From d62a44995fa4bc758ab3b3e6e7ffe7b79c8684ef Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 27 Oct 2007 13:53:11 +0000 Subject: [PATCH] Simplify structure framework git-svn-id: https://svn.argeo.org/slc/trunk@663 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org/argeo/slc/ant/AntRegistryUtil.java | 17 ++--- .../java/org/argeo/slc/ant/SlcAntConfig.java | 24 ++---- .../org/argeo/slc/ant/SlcProjectHelper.java | 16 ++-- .../slc/ant/spring/AbstractSpringArg.java | 28 ++++--- .../argeo/slc/ant/structure/SAwareArg.java | 73 ------------------- .../argeo/slc/ant/structure/SAwareTask.java | 62 +++++++++------- .../org/argeo/slc/ant/test/SlcTestTask.java | 28 ++----- .../slc/core/structure/DefaultSRegistry.java | 16 ++-- .../slc/core/structure/PropagatingSAware.java | 19 ----- .../slc/core/structure/StructureAware.java | 2 +- .../slc/core/structure/StructureElement.java | 3 - .../slc/core/structure/StructureRegistry.java | 9 ++- .../slc/core/structure/WritableSAware.java | 9 --- .../structure/tree/DefaultTreeSAware.java | 18 +++-- .../slc/core/structure/tree/TreeSAware.java | 14 ---- .../slc/core/structure/tree/TreeSElement.java | 48 ++---------- .../slc/core/structure/tree/TreeSPath.java | 38 ++++++++-- .../org/argeo/slc/testslc/DummyTestData.java | 20 +++-- 18 files changed, 162 insertions(+), 282 deletions(-) delete mode 100644 org.argeo.slc/src/main/java/org/argeo/slc/ant/structure/SAwareArg.java delete mode 100644 org.argeo.slc/src/main/java/org/argeo/slc/core/structure/PropagatingSAware.java delete mode 100644 org.argeo.slc/src/main/java/org/argeo/slc/core/structure/WritableSAware.java delete mode 100644 org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSAware.java diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/AntRegistryUtil.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/AntRegistryUtil.java index a8fe8bf29..d257f55b2 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/ant/AntRegistryUtil.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/ant/AntRegistryUtil.java @@ -9,11 +9,10 @@ import org.apache.commons.logging.LogFactory; import org.apache.tools.ant.Project; import org.apache.tools.ant.ProjectHelper; -import org.argeo.slc.core.structure.StructureElement; import org.argeo.slc.core.structure.StructurePath; import org.argeo.slc.core.structure.StructureRegistry; -/** Utilities to manipulate the structure registry in SLC Ant.*/ +/** Utilities to manipulate the structure registry in SLC Ant. */ public class AntRegistryUtil { private static Log log = LogFactory.getLog(AntRegistryUtil.class); @@ -22,6 +21,7 @@ public class AntRegistryUtil { Project p = new Project(); p.setUserProperty("ant.file", antFile.getAbsolutePath()); + p.setBaseDir(antFile.getParentFile()); p.init(); ProjectHelper helper = new SlcProjectHelper(); p.addReference("ant.projectHelper", helper); @@ -40,6 +40,7 @@ public class AntRegistryUtil { Project p = new Project(); p.setUserProperty("ant.file", antFile.getAbsolutePath()); + p.setBaseDir(antFile.getParentFile()); p.init(); ProjectHelper helper = new SlcProjectHelper(); p.addReference("ant.projectHelper", helper); @@ -54,22 +55,19 @@ public class AntRegistryUtil { public static void main(String[] args) { File antFile = new File( - "C:/dev/workspaces/default/org.argeo.slc/src/test/ant/build.xml"); - System - .setProperty(SlcAntConfig.APPLICATION_CONTEXT_PROPERTY, - "C:/dev/workspaces/default/org.argeo.slc/src/test/ant/applicationContext.xml"); + "C:/dev/workspaces/default/org.argeo.slc/src/test/slc/root/Category1/SubCategory2/build.xml"); StructureRegistry registry = AntRegistryUtil.readRegistry(antFile); StringBuffer buf = new StringBuffer(""); int count = 0; List activePaths = new Vector(); - for (StructureElement element : registry.listElements()) { - buf.append(element.getPath()); + for (StructurePath path : registry.listPaths()) { + buf.append(path); if (count != 0 && count % 3 == 0) { // skip } else { - activePaths.add(element.getPath()); + activePaths.add(path); buf.append(" <"); } buf.append('\n'); @@ -80,5 +78,4 @@ public class AntRegistryUtil { runActive(antFile, activePaths); } - } diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntConfig.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntConfig.java index 61c74524c..7fedff747 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntConfig.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntConfig.java @@ -24,16 +24,14 @@ public class SlcAntConfig { /** Path to the root Spring application context */ public static String APPLICATION_CONTEXT_PROPERTY = "org.argeo.slc.ant.applicationContext"; - private final File confDir; - private final File rootDir; - private final File workDir; - /** Retrieve all properties and set them as project user properties */ - public SlcAntConfig(Project project, File slcRootFile) { + public static void initProject(Project project, File slcRootFile) { Properties p = loadFile(slcRootFile.getAbsolutePath()); + final File confDir; + final File workDir; // Root dir - rootDir = slcRootFile.getParentFile(); + final File rootDir = slcRootFile.getParentFile(); project.setUserProperty(ROOT_DIR_PROPERTY, rootDir.getAbsolutePath()); // Conf dir @@ -85,7 +83,7 @@ public class SlcAntConfig { } } - private Properties loadFile(String path) { + private static Properties loadFile(String path) { Properties p = new Properties(); try { FileInputStream in = new FileInputStream(path); @@ -97,16 +95,4 @@ public class SlcAntConfig { return p; } - public File getConfDir() { - return confDir; - } - - public File getRootDir() { - return rootDir; - } - - public File getWorkDir() { - return workDir; - } - } diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcProjectHelper.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcProjectHelper.java index ecb46c07b..34373437d 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcProjectHelper.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcProjectHelper.java @@ -40,7 +40,7 @@ public class SlcProjectHelper extends ProjectHelperImpl { if (slcRootFile == null) { throw new SlcAntException("Cannot find SLC root file"); } - SlcAntConfig slcAntConfig = new SlcAntConfig(project, slcRootFile); + SlcAntConfig.initProject(project, slcRootFile); // init Spring application context String acPath = project @@ -56,19 +56,17 @@ public class SlcProjectHelper extends ProjectHelperImpl { super.parse(project, source); addSlcTasks(project); - + // create structure root - String projectDescription = project.getDescription() != null ? project - .getDescription() : "Root"; - TreeSElement element = TreeSElement.createRootElelment( - getProjectPathName(project), projectDescription); - registry.register(element); + TreeSElement element = new TreeSElement(project.getDescription(), + "Root"); + registry.register(getProjectPath(project), element); } /** Get the path of a project (root). */ public static TreeSPath getProjectPath(Project project) { - return TreeSPath.createChild(null, getProjectPathName(project)); + return TreeSPath.createRootPath(getProjectPathName(project)); } private static String getProjectPathName(Project project) { @@ -109,7 +107,7 @@ public class SlcProjectHelper extends ProjectHelperImpl { project.addTaskDefinition(name, Class.forName(taskdefs .getProperty(name))); } catch (ClassNotFoundException e) { - log.error("Unknown class for task "+name, e); + log.error("Unknown class for task " + name, e); } } } 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 index 5cf3e0831..7865241b4 100644 --- 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 @@ -17,6 +17,9 @@ public abstract class AbstractSpringArg extends DataType { private String bean; + // cache bean instance to avoid reading it twice if it is a prototype + private Object beanInstance = null; + /** The name of the underlying bean, as set throught the attribute. */ public String getBean() { return bean; @@ -28,28 +31,29 @@ public abstract class AbstractSpringArg extends DataType { } /** - * Retrieve the instance of the bean. If teh underlying Spring bean is a - * prototype, it will instanciated each time. + * Retrieve the instance of the bean. The value is cached. */ - protected Object getBeanInstance() { - Object obj = getContext().getBean(bean); - - BeanWrapper wrapper = new BeanWrapperImpl(obj); - for (OverrideArg override : overrides) { - wrapper.setPropertyValue(override.getName(), override.getObject()); + public Object getBeanInstance() { + if (beanInstance == null) { + beanInstance = getContext().getBean(bean); + + BeanWrapper wrapper = new BeanWrapperImpl(beanInstance); + for (OverrideArg override : overrides) { + wrapper.setPropertyValue(override.getName(), override + .getObject()); + } } - - return obj; + return beanInstance; } - /** Creates an override subtag.*/ + /** Creates an override subtag. */ public OverrideArg createOverride() { OverrideArg propertyArg = new OverrideArg(); overrides.add(propertyArg); return propertyArg; } - /** The related Spring application context.*/ + /** The related Spring application context. */ protected ApplicationContext getContext() { return (ApplicationContext) getProject().getReference( SlcProjectHelper.REF_ROOT_CONTEXT); 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 index 44f9f41f3..000000000 --- a/org.argeo.slc/src/main/java/org/argeo/slc/ant/structure/SAwareArg.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.argeo.slc.ant.structure; - -import org.argeo.slc.ant.spring.AbstractSpringArg; -import org.argeo.slc.core.structure.StructureElement; -import org.argeo.slc.core.structure.StructureRegistry; -import org.argeo.slc.core.structure.tree.TreeSAware; -import org.argeo.slc.core.structure.tree.TreeSElement; - -/** Ant types allowing to propagate structure informations.*/ -public abstract class SAwareArg extends AbstractSpringArg{ - //private TreeSAware parentSAware; - - @Override - protected Object getBeanInstance() { - Object obj = super.getBeanInstance(); -/* - if (obj instanceof TreeSAware && parentSAware != null) { - TreeSAware sAware = (TreeSAware) obj; - TreeSElement parentElement = (TreeSElement) parentSAware - .getElement(); - String name = getBean() + parentElement.getChildren().size(); - TreeSElement element = parentElement.createChild(name, - getDescription() != null ? getDescription() - : ""); - sAware.setElement(element); - - parentSAware.addToPropagationList(sAware); -// StructureRegistry registry = (StructureRegistry) getProject() -// .getReference(SlcProjectHelper.REF_STRUCTURE_REGISTRY); -// registry.register(parentSAware); - } - */ - return obj; - } - - public void init(TreeSAware parentSAware){ - - Object obj = super.getBeanInstance(); - - if (obj instanceof TreeSAware && parentSAware != null) { - TreeSAware sAware = (TreeSAware) obj; - TreeSElement parentElement = (TreeSElement) parentSAware - .getElement(); - String name = getBean() + parentElement.getChildren().size(); - TreeSElement element = parentElement.createChild(name, - getDescription() != null ? getDescription() - : ""); - sAware.setElement(element); - - parentSAware.addToPropagationList(sAware); -// StructureRegistry registry = (StructureRegistry) getProject() -// .getReference(SlcProjectHelper.REF_STRUCTURE_REGISTRY); -// registry.register(parentSAware); - } - } - -// public void setParentSAware(TreeSAware parentSAware) { -// this.parentSAware = parentSAware; -// } - - - public StructureElement getElement() { - // TODO Auto-generated method stub - return null; - } - - public void onRegister(StructureRegistry registry) { - // TODO Auto-generated method stub - - } - - -} diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/structure/SAwareTask.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/structure/SAwareTask.java index 3defcd73f..befa20864 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/ant/structure/SAwareTask.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/ant/structure/SAwareTask.java @@ -7,42 +7,44 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Target; import org.argeo.slc.ant.SlcProjectHelper; +import org.argeo.slc.ant.spring.AbstractSpringArg; import org.argeo.slc.ant.spring.AbstractSpringTask; +import org.argeo.slc.core.structure.StructureAware; import org.argeo.slc.core.structure.StructurePath; import org.argeo.slc.core.structure.StructureRegistry; import org.argeo.slc.core.structure.tree.DefaultTreeSAware; -import org.argeo.slc.core.structure.tree.TreeSAware; import org.argeo.slc.core.structure.tree.TreeSElement; import org.argeo.slc.core.structure.tree.TreeSPath; /** Ant task that can be registered within a structure. */ public abstract class SAwareTask extends AbstractSpringTask { - protected final TreeSAware sAware = new DefaultTreeSAware(); - protected final List sAwareArgs = new Vector(); + private final DefaultTreeSAware sAware = new DefaultTreeSAware(); + private final List sAwareArgs = new Vector(); @Override public void init() throws BuildException { StructureRegistry registry = getRegistry(); Target target = getOwningTarget(); - TreeSElement projectElement = (TreeSElement) registry - .getElement(SlcProjectHelper.getProjectPath(getProject())); + + TreeSPath targetPath = createTargetPath(target); TreeSElement targetElement = (TreeSElement) registry .getElement(createTargetPath(target)); if (targetElement == null) { - // create target element - targetElement = projectElement.createChild(target.getName(), target - .getDescription() != null ? target.getDescription() - : ""); - registry.register(targetElement); + targetElement = new TreeSElement(target.getDescription(), + ""); + registry.register(targetPath, targetElement); } - TreeSElement taskElement = targetElement.createChild(getTaskName() - + targetElement.getChildren().size(), - getDescription() != null ? getDescription() : ""); + TreeSElement taskElement = new TreeSElement(getDescription(), + ""); sAware.setElement(taskElement); } + protected void addSAwareArg(AbstractSpringArg arg) { + sAwareArgs.add(arg); + } + @Override /** * Called by Ant at runtime. Decides whether to call the actions depending @@ -52,24 +54,34 @@ public abstract class SAwareTask extends AbstractSpringTask { * @see StructureRegistry */ public final void execute() throws BuildException { - for(SAwareArg arg : sAwareArgs){ - arg.init(sAware); + // init registered args + for (AbstractSpringArg arg : sAwareArgs) { + Object obj = arg.getBeanInstance(); + + if (obj instanceof StructureAware && sAware != null) { + StructureAware sAwareT = (StructureAware) obj; + sAware.addToPropagationList(arg.getBean(), sAwareT); + } } - - getRegistry().register(sAware); - + + // register the task in the structure + TreeSPath targetPath = createTargetPath(getOwningTarget()); + TreeSPath taskPath = targetPath.createChild(getTaskName() + + targetPath.listChildren(getRegistry()).size()); + getRegistry().register(taskPath, sAware); + + // execute depending on the registry mode String mode = getRegistry().getMode(); if (mode.equals(StructureRegistry.ALL)) { executeActions(mode); } else if (mode.equals(StructureRegistry.ACTIVE)) { List activePaths = getRegistry().getActivePaths(); - - StructurePath targetPath = createTargetPath(getOwningTarget()); - if(activePaths.contains(targetPath)){ - if (activePaths.contains(sAware.getElement().getPath())) { + + if (activePaths.contains(targetPath)) { + if (activePaths.contains(taskPath)) { executeActions(mode); } - } + } } } @@ -84,9 +96,9 @@ public abstract class SAwareTask extends AbstractSpringTask { } /** Creates the path for a given Ant target. */ - protected static StructurePath createTargetPath(Target target) { + protected static TreeSPath createTargetPath(Target target) { TreeSPath projectPath = SlcProjectHelper.getProjectPath(target .getProject()); - return TreeSPath.createChild(projectPath, target.getName()); + return projectPath.createChild(target.getName()); } } 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 index df09e5204..69d08eee5 100644 --- 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 @@ -2,7 +2,7 @@ package org.argeo.slc.ant.test; import org.apache.tools.ant.BuildException; -import org.argeo.slc.ant.structure.SAwareArg; +import org.argeo.slc.ant.spring.AbstractSpringArg; import org.argeo.slc.ant.structure.SAwareTask; import org.argeo.slc.core.deploy.DeployedSystem; import org.argeo.slc.core.test.TestData; @@ -24,13 +24,13 @@ public class SlcTestTask extends SAwareTask implements TestRun { public TestDefinitionArg createTestDefinition() { testDefinitionArg = new TestDefinitionArg(); - sAwareArgs.add(testDefinitionArg); + addSAwareArg(testDefinitionArg); return testDefinitionArg; } public TestDataArg createTestData() { testDataArg = new TestDataArg(); - sAwareArgs.add(testDataArg); + addSAwareArg(testDataArg); return testDataArg; } @@ -52,29 +52,15 @@ public class SlcTestTask extends SAwareTask implements TestRun { } -class TestDefinitionArg extends SAwareArg { - private TestDefinition testDefinition; - +class TestDefinitionArg extends AbstractSpringArg { public TestDefinition getTestDefinition() { - if (testDefinition == null) { - // don't call Spring each time in order not to multi-instantiate - // prototype - testDefinition = (TestDefinition) getBeanInstance(); - } - return testDefinition; + return (TestDefinition) getBeanInstance(); } } -class TestDataArg extends SAwareArg { - private TestData testData; - +class TestDataArg extends AbstractSpringArg { public TestData getTestData() { - if (testData == null) { - // don't call Spring each time in order not to multi-instantiate - // prototype - testData = (TestData) getBeanInstance(); - } - return testData; + return (TestData) getBeanInstance(); } } diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/DefaultSRegistry.java b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/DefaultSRegistry.java index 3d6317078..1cca17be4 100644 --- a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/DefaultSRegistry.java +++ b/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/DefaultSRegistry.java @@ -20,18 +20,22 @@ public class DefaultSRegistry implements StructureRegistry { return new Vector(elements); } - public void register(StructureElement element) { + public List listPaths() { + return new Vector(paths); + } + + public void register(StructurePath path,StructureElement element) { StructureElement treeSElement = element; elements.add(treeSElement); - paths.add( treeSElement.getPath()); - log.debug("Registered " + treeSElement.getPath() + " (desc: " + paths.add( path); + log.debug("Registered " + path + " (desc: " + treeSElement.getDescription() + " position: " + elements.size() + ")"); } - public void register(StructureAware structureAware) { - register(structureAware.getElement()); - structureAware.onRegister(this); + public void register(StructurePath path,StructureAware structureAware) { + register(path,structureAware.getElement()); + structureAware.onRegister(this,path); } public StructureElement getElement(StructurePath path) { 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 index 15a6ff89f..000000000 --- a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/PropagatingSAware.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.argeo.slc.core.structure; - -import java.util.List; - -/** Structure aware object able to propagate registration.*/ -public interface PropagatingSAware extends StructureAware { - /** - * Adds a structure aware to which registration should be propagated. The - * passed object will be registered when this object will be - * registered itself, so it should not have been registered before. It doesn't - * have to be consistent with the tree structure defined by tree based - * registry elements (although it will often make more sense). - */ - public void addToPropagationList(StructureAware sAware); - - /** Returns the list of structure aware to propagate to. */ - public List getPropagationList(); - -} 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 index b88e5d22e..f093bf260 100644 --- 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 @@ -9,5 +9,5 @@ public interface StructureAware { public StructureElement getElement(); /** Called after registration. */ - public void onRegister(StructureRegistry registry); + public void onRegister(StructureRegistry registry, StructurePath path); } 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 index b7400d58a..708fbc74e 100644 --- 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 @@ -2,9 +2,6 @@ package org.argeo.slc.core.structure; /** Atomic element holding the reference to the element which is structured. */ public interface StructureElement { - /** Path to this element. */ - public StructurePath getPath(); - /** Description of this element. */ public String getDescription(); } 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 index 3ffb2d26f..140882f74 100644 --- 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 @@ -8,21 +8,24 @@ public interface StructureRegistry { public static String READ = "READ"; /** All mode: everything is executed regardless of the active paths. */ public static String ALL = "ALL"; - /** Active mode: only teh active paths are executed. */ + /** Active mode: only the active paths are executed. */ public static String ACTIVE = "ACTIVE"; /** Adds an element to the registry. */ - public void register(StructureElement element); + public void register(StructurePath path, StructureElement element); /** * Adds the wrapped element of a SructureAware, and * propagates the registration. */ - public void register(StructureAware structureAware); + public void register(StructurePath path, StructureAware structureAware); /** Lists all registered elements. */ public List listElements(); + /** Lists all registered elements. */ + public List listPaths(); + /** Gets a element based on its path. */ public StructureElement getElement(StructurePath path); 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 index 12c2f43e0..000000000 --- a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/WritableSAware.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.argeo.slc.core.structure; - - -/** Structure aware object in which the wrapped element can be externally set. */ -public interface WritableSAware extends StructureAware { - /** Sets the wrapped element. */ - public void setElement(StructureElement element); - -} 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 index 0e470f4e1..10869ce82 100644 --- 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 @@ -5,6 +5,7 @@ import java.util.Vector; import org.argeo.slc.core.structure.StructureAware; import org.argeo.slc.core.structure.StructureElement; +import org.argeo.slc.core.structure.StructurePath; import org.argeo.slc.core.structure.StructureRegistry; /** @@ -12,8 +13,9 @@ import org.argeo.slc.core.structure.StructureRegistry; * registries, using TreeSPath. Convenient to be wrapped in * classes which cannot extend it. */ -public class DefaultTreeSAware implements TreeSAware { +public class DefaultTreeSAware implements StructureAware { private StructureElement element; + private List names = new Vector(); private List children = new Vector(); public StructureElement getElement() { @@ -24,14 +26,20 @@ public class DefaultTreeSAware implements TreeSAware { this.element = element; } - public void onRegister(StructureRegistry registry) { + public void onRegister(StructureRegistry registry, StructurePath path) { + int index = 0; for (StructureAware sAware : children) { - registry.register(sAware.getElement()); - sAware.onRegister(registry); + TreeSPath childPath = ((TreeSPath) path).createChild(names + .get(index) + + index); + registry.register(childPath, sAware.getElement()); + sAware.onRegister(registry, childPath); + index++; } } - public void addToPropagationList(StructureAware sAware) { + public void addToPropagationList(String name, StructureAware sAware) { + names.add(name); children.add(sAware); } 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 index 94dc07c16..000000000 --- a/org.argeo.slc/src/main/java/org/argeo/slc/core/structure/tree/TreeSAware.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.argeo.slc.core.structure.tree; - -import org.argeo.slc.core.structure.PropagatingSAware; -import org.argeo.slc.core.structure.WritableSAware; - -/** - * Provides methods to externally propagate tree related informations in tree - * based registries. - * - * @see TreeSElement - */ -public interface TreeSAware extends WritableSAware, PropagatingSAware { - -} 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 index 6e3ff04a8..aa296c5a9 100644 --- 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 @@ -1,10 +1,6 @@ package org.argeo.slc.core.structure.tree; -import java.util.List; -import java.util.Vector; - import org.argeo.slc.core.structure.StructureElement; -import org.argeo.slc.core.structure.StructurePath; /** * Implementation of StructureElement for tree based registries, @@ -14,10 +10,15 @@ import org.argeo.slc.core.structure.StructurePath; */ public class TreeSElement implements StructureElement { private String description; - private TreeSPath path; - - private List children = new Vector(); + public TreeSElement(String description){ + this.description = description; + } + + public TreeSElement(String description, String defaultDescription){ + this(description!=null?description:defaultDescription); + } + public String getDescription() { return description; } @@ -26,37 +27,4 @@ public class TreeSElement implements StructureElement { this.description = description; } - public StructurePath getPath() { - return path; - } - - public List getChildren() { - return children; - } - - public TreeSElement createChild(String name, String description) { - TreeSElement element = new TreeSElement(); - element.path = TreeSPath.createChild((TreeSPath) this.getPath(), name); - element.description = description; - children.add(element); - return element; - } - - public static TreeSElement createRootElelment(String name, - String description) { - TreeSElement element = new TreeSElement(); - element.path = TreeSPath.createChild(null, name); - element.description = description; - return element; - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof StructureElement) { - StructureElement element = (StructureElement) obj; - return getPath().equals(element.getPath()); - } - return false; - } - } 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 index 524f8adfb..fb66c300b 100644 --- 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 @@ -1,8 +1,11 @@ package org.argeo.slc.core.structure.tree; +import java.util.List; import java.util.StringTokenizer; +import java.util.Vector; import org.argeo.slc.core.structure.StructurePath; +import org.argeo.slc.core.structure.StructureRegistry; /** * Path for tree based StructureRegistry implementations. @@ -37,10 +40,18 @@ public class TreeSPath implements StructurePath { return name; } - /** Create a child path based on a parent path and a name. */ - public static TreeSPath createChild(TreeSPath parent, String name) { + /** Create a path without parent. */ + public static TreeSPath createRootPath(String name) { TreeSPath path = new TreeSPath(); - path.parent = parent; + path.parent = null; + path.name = name; + return path; + } + + /** Create a child . */ + public TreeSPath createChild(String name) { + TreeSPath path = new TreeSPath(); + path.parent = this; path.name = name; return path; } @@ -53,14 +64,31 @@ public class TreeSPath implements StructurePath { TreeSPath currPath = null; while (st.hasMoreTokens()) { if (currPath == null) {// begin - currPath = createChild(null, st.nextToken()); + currPath = createRootPath(st.nextToken()); } else { - currPath = createChild(currPath, st.nextToken()); + currPath = currPath.createChild(st.nextToken()); } } return currPath; } + public List listChildren(StructureRegistry registry){ + return listChildrenPaths(registry, this); + } + + public static List listChildrenPaths(StructureRegistry registry, + TreeSPath path) { + List paths = new Vector(); + List allPaths = registry.listPaths(); + for (StructurePath sPath : allPaths) { + TreeSPath pathT = (TreeSPath) sPath; + if (pathT.parent != null && pathT.parent.equals(path)) { + paths.add(pathT); + } + } + return paths; + } + @Override public String toString() { return getAsUniqueString(); diff --git a/org.argeo.slc/src/test/java/org/argeo/slc/testslc/DummyTestData.java b/org.argeo.slc/src/test/java/org/argeo/slc/testslc/DummyTestData.java index 738c03eeb..02c6e5795 100644 --- a/org.argeo.slc/src/test/java/org/argeo/slc/testslc/DummyTestData.java +++ b/org.argeo.slc/src/test/java/org/argeo/slc/testslc/DummyTestData.java @@ -1,8 +1,8 @@ package org.argeo.slc.testslc; +import org.argeo.slc.core.structure.StructurePath; import org.argeo.slc.core.structure.StructureRegistry; import org.argeo.slc.core.structure.tree.DefaultTreeSAware; -import org.argeo.slc.core.structure.tree.TreeSAware; import org.argeo.slc.core.structure.tree.TreeSElement; import org.argeo.slc.core.test.TestData; @@ -10,6 +10,10 @@ public class DummyTestData extends DefaultTreeSAware implements TestData { private Object reached; private Object expected; + public DummyTestData(){ + setElement(new TreeSElement("This is a dummy test data")); + } + public Object getReached() { return reached; } @@ -27,15 +31,15 @@ public class DummyTestData extends DefaultTreeSAware implements TestData { } @Override - public void onRegister(StructureRegistry registry) { - if (expected instanceof TreeSAware) { - TreeSAware sAware = (TreeSAware) expected; - TreeSElement element = ((TreeSElement) getElement()).createChild( - "expected" + getPropagationList().size(), ""); + public void onRegister(StructureRegistry registry, StructurePath path) { + if (expected instanceof DefaultTreeSAware) { + DefaultTreeSAware sAware = (DefaultTreeSAware) expected; + TreeSElement element = new TreeSElement("This is an expected"); + element.setDescription(""); sAware.setElement(element); - addToPropagationList(sAware); + addToPropagationList("expected",sAware); } - super.onRegister(registry); + super.onRegister(registry, path); } -- 2.39.2