From: Mathieu Baudier Date: Sun, 26 Jun 2022 08:47:05 +0000 (+0200) Subject: Directory as a hierarchy unit. X-Git-Tag: v2.3.10~160 X-Git-Url: https://git.argeo.org/?a=commitdiff_plain;h=3066d79e3ced9339679672242bdf2340a03e1f29;p=lgpl%2Fargeo-commons.git Directory as a hierarchy unit. --- diff --git a/org.argeo.cms/src/org/argeo/cms/acr/directory/HierarchyUnitContent.java b/org.argeo.cms/src/org/argeo/cms/acr/directory/HierarchyUnitContent.java index 0ec025ced..bf8dae72e 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/directory/HierarchyUnitContent.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/directory/HierarchyUnitContent.java @@ -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 iterator() { List 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, diff --git a/org.argeo.util/src/org/argeo/util/directory/Directory.java b/org.argeo.util/src/org/argeo/util/directory/Directory.java index 0bbb5e53f..351a608bc 100644 --- a/org.argeo.util/src/org/argeo/util/directory/Directory.java +++ b/org.argeo.util/src/org/argeo/util/directory/Directory.java @@ -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. diff --git a/org.argeo.util/src/org/argeo/util/directory/HierarchyUnit.java b/org.argeo.util/src/org/argeo/util/directory/HierarchyUnit.java index 68cc1bb2d..2673f16f0 100644 --- a/org.argeo.util/src/org/argeo/util/directory/HierarchyUnit.java +++ b/org.argeo.util/src/org/argeo/util/directory/HierarchyUnit.java @@ -8,7 +8,7 @@ public interface HierarchyUnit { HierarchyUnit getParent(); - Iterable getDirectHierachyUnits(boolean functionalOnly); + Iterable getDirectHierarchyUnits(boolean functionalOnly); boolean isFunctional(); diff --git a/org.argeo.util/src/org/argeo/util/directory/ldap/AbstractLdapDirectory.java b/org.argeo.util/src/org/argeo/util/directory/ldap/AbstractLdapDirectory.java index eab82e0ec..55449a707 100644 --- a/org.argeo.util/src/org/argeo/util/directory/ldap/AbstractLdapDirectory.java +++ b/org.argeo.util/src/org/argeo/util/directory/ldap/AbstractLdapDirectory.java @@ -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) { diff --git a/org.argeo.util/src/org/argeo/util/directory/ldap/LdapDao.java b/org.argeo.util/src/org/argeo/util/directory/ldap/LdapDao.java index 8e26cb44f..d93fb7fdf 100644 --- a/org.argeo.util/src/org/argeo/util/directory/ldap/LdapDao.java +++ b/org.argeo.util/src/org/argeo/util/directory/ldap/LdapDao.java @@ -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) { diff --git a/org.argeo.util/src/org/argeo/util/directory/ldap/LdapHierarchyUnit.java b/org.argeo.util/src/org/argeo/util/directory/ldap/LdapHierarchyUnit.java index a9043cc38..c2fdef4d2 100644 --- a/org.argeo.util/src/org/argeo/util/directory/ldap/LdapHierarchyUnit.java +++ b/org.argeo.util/src/org/argeo/util/directory/ldap/LdapHierarchyUnit.java @@ -24,7 +24,7 @@ public class LdapHierarchyUnit extends DefaultLdapEntry implements HierarchyUnit } @Override - public Iterable getDirectHierachyUnits(boolean functionalOnly) { + public Iterable getDirectHierarchyUnits(boolean functionalOnly) { return getDirectoryDao().doGetDirectHierarchyUnits(getDn(), functionalOnly); } diff --git a/org.argeo.util/src/org/argeo/util/directory/ldap/LdifDao.java b/org.argeo.util/src/org/argeo/util/directory/ldap/LdifDao.java index 5826d86ac..740a47624 100644 --- a/org.argeo.util/src/org/argeo/util/directory/ldap/LdifDao.java +++ b/org.argeo.util/src/org/argeo/util/directory/ldap/LdifDao.java @@ -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); }