1 | /** |
2 | * BSD-style license; for more info see http://xradar.sourceforge.net/license.html |
3 | */ |
4 | package org.sourceforge.xradar.ant; |
5 | |
6 | import java.util.ArrayList; |
7 | import java.util.List; |
8 | |
9 | import org.apache.tools.ant.BuildException; |
10 | import org.apache.tools.ant.Project; |
11 | import org.sourceforge.xradar.XRadarException; |
12 | import org.sourceforge.xradar.dynamics.Dynamics; |
13 | import org.sourceforge.xradar.dynamics.Input; |
14 | |
15 | /** |
16 | * This class is a simple wrapper for Statics merge for Ant. |
17 | * Xml configuration will be : |
18 | * |
19 | *<code> |
20 | <xradar-dynamics debug="false" |
21 | config="etc/radar-config.xml" |
22 | target="${docs.home}" |
23 | staticsConfigured="true"> <!-- false will render staticsRoot attributes optionnal --> |
24 | <!-- If orderId == 1, 'previousReport' is not required as it is the first version of the project |
25 | Xradar will use the etc/config/dynamics/dynamics-master-base.xml |
26 | embedded in the jar distribution. |
27 | --> |
28 | <input reportToMerge="release1/docs/xml/radar_report_normalized.xml" |
29 | qualityReportPath="release1/docs/xml/reports/" |
30 | versionId="1" |
31 | daysSinceLast="1" |
32 | staticsRoot="release1/docs" |
33 | masterFinal="${docs.home}/xml/dynamics-master-final.xml"/> |
34 | |
35 | --release1.2 => version = 1 |
36 | |
37 | <input previousReport="${docs.home}/xml/dynamics-master-final.xml" |
38 | reportToMerge="release2/docs/xml/radar_report_normalized.xml" |
39 | qualityReportPath="release2/docs/xml/reports/" |
40 | versionId="2" |
41 | daysSinceLast="1" |
42 | staticsRoot="release2/docs" |
43 | masterFinal="${docs.home}/xml/dynamics-master-final.xml"/> |
44 | |
45 | |
46 | </xradar-dynamics> |
47 | </code> |
48 | * |
49 | * @author Romain PELISSE, belaran@gmail.com |
50 | * |
51 | */ |
52 | public class DynamicsTask extends AbstractXRadarAntTask |
53 | { |
54 | |
55 | /* |
56 | * Fields accessible through getter/setters |
57 | */ |
58 | private boolean debug = false; |
59 | private String config; |
60 | private String target; |
61 | private boolean staticsConfigured = true; |
62 | |
63 | /* |
64 | * Included element |
65 | */ |
66 | private List<Input> inputs = new ArrayList<Input>(0); |
67 | |
68 | /* |
69 | * Internal fields |
70 | */ |
71 | private Dynamics dynamicsEngine; |
72 | |
73 | |
74 | public void addInput(Input input) |
75 | { |
76 | if ( this.inputs == null ) |
77 | this.inputs = new ArrayList<Input>(); |
78 | this.inputs.add(input); |
79 | } |
80 | /** |
81 | * Execute the merges of the reports |
82 | */ |
83 | public void execute() throws BuildException |
84 | { |
85 | validate(); |
86 | dynamicsInitializtion(); |
87 | try |
88 | { |
89 | for ( Input input : this.inputs ) |
90 | { |
91 | |
92 | // Version specific settings |
93 | dynamicsEngine.setSequenceId(String.valueOf(input.getVersionId())); |
94 | dynamicsEngine.setDaysSinceLast(String.valueOf(input.getDaysSinceLast())); |
95 | dynamicsEngine.setQualityReportPath(input.getQualityReportPath()); |
96 | dynamicsEngine.setMasterFinal(input.getMasterFinal()); |
97 | if ( isStaticsConfigured() ) |
98 | dynamicsEngine.setStaticRoot(input.getStaticsRoot()); |
99 | |
100 | // Updating file from previous version to the current version |
101 | log("Calling execute merge with " + input.getPreviousReport() + " and " + input.getReportToMerge(),Project.MSG_VERBOSE); |
102 | this.dynamicsEngine.executeMerge(input.getPreviousReport(),input.getReportToMerge()); |
103 | // Post processing the previousVersion |
104 | log("Calling post process with " + input.getMasterFinal(),Project.MSG_VERBOSE); |
105 | this.dynamicsEngine.postProcess(input.getMasterFinal()); |
106 | // Adding static images |
107 | log("Adding static images to website",Project.MSG_VERBOSE); |
108 | this.dynamicsEngine.copyImagesToWebSite(); |
109 | // Generating the dynamics 'website' |
110 | log("Calling dynamics style report with " + input.getMasterFinal(),Project.MSG_VERBOSE); |
111 | this.dynamicsEngine.dynamicsStyleReport(input.getMasterFinal(),this.target + Dynamics.EMPTY); |
112 | } |
113 | |
114 | } |
115 | catch (XRadarException e) |
116 | { |
117 | throw new BuildException(e); |
118 | } |
119 | |
120 | } |
121 | |
122 | private void dynamicsInitializtion() throws BuildException |
123 | { |
124 | try |
125 | { |
126 | this.dynamicsEngine.init(); |
127 | } |
128 | catch (XRadarException e) |
129 | { |
130 | throw new BuildException(e); |
131 | } |
132 | } |
133 | |
134 | private void validate() throws BuildException |
135 | { |
136 | // attribute validation |
137 | if ( "".equals(this.getConfig()) ) |
138 | throw new BuildException("Config field is not optionnal."); |
139 | if ( "".equals(this.getTarget()) ) |
140 | throw new BuildException("Target field is not optionnal."); |
141 | // Validating 'input' reports |
142 | if ( this.inputs.size() <= 0 ) |
143 | throw new BuildException("At least one element <input> is required !"); |
144 | // Logging settings |
145 | log("Debug:" + this.debug, Project.MSG_VERBOSE); |
146 | log("Target:" + this.target, Project.MSG_VERBOSE); |
147 | log("Config:" + this.config, Project.MSG_VERBOSE); |
148 | log("Is Statics configured ?" + this.isStaticsConfigured(),Project.MSG_VERBOSE); |
149 | // Validating each report |
150 | for ( Input input : this.inputs ) |
151 | validate(input); |
152 | // Setting the engine |
153 | this.dynamicsEngine = new Dynamics(); |
154 | this.dynamicsEngine.initializedXmlCatalog((! super.isOnline())); |
155 | // Setting (and creating docs-home) |
156 | this.dynamicsEngine.setDebug(this.debug); |
157 | this.dynamicsEngine.setConfig(this.config); |
158 | try |
159 | { |
160 | this.dynamicsEngine.setDocsHome(this.target); |
161 | } |
162 | catch (XRadarException e) |
163 | { |
164 | throw new BuildException(e); |
165 | } |
166 | } |
167 | |
168 | private void validate(Input input) throws BuildException |
169 | { |
170 | String mssg = "Configure input with versionId" + input.getVersionId(); |
171 | // Previous version filename not setted |
172 | if ( input.getPreviousReport() == null || "".equals(input.getPreviousReport()) ) |
173 | { |
174 | // VersionId is 1, using default file |
175 | if ( input.getVersionId() == 1 ) |
176 | input.setPreviousReport(Dynamics.DEFAULT_BASE_MASTER_REPORT); |
177 | else // this is an error... |
178 | throw new BuildException("PreviousReport field is not optionnal." + mssg); |
179 | } |
180 | if ( input.getReportToMerge() == null || "".equals(input.getReportToMerge())) |
181 | throw new BuildException("Report-to-merge field is not optionnal." + mssg ); |
182 | if ( input.getQualityReportPath() == null && "".equals(input.getQualityReportPath() ) ) |
183 | throw new BuildException("qualityReportPath field is not optionnal."+ mssg ); |
184 | if ( "".equals(input.getDaysSinceLast()) ) |
185 | input.setDaysSinceLast(0); |
186 | if ( "".equals(input.getVersionId()) ) |
187 | input.setVersionId(1); |
188 | if ( input.getMasterFinal() == null || "".equals(input.getMasterFinal()) ) |
189 | throw new BuildException("masterFinal field is not optionnal." + mssg ); |
190 | if ( this.isStaticsConfigured() ) |
191 | { |
192 | if ( "".equals(input.getStaticsRoot()) ) |
193 | throw new BuildException("Statics root is required if staticConfigured is set to true." + mssg ); |
194 | //TODO: Check that directory exists and is readable ! |
195 | //TODO: Also check for an index.html file to assert if the report was successfully generated ? |
196 | |
197 | } |
198 | log("Following input is valid:" + input.toString(),Project.MSG_VERBOSE); |
199 | } |
200 | |
201 | /** |
202 | * @return the debug |
203 | */ |
204 | public boolean isDebug() { |
205 | return debug; |
206 | } |
207 | |
208 | /** |
209 | * @param debug the debug to set |
210 | */ |
211 | public void setDebug(boolean debug) { |
212 | this.debug = debug; |
213 | } |
214 | |
215 | /** |
216 | * @return the target |
217 | */ |
218 | public String getTarget() { |
219 | return target; |
220 | } |
221 | |
222 | /** |
223 | * @param target the target to set |
224 | */ |
225 | public void setTarget(String target) { |
226 | this.target = target; |
227 | } |
228 | |
229 | /** |
230 | * @return the config |
231 | */ |
232 | public String getConfig() { |
233 | return config; |
234 | } |
235 | |
236 | /** |
237 | * @param config the config to set |
238 | */ |
239 | public void setConfig(String config) { |
240 | this.config = config; |
241 | } |
242 | /** |
243 | * @return the staticsConfigured |
244 | */ |
245 | public boolean isStaticsConfigured() { |
246 | return staticsConfigured; |
247 | } |
248 | |
249 | /** |
250 | * @param staticsConfigured the staticsConfigured to set |
251 | */ |
252 | public void setStaticsConfigured(boolean staticsConfigured) { |
253 | this.staticsConfigured = staticsConfigured; |
254 | } |
255 | |
256 | } |