]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.util/src/org/argeo/osgi/useradmin/AggregatingUserAdmin.java
Introduce system roles
[lgpl/argeo-commons.git] / org.argeo.util / src / org / argeo / osgi / useradmin / AggregatingUserAdmin.java
index c274ed97e581c934515d11adce2bf19b82e2661a..ca1fa338bab58e785dbda260e8431f908c1bd811 100644 (file)
@@ -1,5 +1,7 @@
 package org.argeo.osgi.useradmin;
 
+import static org.argeo.osgi.useradmin.AbstractUserDirectory.toLdapName;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -7,6 +9,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 import javax.naming.InvalidNameException;
 import javax.naming.ldap.LdapName;
@@ -75,9 +78,9 @@ public class AggregatingUserAdmin implements UserAdmin {
        public User getUser(String key, String value) {
                List<User> res = new ArrayList<User>();
                for (UserAdmin userAdmin : businessRoles.values()) {
-                               User u = userAdmin.getUser(key, value);
-                               if (u != null)
-                                       res.add(u);
+                       User u = userAdmin.getUser(key, value);
+                       if (u != null)
+                               res.add(u);
                }
                // Note: node roles cannot contain users, so it is not searched
                return res.size() == 1 ? res.get(0) : null;
@@ -153,15 +156,19 @@ public class AggregatingUserAdmin implements UserAdmin {
        //
        // USER ADMIN AGGREGATOR
        //
-       protected void addUserDirectory(AbstractUserDirectory userDirectory) {
-               LdapName baseDn = userDirectory.getBaseDn();
-               if (isSystemRolesBaseDn(baseDn)) {
+       protected void addUserDirectory(UserDirectory ud) {
+               if (!(ud instanceof AbstractUserDirectory))
+                       throw new IllegalArgumentException("Only " + AbstractUserDirectory.class.getName() + " is supported");
+               AbstractUserDirectory userDirectory = (AbstractUserDirectory) ud;
+               String basePath = userDirectory.getContext();
+               if (isSystemRolesBaseDn(basePath)) {
                        this.systemRoles = userDirectory;
                        systemRoles.setExternalRoles(this);
-               } else if (isTokensBaseDn(baseDn)) {
+               } else if (isTokensBaseDn(basePath)) {
                        this.tokens = userDirectory;
                        tokens.setExternalRoles(this);
                } else {
+                       LdapName baseDn = toLdapName(basePath);
                        if (businessRoles.containsKey(baseDn))
                                throw new UserDirectoryException("There is already a user admin for " + baseDn);
                        businessRoles.put(baseDn, userDirectory);
@@ -171,20 +178,9 @@ public class AggregatingUserAdmin implements UserAdmin {
        }
 
        /** Called after a new user directory has been added */
-       protected void postAdd(AbstractUserDirectory userDirectory) {
+       protected void postAdd(UserDirectory userDirectory) {
        }
 
-//     private UserAdmin findUserAdmin(User user) {
-//             if (user == null)
-//                     throw new IllegalArgumentException("User should not be null");
-//             AbstractUserDirectory userAdmin = findUserAdmin(user.getName());
-//             if (user instanceof DirectoryUser) {
-//                     return userAdmin;
-//             } else {
-//                     return userAdmin.scope(user);
-//             }
-//     }
-
        private AbstractUserDirectory findUserAdmin(String name) {
                try {
                        return findUserAdmin(new LdapName(name));
@@ -223,12 +219,12 @@ public class AggregatingUserAdmin implements UserAdmin {
                return res.get(0);
        }
 
-       protected boolean isSystemRolesBaseDn(LdapName baseDn) {
-               return baseDn.equals(systemRolesBaseDn);
+       protected boolean isSystemRolesBaseDn(String basePath) {
+               return toLdapName(basePath).equals(systemRolesBaseDn);
        }
 
-       protected boolean isTokensBaseDn(LdapName baseDn) {
-               return tokensBaseDn != null && baseDn.equals(tokensBaseDn);
+       protected boolean isTokensBaseDn(String basePath) {
+               return tokensBaseDn != null && toLdapName(basePath).equals(tokensBaseDn);
        }
 
 //     protected Dictionary<String, Object> currentState() {
@@ -258,9 +254,10 @@ public class AggregatingUserAdmin implements UserAdmin {
                userDirectory.destroy();
        }
 
-       protected void removeUserDirectory(LdapName baseDn) {
-               if (isSystemRolesBaseDn(baseDn))
+       protected void removeUserDirectory(String basePath) {
+               if (isSystemRolesBaseDn(basePath))
                        throw new UserDirectoryException("System roles cannot be removed ");
+               LdapName baseDn = toLdapName(basePath);
                if (!businessRoles.containsKey(baseDn))
                        throw new UserDirectoryException("No user directory registered for " + baseDn);
                AbstractUserDirectory userDirectory = businessRoles.remove(baseDn);
@@ -271,7 +268,12 @@ public class AggregatingUserAdmin implements UserAdmin {
         * Called before each user directory is destroyed, so that additional actions
         * can be performed.
         */
-       protected void preDestroy(AbstractUserDirectory userDirectory) {
+       protected void preDestroy(UserDirectory userDirectory) {
        }
 
+       public Set<UserDirectory> getUserDirectories() {
+               TreeSet<UserDirectory> res = new TreeSet<>((o1, o2) -> o1.getContext().compareTo(o2.getContext()));
+               res.addAll(businessRoles.values());
+               return res;
+       }
 }