Subversion Repositories general

Rev

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;
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;
949 dev 26
 
1011 dev 27
	private Collection createdListeners      = new ArrayList();
28
	private Collection modifiedListeners     = new ArrayList();
949 dev 29
	private Collection beforeDeleteListeners = new ArrayList();
1014 dev 30
	private Collection deletingListeners     = new ArrayList();
1011 dev 31
	private Collection deletedListeners      = new ArrayList();
949 dev 32
 
1041 dev 33
	public MailboxManager()
34
		throws ModelException
919 dev 35
	{
949 dev 36
		UserManager.getInstance().addBeforeDeleteListener(this);
37
		SystemUserManager.getInstance().addBeforeDeleteListener(this);
38
		InetDomainManager.getInstance().addBeforeDeleteListener(this);
919 dev 39
	}
40
 
41
	public Mailbox create(User editor)
42
		throws ModelException
43
	{
44
		if(!allowedToCreate(editor)) throw new ModelSecurityException();
45
 
1015 dev 46
		Mailbox mailbox = new Mailbox();
47
 
48
        // FIXME: make this configurable
49
		mailbox.addPasswordStore(new PasswordStoreMd5());
50
		mailbox.addPasswordStore(new PasswordStoreCrypt());
51
		mailbox.addPasswordStore(new PasswordStorePlain());
52
 
53
		return mailbox;
919 dev 54
	}
55
 
56
	public boolean allowedToCreate(User editor)
57
		throws ModelException
58
	{
921 dev 59
		return Mailbox.allowedToCreate(this, editor);
919 dev 60
	}
61
 
62
	public Mailbox get(User editor, Long id)
63
		throws ModelException
64
	{
1041 dev 65
		Mailbox mailbox = store.get(id);
919 dev 66
 
67
		if(!mailbox.viewableBy(editor))
68
			throw new ModelSecurityException();
69
 
70
		return mailbox;
71
	}
72
 
926 dev 73
	public boolean loginExists(User editor, Mailbox mailbox, String login)
74
		throws ModelException
75
	{
76
		if(mailbox.getDomain() == null)
77
			throw new ModelException("Cannot check unique login for mailbox without domain");
78
 
1041 dev 79
		return store.loginExists(mailbox, login);
926 dev 80
	}
81
 
1041 dev 82
	public Mailbox findForLogin(User editor, String login)
919 dev 83
		throws ModelException
84
	{
1041 dev 85
		Mailbox mailbox = store.findForLogin(login);
919 dev 86
 
1041 dev 87
		if(!mailbox.viewableBy(editor))
88
			throw new ModelSecurityException();
89
 
90
		return mailbox;
919 dev 91
	}
92
 
93
	public void save(User editor, Mailbox mailbox)
94
		throws ModelException
95
	{
96
		if(!mailbox.editableBy(editor))
97
			throw new ModelSecurityException();
98
 
1011 dev 99
        boolean isNew = mailbox.isNew();
100
 
1010 dev 101
		//mailbox.setModUser(editor); // FIXME
919 dev 102
 
1041 dev 103
		store.save(mailbox);
1011 dev 104
 
105
        // inform listeners
106
        if(isNew) {
107
        	for(Iterator i = createdListeners.iterator(); i.hasNext(); ) {
108
        		MailboxCreatedListener listener = (MailboxCreatedListener)i.next();
109
    			listener.mailboxCreated(editor, mailbox);
110
        	}
111
        }
112
        else {
113
            Mailbox oldMailbox = mailbox.getOrigin();
114
            if(oldMailbox == null) oldMailbox = mailbox;
115
        	for(Iterator i = modifiedListeners.iterator(); i.hasNext(); ) {
116
        		MailboxModifiedListener listener = (MailboxModifiedListener)i.next();
117
    			listener.mailboxModified(editor, mailbox, oldMailbox);
118
        	}
119
        }
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
 
1020 dev 315
	public static final Integer SORT_LOGIN  = new Integer(1);
316
	public static final Integer SORT_DOMAIN = new Integer(2);
919 dev 317
 
1020 dev 318
	public static final Comparator LOGIN_COMPARATOR  = new LoginComparator();
319
	public static final Comparator DOMAIN_COMPARATOR = new DomainComparator();
320
 
919 dev 321
	private static class LoginComparator
322
		implements Comparator
323
	{
324
		public int compare(Object o1, Object o2)
325
		{
326
			if(!(o1 instanceof Mailbox) || !(o2 instanceof Mailbox))
327
				throw new ClassCastException("not a Mailbox");
328
 
329
		    Mailbox a1 = (Mailbox)o1;
330
		    Mailbox a2 = (Mailbox)o2;
331
 
332
		    if(a1 == null && a2 == null)
333
		    	return 0;
334
		    else if(a1 == null && a2 != null)
335
		    	return -1;
336
		    else if(a1 != null && a2 == null)
337
		    	return 1;
338
		    else
339
		    	return a1.getLogin().compareToIgnoreCase(a2.getLogin());
340
		}
341
 
342
		public boolean equals(Object obj)
343
		{
344
			return (obj instanceof LoginComparator);
345
		}
346
	}
1020 dev 347
 
348
	private static class DomainComparator
349
		implements Comparator
350
	{
351
		public int compare(Object o1, Object o2)
352
		{
353
			if(!(o1 instanceof Mailbox) || !(o2 instanceof Mailbox))
354
				throw new ClassCastException("not a Mailbox");
355
 
356
		    Mailbox a1 = (Mailbox)o1;
357
		    Mailbox a2 = (Mailbox)o2;
358
 
359
		    if(a1 == null && a2 == null)
360
		    	return 0;
361
		    else if(a1 == null && a2 != null)
362
		    	return -1;
363
		    else if(a1 != null && a2 == null)
364
		    	return 1;
365
		    else
366
		    	return a1.getDomain().getName().compareToIgnoreCase(a2.getDomain().getName());
367
		}
368
 
369
		public boolean equals(Object obj)
370
		{
371
			return (obj instanceof DomainComparator);
372
		}
373
	}
1041 dev 374
 
375
	public void init(Map params)
376
		throws ModelException
377
	{
378
		try {
379
    		mailboxManager = this;
380
 
381
			Class c = Class.forName((String)params.get("store"));
382
			store = (MailboxStore)c.newInstance();
383
        }
384
        catch(Exception ex) {
385
        	throw new ModelException(ex);
386
        }
387
	}
388
 
389
	private static MailboxManager mailboxManager = null;
390
 
391
	public static MailboxManager getInstance()
392
	{
393
		return mailboxManager;
394
	}
919 dev 395
}