From: Mathieu Baudier Date: Sat, 27 Oct 2007 12:05:47 +0000 (+0000) Subject: Make project helper more generic X-Git-Tag: argeo-slc-2.1.7~3200 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=af47cf1f193f9d9965d9e302e2712712ce623a50;p=gpl%2Fargeo-slc.git Make project helper more generic Add log4j Generalize property management git-svn-id: https://svn.argeo.org/slc/trunk@662 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.slc/.classpath b/org.argeo.slc/.classpath index 6e22473c3..92313aabe 100644 --- a/org.argeo.slc/.classpath +++ b/org.argeo.slc/.classpath @@ -7,5 +7,6 @@ + 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 index 000000000..625130719 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 index 000000000..1c222d5e1 --- /dev/null +++ b/org.argeo.slc/src/main/java/META-INF/services/org.apache.tools.ant.ProjectHelper @@ -0,0 +1 @@ +org.argeo.slc.ant.SlcProjectHelper \ No newline at end of file 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 356a7c748..a8fe8bf29 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 @@ -56,7 +56,7 @@ public class AntRegistryUtil { File antFile = new File( "C:/dev/workspaces/default/org.argeo.slc/src/test/ant/build.xml"); System - .setProperty(SlcProjectHelper.PROP_APPLICATION_CONTEXT, + .setProperty(SlcAntConfig.APPLICATION_CONTEXT_PROPERTY, "C:/dev/workspaces/default/org.argeo.slc/src/test/ant/applicationContext.xml"); StructureRegistry registry = AntRegistryUtil.readRegistry(antFile); 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 index 000000000..61c74524c --- /dev/null +++ b/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntConfig.java @@ -0,0 +1,112 @@ +package org.argeo.slc.ant; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; +import java.util.StringTokenizer; + +import org.apache.tools.ant.Project; + +/** Load reference to directories from an slcRoot.properties file */ +public class SlcAntConfig { + // SLC ROOT PROPERTIES + public final static String ROOT_DIR_PROPERTY = "org.argeo.slc.ant.rootDir"; + public final static String CONF_DIR_PROPERTY = "org.argeo.slc.ant.confDir"; + public final static String WORK_DIR_PROPERTY = "org.argeo.slc.ant.workDir"; + /** + * Comma-separated list of property file names to load from the conf dir and + * add to project user properties + */ + public final static String PROPERTY_FILE_NAMES_PROPERTY = "org.argeo.slc.ant.propertyFileNames"; + + // SLC CONF PROPERTIES + /** 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) { + Properties p = loadFile(slcRootFile.getAbsolutePath()); + + // Root dir + rootDir = slcRootFile.getParentFile(); + project.setUserProperty(ROOT_DIR_PROPERTY, rootDir.getAbsolutePath()); + + // Conf dir + if (project.getUserProperty(CONF_DIR_PROPERTY) == null) { + confDir = new File(p.getProperty(CONF_DIR_PROPERTY, rootDir + .getAbsolutePath() + + "/../conf")).getAbsoluteFile(); + project.setUserProperty(CONF_DIR_PROPERTY, confDir + .getAbsolutePath()); + } else { + confDir = new File(project.getUserProperty(CONF_DIR_PROPERTY)) + .getAbsoluteFile(); + } + + // Work dir + if (project.getUserProperty(WORK_DIR_PROPERTY) == null) { + workDir = new File(p.getProperty(WORK_DIR_PROPERTY, rootDir + .getAbsolutePath() + + "/../work")).getAbsoluteFile(); + project.setUserProperty(WORK_DIR_PROPERTY, workDir + .getAbsolutePath()); + } else { + workDir = new File(project.getUserProperty(WORK_DIR_PROPERTY)) + .getAbsoluteFile(); + } + + // Properties from the conf dir files + Properties properties = new Properties(); + StringTokenizer st = new StringTokenizer(p.getProperty( + PROPERTY_FILE_NAMES_PROPERTY, "slc.properties"), ","); + while (st.hasMoreTokens()) { + String fileName = st.nextToken(); + properties.putAll(loadFile(confDir.getAbsolutePath() + "/" + + fileName)); + } + + for (Object o : properties.keySet()) { + String key = o.toString(); + if (project.getUserProperty(key) == null) {// not already set + project.setUserProperty(key, properties.getProperty(key)); + } + } + + // Default application context + if (project.getUserProperty(APPLICATION_CONTEXT_PROPERTY) == null) { + project.setUserProperty(APPLICATION_CONTEXT_PROPERTY, confDir + .getAbsolutePath() + + "/applicationContext.xml"); + } + } + + private Properties loadFile(String path) { + Properties p = new Properties(); + try { + FileInputStream in = new FileInputStream(path); + p.load(in); + in.close(); + } catch (IOException e) { + throw new SlcAntException("Cannot read SLC root file", e); + } + 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/SlcAntException.java b/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntException.java new file mode 100644 index 000000000..70a8b5c68 --- /dev/null +++ b/org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcAntException.java @@ -0,0 +1,16 @@ +package org.argeo.slc.ant; + +import org.argeo.slc.core.SlcException; + +public class SlcAntException extends SlcException { + static final long serialVersionUID = 1l; + + public SlcAntException(String message) { + super(message); + } + + public SlcAntException(String message, Throwable cause) { + super(message, cause); + } + +} 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 e08ec4305..ecb46c07b 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 @@ -1,8 +1,15 @@ package org.argeo.slc.ant; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.helper.ProjectHelperImpl; @@ -16,19 +23,28 @@ import org.argeo.slc.core.structure.tree.TreeSPath; * application context and a structure registry with the Ant project. */ public class SlcProjectHelper extends ProjectHelperImpl { - public static String PROP_APPLICATION_CONTEXT = "org.argeo.slc.slcRootContext"; - // public static String PROP_REGISTRY_MODE = - // "org.argeo.slc.slcRegistryMode"; + private static Log log = LogFactory.getLog(SlcProjectHelper.class); + public static String REF_ROOT_CONTEXT = "slcApplicationContext"; public static String REF_STRUCTURE_REGISTRY = "slcStructureRegistry"; + private String slcRootFileName = "slcRoot.properties"; + @Override public void parse(Project project, Object source) throws BuildException { - stdOut("Entered SLC project helper"); + log.debug("Entered SLC project helper"); + + // look for root file + File projectBaseDir = project.getBaseDir(); + File slcRootFile = findSlcRootFile(projectBaseDir); + if (slcRootFile == null) { + throw new SlcAntException("Cannot find SLC root file"); + } + SlcAntConfig slcAntConfig = new SlcAntConfig(project, slcRootFile); // init Spring application context - String acPath = System.getProperty(PROP_APPLICATION_CONTEXT, - "applicationContext.xml"); + String acPath = project + .getUserProperty(SlcAntConfig.APPLICATION_CONTEXT_PROPERTY); ApplicationContext context = new FileSystemXmlApplicationContext(acPath); project.addReference(REF_ROOT_CONTEXT, context); @@ -39,18 +55,18 @@ public class SlcProjectHelper extends ProjectHelperImpl { // call the underlying implementation to do the actual work 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); - } - private static void stdOut(Object o) { - System.out.println(o); } - /** Get the path of a project (root).*/ + /** Get the path of a project (root). */ public static TreeSPath getProjectPath(Project project) { return TreeSPath.createChild(null, getProjectPathName(project)); } @@ -60,4 +76,41 @@ public class SlcProjectHelper extends ProjectHelperImpl { : "project"; return projectName; } + + private File findSlcRootFile(File dir) { + for (File file : dir.listFiles()) { + if (!file.isDirectory() && file.getName().equals(slcRootFileName)) { + return file; + } + } + + File parentDir = dir.getParentFile(); + if (parentDir == null) { + return null;// stop condition: not found + } else { + return findSlcRootFile(parentDir); + } + } + + private void addSlcTasks(Project project) { + Properties taskdefs = new Properties(); + try { + InputStream in = project.getClass().getResourceAsStream( + "/org/argeo/slc/ant/taskdefs.properties"); + taskdefs.load(in); + in.close(); + } catch (IOException e) { + throw new SlcAntException("Cannot load task definitions", e); + } + + for (Object o : taskdefs.keySet()) { + String name = o.toString(); + try { + project.addTaskDefinition(name, Class.forName(taskdefs + .getProperty(name))); + } catch (ClassNotFoundException e) { + log.error("Unknown class for task "+name, e); + } + } + } } diff --git a/org.argeo.slc/src/test/java/org/argeo/slc/testslc/DummyTestDefinition.java b/org.argeo.slc/src/test/java/org/argeo/slc/testslc/DummyTestDefinition.java index 940e414b1..05fb15715 100644 --- a/org.argeo.slc/src/test/java/org/argeo/slc/testslc/DummyTestDefinition.java +++ b/org.argeo.slc/src/test/java/org/argeo/slc/testslc/DummyTestDefinition.java @@ -1,10 +1,14 @@ package org.argeo.slc.testslc; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.argeo.slc.core.test.IncompatibleTestDataException; import org.argeo.slc.core.test.TestDefinition; import org.argeo.slc.core.test.TestRun; public class DummyTestDefinition implements TestDefinition { + private Log log = LogFactory.getLog(DummyTestDefinition.class); public void execute(TestRun testRun) { if (!(testRun.getTestData() instanceof DummyTestData)) { @@ -13,13 +17,10 @@ public class DummyTestDefinition implements TestDefinition { DummyTestData testData = (DummyTestData) testRun.getTestData(); if (testData.getReached().equals(testData.getExpected())) { - stdOut("Test passed"); + log.info("Test passed"); } else { - stdOut("Test failed"); + log.info("Test failed"); } } - private static void stdOut(Object o) { - System.out.println(o); - } } 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 index 000000000..b03c1e084 --- /dev/null +++ b/org.argeo.slc/src/test/slc/conf/applicationContext.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 index 000000000..4b1d97429 --- /dev/null +++ b/org.argeo.slc/src/test/slc/conf/log4j.properties @@ -0,0 +1,16 @@ +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=DEBUG, console + +## Levels +# Spring +log4j.logger.org.springframework=INFO + + +## Appenders +# A1 is set to be a ConsoleAppender. +log4j.appender.console=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c %n + 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 index 000000000..d5378cb7f --- /dev/null +++ b/org.argeo.slc/src/test/slc/conf/slc.properties @@ -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 index 000000000..3d49ff152 --- /dev/null +++ b/org.argeo.slc/src/test/slc/root/Category1/SubCategory2/build.xml @@ -0,0 +1,52 @@ + + A Test 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 index 000000000..a89140d42 --- /dev/null +++ b/org.argeo.slc/src/test/slc/root/slcRoot.properties @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file