]> git.argeo.org Git - gpl/argeo-slc.git/blob - org.argeo.slc/src/main/java/org/argeo/slc/ant/SlcProjectHelper.java
ecb46c07bf0f73822b3e618f0c8e92b7816857d1
[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 slcAntConfig = new SlcAntConfig(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 String projectDescription = project.getDescription() != null ? project
62 .getDescription() : "Root";
63 TreeSElement element = TreeSElement.createRootElelment(
64 getProjectPathName(project), projectDescription);
65 registry.register(element);
66
67 }
68
69 /** Get the path of a project (root). */
70 public static TreeSPath getProjectPath(Project project) {
71 return TreeSPath.createChild(null, getProjectPathName(project));
72 }
73
74 private static String getProjectPathName(Project project) {
75 String projectName = project.getName() != null ? project.getName()
76 : "project";
77 return projectName;
78 }
79
80 private File findSlcRootFile(File dir) {
81 for (File file : dir.listFiles()) {
82 if (!file.isDirectory() && file.getName().equals(slcRootFileName)) {
83 return file;
84 }
85 }
86
87 File parentDir = dir.getParentFile();
88 if (parentDir == null) {
89 return null;// stop condition: not found
90 } else {
91 return findSlcRootFile(parentDir);
92 }
93 }
94
95 private void addSlcTasks(Project project) {
96 Properties taskdefs = new Properties();
97 try {
98 InputStream in = project.getClass().getResourceAsStream(
99 "/org/argeo/slc/ant/taskdefs.properties");
100 taskdefs.load(in);
101 in.close();
102 } catch (IOException e) {
103 throw new SlcAntException("Cannot load task definitions", e);
104 }
105
106 for (Object o : taskdefs.keySet()) {
107 String name = o.toString();
108 try {
109 project.addTaskDefinition(name, Class.forName(taskdefs
110 .getProperty(name)));
111 } catch (ClassNotFoundException e) {
112 log.error("Unknown class for task "+name, e);
113 }
114 }
115 }
116 }