Subversion Repositories general

Rev

Rev 1011 | Rev 1018 | 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
 
3
import java.util.*;
4
import net.sf.hibernate.*;
923 dev 5
import net.sf.hibernate.type.Type;
924 dev 6
import ak.hostadmiral.util.HibernateUtil;
7
import ak.hostadmiral.util.ModelException;
8
import ak.hostadmiral.util.ModelSecurityException;
919 dev 9
 
10
public class SystemUserManager
1014 dev 11
	implements
12
		UserBeforeDeleteListener,
13
		UserDeletingListener
919 dev 14
{
949 dev 15
	private static SystemUserManager systemUserManager = null;
919 dev 16
	private static boolean registered = false;
949 dev 17
 
18
	public static SystemUserManager getInstance()
19
	{
20
		return systemUserManager;
21
	}
22
 
919 dev 23
	protected static void register()
24
	{
25
		synchronized(SystemUserManager.class) {
26
			if(registered) return;
27
 
28
			registered = true;
29
			try {
30
				HibernateUtil.getConfiguration().addResource(
950 dev 31
					"ak/hostadmiral/core/model/SystemUser.hbm.xml");
949 dev 32
 
33
				systemUserManager = new SystemUserManager();
919 dev 34
			}
35
			catch(Exception ex) {
36
				ex.printStackTrace();
37
				throw new RuntimeException(ex.getMessage());
38
			}
39
		}
40
	}
41
 
42
	static {
43
		register();
44
	}
45
 
1011 dev 46
	private Collection createdListeners      = new ArrayList();
47
	private Collection modifiedListeners     = new ArrayList();
949 dev 48
	private Collection beforeDeleteListeners = new ArrayList();
1014 dev 49
	private Collection deletingListeners     = new ArrayList();
1011 dev 50
	private Collection deletedListeners      = new ArrayList();
949 dev 51
 
919 dev 52
	private SystemUserManager()
53
	{
949 dev 54
		UserManager.getInstance().addBeforeDeleteListener(this);
919 dev 55
	}
56
 
57
	public SystemUser create(User editor)
58
		throws ModelException
59
	{
60
		if(!allowedToCreate(editor)) throw new ModelSecurityException();
61
 
62
		return new SystemUser();
63
	}
64
 
65
	public boolean allowedToCreate(User editor)
66
		throws ModelException
67
	{
921 dev 68
		return SystemUser.allowedToCreate(this, editor);
919 dev 69
	}
70
 
71
	public SystemUser get(User editor, Long id)
72
		throws ModelException
73
	{
74
		SystemUser user;
75
 
76
		try {
77
			user = (SystemUser)HibernateUtil.currentSession().load(SystemUser.class, id);
78
		}
79
		catch(HibernateException ex)
80
		{
81
			throw new ModelException(ex);
82
		}
83
 
84
		if(!user.viewableBy(editor))
85
			throw new ModelSecurityException();
86
 
87
		return user;
88
	}
89
 
923 dev 90
	public boolean nameExists(User editor, SystemUser user, String name)
91
		throws ModelException
92
	{
93
		try {
94
			if(user.getId() == null)
95
				return ((Integer)HibernateUtil.currentSession().iterate(
96
					"select count(*) from SystemUser u where name = ?",
97
					name, Hibernate.STRING)
98
					.next()).intValue() > 0;
99
			else
100
				return ((Integer)HibernateUtil.currentSession().iterate(
101
					"select count(*) from SystemUser u where name = ? and u != ?",
102
					new Object[] { name, user },
103
					new Type[] { Hibernate.STRING, Hibernate.entity(SystemUser.class) } )
104
					.next()).intValue() > 0;
105
		}
106
		catch(HibernateException ex)
107
		{
108
			throw new ModelException(ex);
109
		}
110
	}
111
 
112
	public boolean uidExists(User editor, SystemUser user, Integer uid)
113
		throws ModelException
114
	{
115
		try {
116
			if(user.getId() == null)
117
				return ((Integer)HibernateUtil.currentSession().iterate(
118
					"select count(*) from SystemUser u where uid = ?",
119
					uid, Hibernate.INTEGER)
120
					.next()).intValue() > 0;
121
			else
122
				return ((Integer)HibernateUtil.currentSession().iterate(
123
					"select count(*) from SystemUser u where uid = ? and u != ?",
124
					new Object[] { uid, user },
125
					new Type[] { Hibernate.INTEGER, Hibernate.entity(SystemUser.class) } )
126
					.next()).intValue() > 0;
127
		}
128
		catch(HibernateException ex)
129
		{
130
			throw new ModelException(ex);
131
		}
132
	}
133
 
919 dev 134
	protected SystemUser findForName(String name)
135
		throws ModelException
136
	{
137
		try {
138
			List list = HibernateUtil.currentSession().find(
139
				"from SystemUser where name=?", name, Hibernate.STRING);
140
 
141
			if(list.size() == 0)
142
				return null;
143
			else
144
				return (SystemUser)list.get(0);
145
		}
146
		catch(HibernateException ex)
147
		{
148
			throw new ModelException(ex);
149
		}
150
	}
151
 
152
	protected SystemUser findForUid(Integer uid)
153
		throws ModelException
154
	{
155
		try {
156
			List list = HibernateUtil.currentSession().find(
157
				"from SystemUser where uid=?", uid, Hibernate.INTEGER);
158
 
159
			if(list.size() == 0)
160
				return null;
161
			else
162
				return (SystemUser)list.get(0);
163
		}
164
		catch(HibernateException ex)
165
		{
166
			throw new ModelException(ex);
167
		}
168
	}
169
 
170
	public void save(User editor, SystemUser systemUser)
171
		throws ModelException
172
	{
173
		if(!systemUser.editableBy(editor))
174
			throw new ModelSecurityException();
175
 
1011 dev 176
        boolean isNew = systemUser.isNew();
177
 
1010 dev 178
		//systemUser.setModUser(editor);  // FIXME
919 dev 179
 
180
		try {
181
			HibernateUtil.currentSession().saveOrUpdate(systemUser);
182
		}
183
		catch(HibernateException ex)
184
		{
185
			throw new ModelException(ex);
186
		}
1011 dev 187
 
188
        // inform listeners
189
        if(isNew) {
190
        	for(Iterator i = createdListeners.iterator(); i.hasNext(); ) {
191
        		SystemUserCreatedListener listener = (SystemUserCreatedListener)i.next();
192
    			listener.systemUserCreated(editor, systemUser);
193
        	}
194
        }
195
        else {
196
            SystemUser oldSystemUser = systemUser.getOrigin();
197
            if(oldSystemUser == null) oldSystemUser = systemUser;
198
        	for(Iterator i = modifiedListeners.iterator(); i.hasNext(); ) {
199
        		SystemUserModifiedListener listener = (SystemUserModifiedListener)i.next();
200
    			listener.systemUserModified(editor, systemUser, oldSystemUser);
201
        	}
202
        }
919 dev 203
	}
204
 
1011 dev 205
    public void addCreatedListener(SystemUserCreatedListener listener)
206
    {
207
    	createdListeners.add(listener);
208
    }
209
 
210
    public void removeCreatedListener(SystemUserCreatedListener listener)
211
    {
212
    	createdListeners.remove(listener);
213
    }
214
 
215
    public void addModifiedListener(SystemUserModifiedListener listener)
216
    {
217
    	modifiedListeners.add(listener);
218
    }
219
 
220
    public void removeModifiedListener(SystemUserModifiedListener listener)
221
    {
222
    	modifiedListeners.remove(listener);
223
    }
224
 
949 dev 225
    public void addBeforeDeleteListener(SystemUserBeforeDeleteListener listener)
226
    {
227
    	beforeDeleteListeners.add(listener);
228
    }
229
 
230
    public void removeBeforeDeleteListener(SystemUserBeforeDeleteListener listener)
231
    {
232
    	beforeDeleteListeners.remove(listener);
233
    }
234
 
1014 dev 235
    public void addDeletingListener(SystemUserDeletingListener listener)
236
    {
237
    	deletingListeners.add(listener);
238
    }
239
 
240
    public void removeDeletingListener(SystemUserDeletingListener listener)
241
    {
242
    	deletingListeners.remove(listener);
243
    }
244
 
1011 dev 245
    public void addDeletedListener(SystemUserDeletedListener listener)
246
    {
247
    	deletedListeners.add(listener);
248
    }
249
 
250
    public void removeDeletedListener(SystemUserDeletedListener listener)
251
    {
252
    	deletedListeners.remove(listener);
253
    }
254
 
949 dev 255
    public Collection beforeDelete(User editor, SystemUser user, Collection known)
256
		throws ModelException
257
    {
258
    	Collection cascade = new ArrayList();
259
 
260
    	for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) {
261
    		SystemUserBeforeDeleteListener listener = (SystemUserBeforeDeleteListener)i.next();
262
			Collection subcascade = listener.systemUserBeforeDelete(editor, user, known);
263
    		if(subcascade != null)
264
    			cascade.addAll(subcascade);
265
    	}
266
 
267
    	return cascade;
268
    }
269
 
919 dev 270
	public void delete(User editor, SystemUser systemUser)
271
		throws ModelException
272
	{
1011 dev 273
	    // check rights
919 dev 274
		if(!systemUser.deleteableBy(editor))
275
			throw new ModelSecurityException();
276
 
1014 dev 277
        // inform deleting listeners
278
    	for(Iterator i = deletingListeners.iterator(); i.hasNext(); ) {
279
    		SystemUserDeletingListener listener = (SystemUserDeletingListener)i.next();
280
			listener.systemUserDeleting(editor, systemUser);
281
    	}
282
 
1011 dev 283
        // backup copy
284
        SystemUser oldSystemUser = new SystemUser(systemUser);
285
 
286
        // delete it
919 dev 287
		try {
288
			HibernateUtil.currentSession().delete(systemUser);
289
		}
290
		catch(HibernateException ex)
291
		{
292
			throw new ModelException(ex);
293
		}
1011 dev 294
 
1014 dev 295
        // inform deleted listeners
1011 dev 296
    	for(Iterator i = deletedListeners.iterator(); i.hasNext(); ) {
297
    		SystemUserDeletedListener listener = (SystemUserDeletedListener)i.next();
298
			listener.systemUserDeleted(editor, oldSystemUser);
299
    	}
919 dev 300
	}
301
 
302
	public Collection listSystemUsers(User editor)
303
		throws ModelException
304
	{
305
		try {
306
			if(editor.isSuperuser()) {
307
				return HibernateUtil.currentSession().find("from SystemUser");
308
			}
309
			else {
310
				return HibernateUtil.currentSession().find(
311
					"select u from SystemUser u left join u.owner o where o is null or o=?",
312
					editor, Hibernate.entity(User.class));
313
			}
314
		}
315
		catch(HibernateException ex)
316
		{
317
			throw new ModelException(ex);
318
		}
319
	}
320
 
321
	public boolean areSystemUsersAvailable(User editor)
322
		throws ModelException
323
	{
324
		try {
325
			if(editor.isSuperuser())
326
				return true;
327
			else
328
				return ((Integer)HibernateUtil.currentSession().iterate(
329
					"select count(*) from SystemUser u left join u.owner o where o is null or o=?",
330
					editor, Hibernate.entity(User.class)).next()).intValue() > 0;
331
		}
332
		catch(HibernateException ex)
333
		{
334
			throw new ModelException(ex);
335
		}
336
	}
337
 
949 dev 338
	public Collection userBeforeDelete(User editor, User user, Collection known)
339
		throws ModelException
919 dev 340
	{
949 dev 341
        Collection systemUsers;
919 dev 342
 
949 dev 343
		try {
344
			systemUsers = HibernateUtil.currentSession().find(
345
				"from SystemUser where owner = ?",
346
				user, Hibernate.entity(User.class) );
347
		}
348
		catch(HibernateException ex)
349
		{
350
			throw new ModelException(ex);
351
		}
352
 
353
    	Collection cascade = new ArrayList();
354
		for(Iterator i = systemUsers.iterator(); i.hasNext(); ) {
355
			SystemUser u = (SystemUser)i.next();
356
            if(u.viewableBy(editor)) {
357
				if(u.deleteableBy(editor))
358
					cascade.add(new CascadeDeleteElement(u, CascadeDeleteElement.DELETE,
359
						this.beforeDelete(editor, u, known)));
360
				else
361
					cascade.add(new CascadeDeleteElement(u, CascadeDeleteElement.FORBIDDEN, null));
362
			}
363
			else {
364
				cascade.add(new CascadeDeleteElement(SystemUser.createLimitedCopy(u),
365
					CascadeDeleteElement.FORBIDDEN, null));
366
			}
367
		}
368
 
369
    	return cascade;
919 dev 370
	}
371
 
1014 dev 372
	public void userDeleting(User editor, User user)
373
		throws ModelException
374
	{
375
        Collection systemUsers;
376
 
377
		try {
378
			systemUsers = HibernateUtil.currentSession().find(
379
				"from SystemUser where owner = ?",
380
				user, Hibernate.entity(User.class) );
381
		}
382
		catch(HibernateException ex)
383
		{
384
			throw new ModelException(ex);
385
		}
386
 
387
		for(Iterator i = systemUsers.iterator(); i.hasNext(); ) {
388
			delete(editor, (SystemUser)i.next());
389
		}
390
    }
391
 
919 dev 392
	public static final Comparator UID_COMPARATOR  = new UidComparator();
393
	public static final Comparator NAME_COMPARATOR = new NameComparator();
394
 
395
	private static class UidComparator
396
		implements Comparator
397
	{
398
		public int compare(Object o1, Object o2)
399
		{
400
			if(!(o1 instanceof SystemUser) || !(o2 instanceof SystemUser))
401
				throw new ClassCastException("not a SystemUser");
402
 
403
		    SystemUser a1 = (SystemUser)o1;
404
		    SystemUser a2 = (SystemUser)o2;
405
 
406
		    if(a1 == null && a2 == null)
407
		    	return 0;
408
		    else if(a1 == null && a2 != null)
409
		    	return -1;
410
		    else if(a1 != null && a2 == null)
411
		    	return 1;
412
		    else
413
		    	return a1.getUid().compareTo(a2.getUid());
414
		}
415
 
416
		public boolean equals(Object obj)
417
		{
418
			return (obj instanceof UidComparator);
419
		}
420
	}
421
 
422
	private static class NameComparator
423
		implements Comparator
424
	{
425
		public int compare(Object o1, Object o2)
426
		{
427
			if(!(o1 instanceof SystemUser) || !(o2 instanceof SystemUser))
428
				throw new ClassCastException("not a SystemUser");
429
 
430
		    SystemUser a1 = (SystemUser)o1;
431
		    SystemUser a2 = (SystemUser)o2;
432
 
433
		    if(a1 == null && a2 == null)
434
		    	return 0;
435
		    else if(a1 == null && a2 != null)
436
		    	return -1;
437
		    else if(a1 != null && a2 == null)
438
		    	return 1;
439
		    else
440
		    	return a1.getName().compareToIgnoreCase(a2.getName());
441
		}
442
 
443
		public boolean equals(Object obj)
444
		{
445
			return (obj instanceof NameComparator);
446
		}
447
	}
448
}