Introduce Makefile for Java build
[lgpl/argeo-commons.git] / org.argeo.cms.e4 / src / org / argeo / cms / e4 / users / UserAdminWrapper.java
index 5eecaac215c8ab10c618a5ab760cccd0195167cc..16aa78316142a1a37f2340293c7ee15b4437ff9d 100644 (file)
@@ -2,19 +2,17 @@ package org.argeo.cms.e4.users;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Dictionary;
 import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-
-import javax.transaction.Status;
-import javax.transaction.UserTransaction;
 
+import org.argeo.api.cms.CmsConstants;
 import org.argeo.cms.CmsException;
-import org.argeo.node.NodeConstants;
+import org.argeo.osgi.transaction.WorkTransaction;
 import org.argeo.osgi.useradmin.UserAdminConf;
+import org.argeo.osgi.useradmin.UserDirectory;
 import org.osgi.service.useradmin.UserAdmin;
 import org.osgi.service.useradmin.UserAdminEvent;
 import org.osgi.service.useradmin.UserAdminListener;
@@ -24,8 +22,10 @@ public class UserAdminWrapper {
 
        private UserAdmin userAdmin;
        // private ServiceReference<UserAdmin> userAdminServiceReference;
-       private Set<String> uris;
-       private UserTransaction userTransaction;
+//     private Set<String> uris;
+       private Map<UserDirectory, Hashtable<String, String>> userDirectories = Collections
+                       .synchronizedMap(new LinkedHashMap<>());
+       private WorkTransaction userTransaction;
 
        // First effort to simplify UX while managing users and groups
        public final static boolean COMMIT_ON_SAVE = true;
@@ -38,10 +38,10 @@ public class UserAdminWrapper {
         * {@link UserAdminWrapper#commitOrNotifyTransactionStateChange()} once the
         * security model changes have been performed.
         */
-       public UserTransaction beginTransactionIfNeeded() {
+       public WorkTransaction beginTransactionIfNeeded() {
                try {
                        // UserTransaction userTransaction = getUserTransaction();
-                       if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION) {
+                       if (userTransaction.isNoTransactionStatus()) {
                                userTransaction.begin();
                                // UiAdminUtils.notifyTransactionStateChange(userTransaction);
                        }
@@ -59,7 +59,7 @@ public class UserAdminWrapper {
        public void commitOrNotifyTransactionStateChange() {
                try {
                        // UserTransaction userTransaction = getUserTransaction();
-                       if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION)
+                       if (userTransaction.isNoTransactionStatus())
                                return;
 
                        if (UserAdminWrapper.COMMIT_ON_SAVE)
@@ -89,21 +89,34 @@ public class UserAdminWrapper {
 
        public Map<String, String> getKnownBaseDns(boolean onlyWritable) {
                Map<String, String> dns = new HashMap<String, String>();
-               for (String uri : uris) {
-                       if (!uri.startsWith("/"))
-                               continue;
-                       Dictionary<String, ?> props = UserAdminConf.uriAsProperties(uri);
-                       String readOnly = UserAdminConf.readOnly.getValue(props);
-                       String baseDn = UserAdminConf.baseDn.getValue(props);
+               for (UserDirectory userDirectory : userDirectories.keySet()) {
+                       Boolean readOnly = userDirectory.isReadOnly();
+                       String baseDn = userDirectory.getBaseDn().toString();
 
-                       if (onlyWritable && "true".equals(readOnly))
+                       if (onlyWritable && readOnly)
                                continue;
-                       if (baseDn.equalsIgnoreCase(NodeConstants.ROLES_BASEDN))
+                       if (baseDn.equalsIgnoreCase(CmsConstants.ROLES_BASEDN))
                                continue;
-                       if (baseDn.equalsIgnoreCase(NodeConstants.TOKENS_BASEDN))
+                       if (baseDn.equalsIgnoreCase(CmsConstants.TOKENS_BASEDN))
                                continue;
-                       dns.put(baseDn, uri);
+                       dns.put(baseDn, UserAdminConf.propertiesAsUri(userDirectories.get(userDirectory)).toString());
+
                }
+//             for (String uri : uris) {
+//                     if (!uri.startsWith("/"))
+//                             continue;
+//                     Dictionary<String, ?> props = UserAdminConf.uriAsProperties(uri);
+//                     String readOnly = UserAdminConf.readOnly.getValue(props);
+//                     String baseDn = UserAdminConf.baseDn.getValue(props);
+//
+//                     if (onlyWritable && "true".equals(readOnly))
+//                             continue;
+//                     if (baseDn.equalsIgnoreCase(NodeConstants.ROLES_BASEDN))
+//                             continue;
+//                     if (baseDn.equalsIgnoreCase(NodeConstants.TOKENS_BASEDN))
+//                             continue;
+//                     dns.put(baseDn, uri);
+//             }
                return dns;
        }
 
@@ -111,20 +124,28 @@ public class UserAdminWrapper {
                return userAdmin;
        }
 
-       public UserTransaction getUserTransaction() {
+       public WorkTransaction getUserTransaction() {
                return userTransaction;
        }
 
        /* DEPENDENCY INJECTION */
        public void setUserAdmin(UserAdmin userAdmin, Map<String, String> properties) {
                this.userAdmin = userAdmin;
-               this.uris = Collections.unmodifiableSortedSet(new TreeSet<>(properties.keySet()));
+//             this.uris = Collections.unmodifiableSortedSet(new TreeSet<>(properties.keySet()));
        }
 
-       public void setUserTransaction(UserTransaction userTransaction) {
+       public void setUserTransaction(WorkTransaction userTransaction) {
                this.userTransaction = userTransaction;
        }
 
+       public void addUserDirectory(UserDirectory userDirectory, Map<String, String> properties) {
+               userDirectories.put(userDirectory, new Hashtable<>(properties));
+       }
+
+       public void removeUserDirectory(UserDirectory userDirectory, Map<String, String> properties) {
+               userDirectories.remove(userDirectory);
+       }
+
        // public void setUserAdminServiceReference(
        // ServiceReference<UserAdmin> userAdminServiceReference) {
        // this.userAdminServiceReference = userAdminServiceReference;