1 package org
.argeo
.cms
.e4
.users
;
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
;
11 import org
.argeo
.api
.cms
.CmsConstants
;
12 import org
.argeo
.cms
.swt
.CmsException
;
13 import org
.argeo
.osgi
.useradmin
.UserDirectory
;
14 import org
.argeo
.util
.directory
.DirectoryConf
;
15 import org
.argeo
.util
.transaction
.WorkTransaction
;
16 import org
.osgi
.service
.useradmin
.UserAdmin
;
17 import org
.osgi
.service
.useradmin
.UserAdminEvent
;
18 import org
.osgi
.service
.useradmin
.UserAdminListener
;
20 /** Centralise interaction with the UserAdmin in this bundle */
21 public class UserAdminWrapper
{
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
;
30 // First effort to simplify UX while managing users and groups
31 public final static boolean COMMIT_ON_SAVE
= true;
33 // Registered listeners
34 List
<UserAdminListener
> listeners
= new ArrayList
<UserAdminListener
>();
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.
41 public WorkTransaction
beginTransactionIfNeeded() {
43 // UserTransaction userTransaction = getUserTransaction();
44 if (userTransaction
.isNoTransactionStatus()) {
45 userTransaction
.begin();
46 // UiAdminUtils.notifyTransactionStateChange(userTransaction);
48 return userTransaction
;
49 } catch (Exception e
) {
50 throw new CmsException("Unable to begin transaction", e
);
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).
59 public void commitOrNotifyTransactionStateChange() {
61 // UserTransaction userTransaction = getUserTransaction();
62 if (userTransaction
.isNoTransactionStatus())
65 if (UserAdminWrapper
.COMMIT_ON_SAVE
)
66 userTransaction
.commit();
68 UiAdminUtils
.notifyTransactionStateChange(userTransaction
);
69 } catch (Exception e
) {
70 throw new CmsException("Unable to clean transaction", e
);
74 // TODO implement safer mechanism
75 public void addListener(UserAdminListener userAdminListener
) {
76 if (!listeners
.contains(userAdminListener
))
77 listeners
.add(userAdminListener
);
80 public void removeListener(UserAdminListener userAdminListener
) {
81 if (listeners
.contains(userAdminListener
))
82 listeners
.remove(userAdminListener
);
85 public void notifyListeners(UserAdminEvent event
) {
86 for (UserAdminListener listener
: listeners
)
87 listener
.roleChanged(event
);
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
.getContext();
96 if (onlyWritable
&& readOnly
)
98 if (baseDn
.equalsIgnoreCase(CmsConstants
.ROLES_BASEDN
))
100 if (baseDn
.equalsIgnoreCase(CmsConstants
.TOKENS_BASEDN
))
102 dns
.put(baseDn
, DirectoryConf
.propertiesAsUri(userDirectories
.get(userDirectory
)).toString());
105 // for (String uri : uris) {
106 // if (!uri.startsWith("/"))
108 // Dictionary<String, ?> props = UserAdminConf.uriAsProperties(uri);
109 // String readOnly = UserAdminConf.readOnly.getValue(props);
110 // String baseDn = UserAdminConf.baseDn.getValue(props);
112 // if (onlyWritable && "true".equals(readOnly))
114 // if (baseDn.equalsIgnoreCase(NodeConstants.ROLES_BASEDN))
116 // if (baseDn.equalsIgnoreCase(NodeConstants.TOKENS_BASEDN))
118 // dns.put(baseDn, uri);
123 public UserAdmin
getUserAdmin() {
127 public WorkTransaction
getUserTransaction() {
128 return userTransaction
;
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()));
137 public void setUserTransaction(WorkTransaction userTransaction
) {
138 this.userTransaction
= userTransaction
;
141 public void addUserDirectory(UserDirectory userDirectory
, Map
<String
, String
> properties
) {
142 userDirectories
.put(userDirectory
, new Hashtable
<>(properties
));
145 public void removeUserDirectory(UserDirectory userDirectory
, Map
<String
, String
> properties
) {
146 userDirectories
.remove(userDirectory
);
149 // public void setUserAdminServiceReference(
150 // ServiceReference<UserAdmin> userAdminServiceReference) {
151 // this.userAdminServiceReference = userAdminServiceReference;