Subversion Repositories general

Rev

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