1
2
3
4
5
6 package org.bud.kernel;
7 import java.io.File;
8 import org.apache.log4j.Logger;
9 import org.apache.tools.ant.BuildEvent;
10 import org.apache.tools.ant.BuildException;
11 import org.apache.tools.ant.BuildListener;
12 import org.apache.tools.ant.Project;
13 import org.apache.tools.ant.ProjectHelper;
14 import org.bud.kernel.model.Feature;
15 import org.bud.kernel.model.Release;
16 /***
17 *
18 */
19 public class Script {
20 private Project project;
21 private final File scriptFile;
22 private final Release release;
23
24
25 public Script(File source, Release release) {
26 this.scriptFile = source;
27 this.release = release;
28 }
29
30
31 public void run(ScriptListener listener) {
32 runAnt(new AntListenerAdapter(release, listener));
33 }
34
35
36 public File getFile() {
37 return scriptFile;
38 }
39
40
41 private void runAnt(BuildListener listener) {
42 if (project == null) {
43 project = loadProject(scriptFile);
44 }
45 project.addBuildListener(listener);
46 project.addBuildListener(new MyLog4JLogger(release));
47 project.fireBuildStarted();
48 try {
49 project.executeTarget(project.getDefaultTarget());
50 project.fireBuildFinished(null);
51 }
52 catch (BuildException error) {
53 project.fireBuildFinished(error);
54 throw error;
55 }
56 catch (Throwable error) {
57 project.fireBuildFinished(error);
58 throw new BuildException(error);
59 }
60 }
61
62
63 private static Project loadProject(File source) {
64 Project project = new Project();
65 project.init();
66
67 ProjectHelper helper = ProjectHelper.getProjectHelper();
68
69
70 helper.parse(project, source);
71 source.delete();
72 return project;
73 }
74
75
76 /***
77 * @noinspection AnalyzingLoggingWithoutLogLevelCheck
78 */
79 private static class MyLog4JLogger implements BuildListener {
80 private static final Logger LOG = Logger.getLogger(Script.class);
81 private Release release;
82
83
84 MyLog4JLogger(Release release) {
85 this.release = release;
86 }
87
88
89 public void buildStarted(BuildEvent buildEvent) {
90 LOG.info("> Release (" + release.getVersion() + ") "
91 + release.getDescription());
92 }
93
94
95 public void buildFinished(BuildEvent buildEvent) {
96 if (buildEvent.getException() == null) {
97 LOG.info("< OK");
98 }
99 else {
100 LOG.info("< FAILURE", buildEvent.getException());
101 }
102 }
103
104
105 public void targetStarted(BuildEvent buildEvent) {
106 Feature feature = getFeature(buildEvent);
107 if (feature != null) {
108 LOG.info("--> " + feature.getLabel());
109 }
110 }
111
112
113 public void targetFinished(BuildEvent buildEvent) {
114 Feature feature = getFeature(buildEvent);
115 if (feature != null) {
116 LOG.info("");
117 }
118 }
119
120
121 public void taskStarted(BuildEvent buildEvent) {
122 LOG.info("\t[" + buildEvent.getTask().getTaskName() + "]");
123 }
124
125
126 public void taskFinished(BuildEvent buildEvent) {
127 if (buildEvent.getException() != null) {
128 LOG.info("\tFAILURE : " + buildEvent.getException(),
129 buildEvent.getException());
130 }
131 }
132
133
134 public void messageLogged(BuildEvent buildEvent) {
135 if (buildEvent.getTask() == null) {
136 return;
137 }
138 LOG.info("\t\t" + buildEvent.getMessage());
139 }
140
141
142 private Feature getFeature(BuildEvent buildEvent) {
143 String targetName = buildEvent.getTarget().getName();
144 if (ScriptBuilder.INSTALL_TYPE.equals(targetName)
145 || ScriptBuilder.UNINSTALL_TYPE.equals(targetName)) {
146 return null;
147 }
148 return release.getFeature(Integer.parseInt(targetName) - 1);
149 }
150 }
151
152 private static class AntListenerAdapter implements BuildListener {
153 private Release release;
154 private ScriptListener listener;
155
156
157 AntListenerAdapter(Release release, ScriptListener listener) {
158 this.release = release;
159 this.listener = listener;
160 }
161
162
163 public void buildStarted(BuildEvent buildEvent) {
164 listener.releaseStarted(release);
165 }
166
167
168 public void buildFinished(BuildEvent buildEvent) {
169 listener.releaseFinished(release, buildEvent.getException());
170 }
171
172
173 public void targetStarted(BuildEvent buildEvent) {
174 Feature feature = getFeature(buildEvent);
175 if (feature != null) {
176 listener.featureStarted(feature);
177 }
178 }
179
180
181 public void targetFinished(BuildEvent buildEvent) {
182 Feature feature = getFeature(buildEvent);
183 if (feature != null) {
184 listener.featureFinished(feature, buildEvent.getException());
185 }
186 }
187
188
189 public void taskStarted(BuildEvent buildEvent) {
190 listener.taskStarted(buildEvent.getTask().getTaskName());
191 }
192
193
194 public void taskFinished(BuildEvent buildEvent) {
195 listener.taskFinished(buildEvent.getTask().getTaskName(),
196 buildEvent.getException());
197 }
198
199
200 public void messageLogged(BuildEvent buildEvent) {
201 if (buildEvent.getTask() == null) {
202 return;
203 }
204 listener.taskMessage(buildEvent.getTask().getTaskName(),
205 buildEvent.getMessage());
206 }
207
208
209 private Feature getFeature(BuildEvent buildEvent) {
210 String targetName = buildEvent.getTarget().getName();
211 if (ScriptBuilder.INSTALL_TYPE.equals(targetName)
212 || ScriptBuilder.UNINSTALL_TYPE.equals(targetName)) {
213 return null;
214 }
215 return release.getFeature(Integer.parseInt(targetName) - 1);
216 }
217 }
218 }