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