Directory as a hierarchy unit.
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 26 Jun 2022 08:47:05 +0000 (10:47 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 26 Jun 2022 08:47:05 +0000 (10:47 +0200)
org.argeo.cms/src/org/argeo/cms/acr/directory/HierarchyUnitContent.java
org.argeo.util/src/org/argeo/util/directory/Directory.java
org.argeo.util/src/org/argeo/util/directory/HierarchyUnit.java
org.argeo.util/src/org/argeo/util/directory/ldap/AbstractLdapDirectory.java
org.argeo.util/src/org/argeo/util/directory/ldap/LdapDao.java
org.argeo.util/src/org/argeo/util/directory/ldap/LdapHierarchyUnit.java
org.argeo.util/src/org/argeo/util/directory/ldap/LdifDao.java

index 0ec025ced2c153bfa80170bf497ed4f8cd409021..bf8dae72eb722df203ae8a0a13666745ee6a8844 100644 (file)
@@ -13,6 +13,7 @@ import org.argeo.api.acr.ContentName;
 import org.argeo.api.acr.CrName;
 import org.argeo.api.acr.spi.ProvidedSession;
 import org.argeo.osgi.useradmin.UserDirectory;
+import org.argeo.util.directory.Directory;
 import org.argeo.util.directory.HierarchyUnit;
 import org.osgi.service.useradmin.Role;
 
@@ -44,7 +45,7 @@ class HierarchyUnitContent extends AbstractDirectoryContent {
        @Override
        public Content getParent() {
                HierarchyUnit parentHu = hierarchyUnit.getParent();
-               if (parentHu == null) {
+               if (parentHu instanceof Directory) {
                        return new DirectoryContent(getSession(), provider, hierarchyUnit.getDirectory());
                }
                return new HierarchyUnitContent(getSession(), provider, parentHu);
@@ -53,7 +54,7 @@ class HierarchyUnitContent extends AbstractDirectoryContent {
        @Override
        public Iterator<Content> iterator() {
                List<Content> lst = new ArrayList<>();
-               for (HierarchyUnit hu : hierarchyUnit.getDirectHierachyUnits(false))
+               for (HierarchyUnit hu : hierarchyUnit.getDirectHierarchyUnits(false))
                        lst.add(new HierarchyUnitContent(getSession(), provider, hu));
 
                for (Role role : ((UserDirectory) hierarchyUnit.getDirectory()).getHierarchyUnitRoles(hierarchyUnit, null,
index 0bbb5e53f7bdd3ff35c283596d899bdddea93ddd..351a608bc53c9c3dbfdb81910c858a54b1a3e56e 100644 (file)
@@ -5,7 +5,7 @@ import java.util.Optional;
 
 import org.argeo.util.transaction.WorkControl;
 
-public interface Directory {
+public interface Directory extends HierarchyUnit {
        /**
         * The base of the hierarchy defined by this directory. This could typically be
         * an LDAP base DN.
index 68cc1bb2d5de7cbe308dd1322b8c0c656f025455..2673f16f0760cf04ad2f75ab6929d1418d5862ed 100644 (file)
@@ -8,7 +8,7 @@ public interface HierarchyUnit {
 
        HierarchyUnit getParent();
 
-       Iterable<HierarchyUnit> getDirectHierachyUnits(boolean functionalOnly);
+       Iterable<HierarchyUnit> getDirectHierarchyUnits(boolean functionalOnly);
 
        boolean isFunctional();
 
index eab82e0ec3a0ba2ea2426b01d62a6d7ab20f4c56..55449a70748f3a0f7b4bf079123adc70988b4b7b 100644 (file)
@@ -281,6 +281,26 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv
                return directoryDao.doGetDirectHierarchyUnits(baseDn, functionalOnly);
        }
 
+       @Override
+       public String getHierarchyUnitName() {
+               return getName();
+       }
+
+       @Override
+       public HierarchyUnit getParent() {
+               return null;
+       }
+
+       @Override
+       public boolean isFunctional() {
+               return true;
+       }
+
+       @Override
+       public Directory getDirectory() {
+               return this;
+       }
+
        /*
         * PATHS
         */
@@ -314,7 +334,9 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv
                        LdapName name = (LdapName) getBaseDn().clone();
                        String[] segments = path.split("/");
                        Rdn parentRdn = null;
-                       for (String segment : segments) {
+                       // segments[0] is the directory itself
+                       for (int i = 0; i < segments.length; i++) {
+                               String segment = segments[i];
                                // TODO make attr names configurable ?
                                String attr = LdapAttrs.ou.name();
                                if (parentRdn != null) {
index 8e26cb44f14125206446e23eb0cf0849f26ebe50..d93fb7fdf62074d5be80f53563a41992bb50aa69 100644 (file)
@@ -246,7 +246,9 @@ public class LdapDao extends AbstractLdapDirectoryDao {
        public HierarchyUnit doGetHierarchyUnit(LdapName dn) {
                try {
                        if (getDirectory().getBaseDn().equals(dn))
-                               return null;
+                               return getDirectory();
+                       if (!dn.startsWith(getDirectory().getBaseDn()))
+                               throw new IllegalArgumentException(dn + " does not start with abse DN " + getDirectory().getBaseDn());
                        Attributes attrs = ldapConnection.getAttributes(dn);
                        return new LdapHierarchyUnit(getDirectory(), dn, attrs);
                } catch (NamingException e) {
index a9043cc38cb13c941982b345a39aeb1f5ce2e129..c2fdef4d229d5eb76faf342ccd571d1f6e23f72e 100644 (file)
@@ -24,7 +24,7 @@ public class LdapHierarchyUnit extends DefaultLdapEntry implements HierarchyUnit
        }
 
        @Override
-       public Iterable<HierarchyUnit> getDirectHierachyUnits(boolean functionalOnly) {
+       public Iterable<HierarchyUnit> getDirectHierarchyUnits(boolean functionalOnly) {
                return getDirectoryDao().doGetDirectHierarchyUnits(getDn(), functionalOnly);
        }
 
index 5826d86ac1d29324d50f31badf63afcc5bb6a98d..740a4762468405e762bba24ad8b61e3b01a1d4ef 100644 (file)
@@ -364,6 +364,8 @@ public class LdifDao extends AbstractLdapDirectoryDao {
 //     }
        @Override
        public HierarchyUnit doGetHierarchyUnit(LdapName dn) {
+               if (getDirectory().getBaseDn().equals(dn))
+                       return getDirectory();
                return hierarchy.get(dn);
        }