196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpackage jdiff;
296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.io.*;
496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.util.*;
596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/* For SAX parsing in APIHandler */
796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.Attributes;
896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.SAXException;
996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.SAXParseException;
1096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.XMLReader;
1196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.InputSource;
1296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.helpers.*;
1396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
1496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/**
1596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Creates an API object from an XML file. The API object is the internal
1696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * representation of an API.
1796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * All methods in this class for populating an API object are static.
1896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project *
1996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * See the file LICENSE.txt for copyright details.
2096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @author Matthew Doar, mdoar@pobox.com
2196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */
2296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpublic class XMLToAPI {
2396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
2496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** The instance of the API object which is populated from the file. */
2596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private static API api_ = null;
2696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
2796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Default constructor. */
2896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private XMLToAPI() {
2996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
3096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
3196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
3296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Read the file where the XML representing the API is stored.
3396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
3496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param filename The full name of the file containing the XML
3596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *                 representing the API
3696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param createGlobalComments If set, then store possible comments
3796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param apiName The simple name of the API file. If -oldapidir and
3896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *                -newapidir are not used, then this is the same as
3996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *                the filename parameter
4096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
4196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static API readFile(String filename, boolean createGlobalComments,
4296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			       String apiName) {
4396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // The instance of the API object which is populated from the file.
4496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_ = new API();
4596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.name_ = apiName; // Checked later
4696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        try {
4796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            XMLReader parser = null;
4896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            DefaultHandler handler = new APIHandler(api_, createGlobalComments);
4996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            try {
5096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                String parserName = System.getProperty("org.xml.sax.driver");
5196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                if (parserName == null) {
5296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
5396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                } else {
5496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    // Let the underlying mechanisms try to work out which
5596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    // class to instantiate
5696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
5796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                }
5896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            } catch (SAXException saxe) {
5996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.out.println("SAXException: " + saxe);
6096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                saxe.printStackTrace();
6196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.exit(1);
6296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
6396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (validateXML) {
6496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                parser.setFeature("http://xml.org/sax/features/namespaces", true);
6596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                parser.setFeature("http://xml.org/sax/features/validation", true);
6696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                parser.setFeature("http://apache.org/xml/features/validation/schema", true);
6796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
6896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
6996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            parser.setContentHandler(handler);
7096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            parser.setErrorHandler(handler);
7196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            parser.parse(new InputSource(new FileInputStream(new File(filename))));
7296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } catch(org.xml.sax.SAXNotRecognizedException snre) {
7396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("SAX Parser does not recognize feature: " + snre);
7496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            snre.printStackTrace();
7596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.exit(1);
7696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } catch(org.xml.sax.SAXNotSupportedException snse) {
7796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("SAX Parser feature is not supported: " + snse);
7896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            snse.printStackTrace();
7996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.exit(1);
8096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } catch(org.xml.sax.SAXException saxe) {
8196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("SAX Exception parsing file '" + filename + "' : " + saxe);
8296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            saxe.printStackTrace();
8396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.exit(1);
8496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } catch(java.io.IOException ioe) {
8596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("IOException parsing file '" + filename + "' : " + ioe);
8696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            ioe.printStackTrace();
8796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.exit(1);
8896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
8996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
9096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Add the inherited methods and fields to each class
9196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        addInheritedElements();
9296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        return api_;
9396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    } //readFile()
9496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
9596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
9696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add the inherited methods and fields to each class in turn.
9796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
9896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void addInheritedElements() {
9996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Iterator iter = api_.packages_.iterator();
10096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
10196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            PackageAPI pkg = (PackageAPI)(iter.next());
10296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            Iterator iter2 = pkg.classes_.iterator();
10396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            while (iter2.hasNext()) {
10496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                ClassAPI cls = (ClassAPI)(iter2.next());
10596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                // Look up any inherited classes or interfaces
10696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                if (cls.extends_ != null) {
10796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    ClassAPI parent = (ClassAPI)api_.classes_.get(cls.extends_);
10896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    if (parent != null)
10996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                        addInheritedElements(cls, parent, cls.extends_);
11096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                }
11196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                if (cls.implements_.size() != 0) {
11296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    Iterator iter3 = cls.implements_.iterator();
11396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    while (iter3.hasNext()) {
11496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                        String implName = (String)(iter3.next());
11596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                        ClassAPI parent = (ClassAPI)api_.classes_.get(implName);
11696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                        if (parent != null)
11796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                            addInheritedElements(cls, parent, implName);
11896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    }
11996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                }
12096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            } //while (iter2.hasNext())
12196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } //while (iter.hasNext())
12296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
12396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
12496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
12596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add all the inherited methods and fields in the second class to
12696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * the first class, marking them as inherited from the second class.
12796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Do not add a method or a field if it is already defined locally.
12896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
12996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Only elements at the specified visibility level or
13096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * higher appear in the XML file. All that remains to be tested for
13196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * a private element, which is never inherited.
13296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
13396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * If the parent class inherits any classes or interfaces, call this
13496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * method recursively with those parents.
13596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
13696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void addInheritedElements(ClassAPI child, ClassAPI parent,
13796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                                            String fqParentName) {
13896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (parent.methods_.size() != 0) {
13996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            Iterator iter = parent.methods_.iterator();
14096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            while (iter.hasNext()) {
14196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                MethodAPI m = (MethodAPI)(iter.next());
14296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                // See if it the method is overridden locally
14396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                boolean overridden = false;
14496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                Iterator iter2 = child.methods_.iterator();
14596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                while (iter2.hasNext()) {
14696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    MethodAPI localM = (MethodAPI)(iter2.next());
14796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    if (localM.name_.compareTo(m.name_) == 0 &&
14896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                        localM.getSignature().compareTo(m.getSignature()) == 0)
14996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                        overridden = true;
15096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                }
15196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                if (!overridden && m.inheritedFrom_ == null &&
15296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    m.modifiers_.visibility != null &&
15396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    m.modifiers_.visibility.compareTo("private") != 0) {
15496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    MethodAPI m2 = new MethodAPI(m);
15596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    m2.inheritedFrom_ = fqParentName;
15696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    child.methods_.add(m2);
15796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                }
15896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
15996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
16096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (parent.fields_.size() != 0) {
16196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            Iterator iter = parent.fields_.iterator();
16296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            while (iter.hasNext()) {
16396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                FieldAPI f = (FieldAPI)(iter.next());
16496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                if (child.fields_.indexOf(f) == -1 &&
16596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    f.inheritedFrom_ == null &&
16696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    f.modifiers_.visibility != null &&
16796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    f.modifiers_.visibility.compareTo("private") != 0) {
16896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    FieldAPI f2 = new FieldAPI(f);
16996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    f2.inheritedFrom_ = fqParentName;
17096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    child.fields_.add(f2);
17196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                }
17296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
17396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
17496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
17596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Look up any inherited classes or interfaces
17696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (parent.extends_ != null) {
17796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            ClassAPI parent2 = (ClassAPI)api_.classes_.get(parent.extends_);
17896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (parent2 != null)
17996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                addInheritedElements(child, parent2, parent.extends_);
18096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
18196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (parent.implements_.size() != 0) {
18296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            Iterator iter3 = parent.implements_.iterator();
18396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            while (iter3.hasNext()) {
18496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                String implName = (String)(iter3.next());
18596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                ClassAPI parent2 = (ClassAPI)api_.classes_.get(implName);
18696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                if (parent2 != null)
18796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    addInheritedElements(child, parent2, implName);
18896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
18996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
19096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
19196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
19296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project//
19396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// Methods to add data to an API object. Called by the XML parser.
19496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project//
19596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
19696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
19796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Set the name of the API object.
19896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
19996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param name The name of the package.
20096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
20196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void nameAPI(String name) {
20296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (name == null) {
20396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Error: no API identifier found in the XML file '" + api_.name_ + "'");
20496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.exit(3);
20596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
20696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Check the given name against the filename currently stored in
20796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // the name_ field
20896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String filename2 = name.replace(' ','_');
20996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        filename2 += ".xml";
21096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (filename2.compareTo(api_.name_) != 0) {
21196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Warning: API identifier in the XML file (" +
21296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                               name + ") differs from the name of the file '" +
21396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                               api_.name_ + "'");
21496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
21596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.name_ = name;
21696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
21796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
21896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
21996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Create a new package and add it to the API. Called by the XML parser.
22096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
22196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param name The name of the package.
22296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
22396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void addPackage(String name) {
22496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currPkg_ = new PackageAPI(name);
22596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.packages_.add(api_.currPkg_);
22696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
22796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
22896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
22996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Create a new class and add it to the current package. Called by the XML parser.
23096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
23196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param name The name of the class.
23296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param parent The name of the parent class, null if no class is extended.
23396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param modifiers Modifiers for this class.
23496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
23596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void addClass(String name, String parent,
23696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                                boolean isAbstract,
23796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                                Modifiers modifiers) {
23896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currClass_ = new ClassAPI(name, parent, false, isAbstract, modifiers);
23996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currPkg_.classes_.add(api_.currClass_);
24096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String fqName = api_.currPkg_.name_ + "." + name;
24196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        ClassAPI caOld = (ClassAPI)api_.classes_.put(fqName, api_.currClass_);
24296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (caOld != null) {
24396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Warning: duplicate class : " + fqName + " found. Using the first instance only.");
24496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
24596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
24696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
24796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
24896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add an new interface and add it to the current package. Called by the
24996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * XML parser.
25096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
25196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param name The name of the interface.
25296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param parent The name of the parent interface, null if no
25396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *               interface is extended.
25496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
25596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void addInterface(String name, String parent,
25696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                                    boolean isAbstract,
25796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                                    Modifiers modifiers) {
25896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currClass_ = new ClassAPI(name, parent, true, isAbstract, modifiers);
25996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currPkg_.classes_.add(api_.currClass_);
26096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
26196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
26296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
26396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add an inherited interface to the current class. Called by the XML
26496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * parser.
26596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
26696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param name The name of the inherited interface.
26796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
26896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void addImplements(String name) {
26996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project       api_.currClass_.implements_.add(name);
27096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
27196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
27296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
27396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add a constructor to the current class. Called by the XML parser.
27496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
27596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param name The name of the constructor.
27696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param type The type of the constructor.
27796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param modifiers Modifiers for this constructor.
27896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
27996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void addCtor(String type, Modifiers modifiers) {
28096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String t = type;
28196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (t == null)
28296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            t = "void";
28396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currCtor_ = new ConstructorAPI(t, modifiers);
28496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currClass_.ctors_.add(api_.currCtor_);
28596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
28696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
28796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
28896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add a method to the current class. Called by the XML parser.
28996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
29096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param name The name of the method.
29196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param returnType The return type of the method, null if it is void.
29296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param modifiers Modifiers for this method.
29396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
29496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void addMethod(String name, String returnType,
29596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                                 boolean isAbstract, boolean isNative,
29696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                                 boolean isSynchronized, Modifiers modifiers) {
29796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String rt = returnType;
29896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (rt == null)
29996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            rt = "void";
30096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currMethod_ = new MethodAPI(name, rt, isAbstract, isNative,
30196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                                         isSynchronized, modifiers);
30296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currClass_.methods_.add(api_.currMethod_);
30396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
30496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
30596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
30696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add a field to the current class. Called by the XML parser.
30796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
30896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param name The name of the field.
30996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param type The type of the field, null if it is void.
31096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param modifiers Modifiers for this field.
31196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
31296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void addField(String name, String type, boolean isTransient,
31396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                                boolean isVolatile, String value, Modifiers modifiers) {
31496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String t = type;
31596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (t == null)
31696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            t = "void";
31796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currField_ = new FieldAPI(name, t, isTransient, isVolatile, value, modifiers);
31896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currClass_.fields_.add(api_.currField_);
31996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
32096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
32196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
32296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add a parameter to the current method. Called by the XML parser.
32396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Constuctors have their type (signature) in an attribute, since it
32496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * is often shorter and makes parsing a little easier.
32596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
32696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param name The name of the parameter.
32796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param type The type of the parameter, null if it is void.
32896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
32996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void addParam(String name, String type) {
33096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String t = type;
33196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (t == null)
33296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            t = "void";
33396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        ParamAPI paramAPI = new ParamAPI(name, t);
33496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        api_.currMethod_.params_.add(paramAPI);
33596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
33696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
33796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
33896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add an exception to the current method or constructor.
33996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Called by the XML parser.
34096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
34196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param name The name of the parameter.
34296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param type The type of the parameter.
34396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *             May be null in JDiff1.0.8 and earlier versions.
34496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param currElement Name of the current element.
34596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
34696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void addException(String name, String type, String currElement) {
34796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	String exceptionId = type;
34896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	if (type == null || !showExceptionTypes)
34996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    exceptionId = name;
35096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (currElement.compareTo("method") == 0) {
35196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (api_.currMethod_.exceptions_.compareTo("no exceptions") == 0)
35296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                api_.currMethod_.exceptions_ = exceptionId;
35396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            else
35496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                api_.currMethod_.exceptions_ += ", " + exceptionId;
35596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else {
35696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (api_.currCtor_.exceptions_.compareTo("no exceptions") == 0)
35796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                api_.currCtor_.exceptions_ = exceptionId;
35896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            else
35996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                api_.currCtor_.exceptions_ += ", " + exceptionId;
36096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
36196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
36296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
36396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
36496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * If set, validate the XML which represents an API. By default, this is
36596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * not set for reasons of efficiency, and also because if JDiff generated
36696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * the XML, it should not need validating.
36796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
36896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static boolean validateXML = false;
36996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
37096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
37196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * If set, then store and display the whole qualified name of exceptions.
37296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * If not set, then store and display just the name of the exception,
37396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * which is shorter, but may not detect when an exception changes class,
37496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * but retains the same name.
37596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
37696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private static boolean showExceptionTypes = true;
37796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project}
378