Document directory and improve mapping with ACR
authorMathieu Baudier <mbaudier@argeo.org>
Sun, 18 Sep 2022 09:58:18 +0000 (11:58 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sun, 18 Sep 2022 09:58:18 +0000 (11:58 +0200)
org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java
org.argeo.util/src/org/argeo/osgi/useradmin/DirectoryUserAdmin.java
org.argeo.util/src/org/argeo/util/directory/Directory.java
org.argeo.util/src/org/argeo/util/directory/HierarchyUnit.java

index 48b047c295359434450bface9438b986e83aea9b..74e93fc0affa701c78233641e985d4e14f36a2cf 100644 (file)
@@ -13,12 +13,13 @@ import javax.xml.namespace.QName;
 import org.argeo.api.acr.Content;
 import org.argeo.api.acr.ContentRepository;
 import org.argeo.api.acr.ContentSession;
-import org.argeo.api.acr.CrName;
 import org.argeo.api.acr.DName;
 import org.argeo.api.cms.CmsAuth;
 import org.argeo.cms.CmsUserManager;
 import org.argeo.osgi.useradmin.UserDirectory;
 import org.argeo.util.CurrentSubject;
+import org.argeo.util.directory.Directory;
+import org.argeo.util.directory.HierarchyUnit;
 import org.osgi.service.useradmin.Role;
 
 /** Utilities and routines around {@link Content}. */
@@ -64,6 +65,7 @@ public class ContentUtils {
 //     }
 
        public static final char SLASH = '/';
+       public static final String SLASH_STRING = Character.toString(SLASH);
        public static final String ROOT_SLASH = "" + SLASH;
        public static final String EMPTY = "";
 
@@ -121,14 +123,39 @@ public class ContentUtils {
                        throw new IllegalArgumentException("Path " + path + " contains //");
        }
 
+       /*
+        * DIRECTORY
+        */
+
        public static Content roleToContent(CmsUserManager userManager, ContentSession contentSession, Role role) {
                UserDirectory userDirectory = userManager.getDirectory(role);
-               String path = CmsContentRepository.DIRECTORY_BASE + SLASH + userDirectory.getName() + SLASH
-                               + userDirectory.getRolePath(role);
+               String path = directoryPath(userDirectory) + userDirectory.getRolePath(role);
+               Content content = contentSession.get(path);
+               return content;
+       }
+
+       public static Content hierarchyUnitToContent(ContentSession contentSession, HierarchyUnit hierarchyUnit) {
+               Directory directory = hierarchyUnit.getDirectory();
+               StringJoiner relativePath = new StringJoiner(SLASH_STRING);
+               buildHierarchyUnitPath(hierarchyUnit, relativePath);
+               String path = directoryPath(directory) + relativePath.toString();
                Content content = contentSession.get(path);
                return content;
        }
 
+       /** The path to this {@link Directory}. Ends with a /. */
+       private static String directoryPath(Directory directory) {
+               return CmsContentRepository.DIRECTORY_BASE + SLASH + directory.getName() + SLASH;
+       }
+
+       /** Recursively build a relative path of a {@link HierarchyUnit}. */
+       private static void buildHierarchyUnitPath(HierarchyUnit current, StringJoiner relativePath) {
+               if (current.getParent() == null) // directory
+                       return;
+               buildHierarchyUnitPath(current.getParent(), relativePath);
+               relativePath.add(current.getHierarchyUnitName());
+       }
+
        /*
         * CONSUMER UTILS
         */
index 8ed23ad2ec92d747c66b3ba395ddb80844b525fa..1ed3d7ccbf0f9d218012314d7fc8004d544e622d 100644 (file)
@@ -141,7 +141,8 @@ public class DirectoryUserAdmin extends AbstractLdapDirectory implements UserAdm
        public Role getRoleByPath(String path) {
                LdapEntry entry = doGetRole(pathToName(path));
                if (!(entry instanceof Role)) {
-                       throw new IllegalStateException("Path must be a UserAdmin Role.");
+                       return null;
+//                     throw new IllegalStateException("Path must be a UserAdmin Role.");
                } else {
                        return (Role) entry;
                }
index 9e564ced9d339ba1255f23ce3bf389782831454d..988658969ef752b4ccba2d707666a458f6e390ed 100644 (file)
@@ -1,6 +1,5 @@
 package org.argeo.util.directory;
 
-import java.util.Dictionary;
 import java.util.Optional;
 
 import org.argeo.util.transaction.WorkControl;
@@ -21,17 +20,9 @@ public interface Directory extends HierarchyUnit {
        /** Sets the transaction control used by this directory when editing. */
        void setTransactionControl(WorkControl transactionControl);
 
-       /*
-        * METADATA
-        */
-       /** Metadata of this directory. */
-       public Dictionary<String, Object> getProperties();
-
        /*
         * HIERARCHY
         */
-       /** The first level of hierarchy units. */
-       Iterable<HierarchyUnit> getDirectHierarchyUnits(boolean functionalOnly);
 
        /** The hierarchy unit at this path. */
        HierarchyUnit getHierarchyUnit(String path);
index d35557784dd1f2e00ef5f1873c68b45a764f1721..1acd34f487278a5e1c06a2d978f97980abc75aa0 100644 (file)
@@ -4,12 +4,24 @@ import java.util.Dictionary;
 
 /** A unit within the high-level organisational structure of a directory. */
 public interface HierarchyUnit {
+       /** Name to use in paths. */
        String getHierarchyUnitName();
 
+       /**
+        * The parent {@link HierarchyUnit}, or <code>null</code> if a
+        * {@link Directory}.
+        */
        HierarchyUnit getParent();
 
+       /** Direct children {@link HierarchyUnit}s. */
        Iterable<HierarchyUnit> getDirectHierarchyUnits(boolean functionalOnly);
 
+       /**
+        * Whether this is an arbitrary named and placed {@link HierarchyUnit}.
+        * 
+        * @return <code>true</code> if functional, <code>false</code> is technical
+        *         (e.g. People, Groups, etc.)
+        */
        boolean isFunctional();
 
        /**
@@ -18,7 +30,9 @@ public interface HierarchyUnit {
         */
        String getBase();
 
+       /** The related {@link Directory}. */
        Directory getDirectory();
 
+       /** Its metadata (typically LDAP attributes). */
        Dictionary<String, Object> getProperties();
 }