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