1 package jdiff; 2 3 import java.io.File ; 4 import java.io.InputStream ; 5 import java.io.OutputStream ; 6 import java.io.FileInputStream ; 7 import java.io.FileOutputStream ; 8 import java.util.Vector ; 9 10 import org.apache.tools.ant.BuildException; 11 import org.apache.tools.ant.DirectoryScanner; 12 import org.apache.tools.ant.Project; 13 import org.apache.tools.ant.taskdefs.Javadoc; 14 import org.apache.tools.ant.taskdefs.Javadoc.DocletInfo; 15 import org.apache.tools.ant.taskdefs.Javadoc.DocletParam; 16 import org.apache.tools.ant.types.FileSet; 17 import org.apache.tools.ant.types.DirSet; 18 import org.apache.tools.ant.types.Path; 19 20 24 public class JDiffAntTask { 25 26 public void execute() throws BuildException { 27 jdiffHome = project.getProperty("JDIFF_HOME"); 28 if (jdiffHome == null || jdiffHome.compareTo("") == 0 | 29 jdiffHome.compareTo("(not set)") == 0) { 30 throw new BuildException("Error: invalid JDIFF_HOME property. Set it in the build file to the directory where jdiff is installed"); 31 } 32 33 jdiffClassPath = jdiffHome + DIR_SEP + "lib" + DIR_SEP + "jdiff.jar" + 34 System.getProperty("path.separator") + 35 jdiffHome + DIR_SEP + "lib" + DIR_SEP + "xerces.jar"; 36 37 39 if (!destdir.mkdir() && !destdir.exists()) { 41 throw new BuildException(getDestdir() + " is not a valid directory"); 42 } else { 43 project.log(" Report location: " + getDestdir() + DIR_SEP 44 + "changes.html", Project.MSG_INFO); 45 } 46 48 if (oldProject == null || newProject == null) { 51 throw new BuildException("Error: two projects are needed, one <old> and one <new>"); 52 } 53 54 80 81 generateJavadoc(oldProject); 83 generateJavadoc(newProject); 84 85 generateXML(oldProject); 87 generateXML(newProject); 88 compareXML(oldProject.getName(), newProject.getName()); 89 90 project.log(" Report location: " + getDestdir() + DIR_SEP 92 + "changes.html", Project.MSG_INFO); 93 } 94 95 101 protected void generateXML(ProjectInfo proj) { 102 String apiname = proj.getName(); 103 Javadoc jd = initJavadoc("Analyzing " + apiname); 104 jd.setDestdir(getDestdir()); 105 addSourcePaths(jd, proj); 106 107 jd.setPackagenames(getPackageList(proj)); 110 111 DocletInfo dInfo = jd.createDoclet(); 113 jd.setDoclet("jdiff.JDiff"); 114 jd.setDocletPath(new Path(project, jdiffClassPath)); 115 116 DocletParam dp1 = dInfo.createParam(); 118 dp1.setName("-apiname"); 119 dp1.setValue(apiname); 120 DocletParam dp2 = dInfo.createParam(); 121 dp2.setName("-baseURI"); 122 dp2.setValue("http://www.w3.org"); 123 DocletParam dp3 = dInfo.createParam(); 125 dp3.setName("-apidir"); 126 dp3.setValue(getDestdir().toString()); 127 128 jd.perform(); 130 } 131 132 140 protected void compareXML(String oldapiname, String newapiname) { 141 Javadoc jd = initJavadoc("Comparing versions"); 142 jd.setDestdir(getDestdir()); 143 jd.setPrivate(true); 144 145 jd.setSourcefiles(jdiffHome + DIR_SEP + "lib" + DIR_SEP + "Null.java"); 147 148 DocletInfo dInfo = jd.createDoclet(); 150 jd.setDoclet("jdiff.JDiff"); 151 jd.setDocletPath(new Path(project, jdiffClassPath)); 152 153 DocletParam dp1 = dInfo.createParam(); 155 dp1.setName("-oldapi"); 156 dp1.setValue(oldapiname); 157 DocletParam dp2 = dInfo.createParam(); 158 dp2.setName("-newapi"); 159 dp2.setValue(newapiname); 160 DocletParam dp3 = dInfo.createParam(); 162 dp3.setName("-oldapidir"); 163 dp3.setValue(getDestdir().toString()); 164 DocletParam dp4 = dInfo.createParam(); 165 dp4.setName("-newapidir"); 166 dp4.setValue(getDestdir().toString()); 167 168 DocletParam dp5 = dInfo.createParam(); 170 dp5.setName("-javadocold"); 171 dp5.setValue(".." + DIR_SEP + oldapiname + DIR_SEP); 172 DocletParam dp6 = dInfo.createParam(); 173 dp6.setName("-javadocnew"); 174 dp6.setValue(".." + DIR_SEP + newapiname + DIR_SEP); 175 176 if (getStats()) { 177 dInfo.createParam().setName("-stats"); 179 copyFile(jdiffHome + DIR_SEP + "lib" + DIR_SEP + "black.gif", 181 getDestdir().toString() + DIR_SEP + "black.gif"); 182 copyFile(jdiffHome + DIR_SEP + "lib" + DIR_SEP + "background.gif", 183 getDestdir().toString() + DIR_SEP + "background.gif"); 184 } 185 186 if (getDocchanges()) { 187 dInfo.createParam().setName("-docchanges"); 189 } 190 191 jd.perform(); 193 } 194 195 203 protected void generateJavadoc(ProjectInfo proj) { 204 String javadoc = proj.getJavadoc(); 205 if (javadoc != null && javadoc.compareTo("generated") != 0) { 206 project.log("Configured to use existing Javadoc located in " + 207 javadoc, Project.MSG_INFO); 208 return; 209 } 210 211 String apiname = proj.getName(); 212 Javadoc jd = initJavadoc("Javadoc for " + apiname); 213 jd.setDestdir(new File (getDestdir().toString() + DIR_SEP + apiname)); 214 addSourcePaths(jd, proj); 215 216 jd.setPrivate(true); 217 jd.setPackagenames(getPackageList(proj)); 218 219 jd.perform(); 221 } 222 223 229 protected Javadoc initJavadoc(String logMsg) { 230 Javadoc jd = new Javadoc(); 231 jd.setProject(project); jd.setTaskName(logMsg); 233 jd.init(); 234 235 if (verboseAnt) { 237 jd.setVerbose(true); 238 } 239 return jd; 240 } 241 242 246 protected void addSourcePaths(Javadoc jd, ProjectInfo proj) { 247 Vector dirSets = proj.getDirsets(); 248 int numDirSets = dirSets.size(); 249 for (int i = 0; i < numDirSets; i++) { 250 DirSet dirSet = (DirSet)dirSets.elementAt(i); 251 jd.setSourcepath(new Path(project, dirSet.getDir(project).toString())); 252 } 253 } 254 255 261 protected String getPackageList(ProjectInfo proj) throws BuildException { 262 String packageList = ""; 263 java.lang.StringBuffer sb = new StringBuffer (); 264 Vector dirSets = proj.getDirsets(); 265 int numDirSets = dirSets.size(); 266 boolean addComma = false; 267 for (int i = 0; i < numDirSets; i++) { 268 DirSet dirSet = (DirSet)dirSets.elementAt(i); 269 DirectoryScanner dirScanner = dirSet.getDirectoryScanner(project); 270 String [] files = dirScanner.getIncludedDirectories(); 271 for (int j = 0; j < files.length; j++) { 272 if (!addComma){ 273 addComma = true; 274 } else { 275 sb.append(","); 276 } 277 sb.append(files[j]); 278 } 279 } 280 packageList = sb.toString(); 281 if (packageList.compareTo("") == 0) { 282 throw new BuildException("Error: no packages found to scan"); 283 } 284 project.log(" Package list: " + packageList, Project.MSG_INFO); 285 286 return packageList; 287 } 288 289 292 protected void copyFile(String src, String dst){ 293 File srcFile = new File (src); 294 File dstFile = new File (dst); 295 try { 296 File reportSubdir = new File (getDestdir().toString() + 297 DIR_SEP + "changes"); 298 if (!reportSubdir.mkdir() && !reportSubdir.exists()) { 299 project.log("Warning: unable to create " + reportSubdir, 300 Project.MSG_WARN); 301 } 302 303 InputStream in = new FileInputStream (src); 304 OutputStream out = new FileOutputStream (dst); 305 306 byte[] buf = new byte[1024]; 308 int len; 309 while ((len = in.read(buf)) > 0) { 310 out.write(buf, 0, len); 311 } 312 in.close(); 313 out.close(); 314 } catch (java.io.FileNotFoundException fnfe) { 315 project.log("Warning: unable to copy " + src.toString() + 316 " to " + dst.toString(), Project.MSG_WARN); 317 } catch (java.io.IOException ioe) { 319 project.log("Warning: unable to copy " + src.toString() + 320 " to " + dst.toString(), Project.MSG_WARN); 321 } 323 } 324 325 336 private Project project; 337 338 341 public void setProject(Project proj) { 342 project = proj; 343 } 344 345 348 static String DIR_SEP = System.getProperty("file.separator"); 349 350 355 private String jdiffHome = "(not set)"; 356 357 360 private String jdiffClassPath = "(not set)"; 361 362 363 364 365 366 370 private File destdir = new File ("jdiff_report"); 371 372 375 public void setDestdir(File value) { 376 this.destdir = value; 377 } 378 379 public File getDestdir() { 380 return this.destdir; 381 } 382 383 388 private boolean verbose = false; 389 390 public void setVerbose(boolean value) { 391 this.verbose = value; 392 } 393 394 public boolean getVerbose() { 395 return this.verbose; 396 } 397 398 401 private boolean verboseAnt = false; 402 403 407 private boolean docchanges = false; 408 409 public void setDocchanges(boolean value) { 410 this.docchanges = value; 411 } 412 413 public boolean getDocchanges() { 414 return this.docchanges; 415 } 416 417 420 private boolean stats = false; 421 422 public void setStats(boolean value) { 423 this.stats = value; 424 } 425 426 public boolean getStats() { 427 return this.stats; 428 } 429 430 431 432 433 434 437 private ProjectInfo oldProject = null; 438 439 443 public void addConfiguredOld(ProjectInfo projInfo) { 444 oldProject = projInfo; 445 } 446 447 450 private ProjectInfo newProject = null; 451 452 456 public void addConfiguredNew(ProjectInfo projInfo) { 457 newProject = projInfo; 458 } 459 460 467 public static class ProjectInfo { 468 473 private String name; 474 475 public void setName(String value) { 476 name = value; 477 } 478 479 public String getName() { 480 return name; 481 } 482 483 488 private String javadoc; 489 490 public void setJavadoc(String value) { 491 javadoc = value; 492 } 493 494 public String getJavadoc() { 495 return javadoc; 496 } 497 498 502 private Vector dirsets = new Vector (); 503 504 public void setDirset(DirSet value) { 505 dirsets.add(value); 506 } 507 508 public Vector getDirsets() { 509 return dirsets; 510 } 511 512 516 public void addDirset(DirSet aDirset) { 517 setDirset(aDirset); 518 } 519 520 } 521 } 522 | Popular Tags |