196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpackage jdiff;
296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.io.*;
496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.util.*;
596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/* For SAX XML parsing */
796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.Attributes;
896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.SAXException;
996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.SAXParseException;
1096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.XMLReader;
1196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.InputSource;
1296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport org.xml.sax.helpers.*;
1396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
1496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/**
1596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Creates a Comments from an XML file. The Comments object is the internal
1696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * representation of the comments for the changes.
1796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * All methods in this class for populating a Comments object are static.
1896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project *
1996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * See the file LICENSE.txt for copyright details.
2096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @author Matthew Doar, mdoar@pobox.com
2196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */
2296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpublic class Comments {
2396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
2496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
2596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * All the possible comments known about, accessible by the commentID.
2696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
2796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static Hashtable allPossibleComments = new Hashtable();
2896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
2996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** The old Comments object which is populated from the file read in. */
3096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private static Comments oldComments_ = null;
3196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
3296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Default constructor. */
3396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public Comments() {
3496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        commentsList_ = new ArrayList(); // SingleComment[]
3596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
3696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
3796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    // The list of comments elements associated with this objects
3896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public List commentsList_ = null; // SingleComment[]
3996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
4096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
4196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Read the file where the XML for comments about the changes between
4296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * the old API and new API is stored and create a Comments object for
4396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * it. The Comments object may be null if no file exists.
4496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
4596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static Comments readFile(String filename) {
4696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // If validation is desired, write out the appropriate comments.xsd
4796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // file in the same directory as the comments XML file.
4896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (XMLToAPI.validateXML) {
4996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            writeXSD(filename);
5096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
5196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
5296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // If the file does not exist, return null
5396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        File f = new File(filename);
5496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (!f.exists())
5596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            return null;
5696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
5796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // The instance of the Comments object which is populated from the file.
5896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        oldComments_ = new Comments();
5996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        try {
6096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            DefaultHandler handler = new CommentsHandler(oldComments_);
6196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            XMLReader parser = null;
6296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            try {
6396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                String parserName = System.getProperty("org.xml.sax.driver");
6496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                if (parserName == null) {
6596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
6696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                } else {
6796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    // Let the underlying mechanisms try to work out which
6896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    // class to instantiate
6996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                    parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
7096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                }
7196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            } catch (SAXException saxe) {
7296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.out.println("SAXException: " + saxe);
7396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                saxe.printStackTrace();
7496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.exit(1);
7596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
7696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
7796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (XMLToAPI.validateXML) {
7896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                parser.setFeature("http://xml.org/sax/features/namespaces", true);
7996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                parser.setFeature("http://xml.org/sax/features/validation", true);
8096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                parser.setFeature("http://apache.org/xml/features/validation/schema", true);
8196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
8296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            parser.setContentHandler(handler);
8396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            parser.setErrorHandler(handler);
8496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            parser.parse(new InputSource(new FileInputStream(new File(filename))));
8596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } catch(org.xml.sax.SAXNotRecognizedException snre) {
8696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("SAX Parser does not recognize feature: " + snre);
8796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            snre.printStackTrace();
8896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.exit(1);
8996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } catch(org.xml.sax.SAXNotSupportedException snse) {
9096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("SAX Parser feature is not supported: " + snse);
9196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            snse.printStackTrace();
9296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.exit(1);
9396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } catch(org.xml.sax.SAXException saxe) {
9496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("SAX Exception parsing file '" + filename + "' : " + saxe);
9596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            saxe.printStackTrace();
9696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.exit(1);
9796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } catch(java.io.IOException ioe) {
9896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("IOException parsing file '" + filename + "' : " + ioe);
9996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            ioe.printStackTrace();
10096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.exit(1);
10196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
10296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
10396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Collections.sort(oldComments_.commentsList_);
10496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        return oldComments_;
10596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    } //readFile()
10696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
10796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
10896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Write the XML Schema file used for validation.
10996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
11096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void writeXSD(String filename) {
11196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String xsdFileName = filename;
11296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int idx = xsdFileName.lastIndexOf('\\');
11396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int idx2 = xsdFileName.lastIndexOf('/');
11496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (idx == -1 && idx2 == -1) {
11596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFileName = "";
11696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else if (idx == -1 && idx2 != -1) {
11796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFileName = xsdFileName.substring(0, idx2+1);
11896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else if (idx != -1  && idx2 == -1) {
11996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFileName = xsdFileName.substring(0, idx+1);
12096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else if (idx != -1  && idx2 != -1) {
12196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            int max = idx2 > idx ? idx2 : idx;
12296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFileName = xsdFileName.substring(0, max+1);
12396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
12496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        xsdFileName += "comments.xsd";
12596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        try {
12696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            FileOutputStream fos = new FileOutputStream(xsdFileName);
12796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            PrintWriter xsdFile = new PrintWriter(fos);
12896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            // The contents of the comments.xsd file
12996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"no\"?>");
13096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">");
13196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println();
13296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("<xsd:annotation>");
13396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("  <xsd:documentation>");
13496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("  Schema for JDiff comments.");
13596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("  </xsd:documentation>");
13696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("</xsd:annotation>");
13796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println();
13896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("<xsd:element name=\"comments\" type=\"commentsType\"/>");
13996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println();
14096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("<xsd:complexType name=\"commentsType\">");
14196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("  <xsd:sequence>");
14296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("    <xsd:element name=\"comment\" type=\"commentType\" minOccurs='0' maxOccurs='unbounded'/>");
14396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("  </xsd:sequence>");
14496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("  <xsd:attribute name=\"name\" type=\"xsd:string\"/>");
14596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("  <xsd:attribute name=\"jdversion\" type=\"xsd:string\"/>");
14696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("</xsd:complexType>");
14796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println();
14896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("<xsd:complexType name=\"commentType\">");
14996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("  <xsd:sequence>");
15096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("    <xsd:element name=\"identifier\" type=\"identifierType\" minOccurs='1' maxOccurs='unbounded'/>");
15196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("    <xsd:element name=\"text\" type=\"xsd:string\" minOccurs='1' maxOccurs='1'/>");
15296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("  </xsd:sequence>");
15396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("</xsd:complexType>");
15496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println();
15596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("<xsd:complexType name=\"identifierType\">");
15696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("  <xsd:attribute name=\"id\" type=\"xsd:string\"/>");
15796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("</xsd:complexType>");
15896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println();
15996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.println("</xsd:schema>");
16096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            xsdFile.close();
16196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } catch(IOException e) {
16296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("IO Error while attempting to create " + xsdFileName);
16396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Error: " +  e.getMessage());
16496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.exit(1);
16596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
16696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
16796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
16896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project//
16996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// Methods to add data to a Comments object. Called by the XML parser and the
17096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// report generator.
17196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project//
17296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
17396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
17496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add the SingleComment object to the list of comments kept by this
17596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * object.
17696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
17796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void addComment(SingleComment comment) {
17896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        commentsList_.add(comment);
17996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
18096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
18196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project//
18296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// Methods to get data from a Comments object. Called by the report generator
18396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project//
18496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
18596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
18696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * The text placed into XML comments file where there is no comment yet.
18796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * It never appears in reports.
18896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
18996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static final String placeHolderText = "InsertCommentsHere";
19096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
19196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
19296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Return the comment associated with the given id in the Comment object.
19396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * If there is no such comment, return the placeHolderText.
19496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
19596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static String getComment(Comments comments, String id) {
19696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (comments == null)
19796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            return placeHolderText;
19896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        SingleComment key = new SingleComment(id, null);
19996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int idx = Collections.binarySearch(comments.commentsList_, key);
20096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (idx < 0) {
20196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            return placeHolderText;
20296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else {
20396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            int startIdx = comments.commentsList_.indexOf(key);
20496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            int endIdx = comments.commentsList_.indexOf(key);
20596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            int numIdx = endIdx - startIdx + 1;
20696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (numIdx != 1) {
20796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.out.println("Warning: " + numIdx + " identical ids in the existing comments file. Using the first instance.");
20896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
20996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            SingleComment singleComment = (SingleComment)(comments.commentsList_.get(idx));
21096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            // Convert @link tags to links
21196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            return singleComment.text_;
21296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
21396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
21496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
21596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
21696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Convert @link tags to HTML links.
21796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
21896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static String convertAtLinks(String text, String currentElement,
21996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                                        PackageAPI pkg, ClassAPI cls) {
22096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (text == null)
22196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            return null;
22296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
22396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        StringBuffer result = new StringBuffer();
22496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
22596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int state = -1;
22696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
22796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        final int NORMAL_TEXT = -1;
22896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        final int IN_LINK = 1;
22996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        final int IN_LINK_IDENTIFIER = 2;
23096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        final int IN_LINK_IDENTIFIER_REFERENCE = 3;
23196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        final int IN_LINK_IDENTIFIER_REFERENCE_PARAMS = 6;
23296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        final int IN_LINK_LINKTEXT = 4;
23396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        final int END_OF_LINK = 5;
23496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
23596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        StringBuffer identifier = null;
23696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        StringBuffer identifierReference = null;
23796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        StringBuffer linkText = null;
23896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
23996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Figure out relative reference if required.
24096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String ref = "";
24196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (currentElement.compareTo("class") == 0 ||
24296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            currentElement.compareTo("interface") == 0) {
24396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    ref = pkg.name_ + "." + cls.name_ + ".";
24496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else if (currentElement.compareTo("package") == 0) {
24596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    ref = pkg.name_ + ".";
24696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
24796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        ref = ref.replace('.', '/');
24896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
24996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        for (int i=0; i < text.length(); i++) {
25096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    char c = text.charAt( i);
25196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    char nextChar = i < text.length()-1 ? text.charAt( i+1) : (char)-1;
25296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    int remainingChars = text.length() - i;
25396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
25496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    switch (state) {
25596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    case NORMAL_TEXT:
25696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (c == '{' && remainingChars >= 5) {
25796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    if ("{@link".equals(text.substring(i, i + 6))) {
25896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			state = IN_LINK;
25996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			identifier = null;
26096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			identifierReference = null;
26196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			linkText = null;
26296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			i += 5;
26396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			continue;
26496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    }
26596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
26696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		result.append( c);
26796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		break;
26896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    case IN_LINK:
26996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (Character.isWhitespace(nextChar)) continue;
27096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (nextChar == '}') {
27196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    // End of the link
27296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    state = END_OF_LINK;
27396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		} else if (!Character.isWhitespace(nextChar)) {
27496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    state = IN_LINK_IDENTIFIER;
27596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
27696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		break;
27796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            case IN_LINK_IDENTIFIER:
27896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (identifier == null) {
27996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    identifier = new StringBuffer();
28096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
28196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
28296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (c == '#') {
28396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    // We have a reference.
28496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    state = IN_LINK_IDENTIFIER_REFERENCE;
28596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    // Don't append #
28696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    continue;
28796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		} else if (Character.isWhitespace(c)) {
28896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    // We hit some whitespace: the next character is the beginning
28996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    // of the link text.
29096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    state = IN_LINK_LINKTEXT;
29196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    continue;
29296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
29396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		identifier.append(c);
29496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		// Check for a } that ends the link.
29596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (nextChar == '}') {
29696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    state = END_OF_LINK;
29796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
29896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		break;
29996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            case IN_LINK_IDENTIFIER_REFERENCE:
30096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (identifierReference == null) {
30196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    identifierReference = new StringBuffer();
30296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
30396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (Character.isWhitespace(c)) {
30496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    state = IN_LINK_LINKTEXT;
30596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    continue;
30696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
30796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		identifierReference.append(c);
30896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
30996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (c == '(') {
31096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    state = IN_LINK_IDENTIFIER_REFERENCE_PARAMS;
31196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
31296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
31396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (nextChar == '}') {
31496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    state = END_OF_LINK;
31596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
31696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		break;
31796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            case IN_LINK_IDENTIFIER_REFERENCE_PARAMS:
31896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		// We're inside the parameters of a reference. Spaces are allowed.
31996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (c == ')') {
32096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    state = IN_LINK_IDENTIFIER_REFERENCE;
32196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
32296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		identifierReference.append(c);
32396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (nextChar == '}') {
32496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    state = END_OF_LINK;
32596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
32696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		break;
32796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            case IN_LINK_LINKTEXT:
32896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (linkText == null) linkText = new StringBuffer();
32996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
33096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		linkText.append(c);
33196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
33296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (nextChar == '}') {
33396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    state = END_OF_LINK;
33496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
33596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		break;
33696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            case END_OF_LINK:
33796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		if (identifier != null) {
33896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    result.append("<A HREF=\"");
33996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    result.append(HTMLReportGenerator.newDocPrefix);
34096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    result.append(ref);
34196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    result.append(identifier.toString().replace('.', '/'));
34296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    result.append(".html");
34396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    if (identifierReference != null) {
34496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			result.append("#");
34596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			result.append(identifierReference);
34696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    }
34796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    result.append("\">");   // target=_top?
34896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
34996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    result.append("<TT>");
35096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    if (linkText != null) {
35196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			result.append(linkText);
35296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    } else {
35396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			result.append(identifier);
35496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			if (identifierReference != null) {
35596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			    result.append(".");
35696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			    result.append(identifierReference);
35796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project			}
35896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    }
35996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    result.append("</TT>");
36096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		    result.append("</A>");
36196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		}
36296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		state = NORMAL_TEXT;
36396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project		break;
36496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    }
36596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
36696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        return result.toString();
36796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
36896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
36996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project//
37096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project// Methods to write a Comments object out to a file.
37196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project//
37296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
37396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
37496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Write the XML representation of comments to a file.
37596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
37696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param outputFileName The name of the comments file.
37796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param oldComments The old comments on the changed APIs.
37896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @param newComments The new comments on the changed APIs.
37996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * @return true if no problems encountered
38096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
38196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static boolean writeFile(String outputFileName,
38296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                                    Comments newComments) {
38396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        try {
38496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            FileOutputStream fos = new FileOutputStream(outputFileName);
38596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            outputFile = new PrintWriter(fos);
38696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            newComments.emitXMLHeader(outputFileName);
38796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            newComments.emitComments();
38896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            newComments.emitXMLFooter();
38996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            outputFile.close();
39096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } catch(IOException e) {
39196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("IO Error while attempting to create " + outputFileName);
39296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Error: "+ e.getMessage());
39396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.exit(1);
39496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
39596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        return true;
39696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
39796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
39896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
39996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Write the Comments object out in XML.
40096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
40196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void emitComments() {
40296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Iterator iter = commentsList_.iterator();
40396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
40496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            SingleComment currComment = (SingleComment)(iter.next());
40596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (!currComment.isUsed_)
40696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                outputFile.println("<!-- This comment is no longer used ");
40796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            outputFile.println("<comment>");
40896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            outputFile.println("  <identifier id=\"" + currComment.id_ + "\"/>");
40996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            outputFile.println("  <text>");
41096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            outputFile.println("    " + currComment.text_);
41196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            outputFile.println("  </text>");
41296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            outputFile.println("</comment>");
41396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (!currComment.isUsed_)
41496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                outputFile.println("-->");
41596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
41696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
41796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
41896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
41996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Dump the contents of a Comments object out for inspection.
42096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
42196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void dump() {
42296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Iterator iter = commentsList_.iterator();
42396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int i = 0;
42496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
42596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            i++;
42696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            SingleComment currComment = (SingleComment)(iter.next());
42796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Comment " + i);
42896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("id = " + currComment.id_);
42996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("text = \"" + currComment.text_ + "\"");
43096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("isUsed = " + currComment.isUsed_);
43196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
43296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
43396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
43496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
43596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Emit messages about which comments are now unused and which are new.
43696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
43796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static void noteDifferences(Comments oldComments, Comments newComments) {
43896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (oldComments == null) {
43996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Note: all the comments have been newly generated");
44096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            return;
44196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
44296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
44396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // See which comment ids are no longer used and add those entries to
44496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // the new comments, marking them as unused.
44596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Iterator iter = oldComments.commentsList_.iterator();
44696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
44796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            SingleComment oldComment = (SingleComment)(iter.next());
44896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            int idx = Collections.binarySearch(newComments.commentsList_, oldComment);
44996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (idx < 0) {
45096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.out.println("Warning: comment \"" + oldComment.id_ + "\" is no longer used.");
45196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                oldComment.isUsed_ = false;
45296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                newComments.commentsList_.add(oldComment);
45396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
45496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
45596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
45696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
45796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
45896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
45996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Emit the XML header.
46096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
46196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void emitXMLHeader(String filename) {
46296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"no\"?>");
46396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("<comments");
46496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("  xmlns:xsi='" + RootDocToXML.baseURI + "/2001/XMLSchema-instance'");
46596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("  xsi:noNamespaceSchemaLocation='comments.xsd'");
46696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Extract the identifier from the filename by removing the suffix
46796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int idx = filename.lastIndexOf('.');
46896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String apiIdentifier = filename.substring(0, idx);
46996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Also remove the output directory and directory separator if present
47096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (HTMLReportGenerator.commentsDir != null)
47196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    apiIdentifier = apiIdentifier.substring(HTMLReportGenerator.commentsDir.length()+1);
47296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        else if (HTMLReportGenerator.outputDir != null)
47396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            apiIdentifier = apiIdentifier.substring(HTMLReportGenerator.outputDir.length()+1);
47496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Also remove "user_comments_for_"
47596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        apiIdentifier = apiIdentifier.substring(18);
47696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("  name=\"" + apiIdentifier + "\"");
47796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("  jdversion=\"" + JDiff.version + "\">");
47896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println();
47996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("<!-- Use this file to enter an API change description. For example, when you remove a class, ");
48096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     you can enter a comment for that class that points developers to the replacement class. ");
48196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     You can also provide a change summary for modified API, to give an overview of the changes ");
48296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     why they were made, workarounds, etc.  -->");
48396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println();
48496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("<!-- When the API diffs report is generated, the comments in this file get added to the tables of ");
48596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     removed, added, and modified packages, classes, methods, and fields. This file does not ship ");
48696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     with the final report. -->");
48796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println();
48896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("<!-- The id attribute in an identifier element identifies the change as noted in the report. ");
48996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     An id has the form package[.class[.[ctor|method|field].signature]], where [] indicates optional ");
49096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     text. A comment element can have multiple identifier elements, which will will cause the same ");
49196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     text to appear at each place in the report, but will be converted to separate comments when the ");
49296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     comments file is used. -->");
49396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println();
49496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("<!-- HTML tags in the text field will appear in the report. You also need to close p HTML elements, ");
49596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     used for paragraphs - see the top-level documentation. -->");
49696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println();
49796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("<!-- You can include standard javadoc links in your change descriptions. You can use the @first command  ");
49896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     to cause jdiff to include the first line of the API documentation. You also need to close p HTML ");
49996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("     elements, used for paragraphs - see the top-level documentation. -->");
50096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println();
50196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
50296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
50396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
50496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Emit the XML footer.
50596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
50696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void emitXMLFooter() {
50796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println();
50896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        outputFile.println("</comments>");
50996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
51096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
51196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private static List oldAPIList = null;
51296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private static List newAPIList = null;
51396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
51496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
51596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Return true if the given HTML tag has no separate </tag> end element.
51696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
51796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * If you want to be able to use sloppy HTML in your comments, then you can
51896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * add the element, e.g. li back into the condition here. However, if you
51996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * then become more careful and do provide the closing tag, the output is
52096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * generally just the closing tag, which is incorrect.
52196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     *
52296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * tag.equalsIgnoreCase("tr") || // Is sometimes minimized
52396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * tag.equalsIgnoreCase("th") || // Is sometimes minimized
52496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * tag.equalsIgnoreCase("td") || // Is sometimes minimized
52596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * tag.equalsIgnoreCase("dt") || // Is sometimes minimized
52696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * tag.equalsIgnoreCase("dd") || // Is sometimes minimized
52796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * tag.equalsIgnoreCase("img") || // Is sometimes minimized
52896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * tag.equalsIgnoreCase("code") || // Is sometimes minimized (error)
52996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * tag.equalsIgnoreCase("font") || // Is sometimes minimized (error)
53096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * tag.equalsIgnoreCase("ul") || // Is sometimes minimized
53196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * tag.equalsIgnoreCase("ol") || // Is sometimes minimized
53296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * tag.equalsIgnoreCase("li") // Is sometimes minimized
53396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
53496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public static boolean isMinimizedTag(String tag) {
53596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (tag.equalsIgnoreCase("p") ||
53696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            tag.equalsIgnoreCase("br") ||
53796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            tag.equalsIgnoreCase("hr")
53896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            ) {
53996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            return true;
54096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	}
54196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        return false;
54296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
54396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
54496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
54596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * The file where the XML representing the new Comments object is stored.
54696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
54796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private static PrintWriter outputFile = null;
54896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
54996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project}
55096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
55196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
552