Improve ACR
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / ContentUtils.java
index 5ea79662a387341f5d902c58f0fdc5c95de74f3b..e1fbcb1a9f440157b818a5c12dc8cf264be75c11 100644 (file)
@@ -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<String> toPathSegments(String path) {
                List<String> 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<String> 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() {
+
+       }
+
 }