Simplify structure framework
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 27 Oct 2007 13:53:11 +0000 (13:53 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 27 Oct 2007 13:53:11 +0000 (13:53 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@663 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

18 files changed:
org.argeo.slc/src/main/java/org/argeo/slc/ant/AntRegistryUtil.java
org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntConfig.java
org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcProjectHelper.java
org.argeo.slc/src/main/java/org/argeo/slc/ant/spring/AbstractSpringArg.java
org.argeo.slc/src/main/java/org/argeo/slc/ant/structure/SAwareArg.java [deleted file]
org.argeo.slc/src/main/java/org/argeo/slc/ant/structure/SAwareTask.java
org.argeo.slc/src/main/java/org/argeo/slc/ant/test/SlcTestTask.java
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/DefaultSRegistry.java
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/PropagatingSAware.java [deleted file]
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureAware.java
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureElement.java
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/StructureRegistry.java
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/WritableSAware.java [deleted file]
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/DefaultTreeSAware.java
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSAware.java [deleted file]
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSElement.java
org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSPath.java
org.argeo.slc/src/test/java/org/argeo/slc/testslc/DummyTestData.java

index a8fe8bf296392fa1aa08051bb3a1589bbebb81be..d257f55b2650f0309972b5240bcbe3d233d282db 100644 (file)
@@ -9,11 +9,10 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.tools.ant.Project;\r
 import org.apache.tools.ant.ProjectHelper;\r
 \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
-/** Utilities to manipulate the structure registry in SLC Ant.*/\r
+/** Utilities to manipulate the structure registry in SLC Ant. */\r
 public class AntRegistryUtil {\r
        private static Log log = LogFactory.getLog(AntRegistryUtil.class);\r
 \r
@@ -22,6 +21,7 @@ public class AntRegistryUtil {
 \r
                Project p = new Project();\r
                p.setUserProperty("ant.file", antFile.getAbsolutePath());\r
+               p.setBaseDir(antFile.getParentFile());\r
                p.init();\r
                ProjectHelper helper = new SlcProjectHelper();\r
                p.addReference("ant.projectHelper", helper);\r
@@ -40,6 +40,7 @@ public class AntRegistryUtil {
 \r
                Project p = new Project();\r
                p.setUserProperty("ant.file", antFile.getAbsolutePath());\r
+               p.setBaseDir(antFile.getParentFile());\r
                p.init();\r
                ProjectHelper helper = new SlcProjectHelper();\r
                p.addReference("ant.projectHelper", helper);\r
@@ -54,22 +55,19 @@ public class AntRegistryUtil {
 \r
        public static void main(String[] args) {\r
                File antFile = new File(\r
-                               "C:/dev/workspaces/default/org.argeo.slc/src/test/ant/build.xml");\r
-               System\r
-                               .setProperty(SlcAntConfig.APPLICATION_CONTEXT_PROPERTY,\r
-                                               "C:/dev/workspaces/default/org.argeo.slc/src/test/ant/applicationContext.xml");\r
+                               "C:/dev/workspaces/default/org.argeo.slc/src/test/slc/root/Category1/SubCategory2/build.xml");\r
                StructureRegistry registry = AntRegistryUtil.readRegistry(antFile);\r
 \r
                StringBuffer buf = new StringBuffer("");\r
 \r
                int count = 0;\r
                List<StructurePath> activePaths = new Vector<StructurePath>();\r
-               for (StructureElement element : registry.listElements()) {\r
-                       buf.append(element.getPath());\r
+               for (StructurePath path : registry.listPaths()) {\r
+                       buf.append(path);\r
                        if (count != 0 && count % 3 == 0) {\r
                                // skip\r
                        } else {\r
-                               activePaths.add(element.getPath());\r
+                               activePaths.add(path);\r
                                buf.append(" <");\r
                        }\r
                        buf.append('\n');\r
@@ -80,5 +78,4 @@ public class AntRegistryUtil {
                runActive(antFile, activePaths);\r
 \r
        }\r
-\r
 }\r
index 61c74524c52db399458248eb6ea50d205008ca40..7fedff747840feadd7e1c95ca7b0f4f0cf89118b 100644 (file)
@@ -24,16 +24,14 @@ public class SlcAntConfig {
        /** Path to the root Spring application context */\r
        public static String APPLICATION_CONTEXT_PROPERTY = "org.argeo.slc.ant.applicationContext";\r
 \r
-       private final File confDir;\r
-       private final File rootDir;\r
-       private final File workDir;\r
-\r
        /** Retrieve all properties and set them as project user properties */\r
-       public SlcAntConfig(Project project, File slcRootFile) {\r
+       public static void initProject(Project project, File slcRootFile) {\r
                Properties p = loadFile(slcRootFile.getAbsolutePath());\r
 \r
+               final File confDir;\r
+               final File workDir;\r
                // Root dir\r
-               rootDir = slcRootFile.getParentFile();\r
+               final File rootDir = slcRootFile.getParentFile();\r
                project.setUserProperty(ROOT_DIR_PROPERTY, rootDir.getAbsolutePath());\r
 \r
                // Conf dir\r
@@ -85,7 +83,7 @@ public class SlcAntConfig {
                }\r
        }\r
 \r
-       private Properties loadFile(String path) {\r
+       private static Properties loadFile(String path) {\r
                Properties p = new Properties();\r
                try {\r
                        FileInputStream in = new FileInputStream(path);\r
@@ -97,16 +95,4 @@ public class SlcAntConfig {
                return p;\r
        }\r
 \r
-       public File getConfDir() {\r
-               return confDir;\r
-       }\r
-\r
-       public File getRootDir() {\r
-               return rootDir;\r
-       }\r
-\r
-       public File getWorkDir() {\r
-               return workDir;\r
-       }\r
-\r
 }\r
index ecb46c07bf0f73822b3e618f0c8e92b7816857d1..34373437d7cd2af7b5dfe99a03cbb4435a38bb62 100644 (file)
@@ -40,7 +40,7 @@ public class SlcProjectHelper extends ProjectHelperImpl {
                if (slcRootFile == null) {\r
                        throw new SlcAntException("Cannot find SLC root file");\r
                }\r
-               SlcAntConfig slcAntConfig = new SlcAntConfig(project, slcRootFile);\r
+               SlcAntConfig.initProject(project, slcRootFile);\r
 \r
                // init Spring application context\r
                String acPath = project\r
@@ -56,19 +56,17 @@ public class SlcProjectHelper extends ProjectHelperImpl {
                super.parse(project, source);\r
 \r
                addSlcTasks(project);\r
-               \r
+\r
                // create structure root\r
-               String projectDescription = project.getDescription() != null ? project\r
-                               .getDescription() : "Root";\r
-               TreeSElement element = TreeSElement.createRootElelment(\r
-                               getProjectPathName(project), projectDescription);\r
-               registry.register(element);\r
+               TreeSElement element = new TreeSElement(project.getDescription(),\r
+                               "Root");\r
+               registry.register(getProjectPath(project), element);\r
 \r
        }\r
 \r
        /** Get the path of a project (root). */\r
        public static TreeSPath getProjectPath(Project project) {\r
-               return TreeSPath.createChild(null, getProjectPathName(project));\r
+               return TreeSPath.createRootPath(getProjectPathName(project));\r
        }\r
 \r
        private static String getProjectPathName(Project project) {\r
@@ -109,7 +107,7 @@ public class SlcProjectHelper extends ProjectHelperImpl {
                                project.addTaskDefinition(name, Class.forName(taskdefs\r
                                                .getProperty(name)));\r
                        } catch (ClassNotFoundException e) {\r
-                               log.error("Unknown class for task "+name, e);\r
+                               log.error("Unknown class for task " + name, e);\r
                        }\r
                }\r
        }\r
index 5cf3e0831e1526c370eac75decca5639c9fd6c0e..7865241b4093d268a88c8d1dd60f08e53c4597c4 100644 (file)
@@ -17,6 +17,9 @@ public abstract class AbstractSpringArg extends DataType {
 \r
        private String bean;\r
 \r
+       // cache bean instance to avoid reading it twice if it is a prototype\r
+       private Object beanInstance = null;\r
+\r
        /** The <u>name</u> of the underlying bean, as set throught the attribute. */\r
        public String getBean() {\r
                return bean;\r
@@ -28,28 +31,29 @@ public abstract class AbstractSpringArg extends DataType {
        }\r
 \r
        /**\r
-        * Retrieve the instance of the bean. <b>If teh underlying Spring bean is a\r
-        * prototype, it will instanciated each time.</b>\r
+        * Retrieve the instance of the bean. <b>The value is cached.</b>\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
+       public Object getBeanInstance() {\r
+               if (beanInstance == null) {\r
+                       beanInstance = getContext().getBean(bean);\r
+\r
+                       BeanWrapper wrapper = new BeanWrapperImpl(beanInstance);\r
+                       for (OverrideArg override : overrides) {\r
+                               wrapper.setPropertyValue(override.getName(), override\r
+                                               .getObject());\r
+                       }\r
                }\r
-\r
-               return obj;\r
+               return beanInstance;\r
        }\r
 \r
-       /** Creates an override subtag.*/\r
+       /** Creates an override subtag. */\r
        public OverrideArg createOverride() {\r
                OverrideArg propertyArg = new OverrideArg();\r
                overrides.add(propertyArg);\r
                return propertyArg;\r
        }\r
 \r
-       /** The related Spring application context.*/\r
+       /** The related Spring application context. */\r
        protected ApplicationContext getContext() {\r
                return (ApplicationContext) getProject().getReference(\r
                                SlcProjectHelper.REF_ROOT_CONTEXT);\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/structure/SAwareArg.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/structure/SAwareArg.java
deleted file mode 100644 (file)
index 44f9f41..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.argeo.slc.ant.structure;\r
-\r
-import org.argeo.slc.ant.spring.AbstractSpringArg;\r
-import org.argeo.slc.core.structure.StructureElement;\r
-import org.argeo.slc.core.structure.StructureRegistry;\r
-import org.argeo.slc.core.structure.tree.TreeSAware;\r
-import org.argeo.slc.core.structure.tree.TreeSElement;\r
-\r
-/** Ant types allowing to propagate structure informations.*/\r
-public abstract class SAwareArg extends AbstractSpringArg{\r
-       //private TreeSAware parentSAware;\r
-\r
-       @Override\r
-       protected Object getBeanInstance() {\r
-               Object obj = super.getBeanInstance();\r
-/*\r
-               if (obj instanceof TreeSAware && parentSAware != null) {\r
-                       TreeSAware sAware = (TreeSAware) 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.addToPropagationList(sAware);\r
-//                     StructureRegistry registry = (StructureRegistry) getProject()\r
-//                                     .getReference(SlcProjectHelper.REF_STRUCTURE_REGISTRY);\r
-//                     registry.register(parentSAware);\r
-               }\r
-               */\r
-               return obj;\r
-       }\r
-\r
-       public void init(TreeSAware parentSAware){\r
-               \r
-               Object obj = super.getBeanInstance();\r
-               \r
-               if (obj instanceof TreeSAware && parentSAware != null) {\r
-                       TreeSAware sAware = (TreeSAware) 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.addToPropagationList(sAware);\r
-//                     StructureRegistry registry = (StructureRegistry) getProject()\r
-//                                     .getReference(SlcProjectHelper.REF_STRUCTURE_REGISTRY);\r
-//                     registry.register(parentSAware);\r
-               }\r
-       }\r
-       \r
-//     public void setParentSAware(TreeSAware parentSAware) {\r
-//             this.parentSAware = parentSAware;\r
-//     }\r
-\r
-\r
-       public StructureElement getElement() {\r
-               // TODO Auto-generated method stub\r
-               return null;\r
-       }\r
-\r
-       public void onRegister(StructureRegistry registry) {\r
-               // TODO Auto-generated method stub\r
-               \r
-       }\r
-\r
-       \r
-}\r
index 3defcd73f756de28d1af8ff7fc5bc337c4e023a1..befa20864ce2d58cd485daddc24084e3a5d1b245 100644 (file)
@@ -7,42 +7,44 @@ import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Target;\r
 \r
 import org.argeo.slc.ant.SlcProjectHelper;\r
+import org.argeo.slc.ant.spring.AbstractSpringArg;\r
 import org.argeo.slc.ant.spring.AbstractSpringTask;\r
+import org.argeo.slc.core.structure.StructureAware;\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.TreeSAware;\r
 import org.argeo.slc.core.structure.tree.TreeSElement;\r
 import org.argeo.slc.core.structure.tree.TreeSPath;\r
 \r
 /** Ant task that can be registered within a structure. */\r
 public abstract class SAwareTask extends AbstractSpringTask {\r
-       protected final TreeSAware sAware = new DefaultTreeSAware();\r
-       protected final List<SAwareArg> sAwareArgs = new Vector<SAwareArg>();\r
+       private final DefaultTreeSAware sAware = new DefaultTreeSAware();\r
+       private final List<AbstractSpringArg> sAwareArgs = new Vector<AbstractSpringArg>();\r
 \r
        @Override\r
        public void init() throws BuildException {\r
                StructureRegistry registry = getRegistry();\r
                Target target = getOwningTarget();\r
-               TreeSElement projectElement = (TreeSElement) registry\r
-                               .getElement(SlcProjectHelper.getProjectPath(getProject()));\r
+\r
+               TreeSPath targetPath = createTargetPath(target);\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
+                       targetElement = new TreeSElement(target.getDescription(),\r
+                                       "<no target desc>");\r
+                       registry.register(targetPath, targetElement);\r
                }\r
 \r
-               TreeSElement taskElement = targetElement.createChild(getTaskName()\r
-                               + targetElement.getChildren().size(),\r
-                               getDescription() != null ? getDescription() : "<no task desc>");\r
+               TreeSElement taskElement = new TreeSElement(getDescription(),\r
+                               "<no task desc>");\r
                sAware.setElement(taskElement);\r
        }\r
 \r
+       protected void addSAwareArg(AbstractSpringArg arg) {\r
+               sAwareArgs.add(arg);\r
+       }\r
+\r
        @Override\r
        /**\r
         * Called by Ant at runtime. Decides whether to call the actions depending\r
@@ -52,24 +54,34 @@ public abstract class SAwareTask extends AbstractSpringTask {
         * @see StructureRegistry\r
         */\r
        public final void execute() throws BuildException {\r
-               for(SAwareArg arg : sAwareArgs){\r
-                       arg.init(sAware);\r
+               // init registered args\r
+               for (AbstractSpringArg arg : sAwareArgs) {\r
+                       Object obj = arg.getBeanInstance();\r
+\r
+                       if (obj instanceof StructureAware && sAware != null) {\r
+                               StructureAware sAwareT = (StructureAware) obj;\r
+                               sAware.addToPropagationList(arg.getBean(), sAwareT);\r
+                       }\r
                }\r
-               \r
-               getRegistry().register(sAware);\r
-               \r
+\r
+               // register the task in the structure\r
+               TreeSPath targetPath = createTargetPath(getOwningTarget());\r
+               TreeSPath taskPath = targetPath.createChild(getTaskName()\r
+                               + targetPath.listChildren(getRegistry()).size());\r
+               getRegistry().register(taskPath, sAware);\r
+\r
+               // execute depending on the registry mode\r
                String mode = getRegistry().getMode();\r
                if (mode.equals(StructureRegistry.ALL)) {\r
                        executeActions(mode);\r
                } else if (mode.equals(StructureRegistry.ACTIVE)) {\r
                        List<StructurePath> activePaths = getRegistry().getActivePaths();\r
-                       \r
-                       StructurePath targetPath = createTargetPath(getOwningTarget());\r
-                       if(activePaths.contains(targetPath)){\r
-                               if (activePaths.contains(sAware.getElement().getPath())) {\r
+\r
+                       if (activePaths.contains(targetPath)) {\r
+                               if (activePaths.contains(taskPath)) {\r
                                        executeActions(mode);\r
                                }\r
-                       }                       \r
+                       }\r
                }\r
 \r
        }\r
@@ -84,9 +96,9 @@ public abstract class SAwareTask extends AbstractSpringTask {
        }\r
 \r
        /** Creates the path for a given Ant target. */\r
-       protected static StructurePath createTargetPath(Target target) {\r
+       protected static TreeSPath createTargetPath(Target target) {\r
                TreeSPath projectPath = SlcProjectHelper.getProjectPath(target\r
                                .getProject());\r
-               return TreeSPath.createChild(projectPath, target.getName());\r
+               return projectPath.createChild(target.getName());\r
        }\r
 }\r
index df09e520412c3fdbc2ff98d03ab971be2d8e5582..69d08eee50727654ba534005592fe964effcff1b 100644 (file)
@@ -2,7 +2,7 @@ package org.argeo.slc.ant.test;
 \r
 import org.apache.tools.ant.BuildException;\r
 \r
-import org.argeo.slc.ant.structure.SAwareArg;\r
+import org.argeo.slc.ant.spring.AbstractSpringArg;\r
 import org.argeo.slc.ant.structure.SAwareTask;\r
 import org.argeo.slc.core.deploy.DeployedSystem;\r
 import org.argeo.slc.core.test.TestData;\r
@@ -24,13 +24,13 @@ public class SlcTestTask extends SAwareTask implements TestRun {
 \r
        public TestDefinitionArg createTestDefinition() {\r
                testDefinitionArg = new TestDefinitionArg();\r
-               sAwareArgs.add(testDefinitionArg);\r
+               addSAwareArg(testDefinitionArg);\r
                return testDefinitionArg;\r
        }\r
 \r
        public TestDataArg createTestData() {\r
                testDataArg = new TestDataArg();\r
-               sAwareArgs.add(testDataArg);\r
+               addSAwareArg(testDataArg);\r
                return testDataArg;\r
        }\r
 \r
@@ -52,29 +52,15 @@ public class SlcTestTask extends SAwareTask implements TestRun {
 \r
 }\r
 \r
-class TestDefinitionArg extends SAwareArg {\r
-       private TestDefinition testDefinition;\r
-\r
+class TestDefinitionArg extends AbstractSpringArg {\r
        public TestDefinition getTestDefinition() {\r
-               if (testDefinition == null) {\r
-                       // don't call Spring each time in order not to multi-instantiate\r
-                       // prototype\r
-                       testDefinition = (TestDefinition) getBeanInstance();\r
-               }\r
-               return testDefinition;\r
+               return (TestDefinition) getBeanInstance();\r
        }\r
 }\r
 \r
-class TestDataArg extends SAwareArg {\r
-       private TestData testData;\r
-\r
+class TestDataArg extends AbstractSpringArg {\r
        public TestData getTestData() {\r
-               if (testData == null) {\r
-                       // don't call Spring each time in order not to multi-instantiate\r
-                       // prototype\r
-                       testData = (TestData) getBeanInstance();\r
-               }\r
-               return testData;\r
+               return (TestData) getBeanInstance();\r
        }\r
 \r
 }\r
index 3d6317078f8af228d1ceff9b7be58603549db918..1cca17be4dc553434a307507cda89f1b6e436920 100644 (file)
@@ -20,18 +20,22 @@ public class DefaultSRegistry implements StructureRegistry {
                return new Vector<StructureElement>(elements);\r
        }\r
 \r
-       public void register(StructureElement element) {\r
+       public List<StructurePath> listPaths() {\r
+               return new Vector<StructurePath>(paths);\r
+       }\r
+\r
+       public void register(StructurePath path,StructureElement element) {\r
                StructureElement treeSElement = element;\r
                elements.add(treeSElement);\r
-               paths.add( treeSElement.getPath());\r
-               log.debug("Registered " + treeSElement.getPath() + " (desc: "\r
+               paths.add( path);\r
+               log.debug("Registered " + path + " (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
+       public void register(StructurePath path,StructureAware structureAware) {\r
+               register(path,structureAware.getElement());\r
+               structureAware.onRegister(this,path);\r
        }\r
 \r
        public StructureElement getElement(StructurePath path) {\r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/PropagatingSAware.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/PropagatingSAware.java
deleted file mode 100644 (file)
index 15a6ff8..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.argeo.slc.core.structure;\r
-\r
-import java.util.List;\r
-\r
-/** Structure aware object able to propagate registration.*/\r
-public interface PropagatingSAware extends StructureAware {\r
-       /**\r
-        * Adds a structure aware to which registration should be propagated. The\r
-        * passed object will be registered when this object will be\r
-        * registered itself, so it should not have been registered before. <b>It doesn't\r
-        * have to be consistent with the tree structure defined by tree based\r
-        * registry elements (although it will often make more sense)</b>.\r
-        */\r
-       public void addToPropagationList(StructureAware sAware);\r
-\r
-       /** Returns the list of structure aware to propagate to. */\r
-       public List<StructureAware> getPropagationList();\r
-\r
-}\r
index b88e5d22ead8456ab515bad0966b9af4064b4287..f093bf26017f6a2047162d8776af54f311681726 100644 (file)
@@ -9,5 +9,5 @@ public interface StructureAware {
        public StructureElement getElement();\r
 \r
        /** Called <b>after</b> registration. */\r
-       public void onRegister(StructureRegistry registry);\r
+       public void onRegister(StructureRegistry registry, StructurePath path);\r
 }\r
index b7400d58ad31ebef723eecfa703b7a9d5f6c8d79..708fbc74ec526a9102a030e24df16be62d7c718b 100644 (file)
@@ -2,9 +2,6 @@ package org.argeo.slc.core.structure;
 \r
 /** Atomic element holding the reference to the element which is structured. */\r
 public interface StructureElement {\r
-       /** Path to this element. */\r
-       public StructurePath getPath();\r
-\r
        /** Description of this element. */\r
        public String getDescription();\r
 }\r
index 3ffb2d26ff1caa15139f4794d7deafe312139e6a..140882f749d8b268f249e15523b7e74a0125c436 100644 (file)
@@ -8,21 +8,24 @@ public interface StructureRegistry {
        public static String READ = "READ";\r
        /** All mode: everything is executed regardless of the active paths. */\r
        public static String ALL = "ALL";\r
-       /** Active mode: only teh active paths are executed. */\r
+       /** Active mode: only the active paths are executed. */\r
        public static String ACTIVE = "ACTIVE";\r
 \r
        /** Adds an element to the registry. */\r
-       public void register(StructureElement element);\r
+       public void register(StructurePath path, StructureElement element);\r
 \r
        /**\r
         * Adds the wrapped element of a <code>SructureAware</code>, and\r
         * propagates the registration.\r
         */\r
-       public void register(StructureAware structureAware);\r
+       public void register(StructurePath path, StructureAware structureAware);\r
 \r
        /** Lists <b>all</b> registered elements. */\r
        public List<StructureElement> listElements();\r
 \r
+       /** Lists <b>all</b> registered elements. */\r
+       public List<StructurePath> listPaths();\r
+\r
        /** Gets a element based on its path. */\r
        public StructureElement getElement(StructurePath path);\r
 \r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/WritableSAware.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/WritableSAware.java
deleted file mode 100644 (file)
index 12c2f43..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.argeo.slc.core.structure;\r
-\r
-\r
-/** Structure aware object in which the wrapped element can be externally set. */\r
-public interface WritableSAware extends StructureAware {\r
-       /** Sets the wrapped element. */\r
-       public void setElement(StructureElement element);\r
-\r
-}\r
index 0e470f4e18618dc93bb50783a6b974ac2042e50b..10869ce820b95e803cbf2c1aa7676b23bc827783 100644 (file)
@@ -5,6 +5,7 @@ import java.util.Vector;
 \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
 /**\r
@@ -12,8 +13,9 @@ import org.argeo.slc.core.structure.StructureRegistry;
  * registries, using <code>TreeSPath</code>. Convenient to be wrapped in\r
  * classes which cannot extend it.\r
  */\r
-public class DefaultTreeSAware implements TreeSAware {\r
+public class DefaultTreeSAware implements StructureAware {\r
        private StructureElement element;\r
+       private List<String> names = new Vector<String>();\r
        private List<StructureAware> children = new Vector<StructureAware>();\r
 \r
        public StructureElement getElement() {\r
@@ -24,14 +26,20 @@ public class DefaultTreeSAware implements TreeSAware {
                this.element = element;\r
        }\r
 \r
-       public void onRegister(StructureRegistry registry) {\r
+       public void onRegister(StructureRegistry registry, StructurePath path) {\r
+               int index = 0;\r
                for (StructureAware sAware : children) {\r
-                       registry.register(sAware.getElement());\r
-                       sAware.onRegister(registry);\r
+                       TreeSPath childPath = ((TreeSPath) path).createChild(names\r
+                                       .get(index)\r
+                                       + index);\r
+                       registry.register(childPath, sAware.getElement());\r
+                       sAware.onRegister(registry, childPath);\r
+                       index++;\r
                }\r
        }\r
 \r
-       public void addToPropagationList(StructureAware sAware) {\r
+       public void addToPropagationList(String name, StructureAware sAware) {\r
+               names.add(name);\r
                children.add(sAware);\r
        }\r
 \r
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSAware.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSAware.java
deleted file mode 100644 (file)
index 94dc07c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.argeo.slc.core.structure.tree;\r
-\r
-import org.argeo.slc.core.structure.PropagatingSAware;\r
-import org.argeo.slc.core.structure.WritableSAware;\r
-\r
-/**\r
- * Provides methods to externally propagate tree related informations in tree\r
- * based registries.\r
- * \r
- * @see TreeSElement\r
- */\r
-public interface TreeSAware extends WritableSAware, PropagatingSAware {\r
-\r
-}\r
index 6e3ff04a86625b5ab3769d14b1b6c634f2cc306e..aa296c5a927a42add9598168a906f86f99af10f1 100644 (file)
@@ -1,10 +1,6 @@
 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
 /**\r
  * Implementation of <code>StructureElement</code> for tree based registries,\r
@@ -14,10 +10,15 @@ import org.argeo.slc.core.structure.StructurePath;
  */\r
 public class TreeSElement implements StructureElement {\r
        private String description;\r
-       private TreeSPath path;\r
-\r
-       private List<TreeSElement> children = new Vector<TreeSElement>();\r
 \r
+       public TreeSElement(String description){\r
+               this.description = description;\r
+       }\r
+       \r
+       public TreeSElement(String description, String defaultDescription){\r
+               this(description!=null?description:defaultDescription);\r
+       }\r
+       \r
        public String getDescription() {\r
                return description;\r
        }\r
@@ -26,37 +27,4 @@ public class TreeSElement implements StructureElement {
                this.description = description;\r
        }\r
 \r
-       public StructurePath getPath() {\r
-               return path;\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
index 524f8adfba769b06e25ae613d309b81af11016e8..fb66c300b4fe6e12872875cb7709c25b011c2456 100644 (file)
@@ -1,8 +1,11 @@
 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.structure.StructurePath;\r
+import org.argeo.slc.core.structure.StructureRegistry;\r
 \r
 /**\r
  * Path for tree based <code>StructureRegistry</code> implementations.\r
@@ -37,10 +40,18 @@ public class TreeSPath implements StructurePath {
                return name;\r
        }\r
 \r
-       /** Create a child path based on a parent path and a name. */\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 = parent;\r
+               path.parent = null;\r
+               path.name = name;\r
+               return path;\r
+       }\r
+\r
+       /** Create a child . */\r
+       public TreeSPath createChild(String name) {\r
+               TreeSPath path = new TreeSPath();\r
+               path.parent = this;\r
                path.name = name;\r
                return path;\r
        }\r
@@ -53,14 +64,31 @@ public class TreeSPath implements StructurePath {
                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
        @Override\r
        public String toString() {\r
                return getAsUniqueString();\r
index 738c03eeb0747dfd80a2959ec2402c0f17fc6c9e..02c6e57959fd4d8c7857688d1fd40ab99e002543 100644 (file)
@@ -1,8 +1,8 @@
 package org.argeo.slc.testslc;\r
 \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.TreeSAware;\r
 import org.argeo.slc.core.structure.tree.TreeSElement;\r
 import org.argeo.slc.core.test.TestData;\r
 \r
@@ -10,6 +10,10 @@ public class DummyTestData extends DefaultTreeSAware implements TestData {
        private Object reached;\r
        private Object expected;\r
 \r
+       public DummyTestData(){\r
+               setElement(new TreeSElement("This is a dummy test data"));\r
+       }\r
+       \r
        public Object getReached() {\r
                return reached;\r
        }\r
@@ -27,15 +31,15 @@ public class DummyTestData extends DefaultTreeSAware implements TestData {
        }\r
 \r
        @Override\r
-       public void onRegister(StructureRegistry registry) {\r
-               if (expected instanceof TreeSAware) {\r
-                       TreeSAware sAware = (TreeSAware) expected;\r
-                       TreeSElement element = ((TreeSElement) getElement()).createChild(\r
-                                       "expected" + getPropagationList().size(), "<no desc>");\r
+       public void onRegister(StructureRegistry registry, StructurePath path) {\r
+               if (expected instanceof DefaultTreeSAware) {\r
+                       DefaultTreeSAware sAware = (DefaultTreeSAware) expected;\r
+                       TreeSElement element = new TreeSElement("This is an expected");\r
+                       element.setDescription("<no desc>");\r
                        sAware.setElement(element);\r
-                       addToPropagationList(sAware);\r
+                       addToPropagationList("expected",sAware);\r
                }\r
-               super.onRegister(registry);\r
+               super.onRegister(registry, path);\r
        }\r
        \r
        \r