Subversion Repositories general

Rev

Rev 1041 | Rev 1046 | 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
        }
1045 dev 120
 
121
        // reset backup
122
        mailbox.resetOrigin();
919 dev 123
	}
124
 
1011 dev 125
    public void addCreatedListener(MailboxCreatedListener listener)
126
    {
127
    	createdListeners.add(listener);
128
    }
129
 
130
    public void removeCreatedListener(MailboxCreatedListener listener)
131
    {
132
    	createdListeners.remove(listener);
133
    }
134
 
135
    public void addModifiedListener(MailboxModifiedListener listener)
136
    {
137
    	modifiedListeners.add(listener);
138
    }
139
 
140
    public void removeModifiedListener(MailboxModifiedListener listener)
141
    {
142
    	modifiedListeners.remove(listener);
143
    }
144
 
949 dev 145
    public void addBeforeDeleteListener(MailboxBeforeDeleteListener listener)
146
    {
147
    	beforeDeleteListeners.add(listener);
148
    }
149
 
150
    public void removeBeforeDeleteListener(MailboxBeforeDeleteListener listener)
151
    {
152
    	beforeDeleteListeners.remove(listener);
153
    }
154
 
1014 dev 155
    public void addDeletingListener(MailboxDeletingListener listener)
156
    {
157
    	deletingListeners.add(listener);
158
    }
159
 
160
    public void removeDeletingListener(MailboxDeletingListener listener)
161
    {
162
    	deletingListeners.remove(listener);
163
    }
164
 
1011 dev 165
    public void addDeletedListener(MailboxDeletedListener listener)
166
    {
167
    	deletedListeners.add(listener);
168
    }
169
 
170
    public void removeDeletedListener(MailboxDeletedListener listener)
171
    {
172
    	deletedListeners.remove(listener);
173
    }
174
 
949 dev 175
    public Collection beforeDelete(User editor, Mailbox mailbox, Collection known)
176
		throws ModelException
177
    {
178
    	Collection cascade = new ArrayList();
179
 
180
    	for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) {
181
    		MailboxBeforeDeleteListener listener = (MailboxBeforeDeleteListener)i.next();
182
			Collection subcascade = listener.mailboxBeforeDelete(editor, mailbox, known);
183
    		if(subcascade != null)
184
    			cascade.addAll(subcascade);
185
    	}
186
 
187
    	return cascade;
188
    }
189
 
919 dev 190
	public void delete(User editor, Mailbox mailbox)
191
		throws ModelException
192
	{
1011 dev 193
	    // check rights
919 dev 194
		if(!mailbox.deleteableBy(editor))
195
			throw new ModelSecurityException();
196
 
1014 dev 197
        // inform deleting listeners
198
    	for(Iterator i = deletingListeners.iterator(); i.hasNext(); ) {
199
    		MailboxDeletingListener listener = (MailboxDeletingListener)i.next();
200
			listener.mailboxDeleting(editor, mailbox);
201
    	}
202
 
1011 dev 203
        // backup copy
204
        Mailbox oldMailbox = new Mailbox(mailbox);
205
 
206
        // delete it
1041 dev 207
		store.delete(mailbox);
1011 dev 208
 
1014 dev 209
        // inform deleted listeners
1011 dev 210
    	for(Iterator i = deletedListeners.iterator(); i.hasNext(); ) {
211
    		MailboxDeletedListener listener = (MailboxDeletedListener)i.next();
212
			listener.mailboxDeleted(editor, oldMailbox);
213
    	}
919 dev 214
	}
215
 
216
	public Collection listMailboxes(User editor)
217
		throws ModelException
218
	{
1020 dev 219
		return listMailboxes(null, 0, 0, null, editor);
220
	}
221
 
1027 dev 222
	public Collection listMailboxes(CollectionInfo info, int rowsPerPage, int pageNumber,
1020 dev 223
			Integer[] sortingKeys, User editor)
224
		throws ModelException
225
	{
1041 dev 226
		if(editor.isSuperuser())
227
			return store.listAllMailboxes(info, rowsPerPage, pageNumber, sortingKeys);
228
		else
229
			return store.listMailboxes(info, rowsPerPage, pageNumber, sortingKeys, editor);
919 dev 230
	}
231
 
232
	public boolean areMailboxesAvailable(User editor)
233
		throws ModelException
234
	{
1041 dev 235
		if(editor.isSuperuser())
236
			return true;
237
		else
238
			return store.countMailboxesAvailable(editor) > 0;
919 dev 239
	}
240
 
949 dev 241
	public Collection userBeforeDelete(User editor, User user, Collection known)
242
		throws ModelException
243
	{
1041 dev 244
        Collection mailboxes = store.listOwnMailboxes(user);
919 dev 245
 
949 dev 246
		return iterateBeforeDelete(editor, mailboxes, known);
247
    }
248
 
1014 dev 249
	public void userDeleting(User editor, User user)
250
		throws ModelException
251
	{
1041 dev 252
        Collection mailboxes = store.listOwnMailboxes(user);
1014 dev 253
 
254
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
255
			delete(editor, (Mailbox)i.next());
256
		}
257
    }
258
 
949 dev 259
	public Collection inetDomainBeforeDelete(User editor, InetDomain domain, Collection known)
260
		throws ModelException
919 dev 261
	{
1041 dev 262
        Collection mailboxes = store.listMailboxesForDomain(domain);
919 dev 263
 
949 dev 264
		return iterateBeforeDelete(editor, mailboxes, known);
265
    }
266
 
1014 dev 267
	public void inetDomainDeleting(User editor, InetDomain domain)
268
		throws ModelException
269
	{
1041 dev 270
        Collection mailboxes = store.listMailboxesForDomain(domain);
1014 dev 271
 
272
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
273
			delete(editor, (Mailbox)i.next());
274
		}
275
    }
276
 
949 dev 277
	public Collection systemUserBeforeDelete(User editor, SystemUser user, Collection known)
278
		throws ModelException
279
	{
1041 dev 280
        Collection mailboxes = store.listMailboxesForSystemUser(user);
949 dev 281
 
282
		return iterateBeforeDelete(editor, mailboxes, known);
283
    }
284
 
1014 dev 285
	public void systemUserDeleting(User editor, SystemUser user)
286
		throws ModelException
287
	{
1041 dev 288
        Collection mailboxes = store.listMailboxesForSystemUser(user);
1014 dev 289
 
290
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
291
			delete(editor, (Mailbox)i.next());
292
		}
293
    }
294
 
949 dev 295
	private Collection iterateBeforeDelete(User editor, Collection mailboxes, Collection known)
296
		throws ModelException
297
	{
298
    	Collection cascade = new ArrayList();
299
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
300
			Mailbox mailbox = (Mailbox)i.next();
301
            if(mailbox.viewableBy(editor)) {
302
				if(mailbox.deleteableBy(editor))
303
					cascade.add(new CascadeDeleteElement(mailbox, CascadeDeleteElement.DELETE,
304
						this.beforeDelete(editor, mailbox, known)));
305
				else
306
					cascade.add(new CascadeDeleteElement(mailbox, CascadeDeleteElement.FORBIDDEN,
307
						null));
308
			}
309
			else {
310
				cascade.add(new CascadeDeleteElement(Mailbox.createLimitedCopy(mailbox),
311
					CascadeDeleteElement.FORBIDDEN, null));
312
			}
313
		}
314
 
315
    	return cascade;
919 dev 316
	}
317
 
1020 dev 318
	public static final Integer SORT_LOGIN  = new Integer(1);
319
	public static final Integer SORT_DOMAIN = new Integer(2);
919 dev 320
 
1020 dev 321
	public static final Comparator LOGIN_COMPARATOR  = new LoginComparator();
322
	public static final Comparator DOMAIN_COMPARATOR = new DomainComparator();
323
 
919 dev 324
	private static class LoginComparator
325
		implements Comparator
326
	{
327
		public int compare(Object o1, Object o2)
328
		{
329
			if(!(o1 instanceof Mailbox) || !(o2 instanceof Mailbox))
330
				throw new ClassCastException("not a Mailbox");
331
 
332
		    Mailbox a1 = (Mailbox)o1;
333
		    Mailbox a2 = (Mailbox)o2;
334
 
335
		    if(a1 == null && a2 == null)
336
		    	return 0;
337
		    else if(a1 == null && a2 != null)
338
		    	return -1;
339
		    else if(a1 != null && a2 == null)
340
		    	return 1;
341
		    else
342
		    	return a1.getLogin().compareToIgnoreCase(a2.getLogin());
343
		}
344
 
345
		public boolean equals(Object obj)
346
		{
347
			return (obj instanceof LoginComparator);
348
		}
349
	}
1020 dev 350
 
351
	private static class DomainComparator
352
		implements Comparator
353
	{
354
		public int compare(Object o1, Object o2)
355
		{
356
			if(!(o1 instanceof Mailbox) || !(o2 instanceof Mailbox))
357
				throw new ClassCastException("not a Mailbox");
358
 
359
		    Mailbox a1 = (Mailbox)o1;
360
		    Mailbox a2 = (Mailbox)o2;
361
 
362
		    if(a1 == null && a2 == null)
363
		    	return 0;
364
		    else if(a1 == null && a2 != null)
365
		    	return -1;
366
		    else if(a1 != null && a2 == null)
367
		    	return 1;
368
		    else
369
		    	return a1.getDomain().getName().compareToIgnoreCase(a2.getDomain().getName());
370
		}
371
 
372
		public boolean equals(Object obj)
373
		{
374
			return (obj instanceof DomainComparator);
375
		}
376
	}
1041 dev 377
 
378
	public void init(Map params)
379
		throws ModelException
380
	{
381
		try {
382
    		mailboxManager = this;
383
 
384
			Class c = Class.forName((String)params.get("store"));
385
			store = (MailboxStore)c.newInstance();
386
        }
387
        catch(Exception ex) {
388
        	throw new ModelException(ex);
389
        }
390
	}
391
 
392
	private static MailboxManager mailboxManager = null;
393
 
394
	public static MailboxManager getInstance()
395
	{
396
		return mailboxManager;
397
	}
919 dev 398
}