X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2FContentUtils.java;h=e1fbcb1a9f440157b818a5c12dc8cf264be75c11;hb=b8f50d6d8e7b9c9215d156ba33f9dedfcee913a7;hp=5ea79662a387341f5d902c58f0fdc5c95de74f3b;hpb=f520af45449b203a879392e8a0aeda6703abadfa;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 5ea79662a..e1fbcb1a9 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java @@ -6,12 +6,18 @@ import java.util.List; import java.util.StringJoiner; import java.util.function.BiConsumer; +import javax.security.auth.login.LoginContext; +import javax.security.auth.login.LoginException; 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.cms.CmsAuth; import org.argeo.cms.CmsUserManager; import org.argeo.osgi.useradmin.UserDirectory; +import org.argeo.util.CurrentSubject; import org.osgi.service.useradmin.Role; /** Utilities and routines around {@link Content}. */ @@ -58,6 +64,7 @@ public class ContentUtils { public static final char SLASH = '/'; public static final String ROOT_SLASH = "" + SLASH; + public static final String EMPTY = ""; /** * Split a path (with '/' separator) in an array of length 2, the first part @@ -77,7 +84,7 @@ public class ContentUtils { } if (parentIndex == -1) // no '/' - return new String[] { "", path }; + return new String[] { EMPTY, path }; return new String[] { parentIndex != 0 ? path.substring(0, parentIndex) : "" + SLASH, path.substring(parentIndex + 1) }; @@ -92,7 +99,7 @@ public class ContentUtils { public static List toPathSegments(String path) { List res = new ArrayList<>(); - if ("".equals(path) || ROOT_SLASH.equals(path)) + if (EMPTY.equals(path) || ROOT_SLASH.equals(path)) return res; collectPathSegments(path, res); return res; @@ -100,10 +107,10 @@ public class ContentUtils { private static void collectPathSegments(String path, List segments) { String[] parent = getParentPath(path); - if ("".equals(parent[1])) // root + if (EMPTY.equals(parent[1])) // root return; segments.add(0, parent[1]); - if ("".equals(parent[0])) // end + if (EMPTY.equals(parent[0])) // end return; collectPathSegments(parent[0], segments); } @@ -113,11 +120,6 @@ public class ContentUtils { throw new IllegalArgumentException("Path " + path + " contains //"); } - /** Singleton. */ - private ContentUtils() { - - } - public static Content roleToContent(CmsUserManager userManager, ContentSession contentSession, Role role) { UserDirectory userDirectory = userManager.getDirectory(role); String path = CmsContentRepository.DIRECTORY_BASE + SLASH + userDirectory.getName() + SLASH @@ -126,4 +128,48 @@ public class ContentUtils { return content; } + /* + * CONSUMER UTILS + */ + + public static Content createCollections(ContentSession session, String path) { + if (session.exists(path)) { + Content content = session.get(path); + if (!content.isContentClass(CrName.collection.qName())) { + throw new IllegalStateException("Content " + path + " already exists, but is not a collection"); + } else { + return content; + } + } else { + String[] parentPath = getParentPath(path); + Content parent = createCollections(session, parentPath[0]); + Content content = parent.add(parentPath[1], CrName.collection.qName()); + return content; + } + } + + public static ContentSession openDataAdminSession(ContentRepository repository) { + LoginContext loginContext; + try { + loginContext = CmsAuth.DATA_ADMIN.newLoginContext(); + loginContext.login(); + } catch (LoginException e1) { + throw new RuntimeException("Could not login as data admin", e1); + } finally { + } + + ClassLoader currentCl = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(ContentUtils.class.getClassLoader()); + return CurrentSubject.callAs(loginContext.getSubject(), () -> repository.get()); + } finally { + Thread.currentThread().setContextClassLoader(currentCl); + } + } + + /** Singleton. */ + private ContentUtils() { + + } + }