Refactor Argeo APIs
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / directory / ldap / AbstractLdapDirectory.java
index 06c33b01129107d2b7d724f59a9646a1a1b4fa18..39355c3c415248b16076547092cf2cad98a6729a 100644 (file)
@@ -1,6 +1,6 @@
 package org.argeo.cms.directory.ldap;
 
-import static org.argeo.cms.directory.ldap.LdapNameUtils.toLdapName;
+import static org.argeo.api.acr.ldap.LdapNameUtils.toLdapName;
 
 import java.io.File;
 import java.net.URI;
@@ -26,9 +26,10 @@ import javax.naming.ldap.LdapName;
 import javax.naming.ldap.Rdn;
 import javax.transaction.xa.XAResource;
 
-import org.argeo.api.acr.ldap.LdapAttrs;
-import org.argeo.api.acr.ldap.LdapObjs;
-import org.argeo.api.cms.directory.Directory;
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.acr.ldap.LdapNameUtils;
+import org.argeo.api.acr.ldap.LdapObj;
+import org.argeo.api.cms.directory.CmsDirectory;
 import org.argeo.api.cms.directory.HierarchyUnit;
 import org.argeo.api.cms.transaction.WorkControl;
 import org.argeo.api.cms.transaction.WorkingCopyXaResource;
@@ -36,8 +37,8 @@ import org.argeo.api.cms.transaction.XAResourceProvider;
 import org.argeo.cms.osgi.useradmin.OsUserDirectory;
 import org.argeo.cms.runtime.DirectoryConf;
 
-/** A {@link Directory} based either on LDAP or LDIF. */
-public abstract class AbstractLdapDirectory implements Directory, XAResourceProvider {
+/** A {@link CmsDirectory} based either on LDAP or LDIF. */
+public abstract class AbstractLdapDirectory implements CmsDirectory, XAResourceProvider {
        protected static final String SHARED_STATE_USERNAME = "javax.security.auth.login.name";
        protected static final String SHARED_STATE_PASSWORD = "javax.security.auth.login.password";
 
@@ -56,7 +57,7 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv
        private final boolean scoped;
 
        private List<String> credentialAttributeIds = Arrays
-                       .asList(new String[] { LdapAttrs.userPassword.name(), LdapAttrs.authPassword.name() });
+                       .asList(new String[] { LdapAttr.userPassword.name(), LdapAttr.authPassword.name() });
 
        private WorkControl transactionControl;
        private WorkingCopyXaResource<LdapEntryWorkingCopy> xaResource;
@@ -249,7 +250,7 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv
        protected void collectGroups(LdapEntry user, List<LdapEntry> allRoles) {
                Attributes attrs = user.getAttributes();
                // TODO centralize attribute name
-               Attribute memberOf = attrs.get(LdapAttrs.memberOf.name());
+               Attribute memberOf = attrs.get(LdapAttr.memberOf.name());
                // if user belongs to this directory, we only check memberOf
                if (memberOf != null && user.getDn().startsWith(getBaseDn())) {
                        try {
@@ -299,6 +300,17 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv
                return directoryDao.doGetDirectHierarchyUnits(baseDn, functionalOnly);
        }
 
+       @Override
+       public HierarchyUnit getDirectChild(Type type) {
+               // TODO factorise with hierarchy unit?
+               return switch (type) {
+               case ROLES -> getDirectoryDao().doGetHierarchyUnit((LdapName) getBaseDn().add(getSystemRoleBaseRdn()));
+               case PEOPLE -> getDirectoryDao().doGetHierarchyUnit((LdapName) getBaseDn().add(getUserBaseRdn()));
+               case GROUPS -> getDirectoryDao().doGetHierarchyUnit((LdapName) getBaseDn().add(getGroupBaseRdn()));
+               case FUNCTIONAL -> throw new IllegalArgumentException("Type must be a technical type");
+               };
+       }
+
        @Override
        public String getHierarchyUnitName() {
                return getName();
@@ -320,12 +332,12 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv
        }
 
        @Override
-       public boolean isFunctional() {
-               return true;
+       public boolean isType(Type type) {
+               return Type.FUNCTIONAL.equals(type);
        }
 
        @Override
-       public Directory getDirectory() {
+       public CmsDirectory getDirectory() {
                return this;
        }
 
@@ -338,7 +350,7 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv
                                || wc.getNewData().containsKey(dn))
                        throw new IllegalArgumentException("Already a hierarchy unit " + path);
                BasicAttributes attrs = new BasicAttributes(true);
-               attrs.put(LdapAttrs.objectClass.name(), LdapObjs.organizationalUnit.name());
+               attrs.put(LdapAttr.objectClass.name(), LdapObj.organizationalUnit.name());
                Rdn nameRdn = dn.getRdn(dn.size() - 1);
                // TODO deal with multiple attr RDN
                attrs.put(nameRdn.getType(), nameRdn.getValue());
@@ -385,15 +397,14 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv
                        for (int i = 0; i < segments.length; i++) {
                                String segment = segments[i];
                                // TODO make attr names configurable ?
-                               String attr = getDirectory().getRealm().isPresent()/* IPA */ ? LdapAttrs.cn.name()
-                                               : LdapAttrs.ou.name();
+                               String attr = getDirectory().getRealm().isPresent()/* IPA */ ? LdapAttr.cn.name() : LdapAttr.ou.name();
                                if (parentRdn != null) {
                                        if (getUserBaseRdn().equals(parentRdn))
-                                               attr = LdapAttrs.uid.name();
+                                               attr = LdapAttr.uid.name();
                                        else if (getGroupBaseRdn().equals(parentRdn))
-                                               attr = LdapAttrs.cn.name();
+                                               attr = LdapAttr.cn.name();
                                        else if (getSystemRoleBaseRdn().equals(parentRdn))
-                                               attr = LdapAttrs.cn.name();
+                                               attr = LdapAttr.cn.name();
                                }
                                Rdn rdn = new Rdn(attr, segment);
                                name.add(rdn);
@@ -413,13 +424,13 @@ public abstract class AbstractLdapDirectory implements Directory, XAResourceProv
                return !name.startsWith(baseDn);
        }
 
-       protected static boolean hasObjectClass(Attributes attrs, LdapObjs objectClass) {
+       protected static boolean hasObjectClass(Attributes attrs, LdapObj objectClass) {
                return hasObjectClass(attrs, objectClass.name());
        }
 
        protected static boolean hasObjectClass(Attributes attrs, String objectClass) {
                try {
-                       Attribute attr = attrs.get(LdapAttrs.objectClass.name());
+                       Attribute attr = attrs.get(LdapAttr.objectClass.name());
                        NamingEnumeration<?> en = attr.getAll();
                        while (en.hasMore()) {
                                String v = en.next().toString();