Subversion Repositories general

Rev

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