Rev 1028 | Rev 1045 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
924 | dev | 1 | package ak.hostadmiral.core.model; |
919 | dev | 2 | |
1041 | dev | 3 | import java.util.Collection; |
4 | import java.util.ArrayList; |
||
5 | import java.util.Iterator; |
||
6 | import java.util.Map; |
||
7 | import java.util.Comparator; |
||
8 | |||
9 | import ak.hostadmiral.util.ConfigInit; |
||
1028 | dev | 10 | import ak.hostadmiral.util.CollectionInfo; |
924 | dev | 11 | import ak.hostadmiral.util.ModelException; |
12 | import ak.hostadmiral.util.ModelSecurityException; |
||
1041 | dev | 13 | import ak.hostadmiral.core.model.store.MailAliasStore; |
919 | dev | 14 | |
15 | public class MailAliasManager |
||
1014 | dev | 16 | implements |
1041 | dev | 17 | ConfigInit, |
1014 | dev | 18 | UserBeforeDeleteListener, |
19 | UserDeletingListener, |
||
20 | InetDomainBeforeDeleteListener, |
||
21 | InetDomainDeletingListener |
||
919 | dev | 22 | { |
1041 | dev | 23 | private MailAliasStore store; |
1011 | dev | 24 | |
25 | private Collection createdListeners = new ArrayList(); |
||
26 | private Collection modifiedListeners = new ArrayList(); |
||
27 | private Collection beforeDeleteListeners = new ArrayList(); |
||
1014 | dev | 28 | private Collection deletingListeners = new ArrayList(); |
1011 | dev | 29 | private Collection deletedListeners = new ArrayList(); |
30 | |||
1041 | dev | 31 | public MailAliasManager() |
32 | throws ModelException |
||
919 | dev | 33 | { |
1011 | dev | 34 | UserManager.getInstance().addBeforeDeleteListener(this); |
919 | dev | 35 | } |
36 | |||
37 | public MailAlias create(User editor) |
||
38 | throws ModelException |
||
39 | { |
||
40 | if(!allowedToCreate(editor)) throw new ModelSecurityException(); |
||
41 | |||
42 | MailAlias alias = new MailAlias(); |
||
43 | alias.setDestinations(new ArrayList()); |
||
44 | return alias; |
||
45 | } |
||
46 | |||
47 | public boolean allowedToCreate(User editor) |
||
48 | throws ModelException |
||
49 | { |
||
921 | dev | 50 | return MailAlias.allowedToCreate(this, editor); |
919 | dev | 51 | } |
52 | |||
53 | public MailAlias get(User editor, Long id) |
||
54 | throws ModelException |
||
55 | { |
||
1041 | dev | 56 | MailAlias alias = store.get(id); |
919 | dev | 57 | |
58 | if(!alias.viewableBy(editor)) |
||
59 | throw new ModelSecurityException(); |
||
60 | |||
61 | return alias; |
||
62 | } |
||
63 | |||
926 | dev | 64 | public boolean addressExists(User editor, MailAlias alias, String address) |
65 | throws ModelException |
||
66 | { |
||
67 | if(alias.getDomain() == null) |
||
68 | throw new ModelException("Cannot check unique address for mail alias without domain"); |
||
69 | |||
1041 | dev | 70 | return store.addressExists(alias, address); |
926 | dev | 71 | } |
72 | |||
1041 | dev | 73 | public MailAlias findForName(User editor, String name) |
919 | dev | 74 | throws ModelException |
75 | { |
||
1041 | dev | 76 | MailAlias alias = store.findForName(name); |
919 | dev | 77 | |
1041 | dev | 78 | if(!alias.viewableBy(editor)) |
79 | throw new ModelSecurityException(); |
||
80 | |||
81 | return alias; |
||
919 | dev | 82 | } |
83 | |||
84 | public void save(User editor, MailAlias mailAlias) |
||
85 | throws ModelException |
||
86 | { |
||
87 | if(!mailAlias.editableBy(editor)) |
||
88 | throw new ModelSecurityException(); |
||
89 | |||
1011 | dev | 90 | boolean isNew = mailAlias.isNew(); |
91 | |||
1010 | dev | 92 | //mailAlias.setModUser(editor); // FIXME |
919 | dev | 93 | |
1041 | dev | 94 | store.save(mailAlias); |
1011 | dev | 95 | |
96 | // inform listeners |
||
97 | if(isNew) { |
||
98 | for(Iterator i = createdListeners.iterator(); i.hasNext(); ) { |
||
99 | MailAliasCreatedListener listener = (MailAliasCreatedListener)i.next(); |
||
100 | listener.mailAliasCreated(editor, mailAlias); |
||
101 | } |
||
102 | } |
||
103 | else { |
||
104 | MailAlias oldMailAlias = mailAlias.getOrigin(); |
||
105 | if(oldMailAlias == null) oldMailAlias = mailAlias; |
||
106 | for(Iterator i = modifiedListeners.iterator(); i.hasNext(); ) { |
||
107 | MailAliasModifiedListener listener = (MailAliasModifiedListener)i.next(); |
||
108 | listener.mailAliasModified(editor, mailAlias, oldMailAlias); |
||
109 | } |
||
110 | } |
||
919 | dev | 111 | } |
112 | |||
1011 | dev | 113 | public void addCreatedListener(MailAliasCreatedListener listener) |
114 | { |
||
115 | createdListeners.add(listener); |
||
116 | } |
||
117 | |||
118 | public void removeCreatedListener(MailAliasCreatedListener listener) |
||
119 | { |
||
120 | createdListeners.remove(listener); |
||
121 | } |
||
122 | |||
123 | public void addModifiedListener(MailAliasModifiedListener listener) |
||
124 | { |
||
125 | modifiedListeners.add(listener); |
||
126 | } |
||
127 | |||
128 | public void removeModifiedListener(MailAliasModifiedListener listener) |
||
129 | { |
||
130 | modifiedListeners.remove(listener); |
||
131 | } |
||
132 | |||
133 | public void addBeforeDeleteListener(MailAliasBeforeDeleteListener listener) |
||
134 | { |
||
135 | beforeDeleteListeners.add(listener); |
||
136 | } |
||
137 | |||
138 | public void removeBeforeDeleteListener(MailAliasBeforeDeleteListener listener) |
||
139 | { |
||
140 | beforeDeleteListeners.remove(listener); |
||
141 | } |
||
142 | |||
1014 | dev | 143 | public void addDeletingListener(MailAliasDeletingListener listener) |
144 | { |
||
145 | deletingListeners.add(listener); |
||
146 | } |
||
147 | |||
148 | public void removeDeletingListener(MailAliasDeletingListener listener) |
||
149 | { |
||
150 | deletingListeners.remove(listener); |
||
151 | } |
||
152 | |||
1011 | dev | 153 | public void addDeletedListener(MailAliasDeletedListener listener) |
154 | { |
||
155 | deletedListeners.add(listener); |
||
156 | } |
||
157 | |||
158 | public void removeDeletedListener(MailAliasDeletedListener listener) |
||
159 | { |
||
160 | deletedListeners.remove(listener); |
||
161 | } |
||
162 | |||
163 | public Collection beforeDelete(User editor, MailAlias mailAlias, Collection known) |
||
164 | throws ModelException |
||
165 | { |
||
166 | Collection cascade = new ArrayList(); |
||
167 | |||
168 | for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) { |
||
169 | MailAliasBeforeDeleteListener listener = (MailAliasBeforeDeleteListener)i.next(); |
||
170 | Collection subcascade = listener.mailAliasBeforeDelete(editor, mailAlias, known); |
||
171 | if(subcascade != null) |
||
172 | cascade.addAll(subcascade); |
||
173 | } |
||
174 | |||
175 | return cascade; |
||
176 | } |
||
177 | |||
919 | dev | 178 | public void delete(User editor, MailAlias mailAlias) |
179 | throws ModelException |
||
180 | { |
||
1011 | dev | 181 | // check rights |
919 | dev | 182 | if(!mailAlias.deleteableBy(editor)) |
183 | throw new ModelSecurityException(); |
||
184 | |||
1014 | dev | 185 | // inform deleting listeners |
186 | for(Iterator i = deletingListeners.iterator(); i.hasNext(); ) { |
||
187 | MailAliasDeletingListener listener = (MailAliasDeletingListener)i.next(); |
||
188 | listener.mailAliasDeleting(editor, mailAlias); |
||
189 | } |
||
190 | |||
1011 | dev | 191 | // backup copy |
192 | MailAlias oldMailAlias = new MailAlias(mailAlias); |
||
193 | |||
194 | // delete it |
||
1041 | dev | 195 | store.delete(mailAlias); |
1011 | dev | 196 | |
1014 | dev | 197 | // inform deleted listeners |
1011 | dev | 198 | for(Iterator i = deletedListeners.iterator(); i.hasNext(); ) { |
199 | MailAliasDeletedListener listener = (MailAliasDeletedListener)i.next(); |
||
200 | listener.mailAliasDeleted(editor, oldMailAlias); |
||
201 | } |
||
919 | dev | 202 | } |
203 | |||
204 | public Collection listMailAliases(User editor) |
||
205 | throws ModelException |
||
206 | { |
||
1028 | dev | 207 | return listMailAliases(null, 0, 0, null, editor); |
208 | } |
||
209 | |||
210 | public Collection listMailAliases(CollectionInfo info, int rowsPerPage, int pageNumber, |
||
211 | Integer[] sortingKeys, User editor) |
||
212 | throws ModelException |
||
213 | { |
||
1041 | dev | 214 | if(editor.isSuperuser()) |
215 | return store.listAllMailAliases(info, rowsPerPage, pageNumber, sortingKeys); |
||
216 | else |
||
217 | return store.listMailAliases(info, rowsPerPage, pageNumber, sortingKeys, editor); |
||
919 | dev | 218 | } |
219 | |||
220 | public boolean areMailAliasesAvailable(User editor) |
||
221 | throws ModelException |
||
222 | { |
||
1041 | dev | 223 | if(editor.isSuperuser()) |
224 | return true; |
||
225 | else |
||
226 | return store.countMailAliasesAvailable(editor) > 0; |
||
919 | dev | 227 | } |
228 | |||
1011 | dev | 229 | public Collection userBeforeDelete(User editor, User user, Collection known) |
230 | throws ModelException |
||
231 | { |
||
1041 | dev | 232 | Collection mailAliases = store.listOwnMailAliases(user); |
919 | dev | 233 | |
1011 | dev | 234 | return iterateBeforeDelete(editor, mailAliases, known); |
235 | } |
||
236 | |||
1014 | dev | 237 | public void userDeleting(User editor, User user) |
238 | throws ModelException |
||
239 | { |
||
1041 | dev | 240 | Collection mailAliases = store.listOwnMailAliases(user); |
1014 | dev | 241 | |
242 | for(Iterator i = mailAliases.iterator(); i.hasNext(); ) { |
||
243 | delete(editor, (MailAlias)i.next()); |
||
244 | } |
||
245 | } |
||
246 | |||
247 | public Collection inetDomainBeforeDelete(User editor, InetDomain domain, Collection known) |
||
248 | throws ModelException |
||
249 | { |
||
1041 | dev | 250 | Collection mailAliases = store.listMailAliasesForDomain(domain); |
1014 | dev | 251 | |
252 | return iterateBeforeDelete(editor, mailAliases, known); |
||
253 | } |
||
254 | |||
255 | public void inetDomainDeleting(User editor, InetDomain domain) |
||
256 | throws ModelException |
||
257 | { |
||
1041 | dev | 258 | Collection mailAliases = store.listMailAliasesForDomain(domain); |
1014 | dev | 259 | |
260 | for(Iterator i = mailAliases.iterator(); i.hasNext(); ) { |
||
261 | delete(editor, (MailAlias)i.next()); |
||
262 | } |
||
263 | } |
||
264 | |||
1011 | dev | 265 | private Collection iterateBeforeDelete(User editor, Collection mailAliases, Collection known) |
266 | throws ModelException |
||
919 | dev | 267 | { |
1011 | dev | 268 | Collection cascade = new ArrayList(); |
269 | for(Iterator i = mailAliases.iterator(); i.hasNext(); ) { |
||
270 | MailAlias mailAlias = (MailAlias)i.next(); |
||
271 | if(mailAlias.viewableBy(editor)) { |
||
272 | if(mailAlias.deleteableBy(editor)) |
||
273 | cascade.add(new CascadeDeleteElement(mailAlias, CascadeDeleteElement.DELETE, |
||
274 | this.beforeDelete(editor, mailAlias, known))); |
||
275 | else |
||
276 | cascade.add(new CascadeDeleteElement(mailAlias, CascadeDeleteElement.FORBIDDEN, |
||
277 | null)); |
||
278 | } |
||
279 | else { |
||
280 | cascade.add(new CascadeDeleteElement(MailAlias.createLimitedCopy(mailAlias), |
||
281 | CascadeDeleteElement.FORBIDDEN, null)); |
||
282 | } |
||
283 | } |
||
919 | dev | 284 | |
1011 | dev | 285 | return cascade; |
919 | dev | 286 | } |
287 | |||
1028 | dev | 288 | public static final Integer SORT_ADDRESS = new Integer(1); |
289 | public static final Integer SORT_DOMAIN = new Integer(2); |
||
290 | |||
919 | dev | 291 | public static final Comparator ADDRESS_COMPARATOR = new AddressComparator(); |
292 | |||
293 | private static class AddressComparator |
||
294 | implements Comparator |
||
295 | { |
||
296 | public int compare(Object o1, Object o2) |
||
297 | { |
||
298 | if(!(o1 instanceof MailAlias) || !(o2 instanceof MailAlias)) |
||
299 | throw new ClassCastException("not a MailAlias"); |
||
300 | |||
301 | MailAlias a1 = (MailAlias)o1; |
||
302 | MailAlias a2 = (MailAlias)o2; |
||
303 | |||
304 | if(a1 == null && a2 == null) |
||
305 | return 0; |
||
306 | else if(a1 == null && a2 != null) |
||
307 | return -1; |
||
308 | else if(a1 != null && a2 == null) |
||
309 | return 1; |
||
310 | else |
||
311 | return a1.getAddress().compareToIgnoreCase(a2.getAddress()); |
||
312 | } |
||
313 | |||
314 | public boolean equals(Object obj) |
||
315 | { |
||
316 | return (obj instanceof AddressComparator); |
||
317 | } |
||
318 | } |
||
1041 | dev | 319 | |
320 | public void init(Map params) |
||
321 | throws ModelException |
||
322 | { |
||
323 | try { |
||
324 | mailAliasManager = this; |
||
325 | |||
326 | Class c = Class.forName((String)params.get("store")); |
||
327 | store = (MailAliasStore)c.newInstance(); |
||
328 | } |
||
329 | catch(Exception ex) { |
||
330 | throw new ModelException(ex); |
||
331 | } |
||
332 | } |
||
333 | |||
334 | private static MailAliasManager mailAliasManager = null; |
||
335 | |||
336 | public static MailAliasManager getInstance() |
||
337 | { |
||
338 | return mailAliasManager; |
||
339 | } |
||
919 | dev | 340 | } |