Subversion Repositories general

Rev

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