Subversion Repositories general

Rev

Rev 1014 | Rev 1018 | 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(
128
				"from MailAlias where name=?", name, Hibernate.STRING);
129
 
130
			if(list.size() == 0)
131
				return null;
132
			else
133
				return (MailAlias)list.get(0);
134
		}
135
		catch(HibernateException ex)
136
		{
137
			throw new ModelException(ex);
138
		}
139
	}
140
 
141
	public void save(User editor, MailAlias mailAlias)
142
		throws ModelException
143
	{
144
		if(!mailAlias.editableBy(editor))
145
			throw new ModelSecurityException();
146
 
1011 dev 147
        boolean isNew = mailAlias.isNew();
148
 
1010 dev 149
		//mailAlias.setModUser(editor);  // FIXME
919 dev 150
 
151
		try {
152
			HibernateUtil.currentSession().saveOrUpdate(mailAlias);
153
		}
154
		catch(HibernateException ex)
155
		{
156
			throw new ModelException(ex);
157
		}
1011 dev 158
 
159
        // inform listeners
160
        if(isNew) {
161
        	for(Iterator i = createdListeners.iterator(); i.hasNext(); ) {
162
        		MailAliasCreatedListener listener = (MailAliasCreatedListener)i.next();
163
    			listener.mailAliasCreated(editor, mailAlias);
164
        	}
165
        }
166
        else {
167
            MailAlias oldMailAlias = mailAlias.getOrigin();
168
            if(oldMailAlias == null) oldMailAlias = mailAlias;
169
        	for(Iterator i = modifiedListeners.iterator(); i.hasNext(); ) {
170
        		MailAliasModifiedListener listener = (MailAliasModifiedListener)i.next();
171
    			listener.mailAliasModified(editor, mailAlias, oldMailAlias);
172
        	}
173
        }
919 dev 174
	}
175
 
1011 dev 176
    public void addCreatedListener(MailAliasCreatedListener listener)
177
    {
178
    	createdListeners.add(listener);
179
    }
180
 
181
    public void removeCreatedListener(MailAliasCreatedListener listener)
182
    {
183
    	createdListeners.remove(listener);
184
    }
185
 
186
    public void addModifiedListener(MailAliasModifiedListener listener)
187
    {
188
    	modifiedListeners.add(listener);
189
    }
190
 
191
    public void removeModifiedListener(MailAliasModifiedListener listener)
192
    {
193
    	modifiedListeners.remove(listener);
194
    }
195
 
196
    public void addBeforeDeleteListener(MailAliasBeforeDeleteListener listener)
197
    {
198
    	beforeDeleteListeners.add(listener);
199
    }
200
 
201
    public void removeBeforeDeleteListener(MailAliasBeforeDeleteListener listener)
202
    {
203
    	beforeDeleteListeners.remove(listener);
204
    }
205
 
1014 dev 206
    public void addDeletingListener(MailAliasDeletingListener listener)
207
    {
208
    	deletingListeners.add(listener);
209
    }
210
 
211
    public void removeDeletingListener(MailAliasDeletingListener listener)
212
    {
213
    	deletingListeners.remove(listener);
214
    }
215
 
1011 dev 216
    public void addDeletedListener(MailAliasDeletedListener listener)
217
    {
218
    	deletedListeners.add(listener);
219
    }
220
 
221
    public void removeDeletedListener(MailAliasDeletedListener listener)
222
    {
223
    	deletedListeners.remove(listener);
224
    }
225
 
226
    public Collection beforeDelete(User editor, MailAlias mailAlias, Collection known)
227
		throws ModelException
228
    {
229
    	Collection cascade = new ArrayList();
230
 
231
    	for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) {
232
    		MailAliasBeforeDeleteListener listener = (MailAliasBeforeDeleteListener)i.next();
233
			Collection subcascade = listener.mailAliasBeforeDelete(editor, mailAlias, known);
234
    		if(subcascade != null)
235
    			cascade.addAll(subcascade);
236
    	}
237
 
238
    	return cascade;
239
    }
240
 
919 dev 241
	public void delete(User editor, MailAlias mailAlias)
242
		throws ModelException
243
	{
1011 dev 244
	    // check rights
919 dev 245
		if(!mailAlias.deleteableBy(editor))
246
			throw new ModelSecurityException();
247
 
1014 dev 248
        // inform deleting listeners
249
    	for(Iterator i = deletingListeners.iterator(); i.hasNext(); ) {
250
    		MailAliasDeletingListener listener = (MailAliasDeletingListener)i.next();
251
			listener.mailAliasDeleting(editor, mailAlias);
252
    	}
253
 
1011 dev 254
        // backup copy
255
        MailAlias oldMailAlias = new MailAlias(mailAlias);
256
 
257
        // delete it
919 dev 258
		try {
259
			HibernateUtil.currentSession().delete(mailAlias);
260
		}
261
		catch(HibernateException ex)
262
		{
263
			throw new ModelException(ex);
264
		}
1011 dev 265
 
1014 dev 266
        // inform deleted listeners
1011 dev 267
    	for(Iterator i = deletedListeners.iterator(); i.hasNext(); ) {
268
    		MailAliasDeletedListener listener = (MailAliasDeletedListener)i.next();
269
			listener.mailAliasDeleted(editor, oldMailAlias);
270
    	}
919 dev 271
	}
272
 
273
	public Collection listMailAliases(User editor)
274
		throws ModelException
275
	{
276
		try {
277
			if(editor.isSuperuser())
278
				return HibernateUtil.currentSession().find("from MailAlias");
279
			else
1016 dev 280
				return CollectionUtils.addUnique(
281
					HibernateUtil.currentSession().find(
282
						"select a from MailAlias a left join fetch a.domain as d"
283
						+ " left join fetch a.owner"
284
						+ " where d.owner=?",
285
						new Object[] { editor }, new Type[] { Hibernate.entity(User.class) } ),
286
					HibernateUtil.currentSession().find(
287
						"select a from MailAlias a left join fetch a.domain as d"
288
						+ " left join fetch a.owner"
289
						+ " where a.owner=?",
290
						new Object[] { editor }, new Type[] { Hibernate.entity(User.class) } ));
919 dev 291
		}
292
		catch(HibernateException ex)
293
		{
294
			throw new ModelException(ex);
295
		}
296
	}
297
 
298
	public boolean areMailAliasesAvailable(User editor)
299
		throws ModelException
300
	{
301
		try {
302
			if(editor.isSuperuser()
303
				|| InetDomainManager.getInstance().areInetDomainsAvailable(editor))
304
			{
305
				return true;
306
			}
307
			else {
308
				return ((Integer)HibernateUtil.currentSession().iterate(
309
					"select count(*) from MailAlias a left join a.domain as d"
310
					+ " where d.owner=? or a.owner=?",
311
					new Object[] { editor, editor },
312
					new Type[] { Hibernate.entity(User.class), Hibernate.entity(User.class) })
313
					.next()).intValue() > 0;
314
			}
315
		}
316
		catch(HibernateException ex)
317
		{
318
			throw new ModelException(ex);
319
		}
320
	}
321
 
1011 dev 322
	public Collection userBeforeDelete(User editor, User user, Collection known)
323
		throws ModelException
324
	{
325
        Collection mailAliases;
919 dev 326
 
1011 dev 327
		try {
328
			mailAliases = HibernateUtil.currentSession().find(
329
				"from MailAlias where owner = ?",
330
				user, Hibernate.entity(User.class) );
331
		}
332
		catch(HibernateException ex)
333
		{
334
			throw new ModelException(ex);
335
		}
336
 
337
		return iterateBeforeDelete(editor, mailAliases, known);
338
    }
339
 
1014 dev 340
	public void userDeleting(User editor, User user)
341
		throws ModelException
342
	{
343
        Collection mailAliases;
344
 
345
		try {
346
			mailAliases = HibernateUtil.currentSession().find(
347
				"from MailAlias where owner = ?",
348
				user, Hibernate.entity(User.class) );
349
		}
350
		catch(HibernateException ex)
351
		{
352
			throw new ModelException(ex);
353
		}
354
 
355
		for(Iterator i = mailAliases.iterator(); i.hasNext(); ) {
356
			delete(editor, (MailAlias)i.next());
357
		}
358
    }
359
 
360
	public Collection inetDomainBeforeDelete(User editor, InetDomain domain, Collection known)
361
		throws ModelException
362
	{
363
        Collection mailAliases;
364
 
365
		try {
366
			mailAliases = HibernateUtil.currentSession().find(
367
				"from MailAlias where domain = ?",
368
				domain, Hibernate.entity(InetDomain.class) );
369
		}
370
		catch(HibernateException ex)
371
		{
372
			throw new ModelException(ex);
373
		}
374
 
375
		return iterateBeforeDelete(editor, mailAliases, known);
376
    }
377
 
378
	public void inetDomainDeleting(User editor, InetDomain domain)
379
		throws ModelException
380
	{
381
        Collection mailAliases;
382
 
383
		try {
384
			mailAliases = HibernateUtil.currentSession().find(
385
				"from MailAlias where domain = ?",
386
				domain, Hibernate.entity(InetDomain.class) );
387
		}
388
		catch(HibernateException ex)
389
		{
390
			throw new ModelException(ex);
391
		}
392
 
393
		for(Iterator i = mailAliases.iterator(); i.hasNext(); ) {
394
			delete(editor, (MailAlias)i.next());
395
		}
396
    }
397
 
1011 dev 398
	private Collection iterateBeforeDelete(User editor, Collection mailAliases, Collection known)
399
		throws ModelException
919 dev 400
	{
1011 dev 401
    	Collection cascade = new ArrayList();
402
		for(Iterator i = mailAliases.iterator(); i.hasNext(); ) {
403
			MailAlias mailAlias = (MailAlias)i.next();
404
            if(mailAlias.viewableBy(editor)) {
405
				if(mailAlias.deleteableBy(editor))
406
					cascade.add(new CascadeDeleteElement(mailAlias, CascadeDeleteElement.DELETE,
407
						this.beforeDelete(editor, mailAlias, known)));
408
				else
409
					cascade.add(new CascadeDeleteElement(mailAlias, CascadeDeleteElement.FORBIDDEN,
410
						null));
411
			}
412
			else {
413
				cascade.add(new CascadeDeleteElement(MailAlias.createLimitedCopy(mailAlias),
414
					CascadeDeleteElement.FORBIDDEN, null));
415
			}
416
		}
919 dev 417
 
1011 dev 418
    	return cascade;
919 dev 419
	}
420
 
421
	public static final Comparator ADDRESS_COMPARATOR = new AddressComparator();
422
 
423
	private static class AddressComparator
424
		implements Comparator
425
	{
426
		public int compare(Object o1, Object o2)
427
		{
428
			if(!(o1 instanceof MailAlias) || !(o2 instanceof MailAlias))
429
				throw new ClassCastException("not a MailAlias");
430
 
431
		    MailAlias a1 = (MailAlias)o1;
432
		    MailAlias a2 = (MailAlias)o2;
433
 
434
		    if(a1 == null && a2 == null)
435
		    	return 0;
436
		    else if(a1 == null && a2 != null)
437
		    	return -1;
438
		    else if(a1 != null && a2 == null)
439
		    	return 1;
440
		    else
441
		    	return a1.getAddress().compareToIgnoreCase(a2.getAddress());
442
		}
443
 
444
		public boolean equals(Object obj)
445
		{
446
			return (obj instanceof AddressComparator);
447
		}
448
	}
449
}