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 slcAntConfig
= new SlcAntConfig(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 String projectDescription
= project
.getDescription() != null ? project
62 .getDescription() : "Root";
63 TreeSElement element
= TreeSElement
.createRootElelment(
64 getProjectPathName(project
), projectDescription
);
65 registry
.register(element
);
69 /** Get the path of a project (root). */
70 public static TreeSPath
getProjectPath(Project project
) {
71 return TreeSPath
.createChild(null, getProjectPathName(project
));
74 private static String
getProjectPathName(Project project
) {
75 String projectName
= project
.getName() != null ? project
.getName()
80 private File
findSlcRootFile(File dir
) {
81 for (File file
: dir
.listFiles()) {
82 if (!file
.isDirectory() && file
.getName().equals(slcRootFileName
)) {
87 File parentDir
= dir
.getParentFile();
88 if (parentDir
== null) {
89 return null;// stop condition: not found
91 return findSlcRootFile(parentDir
);
95 private void addSlcTasks(Project project
) {
96 Properties taskdefs
= new Properties();
98 InputStream in
= project
.getClass().getResourceAsStream(
99 "/org/argeo/slc/ant/taskdefs.properties");
102 } catch (IOException e
) {
103 throw new SlcAntException("Cannot load task definitions", e
);
106 for (Object o
: taskdefs
.keySet()) {
107 String name
= o
.toString();
109 project
.addTaskDefinition(name
, Class
.forName(taskdefs
110 .getProperty(name
)));
111 } catch (ClassNotFoundException e
) {
112 log
.error("Unknown class for task "+name
, e
);