View Javadoc

1   package com.atlassian.theplugin.jira.model;
2   
3   import com.atlassian.theplugin.commons.cfg.ServerId;
4   import com.atlassian.theplugin.commons.remoteapi.RemoteApiException;
5   import com.atlassian.theplugin.commons.remoteapi.ServerData;
6   import com.atlassian.theplugin.jira.JIRAServerFacade;
7   import com.atlassian.theplugin.jira.JIRAServerFacadeImpl;
8   import com.atlassian.theplugin.jira.api.*;
9   
10  import java.util.*;
11  
12  /**
13   * User: jgorycki
14   * Date: Nov 18, 2008
15   * Time: 9:01:03 PM
16   */
17  public class JIRAServerModelImpl implements JIRAServerModel {
18  	private JIRAServerFacade facade;
19  
20  	private final Map<ServerData, JIRAServerCache> serverInfoMap = new HashMap<ServerData, JIRAServerCache>();
21  	private boolean modelFrozen = false;
22  	private Collection<FrozenModelListener> frozenListeners = new ArrayList<FrozenModelListener>();
23  	private boolean changed = false;
24  
25  	public JIRAServerModelImpl() {
26  		facade = JIRAServerFacadeImpl.getInstance();
27  	}
28  
29  	// for unit testing
30  	public void setFacade(JIRAServerFacade newFacade) {
31  		facade = newFacade;
32  	}
33  
34  	private synchronized JIRAServerCache getServer(ServerData cfg) {
35  		if (serverInfoMap.containsKey(cfg)) {
36  			return serverInfoMap.get(cfg);
37  		}
38  
39  		JIRAServerCache srv = null;
40  
41  		if (!changed) {
42  			srv = new JIRAServerCache(cfg, facade);
43  			serverInfoMap.put(cfg, srv);
44  		}
45  		return srv;
46  	}
47  
48  	public synchronized void clear(ServerData cfg) {
49  		if (cfg == null) {
50  			return;
51  		}
52  
53  		serverInfoMap.remove(cfg);
54  
55  		if (modelFrozen) {
56  			changed = true;
57  		}
58  	}
59  
60  	public synchronized void clear(ServerId serverId) {
61  		if (serverId == null) {
62  			return;
63  		}
64  
65  		ServerData server = null;
66  
67  		for (ServerData s : serverInfoMap.keySet()) {
68  			if (s.getServerId().equals(serverId.toString())) {
69  				server = s;
70  				break;
71  			}
72  		}
73  
74  		serverInfoMap.remove(server);
75  
76  		if (modelFrozen) {
77  			changed = true;
78  		}
79  	}
80  
81  	public synchronized void replace(ServerData newServer) {
82  		if (newServer == null) {
83  			return;
84  		}
85  
86  		ServerData oldServer = null;
87  
88  		for (ServerData s : serverInfoMap.keySet()) {
89  			if (s.getServerId().equals(newServer.getServerId())) {
90  				oldServer = s;
91  				break;
92  			}
93  		}
94  
95  		if (oldServer != null) {
96  			serverInfoMap.put(newServer, serverInfoMap.get(oldServer));
97  			serverInfoMap.remove(oldServer);
98  		}
99  
100 		if (modelFrozen) {
101 			changed = true;
102 		}
103 	}
104 
105 
106 	public synchronized void clearAll() {
107 		serverInfoMap.clear();
108 	}
109 
110 	public Boolean checkServer(ServerData cfg) throws RemoteApiException {
111 		if (cfg == null) {
112 			return null;
113 		}
114 
115 		JIRAServerCache srv = getServer(cfg);
116 		if (srv != null) {
117 			return srv.checkServer();
118 		}
119 
120 		return null;
121 	}
122 
123 	public String getErrorMessage(ServerData cfg) {
124 		if (cfg == null) {
125 			return "No Server configuration";
126 		}
127 		JIRAServerCache srv = getServer(cfg);
128 		if (srv != null) {
129 			return srv.getErrorMessage();
130 		}
131 
132 		return "";
133 	}
134 
135 
136 	public List<JIRAProject> getProjects(ServerData cfg) throws JIRAException {
137 		if (cfg == null) {
138 			return null;
139 		}
140 		JIRAServerCache srv = getServer(cfg);
141 		return (srv == null) ? null : srv.getProjects();
142 	}
143 
144 	public List<JIRAConstant> getStatuses(ServerData cfg) throws JIRAException {
145 		if (cfg == null) {
146 			return null;
147 		}
148 		JIRAServerCache srv = getServer(cfg);
149 		return (srv == null) ? null : srv.getStatuses();
150 	}
151 
152 	public List<JIRAConstant> getIssueTypes(ServerData cfg, JIRAProject project, boolean includeAny)
153 			throws JIRAException {
154 		if (cfg == null) {
155 			return null;
156 		}
157 		JIRAServerCache srv = getServer(cfg);
158 		return (srv == null) ? null : srv.getIssueTypes(project, includeAny);
159 	}
160 
161 	public List<JIRAConstant> getSubtaskIssueTypes(ServerData cfg, JIRAProject project) throws JIRAException {
162 		if (cfg == null) {
163 			return null;
164 		}
165 		JIRAServerCache srv = getServer(cfg);
166 		return (srv == null) ? null : srv.getSubtaskIssueTypes(project);
167 	}
168 
169 	public List<JIRAQueryFragment> getSavedFilters(ServerData cfg) throws JIRAException {
170 		if (cfg == null) {
171 			return null;
172 		}
173 		JIRAServerCache srv = getServer(cfg);
174 		return (srv == null) ? null : srv.getSavedFilters();
175 	}
176 
177 	public List<JIRAConstant> getPriorities(ServerData cfg, boolean includeAny) throws JIRAException {
178 		if (cfg == null) {
179 			return null;
180 		}
181 		JIRAServerCache srv = getServer(cfg);
182 		return (srv == null) ? null : srv.getPriorities(includeAny);
183 	}
184 
185 	public List<JIRAResolutionBean> getResolutions(ServerData cfg, boolean includeAnyAndUnknown) throws JIRAException {
186 		if (cfg == null) {
187 			return null;
188 		}
189 		JIRAServerCache srv = getServer(cfg);
190 		return (srv == null) ? null : srv.getResolutions(includeAnyAndUnknown);
191 	}
192 
193 	public List<JIRAVersionBean> getVersions(ServerData cfg, JIRAProject project, boolean includeSpecialValues)
194 			throws JIRAException {
195 		if (cfg == null) {
196 			return null;
197 		}
198 		JIRAServerCache srv = getServer(cfg);
199 		return (srv == null) ? null : srv.getVersions(project, includeSpecialValues);
200 	}
201 
202 	public List<JIRAFixForVersionBean> getFixForVersions(ServerData cfg, JIRAProject project,
203 			boolean includeSpecialValues) throws JIRAException {
204 		if (cfg == null) {
205 			return null;
206 		}
207 		JIRAServerCache srv = getServer(cfg);
208 		return (srv == null) ? null : srv.getFixForVersions(project, includeSpecialValues);
209 	}
210 
211 	public List<JIRAComponentBean> getComponents(ServerData cfg, JIRAProject project, final boolean includeSpecialValues)
212 			throws JIRAException {
213 		if (cfg == null) {
214 			return null;
215 		}
216 		JIRAServerCache srv = getServer(cfg);
217 		return (srv == null) ? null : srv.getComponents(project, includeSpecialValues);
218 	}
219 
220 	public Collection<ServerData> getServers() {
221 		return serverInfoMap.keySet();
222 	}
223 
224 	public boolean isModelFrozen() {
225 		return this.modelFrozen;
226 	}
227 
228 	public synchronized void setModelFrozen(boolean frozen) {
229 		this.modelFrozen = frozen;
230 		changed = false;
231 		fireModelFrozen();
232 	}
233 
234 	public void addFrozenModelListener(FrozenModelListener listener) {
235 		frozenListeners.add(listener);
236 	}
237 
238 	public void removeFrozenModelListener(FrozenModelListener listener) {
239 		frozenListeners.remove(listener);
240 	}
241 
242 	private void fireModelFrozen() {
243 		for (FrozenModelListener listener : frozenListeners) {
244 			listener.modelFrozen(this, modelFrozen);
245 		}
246 	}
247 }
248