View Javadoc

1   /*
2    * BUD, installer for development platform.
3    *
4    * Copyright(c) 2006 bud-project - http://opensource.org/licenses/apachepl.php
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  //        project.setUserProperty("ant.file", source.getAbsolutePath());
67          ProjectHelper helper = ProjectHelper.getProjectHelper();
68  
69  //        project.addReference("ant.projectHelper", helper);
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 }