X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2FContentUtils.java;h=bf5954411bc157a32003bf17d3e4363e8ee9d5bc;hb=5724ab347ddfba8f2b21cdcc2fa0b8e1e2b4e527;hp=ed27ce8e8366a24c5fcd2ce0e285026c3ff1afa9;hpb=feddb4be70a8304dd4a533efee6e14c22691b500;p=lgpl%2Fargeo-commons.git 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 ed27ce8e8..bf5954411 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java @@ -3,6 +3,7 @@ package org.argeo.cms.acr; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.StringJoiner; import java.util.function.BiConsumer; @@ -15,10 +16,11 @@ import org.argeo.api.acr.ContentRepository; import org.argeo.api.acr.ContentSession; import org.argeo.api.acr.DName; import org.argeo.api.cms.CmsAuth; +import org.argeo.api.cms.CmsSession; import org.argeo.api.cms.directory.CmsDirectory; +import org.argeo.api.cms.directory.CmsUserManager; import org.argeo.api.cms.directory.HierarchyUnit; import org.argeo.api.cms.directory.UserDirectory; -import org.argeo.cms.CmsUserManager; import org.argeo.cms.util.CurrentSubject; import org.osgi.service.useradmin.Role; @@ -66,7 +68,6 @@ 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 = ""; /** @@ -102,7 +103,7 @@ public class ContentUtils { public static List toPathSegments(String path) { List res = new ArrayList<>(); - if (EMPTY.equals(path) || ROOT_SLASH.equals(path)) + if (EMPTY.equals(path) || Content.ROOT_PATH.equals(path)) return res; collectPathSegments(path, res); return res; @@ -176,7 +177,7 @@ public class ContentUtils { } } - public static ContentSession openDataAdminSession(ContentRepository repository) { + public static ContentSession openDataAdminSession(ContentRepository contentRepository) { LoginContext loginContext; try { loginContext = CmsAuth.DATA_ADMIN.newLoginContext(); @@ -189,12 +190,33 @@ public class ContentUtils { ClassLoader currentCl = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(ContentUtils.class.getClassLoader()); - return CurrentSubject.callAs(loginContext.getSubject(), () -> repository.get()); + return CurrentSubject.callAs(loginContext.getSubject(), () -> contentRepository.get()); } finally { Thread.currentThread().setContextClassLoader(currentCl); } } + public static ContentSession openSession(ContentRepository contentRepository, CmsSession cmsSession) { + return CurrentSubject.callAs(cmsSession.getSubject(), () -> contentRepository.get()); + } + + /** + * Constructs a relative path between a base path and a given path. + * + * @throws IllegalArgumentException if the base path is not an ancestor of the + * path + */ + public static String relativize(String basePath, String path) throws IllegalArgumentException { + Objects.requireNonNull(basePath); + Objects.requireNonNull(path); + if (!path.startsWith(basePath)) + throw new IllegalArgumentException(basePath + " is not an ancestor of " + path); + String relativePath = path.substring(basePath.length()); + if (relativePath.length() > 0 && relativePath.charAt(0) == '/') + relativePath = relativePath.substring(1); + return relativePath; + } + /** Singleton. */ private ContentUtils() {