196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpackage jdiff; 296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport com.sun.javadoc.*; 496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.util.*; 696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.io.*; 796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.lang.reflect.*; // Used for invoking Javadoc indirectly 896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.lang.Runtime; 996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.lang.Process; 1096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 1196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/** 1296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Generates HTML describing the changes between two sets of Java source code. 1396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 1496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * See the file LICENSE.txt for copyright details. 1596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @author Matthew Doar, mdoar@pobox.com. 1696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 1796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpublic class JDiff extends Doclet { 1896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 1996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static LanguageVersion languageVersion(){ 2096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return LanguageVersion.JAVA_1_5; 2196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 2296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 2396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Doclet-mandated start method. Everything begins here. 2496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 2596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param root a RootDoc object passed by Javadoc 2696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @return true if document generation succeeds 2796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 2896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static boolean start(RootDoc root) { 2996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (root != null) 3096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("JDiff: doclet started ..."); 3196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project JDiff jd = new JDiff(); 3296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return jd.startGeneration(root); 3396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 3496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 3596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 3696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Generate the summary of the APIs. 3796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 3896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param root the RootDoc object passed by Javadoc 3996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @return true if no problems encountered within JDiff 4096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 4196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project protected boolean startGeneration(RootDoc newRoot) { 4296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project long startTime = System.currentTimeMillis(); 4396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 4496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Open the file where the XML representing the API will be stored. 4596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // and generate the XML for the API into it. 4696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (writeXML) { 4796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project RootDocToXML.writeXML(newRoot); 4896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 4996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 5096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (compareAPIs) { 5196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String tempOldFileName = oldFileName; 5296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (oldDirectory != null) { 5396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tempOldFileName = oldDirectory; 5496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!tempOldFileName.endsWith(JDiff.DIR_SEP)) { 5596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tempOldFileName += JDiff.DIR_SEP; 5696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 5796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tempOldFileName += oldFileName; 5896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 5996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 6096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Check the file for the old API exists 6196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project File f = new File(tempOldFileName); 6296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!f.exists()) { 6396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Error: file '" + tempOldFileName + "' does not exist for the old API"); 6496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return false; 6596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 6696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Check the file for the new API exists 6796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 6896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String tempNewFileName = newFileName; 6996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (newDirectory != null) { 7096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tempNewFileName = newDirectory; 7196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!tempNewFileName.endsWith(JDiff.DIR_SEP)) { 7296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tempNewFileName += JDiff.DIR_SEP; 7396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 7496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tempNewFileName += newFileName; 7596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 7696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project f = new File(tempNewFileName); 7796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!f.exists()) { 7896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Error: file '" + tempNewFileName + "' does not exist for the new API"); 7996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return false; 8096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 8196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 8296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Read the file where the XML representing the old API is stored 8396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // and create an API object for it. 8496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.print("JDiff: reading the old API in from file '" + tempOldFileName + "'..."); 8596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Read the file in, but do not add any text to the global comments 8696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project API oldAPI = XMLToAPI.readFile(tempOldFileName, false, oldFileName); 8796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 8896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Read the file where the XML representing the new API is stored 8996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // and create an API object for it. 9096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.print("JDiff: reading the new API in from file '" + tempNewFileName + "'..."); 9196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Read the file in, and do add any text to the global comments 9296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project API newAPI = XMLToAPI.readFile(tempNewFileName, true, newFileName); 9396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 9496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Compare the old and new APIs. 9596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project APIComparator comp = new APIComparator(); 9696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 9796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project comp.compareAPIs(oldAPI, newAPI); 9896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 9996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Read the file where the XML for comments about the changes between 10096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // the old API and new API is stored and create a Comments object for 10196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // it. The Comments object may be null if no file exists. 10296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int suffix = oldFileName.lastIndexOf('.'); 10396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String commentsFileName = "user_comments_for_" + oldFileName.substring(0, suffix); 10496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project suffix = newFileName.lastIndexOf('.'); 10596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project commentsFileName += "_to_" + newFileName.substring(0, suffix) + ".xml"; 10696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project commentsFileName = commentsFileName.replace(' ', '_'); 10796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (HTMLReportGenerator.commentsDir !=null) { 10896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project commentsFileName = HTMLReportGenerator.commentsDir + DIR_SEP + commentsFileName; 10996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (HTMLReportGenerator.outputDir != null) { 11096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project commentsFileName = HTMLReportGenerator.outputDir + DIR_SEP + commentsFileName; 11196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 11296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("JDiff: reading the comments in from file '" + commentsFileName + "'..."); 11396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Comments existingComments = Comments.readFile(commentsFileName); 11496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (existingComments == null) 11596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println(" (the comments file will be created)"); 11696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 11796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Generate an HTML report which summarises all the API differences. 11896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project HTMLReportGenerator reporter = new HTMLReportGenerator(); 11996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project reporter.generate(comp, existingComments); 12096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 12196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Emit messages about which comments are now unused and 12296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // which are new. 12396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Comments newComments = reporter.getNewComments(); 12496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Comments.noteDifferences(existingComments, newComments); 12596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 12696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Write the new comments out to the same file, with unused comments 12796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // now commented out. 12896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("JDiff: writing the comments out to file '" + commentsFileName + "'..."); 12996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Comments.writeFile(commentsFileName, newComments); 13096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 13196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 13296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.print("JDiff: finished (took " + (System.currentTimeMillis() - startTime)/1000 + "s"); 13396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (writeXML) 13496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println(", not including scanning the source files)."); 13596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project else if (compareAPIs) 13696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println(")."); 13796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return true; 13896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 13996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 14096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// 14196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// Option processing 14296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// 14396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 14496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 14596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * This method is called by Javadoc to 14696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * parse the options it does not recognize. It then calls 14796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * {@link #validOptions} to validate them. 14896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 14996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param option a String containing an option 15096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @return an int telling how many components that option has 15196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 15296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static int optionLength(String option) { 15396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return Options.optionLength(option); 15496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 15596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 15696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 15796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * After parsing the available options using {@link #optionLength}, 15896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Javadoc invokes this method with an array of options-arrays. 15996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 16096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param options an array of String arrays, one per option 16196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param reporter a DocErrorReporter for generating error messages 16296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @return true if no errors were found, and all options are 16396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * valid 16496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 16596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static boolean validOptions(String[][] options, 16696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project DocErrorReporter reporter) { 16796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return Options.validOptions(options, reporter); 16896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 16996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 17096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 17196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * This method is only called when running JDiff as a standalone 17296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * application, and uses ANT to execute the build configuration in the 17396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * XML configuration file passed in. 17496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 17596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static void main(String[] args) { 17696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (args.length == 0) { 17796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project //showUsage(); 17896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Looking for a local 'build.xml' configuration file"); 17996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (args.length == 1) { 18096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (args[0].compareTo("-help") == 0 || 18196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project args[0].compareTo("-h") == 0 || 18296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project args[0].compareTo("?") == 0) { 18396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project showUsage(); 18496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (args[0].compareTo("-version") == 0) { 18596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("JDiff version: " + JDiff.version); 18696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 18796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return; 18896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 18996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int rc = runAnt(args); 19096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return; 19196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 19296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 19396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 19496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Display usage information for JDiff. 19596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 19696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static void showUsage() { 19796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("usage: java jdiff.JDiff [-version] [-buildfile <XML configuration file>]"); 19896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("If no build file is specified, the local build.xml file is used."); 19996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 20096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 20196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 20296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Invoke ANT by reflection. 20396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 20496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @return The integer return code from running ANT. 20596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 20696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static int runAnt(String[] args) { 20796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String className = null; 20896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Class c = null; 20996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project try { 21096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project className = "org.apache.tools.ant.Main"; 21196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c = Class.forName(className); 21296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch (ClassNotFoundException e1) { 21396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.err.println("Error: ant.jar not found on the classpath"); 21496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return -1; 21596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 21696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project try { 21796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Class[] methodArgTypes = new Class[1]; 21896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project methodArgTypes[0] = args.getClass(); 21996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Method mainMethod = c.getMethod("main", methodArgTypes); 22096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Object[] methodArgs = new Object[1]; 22196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project methodArgs[0] = args; 22296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // The object can be null because the method is static 22396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Integer res = (Integer)mainMethod.invoke(null, methodArgs); 22496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.gc(); // Clean up after running ANT 22596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return res.intValue(); 22696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch (NoSuchMethodException e2) { 22796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.err.println("Error: method \"main\" not found"); 22896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project e2.printStackTrace(); 22996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch (IllegalAccessException e4) { 23096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.err.println("Error: class not permitted to be instantiated"); 23196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project e4.printStackTrace(); 23296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch (InvocationTargetException e5) { 23396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.err.println("Error: method \"main\" could not be invoked"); 23496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project e5.printStackTrace(); 23596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch (Exception e6) { 23696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.err.println("Error: "); 23796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project e6.printStackTrace(); 23896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 23996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.gc(); // Clean up after running ANT 24096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return -1; 24196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 24296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 24396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 24496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The name of the file where the XML representing the old API is 24596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * stored. 24696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 24796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static String oldFileName = "old_java.xml"; 24896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 24996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 25096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The name of the directory where the XML representing the old API is 25196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * stored. 25296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 25396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static String oldDirectory = null; 25496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 25596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 25696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The name of the file where the XML representing the new API is 25796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * stored. 25896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 25996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static String newFileName = "new_java.xml"; 26096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 26196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 26296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The name of the directory where the XML representing the new API is 26396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * stored. 26496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 26596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static String newDirectory = null; 26696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 26796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** If set, then generate the XML for an API and exit. */ 26896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static boolean writeXML = false; 26996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 27096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** If set, then read in two XML files and compare their APIs. */ 27196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static boolean compareAPIs = false; 27296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 27396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 27496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The file separator for the local filesystem, forward or backward slash. 27596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 27696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static String DIR_SEP = System.getProperty("file.separator"); 27796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 27896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Details for where to find JDiff. */ 27996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static final String jDiffLocation = "http://www.jdiff.org"; 28096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Contact email address for the primary JDiff maintainer. */ 28196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static final String authorEmail = "mdoar@pobox.com"; 28296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 28396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** A description for HTML META tags. */ 28496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static final String jDiffDescription = "JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."; 28596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Keywords for HTML META tags. */ 28696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static final String jDiffKeywords = "diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"; 28796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 28896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** The current JDiff version. */ 28996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static final String version = "1.1.0"; 29096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 29196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** The current virtual machine version. */ 29296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static String javaVersion = System.getProperty("java.version"); 29396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 29496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Set to enable increased logging verbosity for debugging. */ 29596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private static boolean trace = false; 29696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 29796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project} //JDiff 298