]> git.argeo.org Git - gpl/argeo-slc.git/blob - org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcProjectHelper.java
Add test result part
[gpl/argeo-slc.git] / org.argeo.slc / src / main / java / org / argeo / slc / ant / SlcProjectHelper.java
1 package org.argeo.slc.ant;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.util.Properties;
7
8 import org.springframework.context.ApplicationContext;
9 import org.springframework.context.support.FileSystemXmlApplicationContext;
10
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;
16
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;
20
21 /**
22 * Custom implementation of a <code>ProjectHelper</code> binding a Spring
23 * application context and a structure registry with the Ant project.
24 */
25 public class SlcProjectHelper extends ProjectHelperImpl {
26 private static Log log = LogFactory.getLog(SlcProjectHelper.class);
27
28 public static String REF_ROOT_CONTEXT = "slcApplicationContext";
29 public static String REF_STRUCTURE_REGISTRY = "slcStructureRegistry";
30
31 private String slcRootFileName = "slcRoot.properties";
32
33 @Override
34 public void parse(Project project, Object source) throws BuildException {
35 log.debug("Entered SLC project helper");
36
37 // look for root file
38 File projectBaseDir = project.getBaseDir();
39 File slcRootFile = findSlcRootFile(projectBaseDir);
40 if (slcRootFile == null) {
41 throw new SlcAntException("Cannot find SLC root file");
42 }
43 SlcAntConfig.initProject(project, slcRootFile);
44
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);
50
51 // init structure register if it does not exist
52 DefaultSRegistry registry = new DefaultSRegistry();
53 project.addReference(REF_STRUCTURE_REGISTRY, registry);
54
55 // call the underlying implementation to do the actual work
56 super.parse(project, source);
57
58 addSlcTasks(project);
59
60 // create structure root
61 TreeSElement element = new TreeSElement(project.getDescription(),
62 "Root");
63 registry.register(getProjectPath(project), element);
64
65 }
66
67 /** Get the path of a project (root). */
68 public static TreeSPath getProjectPath(Project project) {
69 return TreeSPath.createRootPath(getProjectPathName(project));
70 }
71
72 private static String getProjectPathName(Project project) {
73 String projectName = project.getName() != null ? project.getName()
74 : "project";
75 return projectName;
76 }
77
78 private File findSlcRootFile(File dir) {
79 for (File file : dir.listFiles()) {
80 if (!file.isDirectory() && file.getName().equals(slcRootFileName)) {
81 return file;
82 }
83 }
84
85 File parentDir = dir.getParentFile();
86 if (parentDir == null) {
87 return null;// stop condition: not found
88 } else {
89 return findSlcRootFile(parentDir);
90 }
91 }
92
93 private void addSlcTasks(Project project) {
94 Properties taskdefs = new Properties();
95 try {
96 InputStream in = project.getClass().getResourceAsStream(
97 "/org/argeo/slc/ant/taskdefs.properties");
98 taskdefs.load(in);
99 in.close();
100 } catch (IOException e) {
101 throw new SlcAntException("Cannot load task definitions", e);
102 }
103
104 for (Object o : taskdefs.keySet()) {
105 String name = o.toString();
106 try {
107 project.addTaskDefinition(name, Class.forName(taskdefs
108 .getProperty(name)));
109 } catch (ClassNotFoundException e) {
110 log.error("Unknown class for task " + name, e);
111 }
112 }
113 }
114 }