Subversion Repositories general

Rev

Rev 1062 | 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.SystemUserStore;
919 dev 14
 
15
public class SystemUserManager
1014 dev 16
	implements
1041 dev 17
		ConfigInit,
1014 dev 18
		UserBeforeDeleteListener,
19
		UserDeletingListener
919 dev 20
{
1041 dev 21
	private SystemUserStore store;
949 dev 22
 
1062 dev 23
	private Collection validateListeners     = new ArrayList();
1011 dev 24
	private Collection createdListeners      = new ArrayList();
25
	private Collection modifiedListeners     = new ArrayList();
949 dev 26
	private Collection beforeDeleteListeners = new ArrayList();
1014 dev 27
	private Collection deletingListeners     = new ArrayList();
1011 dev 28
	private Collection deletedListeners      = new ArrayList();
949 dev 29
 
1041 dev 30
	public SystemUserManager()
31
		throws ModelException
919 dev 32
	{
949 dev 33
		UserManager.getInstance().addBeforeDeleteListener(this);
1221 dev 34
		UserManager.getInstance().addDeletingListener(this);
919 dev 35
	}
36
 
37
	public SystemUser create(User editor)
38
		throws ModelException
39
	{
40
		if(!allowedToCreate(editor)) throw new ModelSecurityException();
41
 
42
		return new SystemUser();
43
	}
44
 
45
	public boolean allowedToCreate(User editor)
46
		throws ModelException
47
	{
921 dev 48
		return SystemUser.allowedToCreate(this, editor);
919 dev 49
	}
50
 
51
	public SystemUser get(User editor, Long id)
52
		throws ModelException
53
	{
1041 dev 54
		SystemUser user = store.get(id);
919 dev 55
 
56
		if(!user.viewableBy(editor))
57
			throw new ModelSecurityException();
58
 
59
		return user;
60
	}
61
 
923 dev 62
	public boolean nameExists(User editor, SystemUser user, String name)
63
		throws ModelException
64
	{
1041 dev 65
		return store.nameExists(user, name);
923 dev 66
	}
67
 
68
	public boolean uidExists(User editor, SystemUser user, Integer uid)
69
		throws ModelException
70
	{
1041 dev 71
		return store.uidExists(user, uid);
923 dev 72
	}
73
 
1041 dev 74
	public SystemUser findForName(User editor, String name)
919 dev 75
		throws ModelException
76
	{
1041 dev 77
		SystemUser user = store.findForName(name);
919 dev 78
 
1041 dev 79
		if(user != null && !user.viewableBy(editor))
80
			throw new ModelSecurityException();
81
 
82
		return user;
919 dev 83
	}
84
 
1041 dev 85
	public SystemUser findForUid(User editor, Integer uid)
919 dev 86
		throws ModelException
87
	{
1041 dev 88
		SystemUser user = store.findForUid(uid);
919 dev 89
 
1041 dev 90
		if(user != null && !user.viewableBy(editor))
91
			throw new ModelSecurityException();
92
 
93
		return user;
919 dev 94
	}
95
 
96
	public void save(User editor, SystemUser systemUser)
97
		throws ModelException
98
	{
1062 dev 99
		// security check
919 dev 100
		if(!systemUser.editableBy(editor))
101
			throw new ModelSecurityException();
102
 
1062 dev 103
		//systemUser.setModUser(editor);  // FIXME
104
 
1011 dev 105
        boolean isNew = systemUser.isNew();
1062 dev 106
        SystemUser oldSystemUser = systemUser.getOrigin();
107
        if(oldSystemUser == null) oldSystemUser = systemUser;
1011 dev 108
 
1062 dev 109
		// validate
110
    	for(Iterator i = validateListeners.iterator(); i.hasNext(); ) {
111
    		SystemUserValidateListener listener = (SystemUserValidateListener)i.next();
112
			listener.systemUserValidate(editor, systemUser, oldSystemUser);
113
    	}
919 dev 114
 
1041 dev 115
		store.save(systemUser);
1011 dev 116
 
117
        // inform listeners
118
        if(isNew) {
119
        	for(Iterator i = createdListeners.iterator(); i.hasNext(); ) {
120
        		SystemUserCreatedListener listener = (SystemUserCreatedListener)i.next();
121
    			listener.systemUserCreated(editor, systemUser);
122
        	}
123
        }
124
        else {
125
        	for(Iterator i = modifiedListeners.iterator(); i.hasNext(); ) {
126
        		SystemUserModifiedListener listener = (SystemUserModifiedListener)i.next();
127
    			listener.systemUserModified(editor, systemUser, oldSystemUser);
128
        	}
129
        }
1045 dev 130
 
131
        // reset backup
132
        systemUser.resetOrigin();
919 dev 133
	}
134
 
1062 dev 135
    public void addValidateListener(SystemUserValidateListener listener)
136
    {
137
    	validateListeners.add(listener);
138
    }
139
 
140
    public void removeValidateListener(SystemUserValidateListener listener)
141
    {
142
    	validateListeners.remove(listener);
143
    }
144
 
1011 dev 145
    public void addCreatedListener(SystemUserCreatedListener listener)
146
    {
147
    	createdListeners.add(listener);
148
    }
149
 
150
    public void removeCreatedListener(SystemUserCreatedListener listener)
151
    {
152
    	createdListeners.remove(listener);
153
    }
154
 
155
    public void addModifiedListener(SystemUserModifiedListener listener)
156
    {
157
    	modifiedListeners.add(listener);
158
    }
159
 
160
    public void removeModifiedListener(SystemUserModifiedListener listener)
161
    {
162
    	modifiedListeners.remove(listener);
163
    }
164
 
949 dev 165
    public void addBeforeDeleteListener(SystemUserBeforeDeleteListener listener)
166
    {
167
    	beforeDeleteListeners.add(listener);
168
    }
169
 
170
    public void removeBeforeDeleteListener(SystemUserBeforeDeleteListener listener)
171
    {
172
    	beforeDeleteListeners.remove(listener);
173
    }
174
 
1014 dev 175
    public void addDeletingListener(SystemUserDeletingListener listener)
176
    {
177
    	deletingListeners.add(listener);
178
    }
179
 
180
    public void removeDeletingListener(SystemUserDeletingListener listener)
181
    {
182
    	deletingListeners.remove(listener);
183
    }
184
 
1011 dev 185
    public void addDeletedListener(SystemUserDeletedListener listener)
186
    {
187
    	deletedListeners.add(listener);
188
    }
189
 
190
    public void removeDeletedListener(SystemUserDeletedListener listener)
191
    {
192
    	deletedListeners.remove(listener);
193
    }
194
 
949 dev 195
    public Collection beforeDelete(User editor, SystemUser user, Collection known)
196
		throws ModelException
197
    {
198
    	Collection cascade = new ArrayList();
199
 
200
    	for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) {
201
    		SystemUserBeforeDeleteListener listener = (SystemUserBeforeDeleteListener)i.next();
202
			Collection subcascade = listener.systemUserBeforeDelete(editor, user, known);
203
    		if(subcascade != null)
204
    			cascade.addAll(subcascade);
205
    	}
206
 
207
    	return cascade;
208
    }
209
 
919 dev 210
	public void delete(User editor, SystemUser systemUser)
211
		throws ModelException
212
	{
1011 dev 213
	    // check rights
919 dev 214
		if(!systemUser.deleteableBy(editor))
215
			throw new ModelSecurityException();
216
 
1014 dev 217
        // inform deleting listeners
218
    	for(Iterator i = deletingListeners.iterator(); i.hasNext(); ) {
219
    		SystemUserDeletingListener listener = (SystemUserDeletingListener)i.next();
220
			listener.systemUserDeleting(editor, systemUser);
221
    	}
222
 
1011 dev 223
        // backup copy
224
        SystemUser oldSystemUser = new SystemUser(systemUser);
225
 
226
        // delete it
1041 dev 227
		store.delete(systemUser);
1011 dev 228
 
1014 dev 229
        // inform deleted listeners
1011 dev 230
    	for(Iterator i = deletedListeners.iterator(); i.hasNext(); ) {
231
    		SystemUserDeletedListener listener = (SystemUserDeletedListener)i.next();
232
			listener.systemUserDeleted(editor, oldSystemUser);
233
    	}
919 dev 234
	}
235
 
236
	public Collection listSystemUsers(User editor)
237
		throws ModelException
238
	{
1028 dev 239
		return listSystemUsers(null, 0, 0, null, editor);
240
	}
241
 
242
	public Collection listSystemUsers(CollectionInfo info, int rowsPerPage, int pageNumber,
243
			Integer[] sortingKeys, User editor)
244
		throws ModelException
245
	{
1041 dev 246
		if(editor.isSuperuser())
247
			return store.listAllSystemUsers(info, rowsPerPage, pageNumber, sortingKeys);
248
		else
249
			return store.listSystemUsers(info, rowsPerPage, pageNumber,	sortingKeys, editor);
919 dev 250
	}
251
 
252
	public boolean areSystemUsersAvailable(User editor)
253
		throws ModelException
254
	{
1041 dev 255
		if(editor.isSuperuser())
256
        	return true;
257
        else
258
			return store.countSystemUsersAvailable(editor) > 0;
919 dev 259
	}
260
 
949 dev 261
	public Collection userBeforeDelete(User editor, User user, Collection known)
262
		throws ModelException
919 dev 263
	{
1041 dev 264
        Collection systemUsers = store.listOwnSystemUsers(user);
919 dev 265
 
949 dev 266
    	Collection cascade = new ArrayList();
267
		for(Iterator i = systemUsers.iterator(); i.hasNext(); ) {
268
			SystemUser u = (SystemUser)i.next();
1058 dev 269
			if(known.contains(u)) continue;
270
 
271
			known.add(u);
949 dev 272
            if(u.viewableBy(editor)) {
273
				if(u.deleteableBy(editor))
274
					cascade.add(new CascadeDeleteElement(u, CascadeDeleteElement.DELETE,
275
						this.beforeDelete(editor, u, known)));
276
				else
277
					cascade.add(new CascadeDeleteElement(u, CascadeDeleteElement.FORBIDDEN, null));
278
			}
279
			else {
280
				cascade.add(new CascadeDeleteElement(SystemUser.createLimitedCopy(u),
281
					CascadeDeleteElement.FORBIDDEN, null));
282
			}
283
		}
284
 
285
    	return cascade;
919 dev 286
	}
287
 
1014 dev 288
	public void userDeleting(User editor, User user)
289
		throws ModelException
290
	{
1041 dev 291
        Collection systemUsers = store.listOwnSystemUsers(user);
1014 dev 292
 
293
		for(Iterator i = systemUsers.iterator(); i.hasNext(); ) {
294
			delete(editor, (SystemUser)i.next());
295
		}
296
    }
297
 
1028 dev 298
	public static final Integer SORT_UID  = new Integer(1);
299
	public static final Integer SORT_NAME = new Integer(2);
300
 
919 dev 301
	public static final Comparator UID_COMPARATOR  = new UidComparator();
302
	public static final Comparator NAME_COMPARATOR = new NameComparator();
303
 
304
	private static class UidComparator
305
		implements Comparator
306
	{
307
		public int compare(Object o1, Object o2)
308
		{
309
			if(!(o1 instanceof SystemUser) || !(o2 instanceof SystemUser))
310
				throw new ClassCastException("not a SystemUser");
311
 
312
		    SystemUser a1 = (SystemUser)o1;
313
		    SystemUser a2 = (SystemUser)o2;
314
 
315
		    if(a1 == null && a2 == null)
316
		    	return 0;
317
		    else if(a1 == null && a2 != null)
318
		    	return -1;
319
		    else if(a1 != null && a2 == null)
320
		    	return 1;
321
		    else
322
		    	return a1.getUid().compareTo(a2.getUid());
323
		}
324
 
325
		public boolean equals(Object obj)
326
		{
327
			return (obj instanceof UidComparator);
328
		}
329
	}
330
 
331
	private static class NameComparator
332
		implements Comparator
333
	{
334
		public int compare(Object o1, Object o2)
335
		{
336
			if(!(o1 instanceof SystemUser) || !(o2 instanceof SystemUser))
337
				throw new ClassCastException("not a SystemUser");
338
 
339
		    SystemUser a1 = (SystemUser)o1;
340
		    SystemUser a2 = (SystemUser)o2;
341
 
342
		    if(a1 == null && a2 == null)
343
		    	return 0;
344
		    else if(a1 == null && a2 != null)
345
		    	return -1;
346
		    else if(a1 != null && a2 == null)
347
		    	return 1;
348
		    else
349
		    	return a1.getName().compareToIgnoreCase(a2.getName());
350
		}
351
 
352
		public boolean equals(Object obj)
353
		{
354
			return (obj instanceof NameComparator);
355
		}
356
	}
1041 dev 357
 
358
	public void init(Map params)
359
		throws ModelException
360
	{
361
		try {
362
    		systemUserManager = this;
363
 
1046 dev 364
			Class c = Class.forName(((String[])params.get("store"))[0]);
1041 dev 365
			store = (SystemUserStore)c.newInstance();
366
        }
367
        catch(Exception ex) {
368
        	throw new ModelException(ex);
369
        }
370
	}
371
 
372
	private static SystemUserManager systemUserManager = null;
373
 
374
	public static SystemUserManager getInstance()
375
	{
376
		return systemUserManager;
377
	}
919 dev 378
}