Subversion Repositories general

Rev

Rev 1014 | Rev 1028 | 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(
1018 dev 139
				"select u from SystemUser u left join fetch u.owner where u.name=?",
140
				name, Hibernate.STRING);
919 dev 141
 
142
			if(list.size() == 0)
143
				return null;
144
			else
145
				return (SystemUser)list.get(0);
146
		}
147
		catch(HibernateException ex)
148
		{
149
			throw new ModelException(ex);
150
		}
151
	}
152
 
153
	protected SystemUser findForUid(Integer uid)
154
		throws ModelException
155
	{
156
		try {
157
			List list = HibernateUtil.currentSession().find(
1018 dev 158
				"select u from SystemUser u left join fetch u.owner where u.uid=?",
159
				uid, Hibernate.INTEGER);
919 dev 160
 
161
			if(list.size() == 0)
162
				return null;
163
			else
164
				return (SystemUser)list.get(0);
165
		}
166
		catch(HibernateException ex)
167
		{
168
			throw new ModelException(ex);
169
		}
170
	}
171
 
172
	public void save(User editor, SystemUser systemUser)
173
		throws ModelException
174
	{
175
		if(!systemUser.editableBy(editor))
176
			throw new ModelSecurityException();
177
 
1011 dev 178
        boolean isNew = systemUser.isNew();
179
 
1010 dev 180
		//systemUser.setModUser(editor);  // FIXME
919 dev 181
 
182
		try {
183
			HibernateUtil.currentSession().saveOrUpdate(systemUser);
184
		}
185
		catch(HibernateException ex)
186
		{
187
			throw new ModelException(ex);
188
		}
1011 dev 189
 
190
        // inform listeners
191
        if(isNew) {
192
        	for(Iterator i = createdListeners.iterator(); i.hasNext(); ) {
193
        		SystemUserCreatedListener listener = (SystemUserCreatedListener)i.next();
194
    			listener.systemUserCreated(editor, systemUser);
195
        	}
196
        }
197
        else {
198
            SystemUser oldSystemUser = systemUser.getOrigin();
199
            if(oldSystemUser == null) oldSystemUser = systemUser;
200
        	for(Iterator i = modifiedListeners.iterator(); i.hasNext(); ) {
201
        		SystemUserModifiedListener listener = (SystemUserModifiedListener)i.next();
202
    			listener.systemUserModified(editor, systemUser, oldSystemUser);
203
        	}
204
        }
919 dev 205
	}
206
 
1011 dev 207
    public void addCreatedListener(SystemUserCreatedListener listener)
208
    {
209
    	createdListeners.add(listener);
210
    }
211
 
212
    public void removeCreatedListener(SystemUserCreatedListener listener)
213
    {
214
    	createdListeners.remove(listener);
215
    }
216
 
217
    public void addModifiedListener(SystemUserModifiedListener listener)
218
    {
219
    	modifiedListeners.add(listener);
220
    }
221
 
222
    public void removeModifiedListener(SystemUserModifiedListener listener)
223
    {
224
    	modifiedListeners.remove(listener);
225
    }
226
 
949 dev 227
    public void addBeforeDeleteListener(SystemUserBeforeDeleteListener listener)
228
    {
229
    	beforeDeleteListeners.add(listener);
230
    }
231
 
232
    public void removeBeforeDeleteListener(SystemUserBeforeDeleteListener listener)
233
    {
234
    	beforeDeleteListeners.remove(listener);
235
    }
236
 
1014 dev 237
    public void addDeletingListener(SystemUserDeletingListener listener)
238
    {
239
    	deletingListeners.add(listener);
240
    }
241
 
242
    public void removeDeletingListener(SystemUserDeletingListener listener)
243
    {
244
    	deletingListeners.remove(listener);
245
    }
246
 
1011 dev 247
    public void addDeletedListener(SystemUserDeletedListener listener)
248
    {
249
    	deletedListeners.add(listener);
250
    }
251
 
252
    public void removeDeletedListener(SystemUserDeletedListener listener)
253
    {
254
    	deletedListeners.remove(listener);
255
    }
256
 
949 dev 257
    public Collection beforeDelete(User editor, SystemUser user, Collection known)
258
		throws ModelException
259
    {
260
    	Collection cascade = new ArrayList();
261
 
262
    	for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) {
263
    		SystemUserBeforeDeleteListener listener = (SystemUserBeforeDeleteListener)i.next();
264
			Collection subcascade = listener.systemUserBeforeDelete(editor, user, known);
265
    		if(subcascade != null)
266
    			cascade.addAll(subcascade);
267
    	}
268
 
269
    	return cascade;
270
    }
271
 
919 dev 272
	public void delete(User editor, SystemUser systemUser)
273
		throws ModelException
274
	{
1011 dev 275
	    // check rights
919 dev 276
		if(!systemUser.deleteableBy(editor))
277
			throw new ModelSecurityException();
278
 
1014 dev 279
        // inform deleting listeners
280
    	for(Iterator i = deletingListeners.iterator(); i.hasNext(); ) {
281
    		SystemUserDeletingListener listener = (SystemUserDeletingListener)i.next();
282
			listener.systemUserDeleting(editor, systemUser);
283
    	}
284
 
1011 dev 285
        // backup copy
286
        SystemUser oldSystemUser = new SystemUser(systemUser);
287
 
288
        // delete it
919 dev 289
		try {
290
			HibernateUtil.currentSession().delete(systemUser);
291
		}
292
		catch(HibernateException ex)
293
		{
294
			throw new ModelException(ex);
295
		}
1011 dev 296
 
1014 dev 297
        // inform deleted listeners
1011 dev 298
    	for(Iterator i = deletedListeners.iterator(); i.hasNext(); ) {
299
    		SystemUserDeletedListener listener = (SystemUserDeletedListener)i.next();
300
			listener.systemUserDeleted(editor, oldSystemUser);
301
    	}
919 dev 302
	}
303
 
304
	public Collection listSystemUsers(User editor)
305
		throws ModelException
306
	{
307
		try {
308
			if(editor.isSuperuser()) {
1018 dev 309
				return HibernateUtil.currentSession().find(
310
					"select u from SystemUser u left join fetch u.owner");
919 dev 311
			}
312
			else {
313
				return HibernateUtil.currentSession().find(
314
					"select u from SystemUser u left join u.owner o where o is null or o=?",
315
					editor, Hibernate.entity(User.class));
316
			}
317
		}
318
		catch(HibernateException ex)
319
		{
320
			throw new ModelException(ex);
321
		}
322
	}
323
 
324
	public boolean areSystemUsersAvailable(User editor)
325
		throws ModelException
326
	{
327
		try {
328
			if(editor.isSuperuser())
329
				return true;
330
			else
331
				return ((Integer)HibernateUtil.currentSession().iterate(
332
					"select count(*) from SystemUser u left join u.owner o where o is null or o=?",
333
					editor, Hibernate.entity(User.class)).next()).intValue() > 0;
334
		}
335
		catch(HibernateException ex)
336
		{
337
			throw new ModelException(ex);
338
		}
339
	}
340
 
949 dev 341
	public Collection userBeforeDelete(User editor, User user, Collection known)
342
		throws ModelException
919 dev 343
	{
949 dev 344
        Collection systemUsers;
919 dev 345
 
949 dev 346
		try {
347
			systemUsers = HibernateUtil.currentSession().find(
1018 dev 348
				"select u from SystemUser u where u.owner = ?",
949 dev 349
				user, Hibernate.entity(User.class) );
350
		}
351
		catch(HibernateException ex)
352
		{
353
			throw new ModelException(ex);
354
		}
355
 
356
    	Collection cascade = new ArrayList();
357
		for(Iterator i = systemUsers.iterator(); i.hasNext(); ) {
358
			SystemUser u = (SystemUser)i.next();
359
            if(u.viewableBy(editor)) {
360
				if(u.deleteableBy(editor))
361
					cascade.add(new CascadeDeleteElement(u, CascadeDeleteElement.DELETE,
362
						this.beforeDelete(editor, u, known)));
363
				else
364
					cascade.add(new CascadeDeleteElement(u, CascadeDeleteElement.FORBIDDEN, null));
365
			}
366
			else {
367
				cascade.add(new CascadeDeleteElement(SystemUser.createLimitedCopy(u),
368
					CascadeDeleteElement.FORBIDDEN, null));
369
			}
370
		}
371
 
372
    	return cascade;
919 dev 373
	}
374
 
1014 dev 375
	public void userDeleting(User editor, User user)
376
		throws ModelException
377
	{
378
        Collection systemUsers;
379
 
380
		try {
381
			systemUsers = HibernateUtil.currentSession().find(
1018 dev 382
				"select u from SystemUser u where u.owner = ?",
1014 dev 383
				user, Hibernate.entity(User.class) );
384
		}
385
		catch(HibernateException ex)
386
		{
387
			throw new ModelException(ex);
388
		}
389
 
390
		for(Iterator i = systemUsers.iterator(); i.hasNext(); ) {
391
			delete(editor, (SystemUser)i.next());
392
		}
393
    }
394
 
919 dev 395
	public static final Comparator UID_COMPARATOR  = new UidComparator();
396
	public static final Comparator NAME_COMPARATOR = new NameComparator();
397
 
398
	private static class UidComparator
399
		implements Comparator
400
	{
401
		public int compare(Object o1, Object o2)
402
		{
403
			if(!(o1 instanceof SystemUser) || !(o2 instanceof SystemUser))
404
				throw new ClassCastException("not a SystemUser");
405
 
406
		    SystemUser a1 = (SystemUser)o1;
407
		    SystemUser a2 = (SystemUser)o2;
408
 
409
		    if(a1 == null && a2 == null)
410
		    	return 0;
411
		    else if(a1 == null && a2 != null)
412
		    	return -1;
413
		    else if(a1 != null && a2 == null)
414
		    	return 1;
415
		    else
416
		    	return a1.getUid().compareTo(a2.getUid());
417
		}
418
 
419
		public boolean equals(Object obj)
420
		{
421
			return (obj instanceof UidComparator);
422
		}
423
	}
424
 
425
	private static class NameComparator
426
		implements Comparator
427
	{
428
		public int compare(Object o1, Object o2)
429
		{
430
			if(!(o1 instanceof SystemUser) || !(o2 instanceof SystemUser))
431
				throw new ClassCastException("not a SystemUser");
432
 
433
		    SystemUser a1 = (SystemUser)o1;
434
		    SystemUser a2 = (SystemUser)o2;
435
 
436
		    if(a1 == null && a2 == null)
437
		    	return 0;
438
		    else if(a1 == null && a2 != null)
439
		    	return -1;
440
		    else if(a1 != null && a2 == null)
441
		    	return 1;
442
		    else
443
		    	return a1.getName().compareToIgnoreCase(a2.getName());
444
		}
445
 
446
		public boolean equals(Object obj)
447
		{
448
			return (obj instanceof NameComparator);
449
		}
450
	}
451
}