X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fant%2FSlcProjectHelper.java;h=34373437d7cd2af7b5dfe99a03cbb4435a38bb62;hb=d62a44995fa4bc758ab3b3e6e7ffe7b79c8684ef;hp=f0afc92efd7788bb79a9faa807377b9234a8d49b;hpb=2d2e8673ee9a9c610dcd831833cb67c3a508c372;p=gpl%2Fargeo-slc.git 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 f0afc92ef..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 @@ -1,52 +1,72 @@ 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; -import org.argeo.slc.core.structure.StructurePath; +import org.argeo.slc.core.structure.DefaultSRegistry; import org.argeo.slc.core.structure.tree.TreeSElement; import org.argeo.slc.core.structure.tree.TreeSPath; -import org.argeo.slc.core.structure.tree.TreeSRegistry; +/** + * Custom implementation of a ProjectHelper binding a Spring + * 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"; + 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.initProject(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); - // init structure register - TreeSRegistry registry = new TreeSRegistry(); + // init structure register if it does not exist + DefaultSRegistry registry = new DefaultSRegistry(); project.addReference(REF_STRUCTURE_REGISTRY, registry); // call the underlying implementation to do the actual work super.parse(project, source); - String projectDescription = project.getDescription() != null ? project - .getDescription() : "Root"; - TreeSElement element = TreeSElement.createRootElelment( - getProjectPathName(project), projectDescription); - registry.register(element); - } + addSlcTasks(project); + + // create structure root + TreeSElement element = new TreeSElement(project.getDescription(), + "Root"); + registry.register(getProjectPath(project), element); - private static void stdOut(Object o) { - System.out.println(o); } - static TreeSPath getProjectPath(Project project) { - return TreeSPath.createChild(null, getProjectPathName(project)); + /** Get the path of a project (root). */ + public static TreeSPath getProjectPath(Project project) { + return TreeSPath.createRootPath(getProjectPathName(project)); } private static String getProjectPathName(Project project) { @@ -54,4 +74,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); + } + } + } }