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