Introduce structure
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 23 Oct 2007 12:42:55 +0000 (12:42 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 23 Oct 2007 12:42:55 +0000 (12:42 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@632 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

20 files changed:
org.argeo.slc/src/main/java/org/argeo/slc/ant/AbstractSpringArg.java [deleted file]
org.argeo.slc/src/main/java/org/argeo/slc/ant/AbstractSpringTask.java [deleted file]
org.argeo.slc/src/main/java/org/argeo/slc/ant/OverrideArg.java [deleted file]
org.argeo.slc/src/main/java/org/argeo/slc/ant/SAwareArg.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/ant/SAwareTask.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcProjectHelper.java
org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcTestTask.java [deleted file]
org.argeo.slc/src/main/java/org/argeo/slc/ant/spring/AbstractSpringArg.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/ant/spring/AbstractSpringTask.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/ant/spring/OverrideArg.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/ant/test/SlcTestTask.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureAware.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureElement.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructurePath.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureRegistry.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/DefaultTreeSAware.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSElement.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSPath.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSRegistry.java [new file with mode: 0644]
org.argeo.slc/src/test/ant/build.xml

diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/AbstractSpringArg.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/AbstractSpringArg.java
deleted file mode 100644 (file)
index aa633d9..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.argeo.slc.ant;\r
-\r
-import java.util.List;\r
-import java.util.Vector;\r
-\r
-import org.springframework.beans.BeanWrapper;\r
-import org.springframework.beans.BeanWrapperImpl;\r
-import org.springframework.context.ApplicationContext;\r
-\r
-import org.apache.tools.ant.Location;\r
-import org.apache.tools.ant.Project;\r
-import org.apache.tools.ant.types.DataType;\r
-\r
-public abstract class AbstractSpringArg extends DataType {\r
-       private List<OverrideArg> overrides = new Vector<OverrideArg>();\r
-\r
-       private String bean;\r
-\r
-       public String getBean() {\r
-               return bean;\r
-       }\r
-\r
-       public void setBean(String bean) {\r
-               this.bean = bean;\r
-       }\r
-\r
-       protected Object getBeanInstance() {\r
-               Object obj = getContext().getBean(bean);\r
-\r
-               BeanWrapper wrapper = new BeanWrapperImpl(obj);\r
-               for (OverrideArg override : overrides) {\r
-                       wrapper.setPropertyValue(override.getName(), override.getObject());\r
-               }\r
-\r
-               return obj;\r
-       }\r
-\r
-       public OverrideArg createOverride() {\r
-               OverrideArg propertyArg = new OverrideArg();\r
-               overrides.add(propertyArg);\r
-               return propertyArg;\r
-       }\r
-\r
-       protected ApplicationContext getContext() {\r
-               return (ApplicationContext) getProject().getReference(\r
-                               SlcProjectHelper.REF_ROOT_CONTEXT);\r
-       }\r
-\r
-}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/AbstractSpringTask.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/AbstractSpringTask.java
deleted file mode 100644 (file)
index 3f5aa23..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.argeo.slc.ant;\r
-\r
-import org.springframework.context.ApplicationContext;\r
-\r
-import org.apache.tools.ant.Task;\r
-\r
-public abstract class AbstractSpringTask extends Task {\r
-\r
-       protected ApplicationContext getContext() {\r
-               return (ApplicationContext) getProject().getReference(\r
-                               SlcProjectHelper.REF_ROOT_CONTEXT);\r
-       }\r
-\r
-}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/OverrideArg.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/OverrideArg.java
deleted file mode 100644 (file)
index 6f793e4..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.argeo.slc.ant;\r
-\r
-import org.apache.tools.ant.BuildException;\r
-\r
-public class OverrideArg extends AbstractSpringArg {\r
-       private String name;\r
-       private Object value;\r
-\r
-       public String getName() {\r
-               return name;\r
-       }\r
-\r
-       public void setName(String name) {\r
-               this.name = name;\r
-       }\r
-\r
-       public void setValue(String value) {\r
-               if (getBean() != null) {\r
-                       throw new BuildException(\r
-                                       "Cannot set both 'bean' and 'value' attributes.");\r
-               }\r
-               this.value = value;\r
-       }\r
-\r
-       @Override\r
-       public void setBean(String bean) {\r
-               if (value != null) {\r
-                       throw new BuildException(\r
-                                       "Cannot set both 'bean' and 'value' attributes.");\r
-               }\r
-               super.setBean(bean);\r
-       }\r
-\r
-       public Object getObject() {\r
-               if (value != null) {\r
-                       return value;\r
-               } else if (getBean() != null) {\r
-                       return getBeanInstance();\r
-               } else {\r
-                       throw new BuildException("Value or bean not set.");\r
-               }\r
-       }\r
-\r
-}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/SAwareArg.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/SAwareArg.java
new file mode 100644 (file)
index 0000000..2d34f84
--- /dev/null
@@ -0,0 +1,34 @@
+package org.argeo.slc.ant;\r
+\r
+import org.argeo.slc.ant.spring.AbstractSpringArg;\r
+import org.argeo.slc.core.structure.tree.DefaultTreeSAware;\r
+import org.argeo.slc.core.structure.tree.TreeSElement;\r
+\r
+public abstract class SAwareArg extends AbstractSpringArg {\r
+       private DefaultTreeSAware parentSAware;\r
+\r
+       @Override\r
+       protected Object getBeanInstance() {\r
+               Object obj = super.getBeanInstance();\r
+\r
+               if (obj instanceof DefaultTreeSAware && parentSAware!=null) {\r
+                       DefaultTreeSAware sAware = (DefaultTreeSAware) obj;\r
+                       TreeSElement parentElement = (TreeSElement) parentSAware\r
+                                       .getElement();\r
+                       String name = getBean() + parentElement.getChildren().size();\r
+                       TreeSElement element = parentElement.createChild(name,\r
+                                       getDescription() != null ? getDescription()\r
+                                                       : "<no bean desc>");\r
+                       sAware.setElement(element);\r
+                       \r
+                       parentSAware.addChild(sAware);\r
+               }\r
+               return obj;\r
+       }\r
+\r
+       public void setParentSAware(DefaultTreeSAware parentSAware) {\r
+               this.parentSAware = parentSAware;\r
+       }\r
+\r
+       \r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/SAwareTask.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/SAwareTask.java
new file mode 100644 (file)
index 0000000..089c558
--- /dev/null
@@ -0,0 +1,46 @@
+package org.argeo.slc.ant;\r
+\r
+import org.apache.tools.ant.BuildException;\r
+import org.apache.tools.ant.Target;\r
+\r
+import org.argeo.slc.ant.spring.AbstractSpringTask;\r
+import org.argeo.slc.core.structure.StructurePath;\r
+import org.argeo.slc.core.structure.StructureRegistry;\r
+import org.argeo.slc.core.structure.tree.DefaultTreeSAware;\r
+import org.argeo.slc.core.structure.tree.TreeSElement;\r
+import org.argeo.slc.core.structure.tree.TreeSPath;\r
+\r
+public abstract class SAwareTask extends AbstractSpringTask {\r
+       protected final DefaultTreeSAware sAware = new DefaultTreeSAware();\r
+\r
+       @Override\r
+       public void init() throws BuildException {\r
+               StructureRegistry registry = (StructureRegistry) getProject()\r
+                               .getReference(SlcProjectHelper.REF_STRUCTURE_REGISTRY);\r
+               Target target = getOwningTarget();\r
+               TreeSElement projectElement = (TreeSElement) registry\r
+                               .getElement(SlcProjectHelper.getProjectPath(getProject()));\r
+               TreeSElement targetElement = (TreeSElement) registry\r
+                               .getElement(createTargetPath(target));\r
+\r
+               if (targetElement == null) {\r
+                       // create target element\r
+                       targetElement = projectElement.createChild(target.getName(), target\r
+                                       .getDescription() != null ? target.getDescription()\r
+                                       : "<no target>");\r
+                       registry.register(targetElement);\r
+               }\r
+\r
+               TreeSElement taskElement = targetElement.createChild(getTaskName()\r
+                               + targetElement.getChildren().size(),\r
+                               getDescription() != null ? getDescription() : "<no task desc>");\r
+               sAware.setElement(taskElement);\r
+               registry.register(sAware);\r
+       }\r
+\r
+       protected static StructurePath createTargetPath(Target target) {\r
+               TreeSPath projectPath = SlcProjectHelper.getProjectPath(target\r
+                               .getProject());\r
+               return TreeSPath.createChild(projectPath, target.getName());\r
+       }\r
+}\r
index 63b156252857e5824d65c11b8d000802c9508d8f..f0afc92efd7788bb79a9faa807377b9234a8d49b 100644 (file)
@@ -7,27 +7,51 @@ import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;\r
 import org.apache.tools.ant.helper.ProjectHelperImpl;\r
 \r
+import org.argeo.slc.core.structure.StructurePath;\r
+import org.argeo.slc.core.structure.tree.TreeSElement;\r
+import org.argeo.slc.core.structure.tree.TreeSPath;\r
+import org.argeo.slc.core.structure.tree.TreeSRegistry;\r
+\r
 public class SlcProjectHelper extends ProjectHelperImpl {\r
        public static String PROP_APPLICATION_CONTEXT = "org.argeo.slc.slcRootContext";\r
        public static String REF_ROOT_CONTEXT = "slcApplicationContext";\r
+       public static String REF_STRUCTURE_REGISTRY = "slcStructureRegistry";\r
 \r
        @Override\r
        public void parse(Project project, Object source) throws BuildException {\r
                stdOut("Entered SLC project helper");\r
 \r
+               // init Spring application context\r
+               String acPath = System.getProperty(PROP_APPLICATION_CONTEXT,\r
+                               "applicationContext.xml");\r
+               ApplicationContext context = new FileSystemXmlApplicationContext(acPath);\r
+               project.addReference(REF_ROOT_CONTEXT, context);\r
+\r
+               // init structure register\r
+               TreeSRegistry registry = new TreeSRegistry();\r
+               project.addReference(REF_STRUCTURE_REGISTRY, registry);\r
+\r
                // call the underlying implementation to do the actual work\r
                super.parse(project, source);\r
 \r
-               String acPath = System.getProperty(PROP_APPLICATION_CONTEXT);\r
-               if (acPath == null) {\r
-                       acPath = "applicationContext.xml";\r
-               }\r
-               ApplicationContext context = new FileSystemXmlApplicationContext(acPath);\r
-               project.addReference(REF_ROOT_CONTEXT, context);\r
+               String projectDescription = project.getDescription() != null ? project\r
+                               .getDescription() : "Root";\r
+               TreeSElement element = TreeSElement.createRootElelment(\r
+                               getProjectPathName(project), projectDescription);\r
+               registry.register(element);\r
        }\r
 \r
        private static void stdOut(Object o) {\r
                System.out.println(o);\r
        }\r
 \r
+       static TreeSPath getProjectPath(Project project) {\r
+               return TreeSPath.createChild(null, getProjectPathName(project));\r
+       }\r
+\r
+       private static String getProjectPathName(Project project) {\r
+               String projectName = project.getName() != null ? project.getName()\r
+                               : "project";\r
+               return projectName;\r
+       }\r
 }\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcTestTask.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcTestTask.java
deleted file mode 100644 (file)
index e082fe4..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.argeo.slc.ant;\r
-\r
-import org.springframework.context.ApplicationContext;\r
-\r
-import org.apache.tools.ant.BuildException;\r
-\r
-import org.argeo.slc.core.test.TestData;\r
-import org.argeo.slc.core.test.TestDefinition;\r
-\r
-public class SlcTestTask extends AbstractSpringTask {\r
-\r
-       private TestDefinitionArg testDefinitionArg;\r
-       private TestDataArg testDataArg;\r
-\r
-       @Override\r
-       public void execute() throws BuildException {\r
-               TestDefinition testDefinition = testDefinitionArg.getTestDefinition();\r
-               testDefinition.setTestData(testDataArg.getTestData());\r
-               testDefinition.execute();\r
-       }\r
-\r
-       public TestDefinitionArg createTestDefinition() {\r
-               testDefinitionArg = new TestDefinitionArg();\r
-               return testDefinitionArg;\r
-       }\r
-\r
-       public TestDataArg createTestData() {\r
-               testDataArg = new TestDataArg();\r
-               return testDataArg;\r
-       }\r
-}\r
-\r
-class TestDefinitionArg extends AbstractSpringArg {\r
-       public TestDefinition getTestDefinition(){\r
-               return (TestDefinition)getBeanInstance();\r
-       }\r
-}\r
-\r
-class TestDataArg extends AbstractSpringArg {\r
-       public TestData getTestData(){\r
-               return (TestData)getBeanInstance();\r
-       }\r
-\r
-}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/spring/AbstractSpringArg.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/spring/AbstractSpringArg.java
new file mode 100644 (file)
index 0000000..4061f37
--- /dev/null
@@ -0,0 +1,51 @@
+package org.argeo.slc.ant.spring;\r
+\r
+import java.util.List;\r
+import java.util.Vector;\r
+\r
+import org.springframework.beans.BeanWrapper;\r
+import org.springframework.beans.BeanWrapperImpl;\r
+import org.springframework.context.ApplicationContext;\r
+\r
+import org.apache.tools.ant.Location;\r
+import org.apache.tools.ant.Project;\r
+import org.apache.tools.ant.types.DataType;\r
+\r
+import org.argeo.slc.ant.SlcProjectHelper;\r
+\r
+public abstract class AbstractSpringArg extends DataType {\r
+       private List<OverrideArg> overrides = new Vector<OverrideArg>();\r
+\r
+       private String bean;\r
+\r
+       public String getBean() {\r
+               return bean;\r
+       }\r
+\r
+       public void setBean(String bean) {\r
+               this.bean = bean;\r
+       }\r
+\r
+       protected Object getBeanInstance() {\r
+               Object obj = getContext().getBean(bean);\r
+\r
+               BeanWrapper wrapper = new BeanWrapperImpl(obj);\r
+               for (OverrideArg override : overrides) {\r
+                       wrapper.setPropertyValue(override.getName(), override.getObject());\r
+               }\r
+\r
+               return obj;\r
+       }\r
+\r
+       public OverrideArg createOverride() {\r
+               OverrideArg propertyArg = new OverrideArg();\r
+               overrides.add(propertyArg);\r
+               return propertyArg;\r
+       }\r
+\r
+       protected ApplicationContext getContext() {\r
+               return (ApplicationContext) getProject().getReference(\r
+                               SlcProjectHelper.REF_ROOT_CONTEXT);\r
+       }\r
+\r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/spring/AbstractSpringTask.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/spring/AbstractSpringTask.java
new file mode 100644 (file)
index 0000000..dfe954e
--- /dev/null
@@ -0,0 +1,16 @@
+package org.argeo.slc.ant.spring;\r
+\r
+import org.springframework.context.ApplicationContext;\r
+\r
+import org.apache.tools.ant.Task;\r
+\r
+import org.argeo.slc.ant.SlcProjectHelper;\r
+\r
+public abstract class AbstractSpringTask extends Task {\r
+\r
+       protected ApplicationContext getContext() {\r
+               return (ApplicationContext) getProject().getReference(\r
+                               SlcProjectHelper.REF_ROOT_CONTEXT);\r
+       }\r
+\r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/spring/OverrideArg.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/spring/OverrideArg.java
new file mode 100644 (file)
index 0000000..85a6e2c
--- /dev/null
@@ -0,0 +1,45 @@
+package org.argeo.slc.ant.spring;\r
+\r
+import org.apache.tools.ant.BuildException;\r
+\r
+\r
+public class OverrideArg extends AbstractSpringArg {\r
+       private String name;\r
+       private Object value;\r
+\r
+       public String getName() {\r
+               return name;\r
+       }\r
+\r
+       public void setName(String name) {\r
+               this.name = name;\r
+       }\r
+\r
+       public void setValue(String value) {\r
+               if (getBean() != null) {\r
+                       throw new BuildException(\r
+                                       "Cannot set both 'bean' and 'value' attributes.");\r
+               }\r
+               this.value = value;\r
+       }\r
+\r
+       @Override\r
+       public void setBean(String bean) {\r
+               if (value != null) {\r
+                       throw new BuildException(\r
+                                       "Cannot set both 'bean' and 'value' attributes.");\r
+               }\r
+               super.setBean(bean);\r
+       }\r
+\r
+       public Object getObject() {\r
+               if (value != null) {\r
+                       return value;\r
+               } else if (getBean() != null) {\r
+                       return getBeanInstance();\r
+               } else {\r
+                       throw new BuildException("Value or bean not set.");\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/test/SlcTestTask.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/test/SlcTestTask.java
new file mode 100644 (file)
index 0000000..4dcd31a
--- /dev/null
@@ -0,0 +1,48 @@
+package org.argeo.slc.ant.test;\r
+\r
+import org.apache.tools.ant.BuildException;\r
+\r
+import org.argeo.slc.ant.SAwareArg;\r
+import org.argeo.slc.ant.SAwareTask;\r
+import org.argeo.slc.ant.spring.AbstractSpringArg;\r
+import org.argeo.slc.ant.spring.AbstractSpringTask;\r
+import org.argeo.slc.core.test.TestData;\r
+import org.argeo.slc.core.test.TestDefinition;\r
+\r
+public class SlcTestTask extends SAwareTask {\r
+\r
+       private TestDefinitionArg testDefinitionArg;\r
+       private TestDataArg testDataArg;\r
+\r
+       @Override\r
+       public void execute() throws BuildException {\r
+               TestDefinition testDefinition = testDefinitionArg.getTestDefinition();\r
+               testDefinition.setTestData(testDataArg.getTestData());\r
+               testDefinition.execute();\r
+       }\r
+\r
+       public TestDefinitionArg createTestDefinition() {\r
+               testDefinitionArg = new TestDefinitionArg();\r
+               testDefinitionArg.setParentSAware(sAware);\r
+               return testDefinitionArg;\r
+       }\r
+\r
+       public TestDataArg createTestData() {\r
+               testDataArg = new TestDataArg();\r
+               testDataArg.setParentSAware(sAware);\r
+               return testDataArg;\r
+       }\r
+}\r
+\r
+class TestDefinitionArg extends SAwareArg {\r
+       public TestDefinition getTestDefinition(){\r
+               return (TestDefinition)getBeanInstance();\r
+       }\r
+}\r
+\r
+class TestDataArg extends SAwareArg {\r
+       public TestData getTestData(){\r
+               return (TestData)getBeanInstance();\r
+       }\r
+\r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureAware.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureAware.java
new file mode 100644 (file)
index 0000000..8389dda
--- /dev/null
@@ -0,0 +1,7 @@
+package org.argeo.slc.core.structure;\r
+\r
+public interface StructureAware {\r
+       public StructureElement getElement();\r
+       /** Called <b>after</b> registration.*/\r
+       public void onRegister(StructureRegistry registry);\r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureElement.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureElement.java
new file mode 100644 (file)
index 0000000..bbbb005
--- /dev/null
@@ -0,0 +1,8 @@
+package org.argeo.slc.core.structure;\r
+\r
+public interface StructureElement {\r
+       public StructurePath getPath();\r
+       public String getDescription();\r
+       public Boolean getActive();\r
+       public void setActive(Boolean active);\r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructurePath.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructurePath.java
new file mode 100644 (file)
index 0000000..6df3049
--- /dev/null
@@ -0,0 +1,5 @@
+package org.argeo.slc.core.structure;\r
+\r
+public interface StructurePath {\r
+       public String getAsUniqueString();\r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureRegistry.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureRegistry.java
new file mode 100644 (file)
index 0000000..3856fad
--- /dev/null
@@ -0,0 +1,11 @@
+package org.argeo.slc.core.structure;\r
+\r
+import java.util.List;\r
+\r
+public interface StructureRegistry {\r
+       public void register(StructureElement element);\r
+       public void register(StructureAware structureAware);\r
+       public List<StructureElement> listElements();\r
+       \r
+       public StructureElement getElement(StructurePath path);\r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/DefaultTreeSAware.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/DefaultTreeSAware.java
new file mode 100644 (file)
index 0000000..a5d9c21
--- /dev/null
@@ -0,0 +1,32 @@
+package org.argeo.slc.core.structure.tree;\r
+\r
+import java.util.List;\r
+import java.util.Vector;\r
+\r
+import org.argeo.slc.core.structure.StructureAware;\r
+import org.argeo.slc.core.structure.StructureElement;\r
+import org.argeo.slc.core.structure.StructureRegistry;\r
+\r
+public class DefaultTreeSAware implements StructureAware{\r
+       private TreeSElement element;\r
+       private List<StructureAware> children = new Vector<StructureAware>();\r
+\r
+       public StructureElement getElement() {\r
+               return element;\r
+       }\r
+\r
+       public void setElement(TreeSElement element) {\r
+               this.element = element;\r
+       }\r
+\r
+       public void onRegister(StructureRegistry registry) {\r
+               for(StructureAware sAware : children){\r
+                       registry.register(sAware.getElement());\r
+                       sAware.onRegister(registry);\r
+               }\r
+       }\r
+\r
+       public void addChild(StructureAware sAware){\r
+               children.add(sAware);\r
+       }\r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSElement.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSElement.java
new file mode 100644 (file)
index 0000000..3c0ba12
--- /dev/null
@@ -0,0 +1,65 @@
+package org.argeo.slc.core.structure.tree;\r
+\r
+import java.util.List;\r
+import java.util.Vector;\r
+\r
+import org.argeo.slc.core.structure.StructureElement;\r
+import org.argeo.slc.core.structure.StructurePath;\r
+\r
+public class TreeSElement implements StructureElement {\r
+       private String description;\r
+       private TreeSPath path;\r
+       private Boolean active;\r
+\r
+       private List<TreeSElement> children = new Vector<TreeSElement>();\r
+\r
+       public String getDescription() {\r
+               return description;\r
+       }\r
+\r
+       public void setDescription(String description) {\r
+               this.description = description;\r
+       }\r
+\r
+       public StructurePath getPath() {\r
+               return path;\r
+       }\r
+\r
+       public Boolean getActive() {\r
+               return active;\r
+       }\r
+\r
+       public void setActive(Boolean active) {\r
+               this.active = active;\r
+       }\r
+\r
+       public List<TreeSElement> getChildren() {\r
+               return children;\r
+       }\r
+\r
+       public TreeSElement createChild(String name, String description) {\r
+               TreeSElement element = new TreeSElement();\r
+               element.path = TreeSPath.createChild((TreeSPath) this.getPath(), name);\r
+               element.description = description;\r
+               children.add(element);\r
+               return element;\r
+       }\r
+\r
+       public static TreeSElement createRootElelment(String name,\r
+                       String description) {\r
+               TreeSElement element = new TreeSElement();\r
+               element.path = TreeSPath.createChild(null, name);\r
+               element.description = description;\r
+               return element;\r
+       }\r
+\r
+       @Override\r
+       public boolean equals(Object obj) {\r
+               if (obj instanceof StructureElement) {\r
+                       StructureElement element = (StructureElement) obj;\r
+                       return getPath().equals(element.getPath());\r
+               }\r
+               return false;\r
+       }\r
+\r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSPath.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSPath.java
new file mode 100644 (file)
index 0000000..94d22b5
--- /dev/null
@@ -0,0 +1,68 @@
+package org.argeo.slc.core.structure.tree;\r
+\r
+import java.util.StringTokenizer;\r
+\r
+import org.argeo.slc.core.structure.StructurePath;\r
+\r
+public class TreeSPath implements StructurePath {\r
+       public static Character DEFAULT_SEPARATOR = '#';\r
+\r
+       private TreeSPath parent;\r
+       private String name;\r
+       private Character separator = DEFAULT_SEPARATOR;\r
+\r
+       public String getAsUniqueString() {\r
+               String parentStr = parent != null ? parent.getAsUniqueString() : "";\r
+               return parentStr + separator + name;\r
+       }\r
+\r
+       public Character getSeparator() {\r
+               return separator;\r
+       }\r
+\r
+       public TreeSPath getParent() {\r
+               return parent;\r
+       }\r
+\r
+       public String getName() {\r
+               return name;\r
+       }\r
+\r
+       public static TreeSPath createChild(TreeSPath parent, String name) {\r
+               TreeSPath path = new TreeSPath();\r
+               path.parent = parent;\r
+               path.name = name;\r
+               return path;\r
+       }\r
+\r
+       public static TreeSPath createTreeSPath(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
+                       } else {\r
+                               currPath = createChild(currPath, st.nextToken());\r
+                       }\r
+               }\r
+               return currPath;\r
+       }\r
+       \r
+       @Override\r
+       public String toString(){\r
+               return getAsUniqueString();\r
+       }\r
+\r
+       @Override\r
+       public boolean equals(Object obj) {\r
+               if (obj instanceof StructurePath) {\r
+                       StructurePath path = (StructurePath) obj;\r
+                       return getAsUniqueString().equals(path.getAsUniqueString());\r
+               }\r
+               return false;\r
+       }\r
+       \r
+       \r
+}\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSRegistry.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSRegistry.java
new file mode 100644 (file)
index 0000000..b52b71d
--- /dev/null
@@ -0,0 +1,54 @@
+package org.argeo.slc.core.structure.tree;\r
+\r
+import java.util.List;\r
+import java.util.Vector;\r
+\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+\r
+import org.argeo.slc.core.structure.StructureAware;\r
+import org.argeo.slc.core.structure.StructureElement;\r
+import org.argeo.slc.core.structure.StructurePath;\r
+import org.argeo.slc.core.structure.StructureRegistry;\r
+\r
+public class TreeSRegistry implements StructureRegistry {\r
+       private static Log log = LogFactory.getLog(TreeSRegistry.class);\r
+\r
+       private List<TreeSElement> elements = new Vector<TreeSElement>();\r
+       private List<TreeSPath> paths = new Vector<TreeSPath>();\r
+\r
+       public List<StructureElement> listElements() {\r
+               return new Vector<StructureElement>(elements);\r
+       }\r
+\r
+       public void register(StructureElement element) {\r
+               TreeSElement treeSElement = checkElement(element);\r
+               elements.add(treeSElement);\r
+               paths.add((TreeSPath) treeSElement.getPath());\r
+               log.debug("Registered " + treeSElement.getPath() + " (desc: "\r
+                               + treeSElement.getDescription() + " position: "\r
+                               + elements.size() + ")");\r
+       }\r
+\r
+       public void register(StructureAware structureAware) {\r
+               register(structureAware.getElement());\r
+               structureAware.onRegister(this);\r
+       }\r
+\r
+       public StructureElement getElement(StructurePath path) {\r
+               int index = paths.indexOf(path);\r
+               if (index >= 0) {\r
+                       return elements.get(index);\r
+               } else {// not found\r
+                       return null;\r
+               }\r
+       }\r
+\r
+       protected TreeSElement checkElement(StructureElement element) {\r
+               if (!(element instanceof TreeSElement)) {\r
+                       throw new RuntimeException("Element class " + element.getClass()\r
+                                       + " is not supported.");\r
+               }\r
+               return (TreeSElement) element;\r
+       }\r
+}\r
index 84208f57774ec8ec3125a8ce6d7b310a07c09098..ca90d0da3282551142bddc71b68a1c6029a555e7 100644 (file)
@@ -1,5 +1,5 @@
 <project default="test">\r
-       <taskdef name="slc.test" classname="org.argeo.slc.ant.SlcTestTask" />\r
+       <taskdef name="slc.test" classname="org.argeo.slc.ant.test.SlcTestTask" />\r
 \r
        <target name="test" depends="testSimple,testObj">\r
        </target>\r