Subversion Repositories general

Rev

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