1 package org
.argeo
.slc
.ant
;
4 import java
.io
.IOException
;
5 import java
.io
.InputStream
;
6 import java
.util
.Properties
;
8 import org
.springframework
.context
.ApplicationContext
;
9 import org
.springframework
.context
.support
.FileSystemXmlApplicationContext
;
11 import org
.apache
.commons
.logging
.Log
;
12 import org
.apache
.commons
.logging
.LogFactory
;
13 import org
.apache
.tools
.ant
.BuildException
;
14 import org
.apache
.tools
.ant
.Project
;
15 import org
.apache
.tools
.ant
.helper
.ProjectHelperImpl
;
17 import org
.argeo
.slc
.core
.structure
.DefaultSRegistry
;
18 import org
.argeo
.slc
.core
.structure
.tree
.TreeSElement
;
19 import org
.argeo
.slc
.core
.structure
.tree
.TreeSPath
;
22 * Custom implementation of a <code>ProjectHelper</code> binding a Spring
23 * application context and a structure registry with the Ant project.
25 public class SlcProjectHelper
extends ProjectHelperImpl
{
26 private static Log log
= LogFactory
.getLog(SlcProjectHelper
.class);
28 public static String REF_ROOT_CONTEXT
= "slcApplicationContext";
29 public static String REF_STRUCTURE_REGISTRY
= "slcStructureRegistry";
31 private String slcRootFileName
= "slcRoot.properties";
34 public void parse(Project project
, Object source
) throws BuildException
{
35 log
.debug("Entered SLC project helper");
38 File projectBaseDir
= project
.getBaseDir();
39 File slcRootFile
= findSlcRootFile(projectBaseDir
);
40 if (slcRootFile
== null) {
41 throw new SlcAntException("Cannot find SLC root file");
43 SlcAntConfig
.initProject(project
, slcRootFile
);
45 // init Spring application context
46 String acPath
= project
47 .getUserProperty(SlcAntConfig
.APPLICATION_CONTEXT_PROPERTY
);
48 ApplicationContext context
= new FileSystemXmlApplicationContext(acPath
);
49 project
.addReference(REF_ROOT_CONTEXT
, context
);
51 // init structure register if it does not exist
52 DefaultSRegistry registry
= new DefaultSRegistry();
53 project
.addReference(REF_STRUCTURE_REGISTRY
, registry
);
55 // call the underlying implementation to do the actual work
56 super.parse(project
, source
);
60 // create structure root
61 TreeSElement element
= new TreeSElement(project
.getDescription(),
63 registry
.register(getProjectPath(project
), element
);
67 /** Get the path of a project (root). */
68 public static TreeSPath
getProjectPath(Project project
) {
69 return TreeSPath
.createRootPath(getProjectPathName(project
));
72 private static String
getProjectPathName(Project project
) {
73 String projectName
= project
.getName() != null ? project
.getName()
78 private File
findSlcRootFile(File dir
) {
79 for (File file
: dir
.listFiles()) {
80 if (!file
.isDirectory() && file
.getName().equals(slcRootFileName
)) {
85 File parentDir
= dir
.getParentFile();
86 if (parentDir
== null) {
87 return null;// stop condition: not found
89 return findSlcRootFile(parentDir
);
93 private void addSlcTasks(Project project
) {
94 Properties taskdefs
= new Properties();
96 InputStream in
= project
.getClass().getResourceAsStream(
97 "/org/argeo/slc/ant/taskdefs.properties");
100 } catch (IOException e
) {
101 throw new SlcAntException("Cannot load task definitions", e
);
104 for (Object o
: taskdefs
.keySet()) {
105 String name
= o
.toString();
107 project
.addTaskDefinition(name
, Class
.forName(taskdefs
108 .getProperty(name
)));
109 } catch (ClassNotFoundException e
) {
110 log
.error("Unknown class for task " + name
, e
);