From 6aae2af9d483bef26ca8c5be37c9702f839443db Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 18 Sep 2022 11:58:18 +0200 Subject: [PATCH] Document directory and improve mapping with ACR --- .../src/org/argeo/cms/acr/ContentUtils.java | 33 +++++++++++++++++-- .../osgi/useradmin/DirectoryUserAdmin.java | 3 +- .../org/argeo/util/directory/Directory.java | 9 ----- .../argeo/util/directory/HierarchyUnit.java | 14 ++++++++ 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java b/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java index 48b047c29..74e93fc0a 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java @@ -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 */ diff --git a/org.argeo.util/src/org/argeo/osgi/useradmin/DirectoryUserAdmin.java b/org.argeo.util/src/org/argeo/osgi/useradmin/DirectoryUserAdmin.java index 8ed23ad2e..1ed3d7ccb 100644 --- a/org.argeo.util/src/org/argeo/osgi/useradmin/DirectoryUserAdmin.java +++ b/org.argeo.util/src/org/argeo/osgi/useradmin/DirectoryUserAdmin.java @@ -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; } 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 9e564ced9..988658969 100644 --- a/org.argeo.util/src/org/argeo/util/directory/Directory.java +++ b/org.argeo.util/src/org/argeo/util/directory/Directory.java @@ -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 getProperties(); - /* * HIERARCHY */ - /** The first level of hierarchy units. */ - Iterable getDirectHierarchyUnits(boolean functionalOnly); /** The hierarchy unit at this path. */ HierarchyUnit getHierarchyUnit(String path); 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 d35557784..1acd34f48 100644 --- a/org.argeo.util/src/org/argeo/util/directory/HierarchyUnit.java +++ b/org.argeo.util/src/org/argeo/util/directory/HierarchyUnit.java @@ -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 null if a + * {@link Directory}. + */ HierarchyUnit getParent(); + /** Direct children {@link HierarchyUnit}s. */ Iterable getDirectHierarchyUnits(boolean functionalOnly); + /** + * Whether this is an arbitrary named and placed {@link HierarchyUnit}. + * + * @return true if functional, false 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 getProperties(); } -- 2.30.2