Subversion Repositories general

Rev

Rev 1058 | Rev 1073 | 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;
1020 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.MailboxStore;
919 dev 14
 
15
public class MailboxManager
949 dev 16
	implements
1041 dev 17
		ConfigInit,
949 dev 18
		UserBeforeDeleteListener,
1014 dev 19
		UserDeletingListener,
949 dev 20
		SystemUserBeforeDeleteListener,
1014 dev 21
		SystemUserDeletingListener,
22
		InetDomainBeforeDeleteListener,
23
		InetDomainDeletingListener
919 dev 24
{
1041 dev 25
	private MailboxStore store;
1046 dev 26
	private Class[]      passwordStores;
949 dev 27
 
1062 dev 28
	private Collection validateListeners     = new ArrayList();
1011 dev 29
	private Collection createdListeners      = new ArrayList();
30
	private Collection modifiedListeners     = new ArrayList();
949 dev 31
	private Collection beforeDeleteListeners = new ArrayList();
1014 dev 32
	private Collection deletingListeners     = new ArrayList();
1011 dev 33
	private Collection deletedListeners      = new ArrayList();
949 dev 34
 
1041 dev 35
	public MailboxManager()
36
		throws ModelException
919 dev 37
	{
949 dev 38
		UserManager.getInstance().addBeforeDeleteListener(this);
39
		SystemUserManager.getInstance().addBeforeDeleteListener(this);
40
		InetDomainManager.getInstance().addBeforeDeleteListener(this);
919 dev 41
	}
42
 
43
	public Mailbox create(User editor)
44
		throws ModelException
45
	{
46
		if(!allowedToCreate(editor)) throw new ModelSecurityException();
47
 
1015 dev 48
		Mailbox mailbox = new Mailbox();
1046 dev 49
        setMailboxPasswordStores(mailbox);
1015 dev 50
 
51
		return mailbox;
919 dev 52
	}
53
 
54
	public boolean allowedToCreate(User editor)
55
		throws ModelException
56
	{
921 dev 57
		return Mailbox.allowedToCreate(this, editor);
919 dev 58
	}
59
 
60
	public Mailbox get(User editor, Long id)
61
		throws ModelException
62
	{
1041 dev 63
		Mailbox mailbox = store.get(id);
919 dev 64
 
65
		if(!mailbox.viewableBy(editor))
66
			throw new ModelSecurityException();
67
 
68
		return mailbox;
69
	}
70
 
926 dev 71
	public boolean loginExists(User editor, Mailbox mailbox, String login)
72
		throws ModelException
73
	{
74
		if(mailbox.getDomain() == null)
75
			throw new ModelException("Cannot check unique login for mailbox without domain");
76
 
1041 dev 77
		return store.loginExists(mailbox, login);
926 dev 78
	}
79
 
1041 dev 80
	public Mailbox findForLogin(User editor, String login)
919 dev 81
		throws ModelException
82
	{
1041 dev 83
		Mailbox mailbox = store.findForLogin(login);
919 dev 84
 
1041 dev 85
		if(!mailbox.viewableBy(editor))
86
			throw new ModelSecurityException();
87
 
88
		return mailbox;
919 dev 89
	}
90
 
91
	public void save(User editor, Mailbox mailbox)
92
		throws ModelException
93
	{
1062 dev 94
		// security check
919 dev 95
		if(!mailbox.editableBy(editor))
96
			throw new ModelSecurityException();
97
 
1062 dev 98
		//mailbox.setModUser(editor); // FIXME
99
 
1011 dev 100
        boolean isNew = mailbox.isNew();
1062 dev 101
        Mailbox oldMailbox = mailbox.getOrigin();
102
        if(oldMailbox == null) oldMailbox = mailbox;
1011 dev 103
 
1062 dev 104
		// validate
105
    	for(Iterator i = validateListeners.iterator(); i.hasNext(); ) {
106
    		MailboxValidateListener listener = (MailboxValidateListener)i.next();
107
			listener.mailboxValidate(editor, mailbox, oldMailbox);
108
    	}
919 dev 109
 
1041 dev 110
		store.save(mailbox);
1011 dev 111
 
112
        // inform listeners
113
        if(isNew) {
114
        	for(Iterator i = createdListeners.iterator(); i.hasNext(); ) {
115
        		MailboxCreatedListener listener = (MailboxCreatedListener)i.next();
116
    			listener.mailboxCreated(editor, mailbox);
117
        	}
118
        }
119
        else {
120
        	for(Iterator i = modifiedListeners.iterator(); i.hasNext(); ) {
121
        		MailboxModifiedListener listener = (MailboxModifiedListener)i.next();
122
    			listener.mailboxModified(editor, mailbox, oldMailbox);
123
        	}
124
        }
1045 dev 125
 
126
        // reset backup
127
        mailbox.resetOrigin();
919 dev 128
	}
129
 
1062 dev 130
    public void addValidateListener(MailboxValidateListener listener)
131
    {
132
    	validateListeners.add(listener);
133
    }
134
 
135
    public void removeValidateListener(MailboxValidateListener listener)
136
    {
137
    	validateListeners.remove(listener);
138
    }
139
 
1011 dev 140
    public void addCreatedListener(MailboxCreatedListener listener)
141
    {
142
    	createdListeners.add(listener);
143
    }
144
 
145
    public void removeCreatedListener(MailboxCreatedListener listener)
146
    {
147
    	createdListeners.remove(listener);
148
    }
149
 
150
    public void addModifiedListener(MailboxModifiedListener listener)
151
    {
152
    	modifiedListeners.add(listener);
153
    }
154
 
155
    public void removeModifiedListener(MailboxModifiedListener listener)
156
    {
157
    	modifiedListeners.remove(listener);
158
    }
159
 
949 dev 160
    public void addBeforeDeleteListener(MailboxBeforeDeleteListener listener)
161
    {
162
    	beforeDeleteListeners.add(listener);
163
    }
164
 
165
    public void removeBeforeDeleteListener(MailboxBeforeDeleteListener listener)
166
    {
167
    	beforeDeleteListeners.remove(listener);
168
    }
169
 
1014 dev 170
    public void addDeletingListener(MailboxDeletingListener listener)
171
    {
172
    	deletingListeners.add(listener);
173
    }
174
 
175
    public void removeDeletingListener(MailboxDeletingListener listener)
176
    {
177
    	deletingListeners.remove(listener);
178
    }
179
 
1011 dev 180
    public void addDeletedListener(MailboxDeletedListener listener)
181
    {
182
    	deletedListeners.add(listener);
183
    }
184
 
185
    public void removeDeletedListener(MailboxDeletedListener listener)
186
    {
187
    	deletedListeners.remove(listener);
188
    }
189
 
949 dev 190
    public Collection beforeDelete(User editor, Mailbox mailbox, Collection known)
191
		throws ModelException
192
    {
193
    	Collection cascade = new ArrayList();
194
 
195
    	for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) {
196
    		MailboxBeforeDeleteListener listener = (MailboxBeforeDeleteListener)i.next();
197
			Collection subcascade = listener.mailboxBeforeDelete(editor, mailbox, known);
198
    		if(subcascade != null)
199
    			cascade.addAll(subcascade);
200
    	}
201
 
202
    	return cascade;
203
    }
204
 
919 dev 205
	public void delete(User editor, Mailbox mailbox)
206
		throws ModelException
207
	{
1011 dev 208
	    // check rights
919 dev 209
		if(!mailbox.deleteableBy(editor))
210
			throw new ModelSecurityException();
211
 
1014 dev 212
        // inform deleting listeners
213
    	for(Iterator i = deletingListeners.iterator(); i.hasNext(); ) {
214
    		MailboxDeletingListener listener = (MailboxDeletingListener)i.next();
215
			listener.mailboxDeleting(editor, mailbox);
216
    	}
217
 
1011 dev 218
        // backup copy
219
        Mailbox oldMailbox = new Mailbox(mailbox);
220
 
221
        // delete it
1041 dev 222
		store.delete(mailbox);
1011 dev 223
 
1014 dev 224
        // inform deleted listeners
1011 dev 225
    	for(Iterator i = deletedListeners.iterator(); i.hasNext(); ) {
226
    		MailboxDeletedListener listener = (MailboxDeletedListener)i.next();
227
			listener.mailboxDeleted(editor, oldMailbox);
228
    	}
919 dev 229
	}
230
 
231
	public Collection listMailboxes(User editor)
232
		throws ModelException
233
	{
1020 dev 234
		return listMailboxes(null, 0, 0, null, editor);
235
	}
236
 
1027 dev 237
	public Collection listMailboxes(CollectionInfo info, int rowsPerPage, int pageNumber,
1020 dev 238
			Integer[] sortingKeys, User editor)
239
		throws ModelException
240
	{
1041 dev 241
		if(editor.isSuperuser())
242
			return store.listAllMailboxes(info, rowsPerPage, pageNumber, sortingKeys);
243
		else
244
			return store.listMailboxes(info, rowsPerPage, pageNumber, sortingKeys, editor);
919 dev 245
	}
246
 
247
	public boolean areMailboxesAvailable(User editor)
248
		throws ModelException
249
	{
1041 dev 250
		if(editor.isSuperuser())
251
			return true;
252
		else
253
			return store.countMailboxesAvailable(editor) > 0;
919 dev 254
	}
255
 
949 dev 256
	public Collection userBeforeDelete(User editor, User user, Collection known)
257
		throws ModelException
258
	{
1041 dev 259
        Collection mailboxes = store.listOwnMailboxes(user);
919 dev 260
 
949 dev 261
		return iterateBeforeDelete(editor, mailboxes, known);
262
    }
263
 
1014 dev 264
	public void userDeleting(User editor, User user)
265
		throws ModelException
266
	{
1041 dev 267
        Collection mailboxes = store.listOwnMailboxes(user);
1014 dev 268
 
269
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
270
			delete(editor, (Mailbox)i.next());
271
		}
272
    }
273
 
949 dev 274
	public Collection inetDomainBeforeDelete(User editor, InetDomain domain, Collection known)
275
		throws ModelException
919 dev 276
	{
1041 dev 277
        Collection mailboxes = store.listMailboxesForDomain(domain);
919 dev 278
 
949 dev 279
		return iterateBeforeDelete(editor, mailboxes, known);
280
    }
281
 
1014 dev 282
	public void inetDomainDeleting(User editor, InetDomain domain)
283
		throws ModelException
284
	{
1041 dev 285
        Collection mailboxes = store.listMailboxesForDomain(domain);
1014 dev 286
 
287
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
288
			delete(editor, (Mailbox)i.next());
289
		}
290
    }
291
 
949 dev 292
	public Collection systemUserBeforeDelete(User editor, SystemUser user, Collection known)
293
		throws ModelException
294
	{
1041 dev 295
        Collection mailboxes = store.listMailboxesForSystemUser(user);
949 dev 296
 
297
		return iterateBeforeDelete(editor, mailboxes, known);
298
    }
299
 
1014 dev 300
	public void systemUserDeleting(User editor, SystemUser user)
301
		throws ModelException
302
	{
1041 dev 303
        Collection mailboxes = store.listMailboxesForSystemUser(user);
1014 dev 304
 
305
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
306
			delete(editor, (Mailbox)i.next());
307
		}
308
    }
309
 
949 dev 310
	private Collection iterateBeforeDelete(User editor, Collection mailboxes, Collection known)
311
		throws ModelException
312
	{
313
    	Collection cascade = new ArrayList();
314
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
315
			Mailbox mailbox = (Mailbox)i.next();
1058 dev 316
			if(known.contains(mailbox)) continue;
317
 
318
			known.add(mailbox);
949 dev 319
            if(mailbox.viewableBy(editor)) {
320
				if(mailbox.deleteableBy(editor))
321
					cascade.add(new CascadeDeleteElement(mailbox, CascadeDeleteElement.DELETE,
322
						this.beforeDelete(editor, mailbox, known)));
323
				else
324
					cascade.add(new CascadeDeleteElement(mailbox, CascadeDeleteElement.FORBIDDEN,
325
						null));
326
			}
327
			else {
328
				cascade.add(new CascadeDeleteElement(Mailbox.createLimitedCopy(mailbox),
329
					CascadeDeleteElement.FORBIDDEN, null));
330
			}
331
		}
332
 
333
    	return cascade;
919 dev 334
	}
335
 
1046 dev 336
	protected void setMailboxPasswordStores(Mailbox mailbox)
337
		throws ModelException
338
	{
339
		if(passwordStores == null) return;
340
 
341
   		try {
342
			for(int i = 0; i < passwordStores.length; i++)
343
				mailbox.addPasswordStore((PasswordStore)passwordStores[i].newInstance());
344
        }
345
        catch(Exception ex) {
346
        	throw new ModelException(ex);
347
        }
348
	}
349
 
1020 dev 350
	public static final Integer SORT_LOGIN  = new Integer(1);
351
	public static final Integer SORT_DOMAIN = new Integer(2);
919 dev 352
 
1020 dev 353
	public static final Comparator LOGIN_COMPARATOR  = new LoginComparator();
354
	public static final Comparator DOMAIN_COMPARATOR = new DomainComparator();
355
 
919 dev 356
	private static class LoginComparator
357
		implements Comparator
358
	{
359
		public int compare(Object o1, Object o2)
360
		{
361
			if(!(o1 instanceof Mailbox) || !(o2 instanceof Mailbox))
362
				throw new ClassCastException("not a Mailbox");
363
 
364
		    Mailbox a1 = (Mailbox)o1;
365
		    Mailbox a2 = (Mailbox)o2;
366
 
367
		    if(a1 == null && a2 == null)
368
		    	return 0;
369
		    else if(a1 == null && a2 != null)
370
		    	return -1;
371
		    else if(a1 != null && a2 == null)
372
		    	return 1;
373
		    else
374
		    	return a1.getLogin().compareToIgnoreCase(a2.getLogin());
375
		}
376
 
377
		public boolean equals(Object obj)
378
		{
379
			return (obj instanceof LoginComparator);
380
		}
381
	}
1020 dev 382
 
383
	private static class DomainComparator
384
		implements Comparator
385
	{
386
		public int compare(Object o1, Object o2)
387
		{
388
			if(!(o1 instanceof Mailbox) || !(o2 instanceof Mailbox))
389
				throw new ClassCastException("not a Mailbox");
390
 
391
		    Mailbox a1 = (Mailbox)o1;
392
		    Mailbox a2 = (Mailbox)o2;
393
 
394
		    if(a1 == null && a2 == null)
395
		    	return 0;
396
		    else if(a1 == null && a2 != null)
397
		    	return -1;
398
		    else if(a1 != null && a2 == null)
399
		    	return 1;
400
		    else
401
		    	return a1.getDomain().getName().compareToIgnoreCase(a2.getDomain().getName());
402
		}
403
 
404
		public boolean equals(Object obj)
405
		{
406
			return (obj instanceof DomainComparator);
407
		}
408
	}
1041 dev 409
 
410
	public void init(Map params)
411
		throws ModelException
412
	{
413
		try {
414
    		mailboxManager = this;
415
 
1046 dev 416
			Class c = Class.forName(((String[])params.get("store"))[0]);
1041 dev 417
			store = (MailboxStore)c.newInstance();
1046 dev 418
 
419
			String[] passwordStoreNames = (String[])params.get("passwordStore");
420
			if(passwordStoreNames != null) {
421
				passwordStores = new Class[passwordStoreNames.length];
422
				for(int i = 0; i < passwordStoreNames.length; i++) {
423
					passwordStores[i] = Class.forName(passwordStoreNames[i]);
424
				}
425
			}
1041 dev 426
        }
427
        catch(Exception ex) {
428
        	throw new ModelException(ex);
429
        }
430
	}
431
 
432
	private static MailboxManager mailboxManager = null;
433
 
434
	public static MailboxManager getInstance()
435
	{
436
		return mailboxManager;
437
	}
919 dev 438
}