Subversion Repositories general

Rev

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