Subversion Repositories general

Rev

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