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