Introduce directory content provider
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / ContentUtils.java
index 5609cf7778ca65555824c500e48d3769be944f69..272a5c5a148d3f51b3315fad79918e4837aed3c9 100644 (file)
@@ -1,12 +1,13 @@
 package org.argeo.cms.acr;
 
 import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.function.BiConsumer;
 
 import javax.xml.namespace.QName;
 
 import org.argeo.api.acr.Content;
-import org.argeo.api.cms.CmsSession;
 
 /** Utilities and routines around {@link Content}. */
 public class ContentUtils {
@@ -50,18 +51,56 @@ public class ContentUtils {
 //             return t instanceof String;
 //     }
 
+       public static final char SLASH = '/';
+       public static final String ROOT_SLASH = "" + SLASH;
+
        /**
         * Split a path (with '/' separator) in an array of length 2, the first part
         * being the parent path (which could be either absolute or relative), the
-        * second one being the last segment, (guaranteed to be with '/').
+        * second one being the last segment, (guaranteed to be without a '/').
         */
        public static String[] getParentPath(String path) {
-               int parentIndex = path.lastIndexOf('/');
-               // TODO make it more robust
-               return new String[] { parentIndex != 0 ? path.substring(0, parentIndex) : "/",
+               if (path == null)
+                       throw new IllegalArgumentException("Path cannot be null");
+               if (path.length() == 0)
+                       throw new IllegalArgumentException("Path cannot be empty");
+               checkDoubleSlash(path);
+               int parentIndex = path.lastIndexOf(SLASH);
+               if (parentIndex == path.length() - 1) {// trailing '/'
+                       path = path.substring(0, path.length() - 1);
+                       parentIndex = path.lastIndexOf(SLASH);
+               }
+
+               if (parentIndex == -1) // no '/'
+                       return new String[] { "", path };
+
+               return new String[] { parentIndex != 0 ? path.substring(0, parentIndex) : "" + SLASH,
                                path.substring(parentIndex + 1) };
        }
 
+       public static List<String> toPathSegments(String path) {
+               List<String> res = new ArrayList<>();
+               if ("".equals(path) || ROOT_SLASH.equals(path))
+                       return res;
+               collectPathSegments(path, res);
+               return res;
+       }
+
+       private static void collectPathSegments(String path, List<String> segments) {
+               String[] parent = getParentPath(path);
+               if ("".equals(parent[1])) // root
+                       return;
+               segments.add(0, parent[1]);
+               if ("".equals(parent[0])) // end
+                       return;
+               collectPathSegments(parent[0], segments);
+       }
+
+       public static void checkDoubleSlash(String path) {
+               if (path.contains(SLASH + "" + SLASH))
+                       throw new IllegalArgumentException("Path " + path + " contains //");
+       }
+
        /** Singleton. */
        private ContentUtils() {