Subversion Repositories general

Rev

Rev 1016 | Rev 1019 | 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
 
3
import java.util.*;
4
import net.sf.hibernate.*;
5
import net.sf.hibernate.type.Type;
1016 dev 6
import ak.hostadmiral.util.CollectionUtils;
924 dev 7
import ak.hostadmiral.util.HibernateUtil;
8
import ak.hostadmiral.util.ModelException;
9
import ak.hostadmiral.util.ModelSecurityException;
919 dev 10
 
11
public class MailboxManager
949 dev 12
	implements
13
		UserBeforeDeleteListener,
1014 dev 14
		UserDeletingListener,
949 dev 15
		SystemUserBeforeDeleteListener,
1014 dev 16
		SystemUserDeletingListener,
17
		InetDomainBeforeDeleteListener,
18
		InetDomainDeletingListener
919 dev 19
{
949 dev 20
	private static MailboxManager mailboxManager = null;
919 dev 21
	private static boolean registered = false;
949 dev 22
 
23
	public static MailboxManager getInstance()
24
	{
25
		return mailboxManager;
26
	}
27
 
919 dev 28
	protected static void register()
29
	{
30
		synchronized(MailboxManager.class) {
31
			if(registered) return;
32
 
33
			registered = true;
34
			try {
35
				HibernateUtil.getConfiguration().addResource(
950 dev 36
					"ak/hostadmiral/core/model/Mailbox.hbm.xml");
949 dev 37
 
38
				mailboxManager = new MailboxManager();
919 dev 39
			}
40
			catch(Exception ex) {
41
				ex.printStackTrace();
42
				throw new RuntimeException(ex.getMessage());
43
			}
44
		}
45
	}
46
 
47
	static {
48
		register();
49
	}
50
 
1011 dev 51
	private Collection createdListeners      = new ArrayList();
52
	private Collection modifiedListeners     = new ArrayList();
949 dev 53
	private Collection beforeDeleteListeners = new ArrayList();
1014 dev 54
	private Collection deletingListeners     = new ArrayList();
1011 dev 55
	private Collection deletedListeners      = new ArrayList();
949 dev 56
 
919 dev 57
	private MailboxManager()
58
	{
949 dev 59
		UserManager.getInstance().addBeforeDeleteListener(this);
60
		SystemUserManager.getInstance().addBeforeDeleteListener(this);
61
		InetDomainManager.getInstance().addBeforeDeleteListener(this);
919 dev 62
	}
63
 
64
	public Mailbox create(User editor)
65
		throws ModelException
66
	{
67
		if(!allowedToCreate(editor)) throw new ModelSecurityException();
68
 
1015 dev 69
		Mailbox mailbox = new Mailbox();
70
 
71
        // FIXME: make this configurable
72
		mailbox.addPasswordStore(new PasswordStoreMd5());
73
		mailbox.addPasswordStore(new PasswordStoreCrypt());
74
		mailbox.addPasswordStore(new PasswordStorePlain());
75
 
76
		return mailbox;
919 dev 77
	}
78
 
79
	public boolean allowedToCreate(User editor)
80
		throws ModelException
81
	{
921 dev 82
		return Mailbox.allowedToCreate(this, editor);
919 dev 83
	}
84
 
85
	public Mailbox get(User editor, Long id)
86
		throws ModelException
87
	{
88
		Mailbox mailbox;
89
 
90
		try {
91
			mailbox = (Mailbox)HibernateUtil.currentSession().load(Mailbox.class, id);
92
		}
93
		catch(HibernateException ex)
94
		{
95
			throw new ModelException(ex);
96
		}
97
 
98
		if(!mailbox.viewableBy(editor))
99
			throw new ModelSecurityException();
100
 
101
		return mailbox;
102
	}
103
 
926 dev 104
	public boolean loginExists(User editor, Mailbox mailbox, String login)
105
		throws ModelException
106
	{
107
		if(mailbox.getDomain() == null)
108
			throw new ModelException("Cannot check unique login for mailbox without domain");
109
 
110
		try {
111
			if(mailbox.getId() == null)
112
				return ((Integer)HibernateUtil.currentSession().iterate(
113
					"select count(*) from Mailbox where login = ? and domain = ?",
114
					new Object[] { login, mailbox.getDomain() },
115
					new Type[] { Hibernate.STRING, Hibernate.entity(InetDomain.class) } )
116
					.next()).intValue() > 0;
117
			else
118
				return ((Integer)HibernateUtil.currentSession().iterate(
119
					"select count(*) from Mailbox b where login = ? and domain = ? and b != ?",
120
					new Object[] { login, mailbox.getDomain(), mailbox },
121
					new Type[] { Hibernate.STRING, Hibernate.entity(InetDomain.class),
122
						Hibernate.entity(Mailbox.class) } )
123
					.next()).intValue() > 0;
124
		}
125
		catch(HibernateException ex)
126
		{
127
			throw new ModelException(ex);
128
		}
129
	}
130
 
919 dev 131
	protected Mailbox findForLogin(String login)
132
		throws ModelException
133
	{
134
		try {
135
			List list = HibernateUtil.currentSession().find(
1018 dev 136
				"select mb from Mailbox mb left join fetch mb.domain as d"
137
				+ " left join fetch mb.owner where mb.login=?",
138
				login, Hibernate.STRING);
919 dev 139
 
140
			if(list.size() == 0)
141
				return null;
142
			else
143
				return (Mailbox)list.get(0);
144
		}
145
		catch(HibernateException ex)
146
		{
147
			throw new ModelException(ex);
148
		}
149
	}
150
 
151
	public void save(User editor, Mailbox mailbox)
152
		throws ModelException
153
	{
154
		if(!mailbox.editableBy(editor))
155
			throw new ModelSecurityException();
156
 
1011 dev 157
        boolean isNew = mailbox.isNew();
158
 
1010 dev 159
		//mailbox.setModUser(editor); // FIXME
919 dev 160
 
161
		try {
162
			HibernateUtil.currentSession().saveOrUpdate(mailbox);
163
		}
164
		catch(HibernateException ex)
165
		{
166
			throw new ModelException(ex);
167
		}
1011 dev 168
 
169
        // inform listeners
170
        if(isNew) {
171
        	for(Iterator i = createdListeners.iterator(); i.hasNext(); ) {
172
        		MailboxCreatedListener listener = (MailboxCreatedListener)i.next();
173
    			listener.mailboxCreated(editor, mailbox);
174
        	}
175
        }
176
        else {
177
            Mailbox oldMailbox = mailbox.getOrigin();
178
            if(oldMailbox == null) oldMailbox = mailbox;
179
        	for(Iterator i = modifiedListeners.iterator(); i.hasNext(); ) {
180
        		MailboxModifiedListener listener = (MailboxModifiedListener)i.next();
181
    			listener.mailboxModified(editor, mailbox, oldMailbox);
182
        	}
183
        }
919 dev 184
	}
185
 
1011 dev 186
    public void addCreatedListener(MailboxCreatedListener listener)
187
    {
188
    	createdListeners.add(listener);
189
    }
190
 
191
    public void removeCreatedListener(MailboxCreatedListener listener)
192
    {
193
    	createdListeners.remove(listener);
194
    }
195
 
196
    public void addModifiedListener(MailboxModifiedListener listener)
197
    {
198
    	modifiedListeners.add(listener);
199
    }
200
 
201
    public void removeModifiedListener(MailboxModifiedListener listener)
202
    {
203
    	modifiedListeners.remove(listener);
204
    }
205
 
949 dev 206
    public void addBeforeDeleteListener(MailboxBeforeDeleteListener listener)
207
    {
208
    	beforeDeleteListeners.add(listener);
209
    }
210
 
211
    public void removeBeforeDeleteListener(MailboxBeforeDeleteListener listener)
212
    {
213
    	beforeDeleteListeners.remove(listener);
214
    }
215
 
1014 dev 216
    public void addDeletingListener(MailboxDeletingListener listener)
217
    {
218
    	deletingListeners.add(listener);
219
    }
220
 
221
    public void removeDeletingListener(MailboxDeletingListener listener)
222
    {
223
    	deletingListeners.remove(listener);
224
    }
225
 
1011 dev 226
    public void addDeletedListener(MailboxDeletedListener listener)
227
    {
228
    	deletedListeners.add(listener);
229
    }
230
 
231
    public void removeDeletedListener(MailboxDeletedListener listener)
232
    {
233
    	deletedListeners.remove(listener);
234
    }
235
 
949 dev 236
    public Collection beforeDelete(User editor, Mailbox mailbox, Collection known)
237
		throws ModelException
238
    {
239
    	Collection cascade = new ArrayList();
240
 
241
    	for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) {
242
    		MailboxBeforeDeleteListener listener = (MailboxBeforeDeleteListener)i.next();
243
			Collection subcascade = listener.mailboxBeforeDelete(editor, mailbox, known);
244
    		if(subcascade != null)
245
    			cascade.addAll(subcascade);
246
    	}
247
 
248
    	return cascade;
249
    }
250
 
919 dev 251
	public void delete(User editor, Mailbox mailbox)
252
		throws ModelException
253
	{
1011 dev 254
	    // check rights
919 dev 255
		if(!mailbox.deleteableBy(editor))
256
			throw new ModelSecurityException();
257
 
1014 dev 258
        // inform deleting listeners
259
    	for(Iterator i = deletingListeners.iterator(); i.hasNext(); ) {
260
    		MailboxDeletingListener listener = (MailboxDeletingListener)i.next();
261
			listener.mailboxDeleting(editor, mailbox);
262
    	}
263
 
1011 dev 264
        // backup copy
265
        Mailbox oldMailbox = new Mailbox(mailbox);
266
 
267
        // delete it
919 dev 268
		try {
269
			HibernateUtil.currentSession().delete(mailbox);
270
		}
271
		catch(HibernateException ex)
272
		{
273
			throw new ModelException(ex);
274
		}
1011 dev 275
 
1014 dev 276
        // inform deleted listeners
1011 dev 277
    	for(Iterator i = deletedListeners.iterator(); i.hasNext(); ) {
278
    		MailboxDeletedListener listener = (MailboxDeletedListener)i.next();
279
			listener.mailboxDeleted(editor, oldMailbox);
280
    	}
919 dev 281
	}
282
 
283
	public Collection listMailboxes(User editor)
284
		throws ModelException
285
	{
286
		try {
287
			if(editor.isSuperuser())
1016 dev 288
				return HibernateUtil.currentSession().find(
289
					"select mb from Mailbox mb left join fetch mb.domain as d"
290
					+ " left join fetch mb.owner");
919 dev 291
			else
1016 dev 292
				// FIXME: any problems for big lists or by pages?
293
				return CollectionUtils.addUnique(
294
					HibernateUtil.currentSession().find(
295
						"select mb from Mailbox mb left join fetch mb.domain as d"
296
						+ " left join fetch mb.owner"
297
						+ " where mb.owner=?",
298
						new Object[] { editor }, new Type[] { Hibernate.entity(User.class) } ),
299
					HibernateUtil.currentSession().find(
300
						" select mb from Mailbox mb left join fetch mb.domain as d"
301
						+ " left join fetch mb.owner"
302
						+ " where d.owner=?",
303
						new Object[] { editor }, new Type[] { Hibernate.entity(User.class) } ));
919 dev 304
		}
305
		catch(HibernateException ex)
306
		{
307
			throw new ModelException(ex);
308
		}
309
	}
310
 
311
	public boolean areMailboxesAvailable(User editor)
312
		throws ModelException
313
	{
314
		try {
315
			if(editor.isSuperuser()
316
				|| InetDomainManager.getInstance().areInetDomainsAvailable(editor))
317
			{
318
				return true;
319
			}
320
			else {
321
				return ((Integer)HibernateUtil.currentSession().iterate(
322
					"select count(*) from Mailbox mb left join mb.domain as d"
323
					+ " where d.owner=? or mb.owner=?",
324
					new Object[] { editor, editor },
325
					new Type[] { Hibernate.entity(User.class), Hibernate.entity(User.class) })
326
					.next()).intValue() > 0;
327
			}
328
		}
329
		catch(HibernateException ex)
330
		{
331
			throw new ModelException(ex);
332
		}
333
	}
334
 
949 dev 335
	public Collection userBeforeDelete(User editor, User user, Collection known)
336
		throws ModelException
337
	{
338
        Collection mailboxes;
919 dev 339
 
949 dev 340
		try {
341
			mailboxes = HibernateUtil.currentSession().find(
1018 dev 342
				"select mb from Mailbox mb left join fetch mb.domain where mb.owner = ?",
949 dev 343
				user, Hibernate.entity(User.class) );
344
		}
345
		catch(HibernateException ex)
346
		{
347
			throw new ModelException(ex);
348
		}
349
 
350
		return iterateBeforeDelete(editor, mailboxes, known);
351
    }
352
 
1014 dev 353
	public void userDeleting(User editor, User user)
354
		throws ModelException
355
	{
356
        Collection mailboxes;
357
 
358
		try {
359
			mailboxes = HibernateUtil.currentSession().find(
1018 dev 360
				"select mb from Mailbox mb left join fetch mb.domain where mb.owner = ?",
1014 dev 361
				user, Hibernate.entity(User.class) );
362
		}
363
		catch(HibernateException ex)
364
		{
365
			throw new ModelException(ex);
366
		}
367
 
368
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
369
			delete(editor, (Mailbox)i.next());
370
		}
371
    }
372
 
949 dev 373
	public Collection inetDomainBeforeDelete(User editor, InetDomain domain, Collection known)
374
		throws ModelException
919 dev 375
	{
949 dev 376
        Collection mailboxes;
919 dev 377
 
949 dev 378
		try {
379
			mailboxes = HibernateUtil.currentSession().find(
1018 dev 380
				"select mb from Mailbox mb left join fetch mb.owner where mb.domain = ?",
949 dev 381
				domain, Hibernate.entity(InetDomain.class) );
382
		}
383
		catch(HibernateException ex)
384
		{
385
			throw new ModelException(ex);
386
		}
387
 
388
		return iterateBeforeDelete(editor, mailboxes, known);
389
    }
390
 
1014 dev 391
	public void inetDomainDeleting(User editor, InetDomain domain)
392
		throws ModelException
393
	{
394
        Collection mailboxes;
395
 
396
		try {
397
			mailboxes = HibernateUtil.currentSession().find(
1018 dev 398
				"select mb from Mailbox mb left join fetch mb.owner where mb.domain = ?",
1014 dev 399
				domain, Hibernate.entity(InetDomain.class) );
400
		}
401
		catch(HibernateException ex)
402
		{
403
			throw new ModelException(ex);
404
		}
405
 
406
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
407
			delete(editor, (Mailbox)i.next());
408
		}
409
    }
410
 
949 dev 411
	public Collection systemUserBeforeDelete(User editor, SystemUser user, Collection known)
412
		throws ModelException
413
	{
414
        Collection mailboxes;
415
 
416
		try {
417
			mailboxes = HibernateUtil.currentSession().find(
1018 dev 418
				"select mb from Mailbox mb left join fetch mb.domain as d"
419
				+ " left join fetch mb.owner where mb.systemUser = ?",
949 dev 420
				user, Hibernate.entity(SystemUser.class) );
421
		}
422
		catch(HibernateException ex)
423
		{
424
			throw new ModelException(ex);
425
		}
426
 
427
		return iterateBeforeDelete(editor, mailboxes, known);
428
    }
429
 
1014 dev 430
	public void systemUserDeleting(User editor, SystemUser user)
431
		throws ModelException
432
	{
433
        Collection mailboxes;
434
 
435
		try {
436
			mailboxes = HibernateUtil.currentSession().find(
1018 dev 437
				"select mb from Mailbox mb left join fetch mb.domain as d"
438
				+ " left join fetch mb.owner where mb.systemUser = ?",
1014 dev 439
				user, Hibernate.entity(SystemUser.class) );
440
		}
441
		catch(HibernateException ex)
442
		{
443
			throw new ModelException(ex);
444
		}
445
 
446
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
447
			delete(editor, (Mailbox)i.next());
448
		}
449
    }
450
 
949 dev 451
	private Collection iterateBeforeDelete(User editor, Collection mailboxes, Collection known)
452
		throws ModelException
453
	{
454
    	Collection cascade = new ArrayList();
455
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
456
			Mailbox mailbox = (Mailbox)i.next();
457
            if(mailbox.viewableBy(editor)) {
458
				if(mailbox.deleteableBy(editor))
459
					cascade.add(new CascadeDeleteElement(mailbox, CascadeDeleteElement.DELETE,
460
						this.beforeDelete(editor, mailbox, known)));
461
				else
462
					cascade.add(new CascadeDeleteElement(mailbox, CascadeDeleteElement.FORBIDDEN,
463
						null));
464
			}
465
			else {
466
				cascade.add(new CascadeDeleteElement(Mailbox.createLimitedCopy(mailbox),
467
					CascadeDeleteElement.FORBIDDEN, null));
468
			}
469
		}
470
 
471
    	return cascade;
919 dev 472
	}
473
 
474
	public static final Comparator LOGIN_COMPARATOR = new LoginComparator();
475
 
476
	private static class LoginComparator
477
		implements Comparator
478
	{
479
		public int compare(Object o1, Object o2)
480
		{
481
			if(!(o1 instanceof Mailbox) || !(o2 instanceof Mailbox))
482
				throw new ClassCastException("not a Mailbox");
483
 
484
		    Mailbox a1 = (Mailbox)o1;
485
		    Mailbox a2 = (Mailbox)o2;
486
 
487
		    if(a1 == null && a2 == null)
488
		    	return 0;
489
		    else if(a1 == null && a2 != null)
490
		    	return -1;
491
		    else if(a1 != null && a2 == null)
492
		    	return 1;
493
		    else
494
		    	return a1.getLogin().compareToIgnoreCase(a2.getLogin());
495
		}
496
 
497
		public boolean equals(Object obj)
498
		{
499
			return (obj instanceof LoginComparator);
500
		}
501
	}
502
}