Subversion Repositories general

Rev

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