+++ /dev/null
-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
+++ /dev/null
-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
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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
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
+++ /dev/null
-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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+package org.argeo.slc.core.structure;\r
+\r
+public interface StructurePath {\r
+ public String getAsUniqueString();\r
+}\r
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
<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