Subversion Repositories general

Rev

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