KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > uitags > build > JsSuiteEntriesValidator


1 /**
2  * Nov 20, 2004
3  *
4  * Copyright 2004 uitags
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */

18 package net.sf.uitags.build;
19
20 import java.io.File JavaDoc;
21 import java.io.FileFilter JavaDoc;
22 import java.io.FileInputStream JavaDoc;
23 import java.io.IOException JavaDoc;
24 import java.util.ArrayList JavaDoc;
25 import java.util.Arrays JavaDoc;
26 import java.util.HashMap JavaDoc;
27 import java.util.HashSet JavaDoc;
28 import java.util.Iterator JavaDoc;
29 import java.util.List JavaDoc;
30 import java.util.Map JavaDoc;
31 import java.util.Properties JavaDoc;
32 import java.util.Set JavaDoc;
33
34 import org.apache.maven.plugin.AbstractMojo;
35 import org.apache.maven.plugin.MojoFailureException;
36
37 /**
38  * @goal validatesJsSuiteEntries
39  * @description Validity checker for Javascript suite entries.
40  * @author hgani
41  * @author jonni
42  * @version $Id$
43  */

44 public final class JsSuiteEntriesValidator extends AbstractMojo {
45   //////////////////////////////////////
46
////////// Maven parameters //////////
47
//////////////////////////////////////
48

49   /**
50    * The directory containing the JavaScript source files.
51    * @parameter
52    * @required
53    */

54   private String JavaDoc sourceDir;
55   /**
56    * The properties file containing entries to verify against.
57    * @parameter
58    * @required
59    */

60   private String JavaDoc entriesFile;
61
62
63   ////////////////////////////
64
////////// Fields //////////
65
////////////////////////////
66

67   private File JavaDoc jsBaseDirectory;
68   private JsFileFilter fileFilter;
69   private JsSuiteFilter suiteFilter;
70
71
72   ////////////////////////////////////////////
73
////////// Initialization Methods //////////
74
////////////////////////////////////////////
75

76   /**
77    * Processes Maven parameters and save the results to instance variables.
78    */

79   private void init() throws MojoFailureException {
80     this.jsBaseDirectory = new File JavaDoc(this.sourceDir);
81     if (!this.jsBaseDirectory.isDirectory()) {
82       getLog().error("Invalid directory name: " + this.sourceDir);
83       throw new MojoFailureException(
84           "Invalid directory name: " + this.sourceDir);
85     }
86
87     this.fileFilter = new JsFileFilter();
88     this.suiteFilter = new JsSuiteFilter();
89   }
90
91
92   ////////////////////////////////////
93
////////// Action Methods //////////
94
////////////////////////////////////
95

96   private Map JavaDoc getExtractedSuiteFileNameMap() {
97     Properties JavaDoc suiteFileProp = new SuiteProperties();
98     File JavaDoc[] suiteDirs = getSuiteDirectories(this.jsBaseDirectory);
99     for (int i = 0; i < suiteDirs.length; ++i) {
100       String JavaDoc key = suiteDirs[i].getName();
101       String JavaDoc value = implode(getJsFiles(suiteDirs[i]));
102       suiteFileProp.setProperty(key, value);
103     }
104     return suiteFileProp;
105   }
106
107   private String JavaDoc implode(File JavaDoc[] files) {
108     StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
109     if (files.length > 0) {
110       buffer.append(getPathRelativeToBaseDirectory(files[0]));
111       for (int i = 1; i < files.length; ++i) {
112         buffer.append("," + getPathRelativeToBaseDirectory(files[i]));
113       }
114     }
115     return buffer.toString();
116   }
117
118   private String JavaDoc getPathRelativeToBaseDirectory(File JavaDoc file) {
119     String JavaDoc baseName = StringUtils.escapePattern(
120         this.jsBaseDirectory.getPath());
121     String JavaDoc path = file.getPath().replaceFirst(baseName, "");
122     return path.replaceFirst("^/*", "");
123   }
124
125   private File JavaDoc[] getJsFiles(File JavaDoc suiteDir) {
126     return suiteDir.listFiles(this.fileFilter);
127   }
128
129   private File JavaDoc[] getSuiteDirectories(File JavaDoc jsBaseDir) {
130     return jsBaseDir.listFiles(this.suiteFilter);
131   }
132
133   private Map JavaDoc getSuiteFileNamesFromEntriesFile() throws MojoFailureException {
134     Properties JavaDoc availableSuites = new Properties JavaDoc();
135     try {
136       FileInputStream JavaDoc inputStream = new FileInputStream JavaDoc(this.entriesFile);
137       availableSuites.load(inputStream);
138     }
139     catch (IOException JavaDoc e) {
140       throw new MojoFailureException(
141           "Unable to load entries file: '" + this.entriesFile + "'.");
142     }
143
144     return availableSuites;
145   }
146
147   public void execute() throws MojoFailureException {
148     init();
149
150     Map JavaDoc extractedMap = getExtractedSuiteFileNameMap();
151     Map JavaDoc savedMap = getSuiteFileNamesFromEntriesFile();
152
153     List JavaDoc suiteDifference = getSuiteDifference(extractedMap, savedMap);
154     assertNoMissingSuites(suiteDifference, "properties file");
155     suiteDifference = getSuiteDifference(savedMap, extractedMap);
156     assertNoMissingSuites(suiteDifference, "file system");
157
158     Map JavaDoc fileNameDifference = getFileNameDifference(extractedMap, savedMap);
159     assertNoMissingFiles(fileNameDifference, "properties file");
160     fileNameDifference = getFileNameDifference(savedMap, extractedMap);
161     assertNoMissingFiles(fileNameDifference, "file system");
162   }
163
164   private List JavaDoc getSuiteDifference(Map JavaDoc map1, Map JavaDoc map2) {
165     List JavaDoc results = new ArrayList JavaDoc();
166     for (Iterator JavaDoc iter = map1.keySet().iterator(); iter.hasNext(); ) {
167       String JavaDoc key = (String JavaDoc) iter.next();
168       if (!map2.containsKey(key)) {
169         results.add(key);
170       }
171     }
172     return results;
173   }
174
175   private void assertNoMissingSuites(List JavaDoc difference, String JavaDoc entriesName)
176       throws MojoFailureException {
177     if (difference.size() > 0) {
178       getLog().error("Suites missing from " + entriesName + ":");
179       for (Iterator JavaDoc iter = difference.iterator(); iter.hasNext(); ) {
180         getLog().error(iter.next().toString());
181       }
182
183       throw new MojoFailureException(
184           "There are suites missing from " + entriesName + ".");
185     }
186   }
187
188   private Map JavaDoc getFileNameDifference(Map JavaDoc map1, Map JavaDoc map2) {
189     Map JavaDoc results = new HashMap JavaDoc();
190     for (Iterator JavaDoc iter = map1.entrySet().iterator(); iter.hasNext(); ) {
191       Map.Entry JavaDoc entry = (Map.Entry JavaDoc) iter.next();
192       String JavaDoc key = (String JavaDoc) entry.getKey();
193
194       if (map2.containsKey(key)) {
195         String JavaDoc value1 = (String JavaDoc) entry.getValue();
196         String JavaDoc value2 = (String JavaDoc) map2.get(key);
197         results.put(key, getFileNameDifference(value1, value2));
198       }
199     }
200
201     return results;
202   }
203
204   private List JavaDoc getFileNameDifference(String JavaDoc fileNames1, String JavaDoc fileNames2) {
205     String JavaDoc[] fileNameArray1 = fileNames1.split(",");
206     String JavaDoc[] fileNameArray2 = fileNames2.split(",");
207     String JavaDoc baseDir = this.jsBaseDirectory.getAbsolutePath() + "/";
208
209     List JavaDoc difference = new ArrayList JavaDoc();
210     for (int i = 0; i < fileNameArray1.length; ++i) {
211       File JavaDoc file1 = new File JavaDoc(baseDir + fileNameArray1[i]);
212
213       boolean exist = false;
214       for (int j = 0; j < fileNameArray2.length; ++j) {
215         File JavaDoc file2 = new File JavaDoc(baseDir + fileNameArray2[j]);
216         if (file1.equals(file2)) {
217           exist = true;
218         }
219       }
220
221       if (!exist) {
222         difference.add(file1);
223       }
224     }
225     return difference;
226   }
227
228   private void assertNoMissingFiles(Map JavaDoc difference, String JavaDoc entriesName)
229       throws MojoFailureException {
230     boolean hasError = false;
231
232     for (Iterator JavaDoc iter = difference.entrySet().iterator(); iter.hasNext(); ) {
233       Map.Entry JavaDoc entry = (Map.Entry JavaDoc) iter.next();
234       String JavaDoc suiteName = (String JavaDoc) entry.getKey();
235       List JavaDoc fileNameList = (List JavaDoc) entry.getValue();
236
237       if (fileNameList.size() > 0) {
238         Object JavaDoc[] fileNameArray = fileNameList.toArray(
239             new Object JavaDoc[fileNameList.size()]);
240         getLog().error("Files in suite " + suiteName +
241             " missing from " + entriesName + ": " +
242             new ArrayList JavaDoc(Arrays.asList(fileNameArray)));
243         hasError = true;
244       }
245     }
246
247     if (hasError) {
248       throw new MojoFailureException(
249           "There are files missing from " + entriesName + ".");
250     }
251   }
252
253
254   ////////////////////////////////////
255
////////// Static Methods //////////
256
////////////////////////////////////
257

258   public static void main(String JavaDoc args[]) throws MojoFailureException {
259     if (args.length != 2) {
260       printUsage();
261     }
262
263     JsSuiteEntriesValidator generator = new JsSuiteEntriesValidator();
264     generator.sourceDir = args[0];
265     generator.entriesFile = args[1];
266     generator.execute();
267   }
268
269   private static void printUsage() {
270     System.err.println("Usage: PROGRAM JS_BASE_DIR ENTRIES_FILE");
271     System.exit(1);
272   }
273
274
275   ///////////////////////////////////
276
////////// Inner Classes //////////
277
///////////////////////////////////
278

279   private static class JsFileFilter implements FileFilter JavaDoc {
280     public boolean accept(File JavaDoc file) {
281       if (file.isFile() && file.getPath().endsWith(".js")) {
282         return true;
283       }
284       return false;
285     }
286   }
287
288   private static class JsSuiteFilter implements FileFilter JavaDoc {
289     private static Set JavaDoc blackList = new HashSet JavaDoc();
290
291     static {
292       blackList.add("CVS");
293       blackList.add(".svn");
294       blackList.add("excludes");
295     }
296
297     public boolean accept(File JavaDoc file) {
298       if (file.isDirectory() &&
299           !blackList.contains(file.getName())) {
300         return true;
301       }
302       return false;
303     }
304   }
305
306   private static class SuiteProperties extends Properties JavaDoc {
307     private static final long serialVersionUID = 1L;
308
309     private static Properties JavaDoc suites = new Properties JavaDoc();
310
311     static {
312       suites.put("html", "core");
313       suites.put("util", "core");
314     }
315
316     public Object JavaDoc setProperty(String JavaDoc key, String JavaDoc value) {
317       if (suites.containsKey(key)) {
318         key = suites.getProperty(key);
319         String JavaDoc previous = getProperty(key);
320         if (previous != null) {
321           value = previous + "," + value;
322         }
323       }
324       return super.setProperty(key, value);
325     }
326   }
327 }
328
Popular Tags