]> git.argeo.org Git - gpl/argeo-slc.git/blob - UserAdminWrapper.java
67c1c7a9b0506c9d62bc988b37a7911092ecab80
[gpl/argeo-slc.git] / UserAdminWrapper.java
1 package org.argeo.cms.ui.workbench.internal.useradmin;
2
3 import java.util.ArrayList;
4 import java.util.Dictionary;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8
9 import org.argeo.api.NodeConstants;
10 import org.argeo.cms.CmsException;
11 import org.argeo.osgi.transaction.WorkTransaction;
12 import org.argeo.osgi.useradmin.UserAdminConf;
13 import org.osgi.framework.ServiceReference;
14 import org.osgi.service.useradmin.UserAdmin;
15 import org.osgi.service.useradmin.UserAdminEvent;
16 import org.osgi.service.useradmin.UserAdminListener;
17
18 /** Centralise interaction with the UserAdmin in this bundle */
19 public class UserAdminWrapper {
20
21 private UserAdmin userAdmin;
22 private ServiceReference<UserAdmin> userAdminServiceReference;
23 private WorkTransaction userTransaction;
24
25 // First effort to simplify UX while managing users and groups
26 public final static boolean COMMIT_ON_SAVE = true;
27
28 // Registered listeners
29 List<UserAdminListener> listeners = new ArrayList<UserAdminListener>();
30
31 /**
32 * Starts a transaction if necessary. Should always been called together
33 * with {@link UserAdminWrapper#commitOrNotifyTransactionStateChange()} once
34 * the security model changes have been performed.
35 */
36 public WorkTransaction beginTransactionIfNeeded() {
37 try {
38 // UserTransaction userTransaction = getUserTransaction();
39 if (userTransaction.isNoTransactionStatus()) {
40 userTransaction.begin();
41 // UiAdminUtils.notifyTransactionStateChange(userTransaction);
42 }
43 return userTransaction;
44 } catch (Exception e) {
45 throw new CmsException("Unable to begin transaction", e);
46 }
47 }
48
49 /**
50 * Depending on the current application configuration, it will either commit
51 * the current transaction or throw a notification that the transaction
52 * state has changed (In the later case, it must be called from the UI
53 * thread).
54 */
55 public void commitOrNotifyTransactionStateChange() {
56 try {
57 // UserTransaction userTransaction = getUserTransaction();
58 if (userTransaction.isNoTransactionStatus())
59 return;
60
61 if (UserAdminWrapper.COMMIT_ON_SAVE)
62 userTransaction.commit();
63 else
64 UiAdminUtils.notifyTransactionStateChange(userTransaction);
65 } catch (Exception e) {
66 throw new CmsException("Unable to clean transaction", e);
67 }
68 }
69
70 // TODO implement safer mechanism
71 public void addListener(UserAdminListener userAdminListener) {
72 if (!listeners.contains(userAdminListener))
73 listeners.add(userAdminListener);
74 }
75
76 public void removeListener(UserAdminListener userAdminListener) {
77 if (listeners.contains(userAdminListener))
78 listeners.remove(userAdminListener);
79 }
80
81 public void notifyListeners(UserAdminEvent event) {
82 for (UserAdminListener listener : listeners)
83 listener.roleChanged(event);
84 }
85
86 public Map<String, String> getKnownBaseDns(boolean onlyWritable) {
87 Map<String, String> dns = new HashMap<String, String>();
88 for (String uri : userAdminServiceReference.getPropertyKeys()) {
89 if (!uri.startsWith("/"))
90 continue;
91 Dictionary<String, ?> props = UserAdminConf.uriAsProperties(uri);
92 String readOnly = UserAdminConf.readOnly.getValue(props);
93 String baseDn = UserAdminConf.baseDn.getValue(props);
94
95 if (onlyWritable && "true".equals(readOnly))
96 continue;
97 if (baseDn.equalsIgnoreCase(NodeConstants.ROLES_BASEDN))
98 continue;
99 dns.put(baseDn, uri);
100 }
101 return dns;
102 }
103
104 public UserAdmin getUserAdmin() {
105 return userAdmin;
106 }
107
108 public WorkTransaction getUserTransaction() {
109 return userTransaction;
110 }
111
112 /* DEPENDENCY INJECTION */
113 public void setUserAdmin(UserAdmin userAdmin) {
114 this.userAdmin = userAdmin;
115 }
116
117 public void setUserTransaction(WorkTransaction userTransaction) {
118 this.userTransaction = userTransaction;
119 }
120
121 public void setUserAdminServiceReference(
122 ServiceReference<UserAdmin> userAdminServiceReference) {
123 this.userAdminServiceReference = userAdminServiceReference;
124 }
125 }