Subversion Repositories general

Rev

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