Subversion Repositories general

Rev

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