Subversion Repositories general

Rev

Rev 1016 | Rev 1028 | 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 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
	{
277
		try {
278
			if(editor.isSuperuser())
1018 dev 279
				return HibernateUtil.currentSession().find(
280
					"select a from MailAlias a left join fetch a.domain as d"
281
					+ " left join fetch a.owner");
919 dev 282
			else
1018 dev 283
				// FIXME: any problems for big lists or by pages?
1016 dev 284
				return CollectionUtils.addUnique(
285
					HibernateUtil.currentSession().find(
286
						"select a from MailAlias a left join fetch a.domain as d"
287
						+ " left join fetch a.owner"
288
						+ " where d.owner=?",
289
						new Object[] { editor }, new Type[] { Hibernate.entity(User.class) } ),
290
					HibernateUtil.currentSession().find(
291
						"select a from MailAlias a left join fetch a.domain as d"
292
						+ " left join fetch a.owner"
293
						+ " where a.owner=?",
294
						new Object[] { editor }, new Type[] { Hibernate.entity(User.class) } ));
919 dev 295
		}
296
		catch(HibernateException ex)
297
		{
298
			throw new ModelException(ex);
299
		}
300
	}
301
 
302
	public boolean areMailAliasesAvailable(User editor)
303
		throws ModelException
304
	{
305
		try {
306
			if(editor.isSuperuser()
307
				|| InetDomainManager.getInstance().areInetDomainsAvailable(editor))
308
			{
309
				return true;
310
			}
311
			else {
312
				return ((Integer)HibernateUtil.currentSession().iterate(
313
					"select count(*) from MailAlias a left join a.domain as d"
314
					+ " where d.owner=? or a.owner=?",
315
					new Object[] { editor, editor },
316
					new Type[] { Hibernate.entity(User.class), Hibernate.entity(User.class) })
317
					.next()).intValue() > 0;
318
			}
319
		}
320
		catch(HibernateException ex)
321
		{
322
			throw new ModelException(ex);
323
		}
324
	}
325
 
1011 dev 326
	public Collection userBeforeDelete(User editor, User user, Collection known)
327
		throws ModelException
328
	{
329
        Collection mailAliases;
919 dev 330
 
1011 dev 331
		try {
332
			mailAliases = HibernateUtil.currentSession().find(
1018 dev 333
				"select a from MailAlias a left join fetch a.domain where a.owner = ?",
1011 dev 334
				user, Hibernate.entity(User.class) );
335
		}
336
		catch(HibernateException ex)
337
		{
338
			throw new ModelException(ex);
339
		}
340
 
341
		return iterateBeforeDelete(editor, mailAliases, known);
342
    }
343
 
1014 dev 344
	public void userDeleting(User editor, User user)
345
		throws ModelException
346
	{
347
        Collection mailAliases;
348
 
349
		try {
350
			mailAliases = HibernateUtil.currentSession().find(
1018 dev 351
				"select a from MailAlias a left join fetch a.domain where a.owner = ?",
1014 dev 352
				user, Hibernate.entity(User.class) );
353
		}
354
		catch(HibernateException ex)
355
		{
356
			throw new ModelException(ex);
357
		}
358
 
359
		for(Iterator i = mailAliases.iterator(); i.hasNext(); ) {
360
			delete(editor, (MailAlias)i.next());
361
		}
362
    }
363
 
364
	public Collection inetDomainBeforeDelete(User editor, InetDomain domain, Collection known)
365
		throws ModelException
366
	{
367
        Collection mailAliases;
368
 
369
		try {
370
			mailAliases = HibernateUtil.currentSession().find(
1018 dev 371
				"select a from MailAlias a left join fetch a.owner where a.domain = ?",
1014 dev 372
				domain, Hibernate.entity(InetDomain.class) );
373
		}
374
		catch(HibernateException ex)
375
		{
376
			throw new ModelException(ex);
377
		}
378
 
379
		return iterateBeforeDelete(editor, mailAliases, known);
380
    }
381
 
382
	public void inetDomainDeleting(User editor, InetDomain domain)
383
		throws ModelException
384
	{
385
        Collection mailAliases;
386
 
387
		try {
388
			mailAliases = HibernateUtil.currentSession().find(
1018 dev 389
				"select a from MailAlias a left join fetch a.owner where a.domain = ?",
1014 dev 390
				domain, Hibernate.entity(InetDomain.class) );
391
		}
392
		catch(HibernateException ex)
393
		{
394
			throw new ModelException(ex);
395
		}
396
 
397
		for(Iterator i = mailAliases.iterator(); i.hasNext(); ) {
398
			delete(editor, (MailAlias)i.next());
399
		}
400
    }
401
 
1011 dev 402
	private Collection iterateBeforeDelete(User editor, Collection mailAliases, Collection known)
403
		throws ModelException
919 dev 404
	{
1011 dev 405
    	Collection cascade = new ArrayList();
406
		for(Iterator i = mailAliases.iterator(); i.hasNext(); ) {
407
			MailAlias mailAlias = (MailAlias)i.next();
408
            if(mailAlias.viewableBy(editor)) {
409
				if(mailAlias.deleteableBy(editor))
410
					cascade.add(new CascadeDeleteElement(mailAlias, CascadeDeleteElement.DELETE,
411
						this.beforeDelete(editor, mailAlias, known)));
412
				else
413
					cascade.add(new CascadeDeleteElement(mailAlias, CascadeDeleteElement.FORBIDDEN,
414
						null));
415
			}
416
			else {
417
				cascade.add(new CascadeDeleteElement(MailAlias.createLimitedCopy(mailAlias),
418
					CascadeDeleteElement.FORBIDDEN, null));
419
			}
420
		}
919 dev 421
 
1011 dev 422
    	return cascade;
919 dev 423
	}
424
 
425
	public static final Comparator ADDRESS_COMPARATOR = new AddressComparator();
426
 
427
	private static class AddressComparator
428
		implements Comparator
429
	{
430
		public int compare(Object o1, Object o2)
431
		{
432
			if(!(o1 instanceof MailAlias) || !(o2 instanceof MailAlias))
433
				throw new ClassCastException("not a MailAlias");
434
 
435
		    MailAlias a1 = (MailAlias)o1;
436
		    MailAlias a2 = (MailAlias)o2;
437
 
438
		    if(a1 == null && a2 == null)
439
		    	return 0;
440
		    else if(a1 == null && a2 != null)
441
		    	return -1;
442
		    else if(a1 != null && a2 == null)
443
		    	return 1;
444
		    else
445
		    	return a1.getAddress().compareToIgnoreCase(a2.getAddress());
446
		}
447
 
448
		public boolean equals(Object obj)
449
		{
450
			return (obj instanceof AddressComparator);
451
		}
452
	}
453
}