Subversion Repositories general

Rev

Rev 1028 | Rev 1045 | 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
        }
919 dev 111
	}
112
 
1011 dev 113
    public void addCreatedListener(MailAliasCreatedListener listener)
114
    {
115
    	createdListeners.add(listener);
116
    }
117
 
118
    public void removeCreatedListener(MailAliasCreatedListener listener)
119
    {
120
    	createdListeners.remove(listener);
121
    }
122
 
123
    public void addModifiedListener(MailAliasModifiedListener listener)
124
    {
125
    	modifiedListeners.add(listener);
126
    }
127
 
128
    public void removeModifiedListener(MailAliasModifiedListener listener)
129
    {
130
    	modifiedListeners.remove(listener);
131
    }
132
 
133
    public void addBeforeDeleteListener(MailAliasBeforeDeleteListener listener)
134
    {
135
    	beforeDeleteListeners.add(listener);
136
    }
137
 
138
    public void removeBeforeDeleteListener(MailAliasBeforeDeleteListener listener)
139
    {
140
    	beforeDeleteListeners.remove(listener);
141
    }
142
 
1014 dev 143
    public void addDeletingListener(MailAliasDeletingListener listener)
144
    {
145
    	deletingListeners.add(listener);
146
    }
147
 
148
    public void removeDeletingListener(MailAliasDeletingListener listener)
149
    {
150
    	deletingListeners.remove(listener);
151
    }
152
 
1011 dev 153
    public void addDeletedListener(MailAliasDeletedListener listener)
154
    {
155
    	deletedListeners.add(listener);
156
    }
157
 
158
    public void removeDeletedListener(MailAliasDeletedListener listener)
159
    {
160
    	deletedListeners.remove(listener);
161
    }
162
 
163
    public Collection beforeDelete(User editor, MailAlias mailAlias, Collection known)
164
		throws ModelException
165
    {
166
    	Collection cascade = new ArrayList();
167
 
168
    	for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) {
169
    		MailAliasBeforeDeleteListener listener = (MailAliasBeforeDeleteListener)i.next();
170
			Collection subcascade = listener.mailAliasBeforeDelete(editor, mailAlias, known);
171
    		if(subcascade != null)
172
    			cascade.addAll(subcascade);
173
    	}
174
 
175
    	return cascade;
176
    }
177
 
919 dev 178
	public void delete(User editor, MailAlias mailAlias)
179
		throws ModelException
180
	{
1011 dev 181
	    // check rights
919 dev 182
		if(!mailAlias.deleteableBy(editor))
183
			throw new ModelSecurityException();
184
 
1014 dev 185
        // inform deleting listeners
186
    	for(Iterator i = deletingListeners.iterator(); i.hasNext(); ) {
187
    		MailAliasDeletingListener listener = (MailAliasDeletingListener)i.next();
188
			listener.mailAliasDeleting(editor, mailAlias);
189
    	}
190
 
1011 dev 191
        // backup copy
192
        MailAlias oldMailAlias = new MailAlias(mailAlias);
193
 
194
        // delete it
1041 dev 195
		store.delete(mailAlias);
1011 dev 196
 
1014 dev 197
        // inform deleted listeners
1011 dev 198
    	for(Iterator i = deletedListeners.iterator(); i.hasNext(); ) {
199
    		MailAliasDeletedListener listener = (MailAliasDeletedListener)i.next();
200
			listener.mailAliasDeleted(editor, oldMailAlias);
201
    	}
919 dev 202
	}
203
 
204
	public Collection listMailAliases(User editor)
205
		throws ModelException
206
	{
1028 dev 207
		return listMailAliases(null, 0, 0, null, editor);
208
	}
209
 
210
	public Collection listMailAliases(CollectionInfo info, int rowsPerPage, int pageNumber,
211
			Integer[] sortingKeys, User editor)
212
		throws ModelException
213
	{
1041 dev 214
		if(editor.isSuperuser())
215
			return store.listAllMailAliases(info, rowsPerPage, pageNumber, sortingKeys);
216
		else
217
			return store.listMailAliases(info, rowsPerPage, pageNumber, sortingKeys, editor);
919 dev 218
	}
219
 
220
	public boolean areMailAliasesAvailable(User editor)
221
		throws ModelException
222
	{
1041 dev 223
		if(editor.isSuperuser())
224
			return true;
225
		else
226
			return store.countMailAliasesAvailable(editor) > 0;
919 dev 227
	}
228
 
1011 dev 229
	public Collection userBeforeDelete(User editor, User user, Collection known)
230
		throws ModelException
231
	{
1041 dev 232
        Collection mailAliases = store.listOwnMailAliases(user);
919 dev 233
 
1011 dev 234
		return iterateBeforeDelete(editor, mailAliases, known);
235
    }
236
 
1014 dev 237
	public void userDeleting(User editor, User user)
238
		throws ModelException
239
	{
1041 dev 240
        Collection mailAliases = store.listOwnMailAliases(user);
1014 dev 241
 
242
		for(Iterator i = mailAliases.iterator(); i.hasNext(); ) {
243
			delete(editor, (MailAlias)i.next());
244
		}
245
    }
246
 
247
	public Collection inetDomainBeforeDelete(User editor, InetDomain domain, Collection known)
248
		throws ModelException
249
	{
1041 dev 250
        Collection mailAliases = store.listMailAliasesForDomain(domain);
1014 dev 251
 
252
		return iterateBeforeDelete(editor, mailAliases, known);
253
    }
254
 
255
	public void inetDomainDeleting(User editor, InetDomain domain)
256
		throws ModelException
257
	{
1041 dev 258
        Collection mailAliases = store.listMailAliasesForDomain(domain);
1014 dev 259
 
260
		for(Iterator i = mailAliases.iterator(); i.hasNext(); ) {
261
			delete(editor, (MailAlias)i.next());
262
		}
263
    }
264
 
1011 dev 265
	private Collection iterateBeforeDelete(User editor, Collection mailAliases, Collection known)
266
		throws ModelException
919 dev 267
	{
1011 dev 268
    	Collection cascade = new ArrayList();
269
		for(Iterator i = mailAliases.iterator(); i.hasNext(); ) {
270
			MailAlias mailAlias = (MailAlias)i.next();
271
            if(mailAlias.viewableBy(editor)) {
272
				if(mailAlias.deleteableBy(editor))
273
					cascade.add(new CascadeDeleteElement(mailAlias, CascadeDeleteElement.DELETE,
274
						this.beforeDelete(editor, mailAlias, known)));
275
				else
276
					cascade.add(new CascadeDeleteElement(mailAlias, CascadeDeleteElement.FORBIDDEN,
277
						null));
278
			}
279
			else {
280
				cascade.add(new CascadeDeleteElement(MailAlias.createLimitedCopy(mailAlias),
281
					CascadeDeleteElement.FORBIDDEN, null));
282
			}
283
		}
919 dev 284
 
1011 dev 285
    	return cascade;
919 dev 286
	}
287
 
1028 dev 288
	public static final Integer SORT_ADDRESS = new Integer(1);
289
	public static final Integer SORT_DOMAIN  = new Integer(2);
290
 
919 dev 291
	public static final Comparator ADDRESS_COMPARATOR = new AddressComparator();
292
 
293
	private static class AddressComparator
294
		implements Comparator
295
	{
296
		public int compare(Object o1, Object o2)
297
		{
298
			if(!(o1 instanceof MailAlias) || !(o2 instanceof MailAlias))
299
				throw new ClassCastException("not a MailAlias");
300
 
301
		    MailAlias a1 = (MailAlias)o1;
302
		    MailAlias a2 = (MailAlias)o2;
303
 
304
		    if(a1 == null && a2 == null)
305
		    	return 0;
306
		    else if(a1 == null && a2 != null)
307
		    	return -1;
308
		    else if(a1 != null && a2 == null)
309
		    	return 1;
310
		    else
311
		    	return a1.getAddress().compareToIgnoreCase(a2.getAddress());
312
		}
313
 
314
		public boolean equals(Object obj)
315
		{
316
			return (obj instanceof AddressComparator);
317
		}
318
	}
1041 dev 319
 
320
	public void init(Map params)
321
		throws ModelException
322
	{
323
		try {
324
    		mailAliasManager = this;
325
 
326
			Class c = Class.forName((String)params.get("store"));
327
			store = (MailAliasStore)c.newInstance();
328
        }
329
        catch(Exception ex) {
330
        	throw new ModelException(ex);
331
        }
332
	}
333
 
334
	private static MailAliasManager mailAliasManager = null;
335
 
336
	public static MailAliasManager getInstance()
337
	{
338
		return mailAliasManager;
339
	}
919 dev 340
}