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