]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.support.ant/src/main/java/org/argeo/slc/ant/AntRun.java
Start improving Ant
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.ant / src / main / java / org / argeo / slc / ant / AntRun.java
1 package org.argeo.slc.ant;
2
3 import java.io.File;
4 import java.util.ArrayList;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.Vector;
9
10 import org.apache.commons.logging.Log;
11 import org.apache.commons.logging.LogFactory;
12 import org.apache.tools.ant.BuildEvent;
13 import org.apache.tools.ant.BuildListener;
14 import org.apache.tools.ant.Project;
15 import org.apache.tools.ant.ProjectHelper;
16 import org.apache.tools.ant.helper.ProjectHelper2;
17 import org.argeo.slc.SlcException;
18 import org.springframework.core.io.Resource;
19
20 public class AntRun implements Runnable {
21 private final static Log log = LogFactory.getLog(AntRun.class);
22
23 private Resource buildFile;
24 private File baseDir;
25
26 private List<String> targets = new ArrayList<String>();
27 private Map<Object, Object> properties = new HashMap<Object, Object>();
28
29 public void run() {
30 Project project = new Project();
31
32 try {
33 String path = buildFile.getURL().getPath();
34 project.setUserProperty("ant.file", path);
35 project.setBaseDir(extractBaseDir(path));
36
37 project.init();
38 ProjectHelper projectHelper = new ProjectHelper2();
39 project.addReference(ProjectHelper.PROJECTHELPER_REFERENCE,
40 projectHelper);
41 projectHelper.parse(project, buildFile.getURL());
42 } catch (Exception e) {
43 throw new SlcException("Could not parse " + buildFile, e);
44 }
45
46 if (properties != null) {
47 for (Map.Entry<Object, Object> entry : properties.entrySet()) {
48 project.setUserProperty(entry.getKey().toString(), entry
49 .getValue().toString());
50 }
51 }
52
53 project.fireBuildStarted();
54 Throwable exception = null;
55 try {
56 project.addBuildListener(new LoggingListener());
57 if (targets.size() == 0) {
58 project.executeTarget(project.getDefaultTarget());
59 } else {
60 project.executeTargets(new Vector<String>(targets));
61 }
62 } catch (Throwable e) {
63 exception = e;
64 throw new SlcException("Could not run Ant script " + buildFile, e);
65 } finally {
66 project.fireBuildFinished(exception);
67 }
68 }
69
70 private File extractBaseDir(String path) {
71 if(this.baseDir!=null)
72 return this.baseDir;
73
74 String baseDir = null;
75 if (path.length() > 1) {
76 int indx = path.lastIndexOf('/', path.length() - 1);
77 if (indx == -1 || indx == 0) {
78 baseDir = "/";
79 } else {
80 baseDir = path.substring(0, indx) + "/";
81 }
82 } else {
83 baseDir = "/";
84 }
85 File file = new File(baseDir);
86 if (file.exists()) {
87 return file;
88 } else {
89 return new File(System.getProperty("user.dir"));
90 }
91 }
92
93 public void setBuildFile(Resource buildFile) {
94 this.buildFile = buildFile;
95 }
96
97 public void setTargets(List<String> targets) {
98 this.targets = targets;
99 }
100
101 public void setProperties(Map<Object, Object> properties) {
102 this.properties = properties;
103 }
104
105 public void setBaseDir(File baseDir) {
106 this.baseDir = baseDir;
107 }
108
109 protected static class LoggingListener implements BuildListener {
110
111 public void buildFinished(BuildEvent event) {
112 if (log.isDebugEnabled())
113 log.debug("Ant build finished: " + event);
114 }
115
116 public void buildStarted(BuildEvent event) {
117 if (log.isDebugEnabled())
118 log.debug("Ant build started: " + event);
119 }
120
121 public void messageLogged(BuildEvent event) {
122 if (event.getPriority() == Project.MSG_DEBUG) {
123 if (log.isTraceEnabled())
124 log.trace(event.getMessage());
125 } else if (event.getPriority() == Project.MSG_VERBOSE) {
126 if (log.isDebugEnabled())
127 log.debug(event.getMessage());
128 } else if (event.getPriority() == Project.MSG_INFO) {
129 log.info(event.getMessage());
130
131 } else if (event.getPriority() == Project.MSG_WARN) {
132 log.warn(event.getMessage());
133
134 } else if (event.getPriority() == Project.MSG_ERR) {
135 log.error(event.getMessage());
136 } else {
137 log.error(event.getMessage());
138 }
139 }
140
141 public void targetFinished(BuildEvent event) {
142 if (log.isTraceEnabled())
143 log.debug("Target finished: " + event.getTarget());
144 }
145
146 public void targetStarted(BuildEvent event) {
147 if (log.isTraceEnabled())
148 log.debug("Target started: " + event.getTarget());
149 }
150
151 public void taskFinished(BuildEvent event) {
152 }
153
154 public void taskStarted(BuildEvent event) {
155 }
156 }
157 }