Subversion Repositories general

Rev

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