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("<", "&lt;").replaceAll(">", "&gt;");
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, '&#035;'.
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 &lt; 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 &lt; 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 &#064;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     * &quotSuperProduct 1.3&quot;.
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