Subversion Repositories general

Rev

Rev 1018 | Rev 1020 | 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"
1019 dev 137
				+ " left join fetch mb.owner left join fetch mb.systemUser where mb.login=?",
1018 dev 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"
1019 dev 290
					+ " left join fetch mb.owner left join fetch mb.systemUser");
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"
1019 dev 296
						+ " left join fetch mb.owner left join fetch mb.systemUser"
1016 dev 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"
1019 dev 301
						+ " left join fetch mb.owner left join fetch mb.systemUser"
1016 dev 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(
1019 dev 342
				"select mb from Mailbox mb left join fetch mb.domain"
343
				+ " left join fetch mb.systemUser where mb.owner = ?",
949 dev 344
				user, Hibernate.entity(User.class) );
345
		}
346
		catch(HibernateException ex)
347
		{
348
			throw new ModelException(ex);
349
		}
350
 
351
		return iterateBeforeDelete(editor, mailboxes, known);
352
    }
353
 
1014 dev 354
	public void userDeleting(User editor, User user)
355
		throws ModelException
356
	{
357
        Collection mailboxes;
358
 
359
		try {
360
			mailboxes = HibernateUtil.currentSession().find(
1019 dev 361
				"select mb from Mailbox mb left join fetch mb.domain"
362
				+ " left join fetch mb.systemUser where mb.owner = ?",
1014 dev 363
				user, Hibernate.entity(User.class) );
364
		}
365
		catch(HibernateException ex)
366
		{
367
			throw new ModelException(ex);
368
		}
369
 
370
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
371
			delete(editor, (Mailbox)i.next());
372
		}
373
    }
374
 
949 dev 375
	public Collection inetDomainBeforeDelete(User editor, InetDomain domain, Collection known)
376
		throws ModelException
919 dev 377
	{
949 dev 378
        Collection mailboxes;
919 dev 379
 
949 dev 380
		try {
381
			mailboxes = HibernateUtil.currentSession().find(
1019 dev 382
				"select mb from Mailbox mb left join fetch mb.owner"
383
				+ " left join fetch mb.systemUser where mb.domain = ?",
949 dev 384
				domain, Hibernate.entity(InetDomain.class) );
385
		}
386
		catch(HibernateException ex)
387
		{
388
			throw new ModelException(ex);
389
		}
390
 
391
		return iterateBeforeDelete(editor, mailboxes, known);
392
    }
393
 
1014 dev 394
	public void inetDomainDeleting(User editor, InetDomain domain)
395
		throws ModelException
396
	{
397
        Collection mailboxes;
398
 
399
		try {
400
			mailboxes = HibernateUtil.currentSession().find(
1019 dev 401
				"select mb from Mailbox mb left join fetch mb.owner"
402
				+ " left join fetch mb.systemUser where mb.domain = ?",
1014 dev 403
				domain, Hibernate.entity(InetDomain.class) );
404
		}
405
		catch(HibernateException ex)
406
		{
407
			throw new ModelException(ex);
408
		}
409
 
410
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
411
			delete(editor, (Mailbox)i.next());
412
		}
413
    }
414
 
949 dev 415
	public Collection systemUserBeforeDelete(User editor, SystemUser user, Collection known)
416
		throws ModelException
417
	{
418
        Collection mailboxes;
419
 
420
		try {
421
			mailboxes = HibernateUtil.currentSession().find(
1019 dev 422
				"select mb from Mailbox mb left join fetch mb.domain"
1018 dev 423
				+ " left join fetch mb.owner where mb.systemUser = ?",
949 dev 424
				user, Hibernate.entity(SystemUser.class) );
425
		}
426
		catch(HibernateException ex)
427
		{
428
			throw new ModelException(ex);
429
		}
430
 
431
		return iterateBeforeDelete(editor, mailboxes, known);
432
    }
433
 
1014 dev 434
	public void systemUserDeleting(User editor, SystemUser user)
435
		throws ModelException
436
	{
437
        Collection mailboxes;
438
 
439
		try {
440
			mailboxes = HibernateUtil.currentSession().find(
1019 dev 441
				"select mb from Mailbox mb left join fetch mb.domain"
1018 dev 442
				+ " left join fetch mb.owner where mb.systemUser = ?",
1014 dev 443
				user, Hibernate.entity(SystemUser.class) );
444
		}
445
		catch(HibernateException ex)
446
		{
447
			throw new ModelException(ex);
448
		}
449
 
450
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
451
			delete(editor, (Mailbox)i.next());
452
		}
453
    }
454
 
949 dev 455
	private Collection iterateBeforeDelete(User editor, Collection mailboxes, Collection known)
456
		throws ModelException
457
	{
458
    	Collection cascade = new ArrayList();
459
		for(Iterator i = mailboxes.iterator(); i.hasNext(); ) {
460
			Mailbox mailbox = (Mailbox)i.next();
461
            if(mailbox.viewableBy(editor)) {
462
				if(mailbox.deleteableBy(editor))
463
					cascade.add(new CascadeDeleteElement(mailbox, CascadeDeleteElement.DELETE,
464
						this.beforeDelete(editor, mailbox, known)));
465
				else
466
					cascade.add(new CascadeDeleteElement(mailbox, CascadeDeleteElement.FORBIDDEN,
467
						null));
468
			}
469
			else {
470
				cascade.add(new CascadeDeleteElement(Mailbox.createLimitedCopy(mailbox),
471
					CascadeDeleteElement.FORBIDDEN, null));
472
			}
473
		}
474
 
475
    	return cascade;
919 dev 476
	}
477
 
478
	public static final Comparator LOGIN_COMPARATOR = new LoginComparator();
479
 
480
	private static class LoginComparator
481
		implements Comparator
482
	{
483
		public int compare(Object o1, Object o2)
484
		{
485
			if(!(o1 instanceof Mailbox) || !(o2 instanceof Mailbox))
486
				throw new ClassCastException("not a Mailbox");
487
 
488
		    Mailbox a1 = (Mailbox)o1;
489
		    Mailbox a2 = (Mailbox)o2;
490
 
491
		    if(a1 == null && a2 == null)
492
		    	return 0;
493
		    else if(a1 == null && a2 != null)
494
		    	return -1;
495
		    else if(a1 != null && a2 == null)
496
		    	return 1;
497
		    else
498
		    	return a1.getLogin().compareToIgnoreCase(a2.getLogin());
499
		}
500
 
501
		public boolean equals(Object obj)
502
		{
503
			return (obj instanceof LoginComparator);
504
		}
505
	}
506
}