]> git.argeo.org Git - lgpl/argeo-commons.git/blob - UserAdminWrapper.java
2f59e8642f2e8e90c669a265f389551761fd5848
[lgpl/argeo-commons.git] / UserAdminWrapper.java
1 package org.argeo.cms.ui.workbench.internal.useradmin;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.transaction.Status;
7 import javax.transaction.UserTransaction;
8
9 import org.argeo.cms.CmsException;
10 import org.osgi.service.useradmin.UserAdminEvent;
11 import org.osgi.service.useradmin.UserAdminListener;
12
13 /** Centralise interaction with the UserAdmin in this bundle */
14 public class UserAdminWrapper extends
15 org.argeo.cms.util.useradmin.UserAdminWrapper {
16
17 // First effort to simplify UX while managing users and groups
18 public final static boolean COMMIT_ON_SAVE = true;
19
20 // Registered listeners
21 List<UserAdminListener> listeners = new ArrayList<UserAdminListener>();
22
23 /**
24 * Starts a transaction if necessary. Should always been called together
25 * with {@link UserAdminWrapper#commitOrNotifyTransactionStateChange()} once
26 * the security model changes have been performed.
27 */
28 public UserTransaction beginTransactionIfNeeded() {
29 try {
30 UserTransaction userTransaction = getUserTransaction();
31 if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION) {
32 userTransaction.begin();
33 // UiAdminUtils.notifyTransactionStateChange(userTransaction);
34 }
35 return userTransaction;
36 } catch (Exception e) {
37 throw new CmsException("Unable to begin transaction", e);
38 }
39 }
40
41 /**
42 * Depending on the current application configuration, it will either commit
43 * the current transaction or throw a notification that the transaction
44 * state has changed (In the later case, it must be called from the UI
45 * thread).
46 */
47 public void commitOrNotifyTransactionStateChange() {
48 try {
49 UserTransaction userTransaction = getUserTransaction();
50 if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION)
51 return;
52
53 if (UserAdminWrapper.COMMIT_ON_SAVE)
54 userTransaction.commit();
55 else
56 UiAdminUtils.notifyTransactionStateChange(userTransaction);
57 } catch (Exception e) {
58 throw new CmsException("Unable to clean transaction", e);
59 }
60 }
61
62 // TODO implement safer mechanism
63 public void addListener(UserAdminListener userAdminListener) {
64 if (!listeners.contains(userAdminListener))
65 listeners.add(userAdminListener);
66 }
67
68 public void removeListener(UserAdminListener userAdminListener) {
69 if (listeners.contains(userAdminListener))
70 listeners.remove(userAdminListener);
71 }
72
73 public void notifyListeners(UserAdminEvent event) {
74 for (UserAdminListener listener : listeners)
75 listener.roleChanged(event);
76 }
77 }