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
14
15
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
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