<classpathentry kind="lib" path="lib/ant-launcher.jar" sourcepath="lib-src/ant-1.7.0-src.zip"/>\r
<classpathentry kind="lib" path="lib/spring-2.0.6.jar" sourcepath="lib-src/spring-2.0.6-src.zip"/>\r
<classpathentry kind="lib" path="lib/commons-logging.jar"/>\r
+ <classpathentry kind="lib" path="lib/log4j-1.2.14.jar"/>\r
<classpathentry kind="output" path="target/classes"/>\r
</classpath>\r
--- /dev/null
+org.argeo.slc.ant.SlcProjectHelper
\ No newline at end of file
File antFile = new File(\r
"C:/dev/workspaces/default/org.argeo.slc/src/test/ant/build.xml");\r
System\r
- .setProperty(SlcProjectHelper.PROP_APPLICATION_CONTEXT,\r
+ .setProperty(SlcAntConfig.APPLICATION_CONTEXT_PROPERTY,\r
"C:/dev/workspaces/default/org.argeo.slc/src/test/ant/applicationContext.xml");\r
StructureRegistry registry = AntRegistryUtil.readRegistry(antFile);\r
\r
--- /dev/null
+package org.argeo.slc.ant;\r
+\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.IOException;\r
+import java.util.Properties;\r
+import java.util.StringTokenizer;\r
+\r
+import org.apache.tools.ant.Project;\r
+\r
+/** Load reference to directories from an slcRoot.properties file */\r
+public class SlcAntConfig {\r
+ // SLC ROOT PROPERTIES\r
+ public final static String ROOT_DIR_PROPERTY = "org.argeo.slc.ant.rootDir";\r
+ public final static String CONF_DIR_PROPERTY = "org.argeo.slc.ant.confDir";\r
+ public final static String WORK_DIR_PROPERTY = "org.argeo.slc.ant.workDir";\r
+ /**\r
+ * Comma-separated list of property file names to load from the conf dir and\r
+ * add to project user properties\r
+ */\r
+ public final static String PROPERTY_FILE_NAMES_PROPERTY = "org.argeo.slc.ant.propertyFileNames";\r
+ \r
+ // SLC CONF PROPERTIES\r
+ /** 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
+ Properties p = loadFile(slcRootFile.getAbsolutePath());\r
+\r
+ // Root dir\r
+ rootDir = slcRootFile.getParentFile();\r
+ project.setUserProperty(ROOT_DIR_PROPERTY, rootDir.getAbsolutePath());\r
+\r
+ // Conf dir\r
+ if (project.getUserProperty(CONF_DIR_PROPERTY) == null) {\r
+ confDir = new File(p.getProperty(CONF_DIR_PROPERTY, rootDir\r
+ .getAbsolutePath()\r
+ + "/../conf")).getAbsoluteFile();\r
+ project.setUserProperty(CONF_DIR_PROPERTY, confDir\r
+ .getAbsolutePath());\r
+ } else {\r
+ confDir = new File(project.getUserProperty(CONF_DIR_PROPERTY))\r
+ .getAbsoluteFile();\r
+ }\r
+\r
+ // Work dir\r
+ if (project.getUserProperty(WORK_DIR_PROPERTY) == null) {\r
+ workDir = new File(p.getProperty(WORK_DIR_PROPERTY, rootDir\r
+ .getAbsolutePath()\r
+ + "/../work")).getAbsoluteFile();\r
+ project.setUserProperty(WORK_DIR_PROPERTY, workDir\r
+ .getAbsolutePath());\r
+ } else {\r
+ workDir = new File(project.getUserProperty(WORK_DIR_PROPERTY))\r
+ .getAbsoluteFile();\r
+ }\r
+\r
+ // Properties from the conf dir files\r
+ Properties properties = new Properties();\r
+ StringTokenizer st = new StringTokenizer(p.getProperty(\r
+ PROPERTY_FILE_NAMES_PROPERTY, "slc.properties"), ",");\r
+ while (st.hasMoreTokens()) {\r
+ String fileName = st.nextToken();\r
+ properties.putAll(loadFile(confDir.getAbsolutePath() + "/"\r
+ + fileName));\r
+ }\r
+\r
+ for (Object o : properties.keySet()) {\r
+ String key = o.toString();\r
+ if (project.getUserProperty(key) == null) {// not already set\r
+ project.setUserProperty(key, properties.getProperty(key));\r
+ }\r
+ }\r
+\r
+ // Default application context\r
+ if (project.getUserProperty(APPLICATION_CONTEXT_PROPERTY) == null) {\r
+ project.setUserProperty(APPLICATION_CONTEXT_PROPERTY, confDir\r
+ .getAbsolutePath()\r
+ + "/applicationContext.xml");\r
+ }\r
+ }\r
+\r
+ private Properties loadFile(String path) {\r
+ Properties p = new Properties();\r
+ try {\r
+ FileInputStream in = new FileInputStream(path);\r
+ p.load(in);\r
+ in.close();\r
+ } catch (IOException e) {\r
+ throw new SlcAntException("Cannot read SLC root file", e);\r
+ }\r
+ 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
--- /dev/null
+package org.argeo.slc.ant;\r
+\r
+import org.argeo.slc.core.SlcException;\r
+\r
+public class SlcAntException extends SlcException {\r
+ static final long serialVersionUID = 1l;\r
+\r
+ public SlcAntException(String message) {\r
+ super(message);\r
+ }\r
+\r
+ public SlcAntException(String message, Throwable cause) {\r
+ super(message, cause);\r
+ }\r
+\r
+}\r
package org.argeo.slc.ant;\r
\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.util.Properties;\r
+\r
import org.springframework.context.ApplicationContext;\r
import org.springframework.context.support.FileSystemXmlApplicationContext;\r
\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
import org.apache.tools.ant.BuildException;\r
import org.apache.tools.ant.Project;\r
import org.apache.tools.ant.helper.ProjectHelperImpl;\r
* application context and a structure registry with the Ant project.\r
*/\r
public class SlcProjectHelper extends ProjectHelperImpl {\r
- public static String PROP_APPLICATION_CONTEXT = "org.argeo.slc.slcRootContext";\r
- // public static String PROP_REGISTRY_MODE =\r
- // "org.argeo.slc.slcRegistryMode";\r
+ private static Log log = LogFactory.getLog(SlcProjectHelper.class);\r
+\r
public static String REF_ROOT_CONTEXT = "slcApplicationContext";\r
public static String REF_STRUCTURE_REGISTRY = "slcStructureRegistry";\r
\r
+ private String slcRootFileName = "slcRoot.properties";\r
+\r
@Override\r
public void parse(Project project, Object source) throws BuildException {\r
- stdOut("Entered SLC project helper");\r
+ log.debug("Entered SLC project helper");\r
+\r
+ // look for root file\r
+ File projectBaseDir = project.getBaseDir();\r
+ File slcRootFile = findSlcRootFile(projectBaseDir);\r
+ if (slcRootFile == null) {\r
+ throw new SlcAntException("Cannot find SLC root file");\r
+ }\r
+ SlcAntConfig slcAntConfig = new SlcAntConfig(project, slcRootFile);\r
\r
// init Spring application context\r
- String acPath = System.getProperty(PROP_APPLICATION_CONTEXT,\r
- "applicationContext.xml");\r
+ String acPath = project\r
+ .getUserProperty(SlcAntConfig.APPLICATION_CONTEXT_PROPERTY);\r
ApplicationContext context = new FileSystemXmlApplicationContext(acPath);\r
project.addReference(REF_ROOT_CONTEXT, context);\r
\r
// call the underlying implementation to do the actual work\r
super.parse(project, source);\r
\r
+ addSlcTasks(project);\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
- }\r
\r
- private static void stdOut(Object o) {\r
- System.out.println(o);\r
}\r
\r
- /** Get the path of a project (root).*/\r
+ /** Get the path of a project (root). */\r
public static TreeSPath getProjectPath(Project project) {\r
return TreeSPath.createChild(null, getProjectPathName(project));\r
}\r
: "project";\r
return projectName;\r
}\r
+\r
+ private File findSlcRootFile(File dir) {\r
+ for (File file : dir.listFiles()) {\r
+ if (!file.isDirectory() && file.getName().equals(slcRootFileName)) {\r
+ return file;\r
+ }\r
+ }\r
+\r
+ File parentDir = dir.getParentFile();\r
+ if (parentDir == null) {\r
+ return null;// stop condition: not found\r
+ } else {\r
+ return findSlcRootFile(parentDir);\r
+ }\r
+ }\r
+\r
+ private void addSlcTasks(Project project) {\r
+ Properties taskdefs = new Properties();\r
+ try {\r
+ InputStream in = project.getClass().getResourceAsStream(\r
+ "/org/argeo/slc/ant/taskdefs.properties");\r
+ taskdefs.load(in);\r
+ in.close();\r
+ } catch (IOException e) {\r
+ throw new SlcAntException("Cannot load task definitions", e);\r
+ }\r
+\r
+ for (Object o : taskdefs.keySet()) {\r
+ String name = o.toString();\r
+ try {\r
+ project.addTaskDefinition(name, Class.forName(taskdefs\r
+ .getProperty(name)));\r
+ } catch (ClassNotFoundException e) {\r
+ log.error("Unknown class for task "+name, e);\r
+ }\r
+ }\r
+ }\r
}\r
package org.argeo.slc.testslc;\r
\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+\r
import org.argeo.slc.core.test.IncompatibleTestDataException;\r
import org.argeo.slc.core.test.TestDefinition;\r
import org.argeo.slc.core.test.TestRun;\r
\r
public class DummyTestDefinition implements TestDefinition {\r
+ private Log log = LogFactory.getLog(DummyTestDefinition.class);\r
\r
public void execute(TestRun testRun) {\r
if (!(testRun.getTestData() instanceof DummyTestData)) {\r
DummyTestData testData = (DummyTestData) testRun.getTestData();\r
\r
if (testData.getReached().equals(testData.getExpected())) {\r
- stdOut("Test passed");\r
+ log.info("Test passed");\r
} else {\r
- stdOut("Test failed");\r
+ log.info("Test failed");\r
}\r
}\r
\r
- private static void stdOut(Object o) {\r
- System.out.println(o);\r
- }\r
}\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<beans xmlns="http://www.springframework.org/schema/beans"\r
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">\r
+\r
+ <bean id="dummyTestDefinition"\r
+ class="org.argeo.slc.testslc.DummyTestDefinition" scope="prototype">\r
+ </bean>\r
+\r
+ <bean id="dummyTestDataOK"\r
+ class="org.argeo.slc.testslc.DummyTestData" scope="prototype">\r
+ <property name="expected" value="value1" />\r
+ <property name="reached" value="value1" />\r
+ </bean>\r
+\r
+ <bean id="dummyTestDataNOK"\r
+ class="org.argeo.slc.testslc.DummyTestData" scope="prototype">\r
+ <property name="expected" value="value1" />\r
+ <property name="reached" value="value2" />\r
+ </bean>\r
+\r
+ <bean id="dummyTestDataObjOK"\r
+ class="org.argeo.slc.testslc.DummyTestData" scope="prototype">\r
+ <property name="expected" ref="dummyTestDataObject1" />\r
+ <property name="reached" ref="dummyTestDataObject1" />\r
+ </bean>\r
+\r
+ <bean id="dummyTestDataObjNOK"\r
+ class="org.argeo.slc.testslc.DummyTestData" scope="prototype">\r
+ <property name="expected" ref="dummyTestDataObject1" />\r
+ <property name="reached" ref="dummyTestDataObject2" />\r
+ </bean>\r
+\r
+ <bean id="dummyTestDataObject1"\r
+ class="org.argeo.slc.testslc.DummyTestDataObject" scope="prototype">\r
+ <property name="value" value="dummy1" />\r
+ </bean>\r
+\r
+ <bean id="dummyTestDataObject2"\r
+ class="org.argeo.slc.testslc.DummyTestDataObject" scope="prototype">\r
+ <property name="value" value="dummy2" />\r
+ </bean>\r
+\r
+</beans>
\ No newline at end of file
--- /dev/null
+# Set root logger level to DEBUG and its only appender to A1.\r
+log4j.rootLogger=DEBUG, console\r
+\r
+## Levels\r
+# Spring\r
+log4j.logger.org.springframework=INFO\r
+\r
+\r
+## Appenders\r
+# A1 is set to be a ConsoleAppender.\r
+log4j.appender.console=org.apache.log4j.ConsoleAppender\r
+\r
+# A1 uses PatternLayout.\r
+log4j.appender.console.layout=org.apache.log4j.PatternLayout\r
+log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c %n\r
+\r
--- /dev/null
+rootTest=TEST
\ No newline at end of file
--- /dev/null
+<project default="test" name="testProject">\r
+ <description>A Test project</description>\r
+\r
+ <target name="test" depends="testSimple,testObj">\r
+ </target>\r
+\r
+ <target name="testSimple" description="A simple test">\r
+ <echo message="${rootTest}"/>\r
+ \r
+ <!-- Success -->\r
+ <slc.test>\r
+ <testDefinition bean="dummyTestDefinition" />\r
+ <testData bean="dummyTestDataOK" />\r
+ </slc.test>\r
+\r
+ <!-- Failure -->\r
+ <slc.test>\r
+ <testDefinition bean="dummyTestDefinition" />\r
+ <testData bean="dummyTestDataNOK" />\r
+ </slc.test>\r
+\r
+ <!-- Override property -->\r
+ <slc.test>\r
+ <testDefinition bean="dummyTestDefinition" />\r
+ <testData bean="dummyTestDataNOK">\r
+ <override name="reached" value="value1" />\r
+ </testData>\r
+ </slc.test>\r
+ </target>\r
+ \r
+ <target name="testObj" description="An object test">\r
+ <!-- Success -->\r
+ <slc.test>\r
+ <testDefinition bean="dummyTestDefinition"/>\r
+ <testData bean="dummyTestDataObjOK" description="A dummy testDef"/>\r
+ </slc.test>\r
+\r
+ <!-- Failure -->\r
+ <slc.test>\r
+ <testDefinition bean="dummyTestDefinition" />\r
+ <testData bean="dummyTestDataObjNOK" />\r
+ </slc.test>\r
+\r
+ <!-- Override property -->\r
+ <slc.test>\r
+ <testDefinition bean="dummyTestDefinition" />\r
+ <testData bean="dummyTestDataObjNOK">\r
+ <override name="reached" bean="dummyTestDataObject1" />\r
+ </testData>\r
+ </slc.test>\r
+ </target>\r
+</project>
\ No newline at end of file
--- /dev/null
+<project name="slcRoot" default="init">\r
+ <property name="rootTest" value="TEST"/>\r
+ \r
+ <target name="init">\r
+ <property name="rootTest" value="TEST"/>\r
+ </target>\r
+</project>
\ No newline at end of file