196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpackage jdiff; 296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport com.sun.javadoc.*; 496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport com.sun.javadoc.ParameterizedType; 596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport com.sun.javadoc.Type; 696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.util.*; 896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.io.*; 996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.lang.reflect.*; 1096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 1196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/** 1296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Converts a Javadoc RootDoc object into a representation in an 1396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * XML file. 1496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 1596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * See the file LICENSE.txt for copyright details. 1696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @author Matthew Doar, mdoar@pobox.com 1796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 1896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpublic class RootDocToXML { 1996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 2096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Default constructor. */ 2196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public RootDocToXML() { 2296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 2396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 2496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 2596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Write the XML representation of the API to a file. 2696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 2796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param root the RootDoc object passed by Javadoc 2896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @return true if no problems encountered 2996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 3096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static boolean writeXML(RootDoc root) { 3196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String tempFileName = outputFileName; 3296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (outputDirectory != null) { 3396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tempFileName = outputDirectory; 3496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!tempFileName.endsWith(JDiff.DIR_SEP)) 3596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tempFileName += JDiff.DIR_SEP; 3696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project tempFileName += outputFileName; 3796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 3896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 3996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project try { 4096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project FileOutputStream fos = new FileOutputStream(tempFileName); 4196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile = new PrintWriter(fos); 4296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("JDiff: writing the API to file '" + tempFileName + "'..."); 4396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (root.specifiedPackages().length != 0 || root.specifiedClasses().length != 0) { 4496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project RootDocToXML apiWriter = new RootDocToXML(); 4596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project apiWriter.emitXMLHeader(); 4696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project apiWriter.logOptions(); 4796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project apiWriter.processPackages(root); 4896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project apiWriter.emitXMLFooter(); 4996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 5096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.close(); 5196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch(IOException e) { 5296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("IO Error while attempting to create " + tempFileName); 5396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Error: " + e.getMessage()); 5496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.exit(1); 5596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 5696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // If validation is desired, write out the appropriate api.xsd file 5796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // in the same directory as the XML file. 5896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (XMLToAPI.validateXML) { 5996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project writeXSD(); 6096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 6196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return true; 6296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 6396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 6496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 6596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Write the XML Schema file used for validation. 6696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 6796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static void writeXSD() { 6896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String xsdFileName = outputFileName; 6996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (outputDirectory == null) { 7096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int idx = xsdFileName.lastIndexOf('\\'); 7196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int idx2 = xsdFileName.lastIndexOf('/'); 7296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (idx == -1 && idx2 == -1) { 7396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFileName = ""; 7496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (idx == -1 && idx2 != -1) { 7596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFileName = xsdFileName.substring(0, idx2); 7696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (idx != -1 && idx2 == -1) { 7796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFileName = xsdFileName.substring(0, idx); 7896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else if (idx != -1 && idx2 != -1) { 7996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int max = idx2 > idx ? idx2 : idx; 8096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFileName = xsdFileName.substring(0, max); 8196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 8296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 8396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFileName = outputDirectory; 8496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!xsdFileName.endsWith(JDiff.DIR_SEP)) 8596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFileName += JDiff.DIR_SEP; 8696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 8796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFileName += "api.xsd"; 8896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project try { 8996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project FileOutputStream fos = new FileOutputStream(xsdFileName); 9096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project PrintWriter xsdFile = new PrintWriter(fos); 9196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // The contents of the api.xsd file 9296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"no\"?>"); 9396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"); 9496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(""); 9596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:annotation>"); 9696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:documentation>"); 9796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" Schema for JDiff API representation."); 9896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" </xsd:documentation>"); 9996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("</xsd:annotation>"); 10096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(); 10196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:element name=\"api\" type=\"apiType\"/>"); 10296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(""); 10396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:complexType name=\"apiType\">"); 10496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:sequence>"); 10596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"package\" type=\"packageType\" minOccurs='1' maxOccurs='unbounded'/>"); 10696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" </xsd:sequence>"); 10796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"name\" type=\"xsd:string\"/>"); 10896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"jdversion\" type=\"xsd:string\"/>"); 10996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("</xsd:complexType>"); 11096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(); 11196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:complexType name=\"packageType\">"); 11296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:sequence>"); 11396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:choice maxOccurs='unbounded'>"); 11496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"class\" type=\"classType\"/>"); 11596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"interface\" type=\"classType\"/>"); 11696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" </xsd:choice>"); 11796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"doc\" type=\"xsd:string\" minOccurs='0' maxOccurs='1'/>"); 11896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" </xsd:sequence>"); 11996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"name\" type=\"xsd:string\"/>"); 12096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("</xsd:complexType>"); 12196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(); 12296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:complexType name=\"classType\">"); 12396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:sequence>"); 12496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"implements\" type=\"interfaceTypeName\" minOccurs='0' maxOccurs='unbounded'/>"); 12596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"constructor\" type=\"constructorType\" minOccurs='0' maxOccurs='unbounded'/>"); 12696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"method\" type=\"methodType\" minOccurs='0' maxOccurs='unbounded'/>"); 12796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"field\" type=\"fieldType\" minOccurs='0' maxOccurs='unbounded'/>"); 12896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"doc\" type=\"xsd:string\" minOccurs='0' maxOccurs='1'/>"); 12996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" </xsd:sequence>"); 13096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"name\" type=\"xsd:string\"/>"); 13196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"extends\" type=\"xsd:string\" use='optional'/>"); 13296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"abstract\" type=\"xsd:boolean\"/>"); 13396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"src\" type=\"xsd:string\" use='optional'/>"); 13496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"static\" type=\"xsd:boolean\"/>"); 13596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"final\" type=\"xsd:boolean\"/>"); 13696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"deprecated\" type=\"xsd:string\"/>"); 13796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"visibility\" type=\"xsd:string\"/>"); 13896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("</xsd:complexType>"); 13996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(); 14096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:complexType name=\"interfaceTypeName\">"); 14196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"name\" type=\"xsd:string\"/>"); 14296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("</xsd:complexType>"); 14396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(); 14496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:complexType name=\"constructorType\">"); 14596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:sequence>"); 14696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"exception\" type=\"exceptionType\" minOccurs='0' maxOccurs='unbounded'/>"); 14796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"doc\" type=\"xsd:string\" minOccurs='0' maxOccurs='1'/>"); 14896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" </xsd:sequence>"); 14996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"name\" type=\"xsd:string\"/>"); 15096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"type\" type=\"xsd:string\" use='optional'/>"); 15196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"src\" type=\"xsd:string\" use='optional'/>"); 15296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"static\" type=\"xsd:boolean\"/>"); 15396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"final\" type=\"xsd:boolean\"/>"); 15496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"deprecated\" type=\"xsd:string\"/>"); 15596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"visibility\" type=\"xsd:string\"/>"); 15696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("</xsd:complexType>"); 15796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(); 15896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:complexType name=\"paramsType\">"); 15996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"name\" type=\"xsd:string\"/>"); 16096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"type\" type=\"xsd:string\"/>"); 16196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("</xsd:complexType>"); 16296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(); 16396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:complexType name=\"exceptionType\">"); 16496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"name\" type=\"xsd:string\"/>"); 16596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"type\" type=\"xsd:string\"/>"); 16696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("</xsd:complexType>"); 16796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(); 16896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:complexType name=\"methodType\">"); 16996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:sequence>"); 17096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"param\" type=\"paramsType\" minOccurs='0' maxOccurs='unbounded'/>"); 17196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"exception\" type=\"exceptionType\" minOccurs='0' maxOccurs='unbounded'/>"); 17296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"doc\" type=\"xsd:string\" minOccurs='0' maxOccurs='1'/>"); 17396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" </xsd:sequence>"); 17496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"name\" type=\"xsd:string\"/>"); 17596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"return\" type=\"xsd:string\" use='optional'/>"); 17696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"abstract\" type=\"xsd:boolean\"/>"); 17796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"native\" type=\"xsd:boolean\"/>"); 17896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"synchronized\" type=\"xsd:boolean\"/>"); 17996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"src\" type=\"xsd:string\" use='optional'/>"); 18096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"static\" type=\"xsd:boolean\"/>"); 18196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"final\" type=\"xsd:boolean\"/>"); 18296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"deprecated\" type=\"xsd:string\"/>"); 18396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"visibility\" type=\"xsd:string\"/>"); 18496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("</xsd:complexType>"); 18596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(); 18696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("<xsd:complexType name=\"fieldType\">"); 18796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:sequence>"); 18896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:element name=\"doc\" type=\"xsd:string\" minOccurs='0' maxOccurs='1'/>"); 18996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" </xsd:sequence>"); 19096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"name\" type=\"xsd:string\"/>"); 19196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"type\" type=\"xsd:string\"/>"); 19296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"transient\" type=\"xsd:boolean\"/>"); 19396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"volatile\" type=\"xsd:boolean\"/>"); 19496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"value\" type=\"xsd:string\" use='optional'/>"); 19596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"src\" type=\"xsd:string\" use='optional'/>"); 19696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"static\" type=\"xsd:boolean\"/>"); 19796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"final\" type=\"xsd:boolean\"/>"); 19896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"deprecated\" type=\"xsd:string\"/>"); 19996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(" <xsd:attribute name=\"visibility\" type=\"xsd:string\"/>"); 20096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("</xsd:complexType>"); 20196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println(); 20296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.println("</xsd:schema>"); 20396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project xsdFile.close(); 20496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch(IOException e) { 20596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("IO Error while attempting to create " + xsdFileName); 20696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Error: " + e.getMessage()); 20796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.exit(1); 20896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 20996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 21096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 21196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 21296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Write the options which were used to generate this XML file 21396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * out as XML comments. 21496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 21596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void logOptions() { 21696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print("<!-- "); 21796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" Command line arguments = " + Options.cmdOptions); 21896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" -->"); 21996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 22096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 22196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 22296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Process each package and the classes/interfaces within it. 22396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 22496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param pd an array of PackageDoc objects 22596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 22696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void processPackages(RootDoc root) { 22796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project PackageDoc[] specified_pd = root.specifiedPackages(); 22896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Map pdl = new TreeMap(); 22996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; specified_pd != null && i < specified_pd.length; i++) { 23096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project pdl.put(specified_pd[i].name(), specified_pd[i]); 23196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 23296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 23396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Classes may be specified separately, so merge their packages into the 23496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // list of specified packages. 23596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project ClassDoc[] cd = root.specifiedClasses(); 23696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // This is lists of the specific classes to document 23796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Map classesToUse = new HashMap(); 23896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; cd != null && i < cd.length; i++) { 23996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project PackageDoc cpd = cd[i].containingPackage(); 24096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (cpd == null && !packagesOnly) { 24196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // If the RootDoc object has been created from a jar file 24296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // this duplicates classes, so we have to be able to disable it. 24396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // TODO this is still null? 24496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project cpd = root.packageNamed("anonymous"); 24596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 24696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String pkgName = cpd.name(); 24796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String className = cd[i].name(); 24896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("Found package " + pkgName + " for class " + className); 24996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!pdl.containsKey(pkgName)) { 25096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("Adding new package " + pkgName); 25196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project pdl.put(pkgName, cpd); 25296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 25396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 25496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Keep track of the specific classes to be used for this package 25596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project List classes; 25696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (classesToUse.containsKey(pkgName)) { 25796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project classes = (ArrayList) classesToUse.get(pkgName); 25896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 25996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project classes = new ArrayList(); 26096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 26196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project classes.add(cd[i]); 26296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project classesToUse.put(pkgName, classes); 26396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 26496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 26596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project PackageDoc[] pd = (PackageDoc[]) pdl.values().toArray(new PackageDoc[0]); 26696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; pd != null && i < pd.length; i++) { 26796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String pkgName = pd[i].name(); 26896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 26996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Check for an exclude tag in the package doc block, but not 27096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // in the package.htm[l] file. 27196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!shownElement(pd[i], null)) 27296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project continue; 27396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 27496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING PACKAGE: " + pkgName); 27596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("<package name=\"" + pkgName + "\">"); 27696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 27796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int tagCount = pd[i].tags().length; 27896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("#tags: " + tagCount); 27996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 28096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project List classList; 28196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (classesToUse.containsKey(pkgName)) { 28296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Use only the specified classes in the package 28396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Using the specified classes"); 28496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project classList = (ArrayList) classesToUse.get(pkgName); 28596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 28696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Use all classes in the package 28796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project classList = new LinkedList(Arrays.asList(pd[i].allClasses())); 28896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 28996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Collections.sort(classList); 29096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project ClassDoc[] classes = new ClassDoc[classList.size()]; 29196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project classes = (ClassDoc[])classList.toArray(classes); 29296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project processClasses(classes, pkgName); 29396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 29496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addPkgDocumentation(root, pd[i], 2); 29596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 29696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("</package>"); 29796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 29896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } // processPackages 29996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 30096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 30196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Process classes and interfaces. 30296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 30396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param cd An array of ClassDoc objects. 30496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 30596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void processClasses(ClassDoc[] cd, String pkgName) { 30696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (cd.length == 0) 30796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return; 30896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING CLASSES, number=" + cd.length); 30996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < cd.length; i++) { 31096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String className = cd[i].name(); 31196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING CLASS/IFC: " + className); 31296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Only save the shown elements 31396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!shownElement(cd[i], classVisibilityLevel)) 31496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project continue; 31596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean isInterface = false; 31696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (cd[i].isInterface()) 31796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project isInterface = true; 31896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (isInterface) { 31996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" <!-- start interface " + pkgName + "." + className + " -->"); 32096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" <interface name=\"" + className + "\""); 32196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 32296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" <!-- start class " + pkgName + "." + className + " -->"); 32396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" <class name=\"" + className + "\""); 32496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 32596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Add attributes to the class element 32696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Type parent = cd[i].superclassType(); 32796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (parent != null) 32896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" extends=\"" + buildEmittableTypeString(parent) + "\""); 32996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" abstract=\"" + cd[i].isAbstract() + "\""); 33096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addCommonModifiers(cd[i], 4); 33196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(">"); 33296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Process class members. (Treat inner classes as members.) 33396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project processInterfaces(cd[i].interfaceTypes()); 33496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project processConstructors(cd[i].constructors()); 33596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project processMethods(cd[i], cd[i].methods()); 33696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project processFields(cd[i].fields()); 33796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 33896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addDocumentation(cd[i], 4); 33996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 34096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (isInterface) { 34196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" </interface>"); 34296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" <!-- end interface " + pkgName + "." + className + " -->"); 34396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 34496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" </class>"); 34596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" <!-- end class " + pkgName + "." + className + " -->"); 34696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 34796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Inner classes have already been added. 34896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /* 34996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project ClassDoc[] ic = cd[i].innerClasses(); 35096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int k = 0; k < ic.length; k++) { 35196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Inner class " + k + ", name = " + ic[k].name()); 35296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 35396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 35496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//for 35596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//processClasses() 35696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 35796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 35896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Add qualifiers for the program element as attributes. 35996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 36096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param ped The given program element. 36196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 36296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void addCommonModifiers(ProgramElementDoc ped, int indent) { 36396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addSourcePosition(ped, indent); 36496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Static and final and visibility on one line 36596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < indent; i++) outputFile.print(" "); 36696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print("static=\"" + ped.isStatic() + "\""); 36796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" final=\"" + ped.isFinal() + "\""); 36896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Visibility 36996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String visibility = null; 37096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (ped.isPublic()) 37196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project visibility = "public"; 37296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project else if (ped.isProtected()) 37396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project visibility = "protected"; 37496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project else if (ped.isPackagePrivate()) 37596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project visibility = "package"; 37696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project else if (ped.isPrivate()) 37796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project visibility = "private"; 37896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" visibility=\"" + visibility + "\""); 37996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 38096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Deprecation on its own line 38196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < indent; i++) outputFile.print(" "); 38296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean isDeprecated = false; 38396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Tag[] ta = ((Doc)ped).tags("deprecated"); 38496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (ta.length != 0) { 38596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project isDeprecated = true; 38696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 38796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (ta.length > 1) { 38896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("JDiff: warning: multiple @deprecated tags found in comments for " + ped.name() + ". Using the first one only."); 38996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Text is: " + ((Doc)ped).getRawCommentText()); 39096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 39196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (isDeprecated) { 39296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String text = ta[0].text(); // Use only one @deprecated tag 39396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (text != null && text.compareTo("") != 0) { 39496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int idx = endOfFirstSentence(text); 39596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (idx == 0) { 39696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // No useful comment 39796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print("deprecated=\"deprecated, no comment\""); 39896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 39996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String fs = null; 40096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (idx == -1) 40196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project fs = text; 40296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project else 40396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project fs = text.substring(0, idx+1); 40496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String st = API.hideHTMLTags(fs); 40596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print("deprecated=\"" + st + "\""); 40696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 40796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 40896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print("deprecated=\"deprecated, no comment\""); 40996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 41096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 41196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print("deprecated=\"not deprecated\""); 41296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 41396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 41496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } //addQualifiers() 41596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 41696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 41796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Insert the source code details, if available. 41896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 41996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param ped The given program element. 42096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 42196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void addSourcePosition(ProgramElementDoc ped, int indent) { 42296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!addSrcInfo) 42396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return; 42496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (JDiff.javaVersion.startsWith("1.1") || 42596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project JDiff.javaVersion.startsWith("1.2") || 42696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project JDiff.javaVersion.startsWith("1.3")) { 42796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return; // position() only appeared in J2SE1.4 42896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 42996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project try { 43096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Could cache the method for improved performance 43196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Class c = ProgramElementDoc.class; 43296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Method m = c.getMethod("position", (Class[]) null); 43396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Object sp = m.invoke(ped, (Object[]) null); 43496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (sp != null) { 43596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < indent; i++) outputFile.print(" "); 43696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("src=\"" + sp + "\""); 43796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 43896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch (NoSuchMethodException e2) { 43996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.err.println("Error: method \"position\" not found"); 44096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project e2.printStackTrace(); 44196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch (IllegalAccessException e4) { 44296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.err.println("Error: class not permitted to be instantiated"); 44396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project e4.printStackTrace(); 44496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch (InvocationTargetException e5) { 44596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.err.println("Error: method \"position\" could not be invoked"); 44696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project e5.printStackTrace(); 44796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch (Exception e6) { 44896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.err.println("Error: "); 44996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project e6.printStackTrace(); 45096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 45196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 45296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 45396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 45496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Process the interfaces implemented by the class. 45596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 45696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param ifaces An array of ClassDoc objects 45796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 45896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void processInterfaces(Type[] ifaces) { 45996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING INTERFACES, number=" + ifaces.length); 46096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < ifaces.length; i++) { 46196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String ifaceName = buildEmittableTypeString(ifaces[i]); 46296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING INTERFACE: " + ifaceName); 46396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" <implements name=\"" + ifaceName + "\"/>"); 46496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//for 46596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//processInterfaces() 46696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 46796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 46896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Process the constructors in the class. 46996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 47096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param ct An array of ConstructorDoc objects 47196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 47296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void processConstructors(ConstructorDoc[] ct) { 47396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING CONSTRUCTORS, number=" + ct.length); 47496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < ct.length; i++) { 47596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String ctorName = ct[i].name(); 47696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING CONSTRUCTOR: " + ctorName); 47796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Only save the shown elements 47896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!shownElement(ct[i], memberVisibilityLevel)) 47996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project continue; 48096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" <constructor name=\"" + ctorName + "\""); 48196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 48296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Parameter[] params = ct[i].parameters(); 48396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean first = true; 48496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (params.length != 0) { 48596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" type=\""); 48696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int j = 0; j < params.length; j++) { 48796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!first) 48896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(", "); 48996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project emitType(params[j].type()); 49096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project first = false; 49196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 49296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("\""); 49396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else 49496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(); 49596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addCommonModifiers(ct[i], 6); 49696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(">"); 49796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 49896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Generate the exception elements if any exceptions are thrown 49996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project processExceptions(ct[i].thrownExceptions()); 50096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 50196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addDocumentation(ct[i], 6); 50296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 50396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" </constructor>"); 50496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//for 50596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//processConstructors() 50696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 50796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 50896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Process all exceptions thrown by a constructor or method. 50996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 51096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param cd An array of ClassDoc objects 51196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 51296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void processExceptions(ClassDoc[] cd) { 51396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING EXCEPTIONS, number=" + cd.length); 51496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < cd.length; i++) { 51596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String exceptionName = cd[i].name(); 51696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING EXCEPTION: " + exceptionName); 51796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" <exception name=\"" + exceptionName + "\" type=\""); 51896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project emitType(cd[i]); 51996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("\"/>"); 52096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//for 52196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//processExceptions() 52296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 52396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 52496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Process the methods in the class. 52596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 52696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param md An array of MethodDoc objects 52796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 52896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void processMethods(ClassDoc cd, MethodDoc[] md) { 52996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING " +cd.name()+" METHODS, number = " + md.length); 53096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < md.length; i++) { 53196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String methodName = md[i].name(); 53296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING METHOD: " + methodName); 53396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Skip <init> and <clinit> 53496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (methodName.startsWith("<")) 53596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project continue; 53696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Only save the shown elements 53796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!shownElement(md[i], memberVisibilityLevel)) 53896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project continue; 53996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" <method name=\"" + methodName + "\""); 54096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project com.sun.javadoc.Type retType = md[i].returnType(); 54196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (retType.qualifiedTypeName().compareTo("void") == 0) { 54296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Don't add a return attribute if the return type is void 54396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(); 54496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 54596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" return=\""); 54696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project emitType(retType); 54796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("\""); 54896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 54996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" abstract=\"" + md[i].isAbstract() + "\""); 55096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" native=\"" + md[i].isNative() + "\""); 55196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" synchronized=\"" + md[i].isSynchronized() + "\""); 55296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addCommonModifiers(md[i], 6); 55396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(">"); 55496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Generate the parameter elements, if any 55596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project Parameter[] params = md[i].parameters(); 55696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int j = 0; j < params.length; j++) { 55796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" <param name=\"" + params[j].name() + "\""); 55896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" type=\""); 55996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project emitType(params[j].type()); 56096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("\"/>"); 56196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 56296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 56396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Generate the exception elements if any exceptions are thrown 56496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project processExceptions(md[i].thrownExceptions()); 56596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 56696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addDocumentation(md[i], 6); 56796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 56896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" </method>"); 56996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//for 57096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//processMethods() 57196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 57296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 57396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Process the fields in the class. 57496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 57596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param fd An array of FieldDoc objects 57696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 57796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void processFields(FieldDoc[] fd) { 57896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING FIELDS, number=" + fd.length); 57996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < fd.length; i++) { 58096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String fieldName = fd[i].name(); 58196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) System.out.println("PROCESSING FIELD: " + fieldName); 58296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Only save the shown elements 58396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!shownElement(fd[i], memberVisibilityLevel)) 58496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project continue; 58596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" <field name=\"" + fieldName + "\""); 58696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" type=\""); 58796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project emitType(fd[i].type()); 58896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("\""); 58996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(" transient=\"" + fd[i].isTransient() + "\""); 59096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" volatile=\"" + fd[i].isVolatile() + "\""); 59196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/* JDK 1.4 and later */ 59296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/* 59396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String value = fd[i].constantValueExpression(); 59496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (value != null) 59596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" value=\"" + value + "\""); 59696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project*/ 59796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addCommonModifiers(fd[i], 6); 59896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(">"); 59996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 60096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project addDocumentation(fd[i], 6); 60196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 60296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" </field>"); 60396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 60496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//for 60596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project }//processFields() 60696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 60796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 60896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Emit the type name. Removed any prefixed warnings about ambiguity. 60996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The type maybe an array. 61096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 61196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param type A Type object. 61296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 61396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void emitType(com.sun.javadoc.Type type) { 61496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String name = buildEmittableTypeString(type); 61596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (name == null) 61696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return; 61796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.print(name); 61896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 61996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 62096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 62196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Build the emittable type name. The type may be an array and/or 62296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * a generic type. 62396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 62496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param type A Type object 62596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @return The emittable type name 62696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 62796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private String buildEmittableTypeString(com.sun.javadoc.Type type) { 62896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (type == null) { 62996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return null; 63096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 63196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // type.toString() returns the fully qualified name of the type 63296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // including the dimension and the parameters we just need to 63396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // escape the generic parameters brackets so that the XML 63496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // generated is correct 63596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String name = type.toString().replaceAll("<", "<").replaceAll(">", ">"); 63696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (name.startsWith("<<ambiguous>>")) { 63796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project name = name.substring(13); 63896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 63996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return name; 64096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 64196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 64296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 64396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Emit the XML header. 64496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 64596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void emitXMLHeader() { 64696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"no\"?>"); 64796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("<!-- Generated by the JDiff Javadoc doclet -->"); 64896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("<!-- (" + JDiff.jDiffLocation + ") -->"); 64996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("<!-- on " + new Date() + " -->"); 65096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(); 65196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/* No need for this any longer, since doc block text is in an CDATA element 65296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("<!-- XML Schema is used, but XHTML transitional DTD is needed for nbsp -->"); 65396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("<!-- entity definitions etc.-->"); 65496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("<!DOCTYPE api"); 65596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""); 65696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" \"" + baseURI + "/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"); 65796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project*/ 65896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("<api"); 65996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" xmlns:xsi='" + baseURI + "/2001/XMLSchema-instance'"); 66096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" xsi:noNamespaceSchemaLocation='api.xsd'"); 66196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" name=\"" + apiIdentifier + "\""); 66296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(" jdversion=\"" + JDiff.version + "\">"); 66396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(); 66496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 66596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 66696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 66796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Emit the XML footer. 66896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 66996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void emitXMLFooter() { 67096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(); 67196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("</api>"); 67296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 67396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 67496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 67596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Determine if the program element is shown, according to the given 67696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * level of visibility. 67796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 67896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param ped The given program element. 67996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param visLevel The desired visibility level; "public", "protected", 68096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * "package" or "private". If null, only check for an exclude tag. 68196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @return boolean Set if this element is shown. 68296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 68396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public boolean shownElement(Doc doc, String visLevel) { 68496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // If a doc block contains @exclude or a similar such tag, 68596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // then don't display it. 68696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (doExclude && excludeTag != null && doc != null) { 68796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String rct = doc.getRawCommentText(); 68896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (rct != null && rct.indexOf(excludeTag) != -1) { 68996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return false; 69096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 69196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 69296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (visLevel == null) { 69396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return true; 69496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 69596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project ProgramElementDoc ped = null; 69696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (doc instanceof ProgramElementDoc) { 69796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project ped = (ProgramElementDoc)doc; 69896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 69996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (visLevel.compareTo("private") == 0) 70096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return true; 70196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Show all that is not private 70296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (visLevel.compareTo("package") == 0) 70396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return !ped.isPrivate(); 70496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Show all that is not private or package 70596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (visLevel.compareTo("protected") == 0) 70696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return !(ped.isPrivate() || ped.isPackagePrivate()); 70796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Show all that is not private or package or protected, 70896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // i.e. all that is public 70996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (visLevel.compareTo("public") == 0) 71096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return ped.isPublic(); 71196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return false; 71296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } //shownElement() 71396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 71496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 71596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Strip out non-printing characters, replacing them with a character 71696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * which will not change where the end of the first sentence is found. 71796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * This character is the hash mark, '#'. 71896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 71996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public String stripNonPrintingChars(String s, Doc doc) { 72096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!stripNonPrintables) 72196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return s; 72296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project char[] sa = s.toCharArray(); 72396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < sa.length; i++) { 72496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project char c = sa[i]; 72596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // TODO still have an issue with Unicode: 0xfc in java.lang.String.toUpperCase comments 72696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// if (Character.isDefined(c)) 72796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (Character.isLetterOrDigit(c)) 72896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project continue; 72996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // There must be a better way that is still platform independent! 73096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (c == ' ' || 73196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '.' || 73296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == ',' || 73396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '\r' || 73496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '\t' || 73596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '\n' || 73696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '!' || 73796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '?' || 73896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == ';' || 73996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == ':' || 74096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '[' || 74196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == ']' || 74296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '(' || 74396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == ')' || 74496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '~' || 74596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '@' || 74696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '#' || 74796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '$' || 74896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '%' || 74996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '^' || 75096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '&' || 75196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '*' || 75296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '-' || 75396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '=' || 75496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '+' || 75596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '_' || 75696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '|' || 75796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '\\' || 75896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '/' || 75996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '\'' || 76096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '}' || 76196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '{' || 76296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '"' || 76396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '<' || 76496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '>' || 76596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project c == '`' 76696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project ) 76796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project continue; 76896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/* Doesn't seem to return the expected values? 76996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int val = Character.getNumericValue(c); 77096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// if (s.indexOf("which is also a test for non-printable") != -1) 77196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// System.out.println("** Char " + i + "[" + c + "], val =" + val); //DEBUG 77296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Ranges from http://www.unicode.org/unicode/reports/tr20/ 77396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Should really replace 0x2028 and 0x2029 with <br/> 77496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (val == 0x0 || 77596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project inRange(val, 0x2028, 0x2029) || 77696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project inRange(val, 0x202A, 0x202E) || 77796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project inRange(val, 0x206A, 0x206F) || 77896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project inRange(val, 0xFFF9, 0xFFFC) || 77996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project inRange(val, 0xE0000, 0xE007F)) { 78096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) { 78196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Warning: changed non-printing character " + sa[i] + " in " + doc.name()); 78296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 78396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project sa[i] = '#'; 78496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 78596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project*/ 78696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Replace the non-printable character with a printable character 78796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // which does not change the end of the first sentence 78896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project sa[i] = '#'; 78996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 79096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return new String(sa); 79196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 79296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 79396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Return true if val is in the range [min|max], inclusive. */ 79496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public boolean inRange(int val, int min, int max) { 79596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (val < min) 79696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return false; 79796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (val > max) 79896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return false; 79996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return true; 80096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 80196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 80296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 80396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Add at least the first sentence from a doc block to the API. This is 80496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * used by the report generator if no comment is provided. 80596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Need to make sure that HTML tags are not confused with XML tags. 80696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * This could be done by stuffing the < character to another string 80796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * or by handling HTML in the parser. This second option seems neater. Note that 80896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * XML expects all element tags to have either a closing "/>" or a matching 80996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * end element tag. Due to the difficulties of converting incorrect HTML 81096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * to XHTML, the first option is used. 81196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 81296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void addDocumentation(ProgramElementDoc ped, int indent) { 81396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String rct = ((Doc)ped).getRawCommentText(); 81496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (rct != null) { 81596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project rct = stripNonPrintingChars(rct, (Doc)ped); 81696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project rct = rct.trim(); 81796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (rct.compareTo("") != 0 && 81896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project rct.indexOf(Comments.placeHolderText) == -1 && 81996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project rct.indexOf("InsertOtherCommentsHere") == -1) { 82096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int idx = endOfFirstSentence(rct); 82196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (idx == 0) 82296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return; 82396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < indent; i++) outputFile.print(" "); 82496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("<doc>"); 82596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < indent; i++) outputFile.print(" "); 82696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String firstSentence = null; 82796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (idx == -1) 82896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project firstSentence = rct; 82996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project else 83096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project firstSentence = rct.substring(0, idx+1); 83196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean checkForAts = false; 83296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (checkForAts && firstSentence.indexOf("@") != -1 && 83396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project firstSentence.indexOf("@link") == -1) { 83496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Warning: @ tag seen in comment: " + 83596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project firstSentence); 83696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 83796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String firstSentenceNoTags = API.stuffHTMLTags(firstSentence); 83896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(firstSentenceNoTags); 83996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < indent; i++) outputFile.print(" "); 84096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("</doc>"); 84196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 84296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 84396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 84496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 84596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 84696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Add at least the first sentence from a doc block for a package to the API. This is 84796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * used by the report generator if no comment is provided. 84896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The default source tree may not include the package.html files, so 84996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * this may be unavailable in many cases. 85096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Need to make sure that HTML tags are not confused with XML tags. 85196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * This could be done by stuffing the < character to another string 85296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * or by handling HTML in the parser. This second option is neater. Note that 85396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * XML expects all element tags to have either a closing "/>" or a matching 85496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * end element tag. Due to the difficulties of converting incorrect HTML 85596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * to XHTML, the first option is used. 85696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 85796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void addPkgDocumentation(RootDoc root, PackageDoc pd, int indent) { 85896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String rct = null; 85996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String filename = pd.name(); 86096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project try { 86196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // See if the source path was specified as part of the 86296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // options and prepend it if it was. 86396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String srcLocation = null; 86496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String[][] options = root.options(); 86596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int opt = 0; opt < options.length; opt++) { 86696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if ((options[opt][0]).compareTo("-sourcepath") == 0) { 86796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project srcLocation = options[opt][1]; 86896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project break; 86996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 87096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 87196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project filename = filename.replace('.', JDiff.DIR_SEP.charAt(0)); 87296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (srcLocation != null) { 87396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Make a relative location absolute 87496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (srcLocation.startsWith("..")) { 87596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String curDir = System.getProperty("user.dir"); 87696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project while (srcLocation.startsWith("..")) { 87796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project srcLocation = srcLocation.substring(3); 87896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int idx = curDir.lastIndexOf(JDiff.DIR_SEP); 87996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project curDir = curDir.substring(0, idx+1); 88096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 88196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project srcLocation = curDir + srcLocation; 88296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 88396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project filename = srcLocation + JDiff.DIR_SEP + filename; 88496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 88596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Try both ".htm" and ".html" 88696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project filename += JDiff.DIR_SEP + "package.htm"; 88796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project File f2 = new File(filename); 88896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!f2.exists()) { 88996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project filename += "l"; 89096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 89196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project FileInputStream f = new FileInputStream(filename); 89296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project BufferedReader d = new BufferedReader(new InputStreamReader(f)); 89396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String str = d.readLine(); 89496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Ignore everything except the lines between <body> elements 89596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project boolean inBody = false; 89696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project while(str != null) { 89796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (!inBody) { 89896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (str.toLowerCase().trim().startsWith("<body")) { 89996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project inBody = true; 90096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 90196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project str = d.readLine(); // Get the next line 90296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project continue; // Ignore the line 90396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } else { 90496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (str.toLowerCase().trim().startsWith("</body")) { 90596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project inBody = false; 90696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project continue; // Ignore the line 90796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 90896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 90996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (rct == null) 91096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project rct = str + "\n"; 91196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project else 91296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project rct += str + "\n"; 91396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project str = d.readLine(); 91496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 91596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch(java.io.FileNotFoundException e) { 91696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // If it doesn't exist, that's fine 91796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (trace) 91896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("No package level documentation file at '" + filename + "'"); 91996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } catch(java.io.IOException e) { 92096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.out.println("Error reading file \"" + filename + "\": " + e.getMessage()); 92196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project System.exit(5); 92296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 92396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (rct != null) { 92496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project rct = stripNonPrintingChars(rct, (Doc)pd); 92596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project rct = rct.trim(); 92696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (rct.compareTo("") != 0 && 92796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project rct.indexOf(Comments.placeHolderText) == -1 && 92896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project rct.indexOf("InsertOtherCommentsHere") == -1) { 92996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int idx = endOfFirstSentence(rct); 93096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (idx == 0) 93196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return; 93296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < indent; i++) outputFile.print(" "); 93396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("<doc>"); 93496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < indent; i++) outputFile.print(" "); 93596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String firstSentence = null; 93696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (idx == -1) 93796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project firstSentence = rct; 93896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project else 93996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project firstSentence = rct.substring(0, idx+1); 94096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project String firstSentenceNoTags = API.stuffHTMLTags(firstSentence); 94196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println(firstSentenceNoTags); 94296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project for (int i = 0; i < indent; i++) outputFile.print(" "); 94396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project outputFile.println("</doc>"); 94496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 94596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 94696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 94796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 94896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 94996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Find the index of the end of the first sentence in the given text, 95096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * when writing out to an XML file. 95196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * This is an extended version of the algorithm used by the DocCheck 95296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Javadoc doclet. It checks for @tags too. 95396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 95496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param text The text to be searched. 95596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @return The index of the end of the first sentence. If there is no 95696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * end, return -1. If there is no useful text, return 0. 95796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * If the whole doc block comment is wanted (default), return -1. 95896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 95996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static int endOfFirstSentence(String text) { 96096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return endOfFirstSentence(text, true); 96196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 96296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 96396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 96496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Find the index of the end of the first sentence in the given text. 96596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * This is an extended version of the algorithm used by the DocCheck 96696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Javadoc doclet. It checks for @tags too. 96796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 96896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param text The text to be searched. 96996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param writingToXML Set to true when writing out XML. 97096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @return The index of the end of the first sentence. If there is no 97196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * end, return -1. If there is no useful text, return 0. 97296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * If the whole doc block comment is wanted (default), return -1. 97396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 97496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static int endOfFirstSentence(String text, boolean writingToXML) { 97596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (saveAllDocs && writingToXML) 97696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return -1; 97796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int textLen = text.length(); 97896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (textLen == 0) 97996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return 0; 98096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int index = -1; 98196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Handle some special cases 98296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int fromindex = 0; 98396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int ellipsis = text.indexOf(". . ."); // Handles one instance of this 98496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (ellipsis != -1) 98596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project fromindex = ellipsis + 5; 98696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // If the first non-whitespace character is an @, go beyond it 98796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int i = 0; 98896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project while (i < textLen && text.charAt(i) == ' ') { 98996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project i++; 99096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 99196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (text.charAt(i) == '@' && fromindex < textLen-1) 99296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project fromindex = i + 1; 99396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Use the brute force approach. 99496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("? ", fromindex)); 99596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("?\t", fromindex)); 99696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("?\n", fromindex)); 99796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("?\r", fromindex)); 99896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("?\f", fromindex)); 99996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("! ", fromindex)); 100096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("!\t", fromindex)); 100196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("!\n", fromindex)); 100296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("!\r", fromindex)); 100396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("!\f", fromindex)); 100496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf(". ", fromindex)); 100596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf(".\t", fromindex)); 100696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf(".\n", fromindex)); 100796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf(".\r", fromindex)); 100896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf(".\f", fromindex)); 100996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@param", fromindex)); 101096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@return", fromindex)); 101196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@throw", fromindex)); 101296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@serial", fromindex)); 101396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@exception", fromindex)); 101496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@deprecate", fromindex)); 101596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@author", fromindex)); 101696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@since", fromindex)); 101796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@see", fromindex)); 101896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@version", fromindex)); 101996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (doExclude && excludeTag != null) 102096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf(excludeTag)); 102196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@vtexclude", fromindex)); 102296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("@vtinclude", fromindex)); 102396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("<p>", 2)); // Not at start 102496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("<P>", 2)); // Not at start 102596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("<blockquote", 2)); // Not at start 102696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf("<pre", fromindex)); // May contain anything! 102796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Avoid the char at the start of a tag in some cases 102896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (index != -1 && 102996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project (text.charAt(index) == '@' || text.charAt(index) == '<')) { 103096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (index != 0) 103196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index--; 103296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 103396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 103496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/* Not used for jdiff, since tags are explicitly checked for above. 103596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // Look for a sentence terminated by an HTML tag. 103696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = minIndex(index, text.indexOf(".<", fromindex)); 103796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (index == -1) { 103896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // If period-whitespace etc was not found, check to see if 103996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project // last character is a period, 104096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int endIndex = text.length()-1; 104196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (text.charAt(endIndex) == '.' || 104296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project text.charAt(endIndex) == '?' || 104396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project text.charAt(endIndex) == '!') 104496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project index = endIndex; 104596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 104696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project*/ 104796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return index; 104896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 104996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 105096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 105196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Return the minimum of two indexes if > -1, and return -1 105296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * only if both indexes = -1. 105396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param i an int index 105496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @param j an int index 105596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @return an int equal to the minimum index > -1, or -1 105696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 105796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static int minIndex(int i, int j) { 105896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (i == -1) return j; 105996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (j == -1) return i; 106096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return Math.min(i,j); 106196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 106296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 106396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 106496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The name of the file where the XML representing the API will be 106596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * stored. 106696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 106796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static String outputFileName = null; 106896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 106996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 107096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The identifier of the API being written out in XML, e.g. 107196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * "SuperProduct 1.3". 107296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 107396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static String apiIdentifier = null; 107496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 107596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 107696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The file where the XML representing the API will be stored. 107796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 107896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private static PrintWriter outputFile = null; 107996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 108096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 108196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The name of the directory where the XML representing the API will be 108296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * stored. 108396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 108496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static String outputDirectory = null; 108596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 108696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 108796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Do not display a class with a lower level of visibility than this. 108896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Default is to display all public and protected classes. 108996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 109096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static String classVisibilityLevel = "protected"; 109196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 109296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 109396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Do not display a member with a lower level of visibility than this. 109496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Default is to display all public and protected members 109596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * (constructors, methods, fields). 109696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 109796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static String memberVisibilityLevel = "protected"; 109896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 109996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 110096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * If set, then save the entire contents of a doc block comment in the 110196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * API file. If not set, then just save the first sentence. Default is 110296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * that this is set. 110396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 110496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static boolean saveAllDocs = true; 110596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 110696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 110796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * If set, exclude program elements marked with whatever the exclude tag 110896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * is specified as, e.g. "@exclude". 110996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 111096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static boolean doExclude = false; 111196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 111296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 111396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Exclude program elements marked with this String, e.g. "@exclude". 111496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 111596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static String excludeTag = null; 111696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 111796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 111896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * The base URI for locating necessary DTDs and Schemas. By default, this 111996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * is "http://www.w3.org". A typical value to use local copies of DTD files 112096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * might be "file:///C:/jdiff/lib" 112196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 112296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static String baseURI = "http://www.w3.org"; 112396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 112496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 112596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * If set, then strip out non-printing characters from documentation. 112696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Default is that this is set. 112796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 112896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static boolean stripNonPrintables = true; 112996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 113096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 113196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * If set, then add the information about the source file and line number 113296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * which is available in J2SE1.4. Default is that this is not set. 113396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 113496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static boolean addSrcInfo = false; 113596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 113696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** 113796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * If set, scan classes with no packages. 113896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * If the source is a jar file this may duplicates classes, so 113996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * disable it using the -packagesonly option. Default is that this is 114096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * not set. 114196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 114296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project static boolean packagesOnly = false; 114396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 114496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project /** Set to enable increased logging verbosity for debugging. */ 114596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private static boolean trace = false; 114696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 114796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project} //RootDocToXML 1148