]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.util/src/org/argeo/osgi/useradmin/LdifHierarchyUnit.java
Introduce system roles
[lgpl/argeo-commons.git] / org.argeo.util / src / org / argeo / osgi / useradmin / LdifHierarchyUnit.java
index 5cf52b9a2f34038bdf299b65683456bf1ce31668..d4259c87d5714a4d829fecd03c390b0af843ca9f 100644 (file)
@@ -1,11 +1,13 @@
 package org.argeo.osgi.useradmin;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 
 import javax.naming.directory.Attributes;
 import javax.naming.ldap.LdapName;
+import javax.naming.ldap.Rdn;
 
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.useradmin.Role;
@@ -15,40 +17,51 @@ class LdifHierarchyUnit implements HierarchyUnit {
        private final AbstractUserDirectory directory;
 
        private final LdapName dn;
-       private final int type;
+       private final boolean functional;
        private final Attributes attributes;
 
        HierarchyUnit parent;
        List<HierarchyUnit> children = new ArrayList<>();
 
-       LdifHierarchyUnit(AbstractUserDirectory directory, LdapName dn, int type, Attributes attributes) {
+       LdifHierarchyUnit(AbstractUserDirectory directory, LdapName dn, Attributes attributes) {
                Objects.requireNonNull(directory);
                Objects.requireNonNull(dn);
 
                this.directory = directory;
                this.dn = dn;
-               this.type = type;
                this.attributes = attributes;
+
+               Rdn rdn = LdapNameUtils.getLastRdn(dn);
+               functional = !(directory.getUserBaseRdn().equals(rdn) || directory.getGroupBaseRdn().equals(rdn)
+                               || directory.getSystemRoleBaseRdn().equals(rdn));
        }
 
        @Override
-       public int getHierarchyChildCount() {
-               return children.size();
+       public HierarchyUnit getParent() {
+               return parent;
        }
 
        @Override
-       public HierarchyUnit getHierarchyChild(int i) {
-               return children.get(i);
+       public Iterable<HierarchyUnit> getDirectHierachyUnits(boolean functionalOnly) {
+               List<HierarchyUnit> res = new ArrayList<>();
+               if (functionalOnly)
+                       for (HierarchyUnit hu : children) {
+                               if (hu.isFunctional())
+                                       res.add(hu);
+                       }
+               else
+                       res.addAll(children);
+               return Collections.unmodifiableList(res);
        }
 
        @Override
-       public int getHierarchyUnitType() {
-               return type;
+       public boolean isFunctional() {
+               return functional;
        }
 
        @Override
        public String getHierarchyUnitName() {
-               String name = dn.getRdn(dn.size() - 1).getValue().toString();
+               String name = LdapNameUtils.getLastRdnValue(dn);
                // TODO check ou, o, etc.
                return name;
        }
@@ -58,12 +71,12 @@ class LdifHierarchyUnit implements HierarchyUnit {
        }
 
        @Override
-       public String getBasePath() {
+       public String getContext() {
                return dn.toString();
        }
 
        @Override
-       public List<? extends Role> getRoles(String filter, boolean deep) {
+       public List<? extends Role> getHierarchyUnitRoles(String filter, boolean deep) {
                try {
                        return directory.getRoles(dn, filter, deep);
                } catch (InvalidSyntaxException e) {
@@ -71,6 +84,11 @@ class LdifHierarchyUnit implements HierarchyUnit {
                }
        }
 
+       @Override
+       public UserDirectory getDirectory() {
+               return directory;
+       }
+
        @Override
        public int hashCode() {
                return dn.hashCode();