Make project helper more generic
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 27 Oct 2007 12:05:47 +0000 (12:05 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 27 Oct 2007 12:05:47 +0000 (12:05 +0000)
Add log4j
Generalize property management

git-svn-id: https://svn.argeo.org/slc/trunk@662 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

13 files changed:
org.argeo.slc/.classpath
org.argeo.slc/lib/log4j-1.2.14.jar [new file with mode: 0644]
org.argeo.slc/src/main/java/META-INF/services/org.apache.tools.ant.ProjectHelper [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/ant/AntRegistryUtil.java
org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntConfig.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntException.java [new file with mode: 0644]
org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcProjectHelper.java
org.argeo.slc/src/test/java/org/argeo/slc/testslc/DummyTestDefinition.java
org.argeo.slc/src/test/slc/conf/applicationContext.xml [new file with mode: 0644]
org.argeo.slc/src/test/slc/conf/log4j.properties [new file with mode: 0644]
org.argeo.slc/src/test/slc/conf/slc.properties [new file with mode: 0644]
org.argeo.slc/src/test/slc/root/Category1/SubCategory2/build.xml [new file with mode: 0644]
org.argeo.slc/src/test/slc/root/slcRoot.properties [new file with mode: 0644]

index 6e22473c3e3290db08ef0020f6b3846bcbc3a831..92313aabe385579a24b4166a3325e0dfc791cf4b 100644 (file)
@@ -7,5 +7,6 @@
        <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
diff --git a/org.argeo.slc/lib/log4j-1.2.14.jar b/org.argeo.slc/lib/log4j-1.2.14.jar
new file mode 100644 (file)
index 0000000..6251307
Binary files /dev/null and b/org.argeo.slc/lib/log4j-1.2.14.jar differ
diff --git a/org.argeo.slc/src/main/java/META-INF/services/org.apache.tools.ant.ProjectHelper b/org.argeo.slc/src/main/java/META-INF/services/org.apache.tools.ant.ProjectHelper
new file mode 100644 (file)
index 0000000..1c222d5
--- /dev/null
@@ -0,0 +1 @@
+org.argeo.slc.ant.SlcProjectHelper
\ No newline at end of file
index 356a7c7484dfe6dd9ad14b29591298aeeea4e1cd..a8fe8bf296392fa1aa08051bb3a1589bbebb81be 100644 (file)
@@ -56,7 +56,7 @@ public class AntRegistryUtil {
                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
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
new file mode 100644 (file)
index 0000000..61c7452
--- /dev/null
@@ -0,0 +1,112 @@
+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
diff --git a/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntException.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntException.java
new file mode 100644 (file)
index 0000000..70a8b5c
--- /dev/null
@@ -0,0 +1,16 @@
+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
index e08ec43059cd687c732869393764f086443d8f96..ecb46c07bf0f73822b3e618f0c8e92b7816857d1 100644 (file)
@@ -1,8 +1,15 @@
 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
@@ -16,19 +23,28 @@ import org.argeo.slc.core.structure.tree.TreeSPath;
  * 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
@@ -39,18 +55,18 @@ public class SlcProjectHelper extends ProjectHelperImpl {
                // 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
@@ -60,4 +76,41 @@ public class SlcProjectHelper extends ProjectHelperImpl {
                                : "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
index 940e414b102a56e4a4d71302aae05ee185ee9e56..05fb15715c1cc1269ec635b6a66d5bb4d9e7f679 100644 (file)
@@ -1,10 +1,14 @@
 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
@@ -13,13 +17,10 @@ public class DummyTestDefinition implements TestDefinition {
                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
diff --git a/org.argeo.slc/src/test/slc/conf/applicationContext.xml b/org.argeo.slc/src/test/slc/conf/applicationContext.xml
new file mode 100644 (file)
index 0000000..b03c1e0
--- /dev/null
@@ -0,0 +1,44 @@
+<?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
diff --git a/org.argeo.slc/src/test/slc/conf/log4j.properties b/org.argeo.slc/src/test/slc/conf/log4j.properties
new file mode 100644 (file)
index 0000000..4b1d974
--- /dev/null
@@ -0,0 +1,16 @@
+# 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
diff --git a/org.argeo.slc/src/test/slc/conf/slc.properties b/org.argeo.slc/src/test/slc/conf/slc.properties
new file mode 100644 (file)
index 0000000..d5378cb
--- /dev/null
@@ -0,0 +1 @@
+rootTest=TEST
\ No newline at end of file
diff --git a/org.argeo.slc/src/test/slc/root/Category1/SubCategory2/build.xml b/org.argeo.slc/src/test/slc/root/Category1/SubCategory2/build.xml
new file mode 100644 (file)
index 0000000..3d49ff1
--- /dev/null
@@ -0,0 +1,52 @@
+<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
diff --git a/org.argeo.slc/src/test/slc/root/slcRoot.properties b/org.argeo.slc/src/test/slc/root/slcRoot.properties
new file mode 100644 (file)
index 0000000..a89140d
--- /dev/null
@@ -0,0 +1,7 @@
+<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