]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSPath.java
Improve unit tests
[gpl/argeo-slc.git] / org.argeo.slc / src / main / java / org / argeo / slc / core / structure / tree / TreeSPath.java
index 94d22b592b6195ca6789e1569ea9a4d8fe8a3a06..b00d1cf9443bd6351258f36b6d88de01db3077ca 100644 (file)
 package org.argeo.slc.core.structure.tree;\r
 \r
+import java.util.List;\r
 import java.util.StringTokenizer;\r
+import java.util.Vector;\r
 \r
+import org.argeo.slc.core.SlcException;\r
 import org.argeo.slc.core.structure.StructurePath;\r
+import org.argeo.slc.core.structure.StructureRegistry;\r
 \r
-public class TreeSPath implements StructurePath {\r
+/**\r
+ * Path for tree based <code>StructureRegistry</code> implementations.\r
+ */\r
+public class TreeSPath implements StructurePath, Comparable<StructurePath> {\r
+       /** Default character to use a separator: #. */\r
        public static Character DEFAULT_SEPARATOR = '#';\r
 \r
        private TreeSPath parent;\r
        private String name;\r
        private Character separator = DEFAULT_SEPARATOR;\r
 \r
+       /** For ORM */\r
+       private Long tid;\r
+\r
        public String getAsUniqueString() {\r
                String parentStr = parent != null ? parent.getAsUniqueString() : "";\r
                return parentStr + separator + name;\r
        }\r
 \r
+       public void setAsUniqueString(String str) {\r
+               TreeSPath twin = parseToCreatePath(str, getSeparator());\r
+               name = twin.name;\r
+               parent = twin.parent;\r
+       }\r
+\r
+       /** The separator actually used by this path. */\r
        public Character getSeparator() {\r
                return separator;\r
        }\r
 \r
+       /** Gets the parent path. */\r
        public TreeSPath getParent() {\r
                return parent;\r
        }\r
 \r
+       /** Gets the name part of the path. */\r
        public String getName() {\r
                return name;\r
        }\r
 \r
-       public static TreeSPath createChild(TreeSPath parent, String name) {\r
+       /** Create a path without parent. */\r
+       public static TreeSPath createRootPath(String name) {\r
+               TreeSPath path = new TreeSPath();\r
+               path.parent = null;\r
+               path.name = name;\r
+               return path;\r
+       }\r
+\r
+       /** Create a child . */\r
+       public TreeSPath createChild(String name) {\r
+               if (name.indexOf(separator) > -1) {\r
+                       throw new SlcException("Tree path name '" + name\r
+                                       + "' contains separator character " + separator);\r
+               }\r
                TreeSPath path = new TreeSPath();\r
-               path.parent = parent;\r
+               path.parent = this;\r
                path.name = name;\r
                return path;\r
        }\r
 \r
-       public static TreeSPath createTreeSPath(String path, Character separator) {\r
+       /** Parses a string to a path. */\r
+       public static TreeSPath parseToCreatePath(String path, Character separator) {\r
                StringTokenizer st = new StringTokenizer(path, Character\r
                                .toString(separator));\r
 \r
                TreeSPath currPath = null;\r
                while (st.hasMoreTokens()) {\r
                        if (currPath == null) {// begin\r
-                               currPath = createChild(null, st.nextToken());\r
+                               currPath = createRootPath(st.nextToken());\r
                        } else {\r
-                               currPath = createChild(currPath, st.nextToken());\r
+                               currPath = currPath.createChild(st.nextToken());\r
                        }\r
                }\r
                return currPath;\r
        }\r
+\r
+       public List<TreeSPath> listChildren(StructureRegistry registry) {\r
+               return listChildrenPaths(registry, this);\r
+       }\r
+\r
+       public static List<TreeSPath> listChildrenPaths(StructureRegistry registry,\r
+                       TreeSPath path) {\r
+               List<TreeSPath> paths = new Vector<TreeSPath>();\r
+               List<StructurePath> allPaths = registry.listPaths();\r
+               for (StructurePath sPath : allPaths) {\r
+                       TreeSPath pathT = (TreeSPath) sPath;\r
+                       if (pathT.parent != null && pathT.parent.equals(path)) {\r
+                               paths.add(pathT);\r
+                       }\r
+               }\r
+               return paths;\r
+       }\r
+\r
+       public TreeSPath getRoot(){\r
+               TreeSPath root = this;\r
+               while(root.getParent()!=null){\r
+                       root = root.getParent();\r
+               }\r
+               return root;\r
+       }\r
        \r
        @Override\r
-       public String toString(){\r
+       public String toString() {\r
                return getAsUniqueString();\r
        }\r
 \r
@@ -63,6 +122,29 @@ public class TreeSPath implements StructurePath {
                }\r
                return false;\r
        }\r
-       \r
-       \r
+\r
+       public int compareTo(StructurePath o) {\r
+               return getAsUniqueString().compareTo(o.getAsUniqueString());\r
+       }\r
+\r
+       Long getTid() {\r
+               return tid;\r
+       }\r
+\r
+       void setTid(Long tid) {\r
+               this.tid = tid;\r
+       }\r
+\r
+       public void setSeparator(Character separator) {\r
+               this.separator = separator;\r
+       }\r
+\r
+       protected void setParent(TreeSPath parent) {\r
+               this.parent = parent;\r
+       }\r
+\r
+       protected void setName(String name) {\r
+               this.name = name;\r
+       }\r
+\r
 }\r