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.helpers.DefaultHandler; 1296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 1396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/** 1496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Handle the parsing of an XML file and the generation of an API object. 1596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 1696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * See the file LICENSE.txt for copyright details. 1796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @author Matthew Doar, mdoar@pobox.com 1896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 1996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectclass APIHandler extends DefaultHandler { 2096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 2196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** The API object which is populated from the XML file. */ 2296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public API api_; 2396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 2496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Default constructor. */ 2596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public APIHandler(API api, boolean createGlobalComments) { 2696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project api_ = api; 2796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project createGlobalComments_ = createGlobalComments; 2896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tagStack = new LinkedList(); 2996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 3096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 3196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** If set, then check that each comment is a sentence. */ 3296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static boolean checkIsSentence = false; 3396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 3496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 3596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Contains the name of the current package element type 3696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * where documentation is being added. Also used as the level 3796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * at which to add documentation into an element, i.e. class-level 3896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * or package-level. 3996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 4096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private String currentElement = null; 4196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 4296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** If set, then create the global list of comments. */ 4396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private boolean createGlobalComments_ = false; 4496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 4596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Set if inside a doc element. */ 4696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private boolean inDoc = false; 4796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 4896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** The current comment text being assembled. */ 4996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private String currentText = null; 5096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 5196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** The current text from deprecation, null if empty. */ 5296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private String currentDepText = null; 5396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 5496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 5596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The stack of SingleComment objects awaiting the comment text 5696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * currently being assembled. 5796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 5896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private LinkedList tagStack = null; 5996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 6096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Called at the start of the document. */ 6196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void startDocument() { 6296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 6396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 6496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Called when the end of the document is reached. */ 6596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void endDocument() { 6696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) 6796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project api_.dump(); 6896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println(" finished"); 6996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 7096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 7196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Called when a new element is started. */ 7296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void startElement(java.lang.String uri, java.lang.String localName, 7396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project java.lang.String qName, Attributes attributes) { 7496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // The change to JAXP compliance produced this change. 7596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (localName.equals("")) 7696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project localName = qName; 7796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (localName.compareTo("api") == 0) { 7896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String apiName = attributes.getValue("name"); 7996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String version = attributes.getValue("jdversion"); // Not used yet 8096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project XMLToAPI.nameAPI(apiName); 8196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (localName.compareTo("package") == 0) { 8296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement = localName; 8396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String pkgName = attributes.getValue("name"); 8496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project XMLToAPI.addPackage(pkgName); 8596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (localName.compareTo("class") == 0) { 8696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement = localName; 8796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String className = attributes.getValue("name"); 8896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String parentName = attributes.getValue("extends"); 8996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean isAbstract = false; 9096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (attributes.getValue("abstract").compareTo("true") == 0) 9196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project isAbstract = true; 9296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project XMLToAPI.addClass(className, parentName, isAbstract, getModifiers(attributes)); 9396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (localName.compareTo("interface") == 0) { 9496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement = localName; 9596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String className = attributes.getValue("name"); 9696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String parentName = attributes.getValue("extends"); 9796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean isAbstract = false; 9896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (attributes.getValue("abstract").compareTo("true") == 0) 9996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project isAbstract = true; 10096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project XMLToAPI.addInterface(className, parentName, isAbstract, getModifiers(attributes)); 10196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (localName.compareTo("implements") == 0) { 10296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String interfaceName = attributes.getValue("name"); 10396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project XMLToAPI.addImplements(interfaceName); 10496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (localName.compareTo("constructor") == 0) { 10596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement = localName; 10696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String ctorType = attributes.getValue("type"); 10796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project XMLToAPI.addCtor(ctorType, getModifiers(attributes)); 10896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (localName.compareTo("method") == 0) { 10996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement = localName; 11096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String methodName = attributes.getValue("name"); 11196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String returnType = attributes.getValue("return"); 11296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean isAbstract = false; 11396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (attributes.getValue("abstract").compareTo("true") == 0) 11496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project isAbstract = true; 11596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean isNative = false; 11696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (attributes.getValue("native").compareTo("true") == 0) 11796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project isNative = true; 11896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean isSynchronized = false; 11996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (attributes.getValue("synchronized").compareTo("true") == 0) 12096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project isSynchronized = true; 12196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project XMLToAPI.addMethod(methodName, returnType, isAbstract, isNative, 12296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project isSynchronized, getModifiers(attributes)); 12396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (localName.compareTo("field") == 0) { 12496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement = localName; 12596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String fieldName = attributes.getValue("name"); 12696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String fieldType = attributes.getValue("type"); 12796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean isTransient = false; 12896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (attributes.getValue("transient").compareTo("true") == 0) 12996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project isTransient = true; 13096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean isVolatile = false; 13196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (attributes.getValue("volatile").compareTo("true") == 0) 13296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project isVolatile = true; 13396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String value = attributes.getValue("value"); 13496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project XMLToAPI.addField(fieldName, fieldType, isTransient, isVolatile, 13596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project value, getModifiers(attributes)); 13696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (localName.compareTo("param") == 0) { 13796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String paramName = attributes.getValue("name"); 13896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String paramType = attributes.getValue("type"); 13996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project XMLToAPI.addParam(paramName, paramType); 14096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (localName.compareTo("exception") == 0) { 14196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String paramName = attributes.getValue("name"); 14296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String paramType = attributes.getValue("type"); 14396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project XMLToAPI.addException(paramName, paramType, currentElement); 14496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (localName.compareTo("doc") == 0) { 14596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project inDoc = true; 14696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentText = null; 14796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 14896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (inDoc) { 14996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Start of an element, probably an HTML element 15096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addStartTagToText(localName, attributes); 15196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 15296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Error: unknown element type: " + localName); 15396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.exit(-1); 15496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 15596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 15696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 15796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 15896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Called when the end of an element is reached. */ 15996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void endElement(java.lang.String uri, java.lang.String localName, 16096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project java.lang.String qName) { 16196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (localName.equals("")) 16296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project localName = qName; 16396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Deal with the end of doc blocks 16496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (localName.compareTo("doc") == 0) { 16596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project inDoc = false; 16696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Add the assembled comment text to the appropriate current 16796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // program element, as determined by currentElement. 16896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addTextToComments(); 16996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (inDoc) { 17096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // An element was found inside the HTML text 17196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addEndTagToText(localName); 17296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (currentElement.compareTo("constructor") == 0 && 17396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project localName.compareTo("constructor") == 0) { 17496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement = "class"; 17596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (currentElement.compareTo("method") == 0 && 17696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project localName.compareTo("method") == 0) { 17796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement = "class"; 17896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (currentElement.compareTo("field") == 0 && 17996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project localName.compareTo("field") == 0) { 18096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement = "class"; 18196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (currentElement.compareTo("class") == 0 || 18296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement.compareTo("interface") == 0) { 18396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Feature request 510307 and bug 517383: duplicate comment ids. 18496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // The end of a member element leaves the currentElement at the 18596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // "class" level, but the next class may in fact be an interface 18696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // and so the currentElement here will be "interface". 18796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (localName.compareTo("class") == 0 || 18896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project localName.compareTo("interface") == 0) { 18996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement = "package"; 19096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 19196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 19296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 19396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 19496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Called to process text. */ 19596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void characters(char[] ch, int start, int length) { 19696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (inDoc) { 19796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String chunk = new String(ch, start, length); 19896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (currentText == null) 19996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentText = chunk; 20096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project else 20196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentText += chunk; 20296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 20396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 20496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 20596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 20696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Trim the current text, check it is a sentence and add it to the 20796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * current program element. 20896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 20996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void addTextToComments() { 21096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Eliminate any whitespace at each end of the text. 21196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentText = currentText.trim(); 21296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Convert any @link tags to HTML links. 21396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (convertAtLinks) { 21496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentText = Comments.convertAtLinks(currentText, currentElement, 21596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project api_.currPkg_, api_.currClass_); 21696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 21796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Check that it is a sentence 21896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (checkIsSentence && !currentText.endsWith(".") && 21996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentText.compareTo(Comments.placeHolderText) != 0) { 22096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Warning: text of comment does not end in a period: " + currentText); 22196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 22296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // The construction of the commentID assumes that the 22396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // documentation is the final element to be parsed. The format matches 22496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // the format used in the report generator to look up comments in the 22596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // the existingComments object. 22696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String commentID = null; 22796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Add this comment to the current API element. 22896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (currentElement.compareTo("package") == 0) { 22996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project api_.currPkg_.doc_ = currentText; 23096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project commentID = api_.currPkg_.name_; 23196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (currentElement.compareTo("class") == 0 || 23296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentElement.compareTo("interface") == 0) { 23396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project api_.currClass_.doc_ = currentText; 23496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project commentID = api_.currPkg_.name_ + "." + api_.currClass_.name_; 23596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (currentElement.compareTo("constructor") == 0) { 23696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project api_.currCtor_.doc_ = currentText; 23796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project commentID = api_.currPkg_.name_ + "." + api_.currClass_.name_ + 23896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project ".ctor_changed("; 23996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (api_.currCtor_.type_.compareTo("void") == 0) 24096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project commentID = commentID + ")"; 24196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project else 24296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project commentID = commentID + api_.currCtor_.type_ + ")"; 24396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (currentElement.compareTo("method") == 0) { 24496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project api_.currMethod_.doc_ = currentText; 24596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project commentID = api_.currPkg_.name_ + "." + api_.currClass_.name_ + 24696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project "." + api_.currMethod_.name_ + "_changed(" + 24796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project api_.currMethod_.getSignature() + ")"; 24896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (currentElement.compareTo("field") == 0) { 24996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project api_.currField_.doc_ = currentText; 25096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project commentID = api_.currPkg_.name_ + "." + api_.currClass_.name_ + 25196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project "." + api_.currField_.name_; 25296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 25396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Add to the list of possible comments for use when an 25496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // element has changed (not removed or added). 25596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (createGlobalComments_ && commentID != null) { 25696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String ct = currentText; 25796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Use any deprecation text as the possible comment, ignoring 25896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // any other comment text. 25996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (currentDepText != null) { 26096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project ct = currentDepText; 26196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentDepText = null; // Never reuse it. Bug 469794 26296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 26396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String ctOld = (String)(Comments.allPossibleComments.put(commentID, ct)); 26496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (ctOld != null) { 26596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Error: duplicate comment id: " + commentID); 26696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.exit(5); 26796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 26896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 26996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 27096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 27196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 27296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Add the start tag to the current comment text. 27396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 27496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void addStartTagToText(String localName, Attributes attributes) { 27596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Need to insert the HTML tag into the current text 27696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String currentHTMLTag = localName; 27796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Save the tag in a stack 27896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tagStack.add(currentHTMLTag); 27996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String tag = "<" + currentHTMLTag; 28096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Now add all the attributes into the current text 28196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int len = attributes.getLength(); 28296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < len; i++) { 28396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String name = attributes.getLocalName(i); 28496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String value = attributes.getValue(i); 28596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tag += " " + name + "=\"" + value+ "\""; 28696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 28796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 28896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // End the tag 28996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (Comments.isMinimizedTag(currentHTMLTag)) { 29096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tag += "/>"; 29196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 29296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tag += ">"; 29396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 29496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Now insert the HTML tag into the current text 29596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (currentText == null) 29696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentText = tag; 29796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project else 29896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentText += tag; 29996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 30096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 30196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 30296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Add the end tag to the current comment text. 30396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 30496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void addEndTagToText(String localName) { 30596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Close the current HTML tag 30696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String currentHTMLTag = (String)(tagStack.removeLast()); 30796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!Comments.isMinimizedTag(currentHTMLTag)) 30896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentText += "</" + currentHTMLTag + ">"; 30996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 31096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 31196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Extra modifiers which are common to all program elements. */ 31296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public Modifiers getModifiers(Attributes attributes) { 31396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Modifiers modifiers = new Modifiers(); 31496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project modifiers.isStatic = false; 31596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (attributes.getValue("static").compareTo("true") == 0) 31696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project modifiers.isStatic = true; 31796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project modifiers.isFinal = false; 31896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (attributes.getValue("final").compareTo("true") == 0) 31996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project modifiers.isFinal = true; 32096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project modifiers.isDeprecated = false; 32196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String cdt = attributes.getValue("deprecated"); 32296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (cdt.compareTo("not deprecated") == 0) { 32396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project modifiers.isDeprecated = false; 32496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentDepText = null; 32596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (cdt.compareTo("deprecated, no comment") == 0) { 32696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project modifiers.isDeprecated = true; 32796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentDepText = null; 32896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 32996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project modifiers.isDeprecated = true; 33096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project currentDepText = API.showHTMLTags(cdt); 33196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 33296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project modifiers.visibility = attributes.getValue("visibility"); 33396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return modifiers; 33496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 33596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 33696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void warning(SAXParseException e) { 33796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Warning (" + e.getLineNumber() + "): parsing XML API file:" + e); 33896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project e.printStackTrace(); 33996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 34096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 34196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void error(SAXParseException e) { 34296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Error (" + e.getLineNumber() + "): parsing XML API file:" + e); 34396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project e.printStackTrace(); 34496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.exit(1); 34596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 34696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 34796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void fatalError(SAXParseException e) { 34896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Fatal Error (" + e.getLineNumber() + "): parsing XML API file:" + e); 34996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project e.printStackTrace(); 35096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.exit(1); 35196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 35296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 35396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 35496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * If set, then attempt to convert @link tags to HTML links. 35596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * A few of the HTML links may be broken links. 35696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 35796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private static boolean convertAtLinks = true; 35896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 35996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Set to enable increased logging verbosity for debugging. */ 36096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private static boolean trace = false; 36196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 36296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project} 363