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}. */
// }
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 = "";
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
*/
package org.argeo.util.directory;
-import java.util.Dictionary;
import java.util.Optional;
import org.argeo.util.transaction.WorkControl;
/** 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);
/** 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();
/**
*/
String getBase();
+ /** The related {@link Directory}. */
Directory getDirectory();
+ /** Its metadata (typically LDAP attributes). */
Dictionary<String, Object> getProperties();
}