1 18 package net.sf.uitags.build; 19 20 import java.io.File ; 21 import java.io.FileFilter ; 22 import java.io.FileInputStream ; 23 import java.io.IOException ; 24 import java.util.ArrayList ; 25 import java.util.Arrays ; 26 import java.util.HashMap ; 27 import java.util.HashSet ; 28 import java.util.Iterator ; 29 import java.util.List ; 30 import java.util.Map ; 31 import java.util.Properties ; 32 import java.util.Set ; 33 34 import org.apache.maven.plugin.AbstractMojo; 35 import org.apache.maven.plugin.MojoFailureException; 36 37 44 public final class JsSuiteEntriesValidator extends AbstractMojo { 45 49 54 private String sourceDir; 55 60 private String entriesFile; 61 62 63 67 private File jsBaseDirectory; 68 private JsFileFilter fileFilter; 69 private JsSuiteFilter suiteFilter; 70 71 72 76 79 private void init() throws MojoFailureException { 80 this.jsBaseDirectory = new File (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 96 private Map getExtractedSuiteFileNameMap() { 97 Properties suiteFileProp = new SuiteProperties(); 98 File [] suiteDirs = getSuiteDirectories(this.jsBaseDirectory); 99 for (int i = 0; i < suiteDirs.length; ++i) { 100 String key = suiteDirs[i].getName(); 101 String value = implode(getJsFiles(suiteDirs[i])); 102 suiteFileProp.setProperty(key, value); 103 } 104 return suiteFileProp; 105 } 106 107 private String implode(File [] files) { 108 StringBuffer buffer = new StringBuffer (); 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 getPathRelativeToBaseDirectory(File file) { 119 String baseName = StringUtils.escapePattern( 120 this.jsBaseDirectory.getPath()); 121 String path = file.getPath().replaceFirst(baseName, ""); 122 return path.replaceFirst("^/*", ""); 123 } 124 125 private File [] getJsFiles(File suiteDir) { 126 return suiteDir.listFiles(this.fileFilter); 127 } 128 129 private File [] getSuiteDirectories(File jsBaseDir) { 130 return jsBaseDir.listFiles(this.suiteFilter); 131 } 132 133 private Map getSuiteFileNamesFromEntriesFile() throws MojoFailureException { 134 Properties availableSuites = new Properties (); 135 try { 136 FileInputStream inputStream = new FileInputStream (this.entriesFile); 137 availableSuites.load(inputStream); 138 } 139 catch (IOException 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 extractedMap = getExtractedSuiteFileNameMap(); 151 Map savedMap = getSuiteFileNamesFromEntriesFile(); 152 153 List suiteDifference = getSuiteDifference(extractedMap, savedMap); 154 assertNoMissingSuites(suiteDifference, "properties file"); 155 suiteDifference = getSuiteDifference(savedMap, extractedMap); 156 assertNoMissingSuites(suiteDifference, "file system"); 157 158 Map fileNameDifference = getFileNameDifference(extractedMap, savedMap); 159 assertNoMissingFiles(fileNameDifference, "properties file"); 160 fileNameDifference = getFileNameDifference(savedMap, extractedMap); 161 assertNoMissingFiles(fileNameDifference, "file system"); 162 } 163 164 private List getSuiteDifference(Map map1, Map map2) { 165 List results = new ArrayList (); 166 for (Iterator iter = map1.keySet().iterator(); iter.hasNext(); ) { 167 String key = (String ) iter.next(); 168 if (!map2.containsKey(key)) { 169 results.add(key); 170 } 171 } 172 return results; 173 } 174 175 private void assertNoMissingSuites(List difference, String entriesName) 176 throws MojoFailureException { 177 if (difference.size() > 0) { 178 getLog().error("Suites missing from " + entriesName + ":"); 179 for (Iterator 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 getFileNameDifference(Map map1, Map map2) { 189 Map results = new HashMap (); 190 for (Iterator iter = map1.entrySet().iterator(); iter.hasNext(); ) { 191 Map.Entry entry = (Map.Entry ) iter.next(); 192 String key = (String ) entry.getKey(); 193 194 if (map2.containsKey(key)) { 195 String value1 = (String ) entry.getValue(); 196 String value2 = (String ) map2.get(key); 197 results.put(key, getFileNameDifference(value1, value2)); 198 } 199 } 200 201 return results; 202 } 203 204 private List getFileNameDifference(String fileNames1, String fileNames2) { 205 String [] fileNameArray1 = fileNames1.split(","); 206 String [] fileNameArray2 = fileNames2.split(","); 207 String baseDir = this.jsBaseDirectory.getAbsolutePath() + "/"; 208 209 List difference = new ArrayList (); 210 for (int i = 0; i < fileNameArray1.length; ++i) { 211 File file1 = new File (baseDir + fileNameArray1[i]); 212 213 boolean exist = false; 214 for (int j = 0; j < fileNameArray2.length; ++j) { 215 File file2 = new File (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 difference, String entriesName) 229 throws MojoFailureException { 230 boolean hasError = false; 231 232 for (Iterator iter = difference.entrySet().iterator(); iter.hasNext(); ) { 233 Map.Entry entry = (Map.Entry ) iter.next(); 234 String suiteName = (String ) entry.getKey(); 235 List fileNameList = (List ) entry.getValue(); 236 237 if (fileNameList.size() > 0) { 238 Object [] fileNameArray = fileNameList.toArray( 239 new Object [fileNameList.size()]); 240 getLog().error("Files in suite " + suiteName + 241 " missing from " + entriesName + ": " + 242 new ArrayList (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 258 public static void main(String 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 279 private static class JsFileFilter implements FileFilter { 280 public boolean accept(File 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 { 289 private static Set blackList = new HashSet (); 290 291 static { 292 blackList.add("CVS"); 293 blackList.add(".svn"); 294 blackList.add("excludes"); 295 } 296 297 public boolean accept(File 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 { 307 private static final long serialVersionUID = 1L; 308 309 private static Properties suites = new Properties (); 310 311 static { 312 suites.put("html", "core"); 313 suites.put("util", "core"); 314 } 315 316 public Object setProperty(String key, String value) { 317 if (suites.containsKey(key)) { 318 key = suites.getProperty(key); 319 String 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 |