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.helpers.DefaultHandler;
1296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
1396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/**
1496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Handle the parsing of an XML file and the generation of a Comments object.
1596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project *
1696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * All HTML written for the comments sections in the report must
1796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * use tags such as <p/> rather than just <p>, since the XML
1896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * parser used requires that or matching end elements.
1996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project *
20e064b57f77a1ccdb9541c5d4f16ef6bbed86eeb7Dirk Dougherty * From https://www.w3.org/TR/2000/REC-xhtml1-20000126:
21e064b57f77a1ccdb9541c5d4f16ef6bbed86eeb7Dirk Dougherty * "Empty elements must either have an end tag or the start tag must end with /<".
2296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project *
2396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * See the file LICENSE.txt for copyright details.
2496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * @author Matthew Doar, mdoar@pobox.com
2596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */
2696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectclass CommentsHandler extends DefaultHandler {
2796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
2896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** The Comments object which is populated from the XML file. */
2996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public Comments comments_ = null;
3096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
3196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** The current SingleComment object being populated. */
3296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private List currSingleComment_ = null; // SingleComment[]
3396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
3496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Set if in text. */
3596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private boolean inText = false;
3696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
3796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** The current text which is being assembled from chunks. */
3896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private String currentText = null;
3996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
4096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** The stack of SingleComments still waiting for comment text. */
4196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private LinkedList tagStack = null;
4296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
4396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Default constructor. */
4496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public CommentsHandler(Comments comments) {
4596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        comments_ = comments;
4696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        tagStack = new LinkedList();
4796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
4896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
4996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void startDocument() {
5096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
5196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
5296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void endDocument() {
5396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (trace)
5496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            comments_.dump();
5596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
5696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
5796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void startElement(java.lang.String uri, java.lang.String localName,
5896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                             java.lang.String qName, Attributes attributes) {
5996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	// The change to JAXP compliance produced this change.
6096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	if (localName.equals(""))
6196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    localName = qName;
6296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (localName.compareTo("comments") == 0) {
6396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            String commentsName = attributes.getValue("name");
6496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            String version = attributes.getValue("jdversion"); // Not used yet
6596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (commentsName == null) {
6696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.out.println("Error: no identifier found in the comments XML file.");
6796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.exit(3);
6896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
6996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            // Check the given names against the names of the APIs
7096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            int idx1 = JDiff.oldFileName.lastIndexOf('.');
7196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            int idx2 = JDiff.newFileName.lastIndexOf('.');
7296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            String filename2 = JDiff.oldFileName.substring(0, idx1) +
7396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                "_to_" + JDiff.newFileName.substring(0, idx2);
7496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (filename2.compareTo(commentsName) != 0) {
7596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.out.println("Warning: API identifier in the comments XML file (" + filename2 + ") differs from the name of the file.");
7696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
7796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else if (localName.compareTo("comment") == 0) {
7896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            currSingleComment_ = new ArrayList(); // SingleComment[];
7996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else if (localName.compareTo("identifier") == 0) {
8096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            // May have multiple identifiers for one comment's text
8196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            String id = attributes.getValue("id");
8296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            SingleComment newComment = new SingleComment(id, null);
8396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            // Store it here until we can add text to it
8496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            currSingleComment_.add(newComment);
8596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else if (localName.compareTo("text") == 0) {
8696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            inText = true;
8796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            currentText = null;
8896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else {
8996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (inText) {
9096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                // Start of an element, probably an HTML element
9196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                addStartTagToText(localName, attributes);
9296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            } else {
9396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.out.println("Error: unknown element type: " + localName);
9496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                System.exit(-1);
9596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            }
9696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
9796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
9896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
9996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void endElement(java.lang.String uri, java.lang.String localName,
10096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                           java.lang.String qName) {
10196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	if (localName.equals(""))
10296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project	    localName = qName;
10396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (localName.compareTo("text") == 0) {
10496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            inText = false;
10596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            addTextToComments();
10696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else if (inText) {
10796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            addEndTagToText(localName);
10896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
10996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
11096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
11196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
11296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Deal with a chunk of text. The text may come in multiple chunks. */
11396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void characters(char[] ch, int start, int length) {
11496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (inText) {
11596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            String chunk = new String(ch, start, length);
11696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (currentText == null)
11796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                currentText = chunk;
11896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            else
11996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                currentText += chunk;
12096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
12196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
12296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
12396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
12496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Trim the current text, check it is a sentence and add it to all
12596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * the comments which are waiting for it.
12696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
12796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void addTextToComments() {
12896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Eliminate any whitespace at each end of the text.
12996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        currentText = currentText.trim();
13096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Check that it is a sentence
13196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (!currentText.endsWith(".") &&
13296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            !currentText.endsWith("?") &&
13396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            !currentText.endsWith("!") &&
13496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            currentText.compareTo(Comments.placeHolderText) != 0) {
13596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            System.out.println("Warning: text of comment does not end in a period: " + currentText);
13696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
13796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Add this comment to all the SingleComments waiting for it
13896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        Iterator iter = currSingleComment_.iterator();
13996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        while (iter.hasNext()) {
14096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            SingleComment currComment = (SingleComment)(iter.next());
14196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            if (currComment.text_ == null)
14296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                currComment.text_ = currentText;
14396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            else
14496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project                currComment.text_ += currentText;
14596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            comments_.addComment(currComment);
14696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
14796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
14896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
14996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
15096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add the start tag to the current comment text.
15196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
15296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void addStartTagToText(String localName, Attributes attributes) {
15396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Need to insert the HTML tag into the current text
15496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String currentHTMLTag = localName;
15596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Save the tag in a stack
15696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        tagStack.add(currentHTMLTag);
15796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String tag = "<" + currentHTMLTag;
15896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Now add all the attributes into the current text
15996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        int len = attributes.getLength();
16096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        for (int i = 0; i < len; i++) {
16196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            String name = attributes.getLocalName(i);
16296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            String value = attributes.getValue(i);
16396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            tag += " " + name + "=\"" + value+ "\"";
16496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
16596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
16696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // End the tag
16796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (Comments.isMinimizedTag(currentHTMLTag)) {
16896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            tag += "/>";
16996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        } else {
17096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            tag += ">";
17196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        }
17296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Now insert the HTML tag into the current text
17396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (currentText == null)
17496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            currentText = tag;
17596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        else
17696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            currentText += tag;
17796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
17896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
17996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /**
18096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     * Add the end tag to the current comment text.
18196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project     */
18296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void addEndTagToText(String localName) {
18396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        // Close the current HTML tag
18496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        String currentHTMLTag = (String)(tagStack.removeLast());
18596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        if (!Comments.isMinimizedTag(currentHTMLTag))
18696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project            currentText += "</" + currentHTMLTag + ">";
18796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
18896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
18996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void warning(SAXParseException e) {
19096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.out.println("Warning (" + e.getLineNumber() + "): parsing XML comments file:" + e);
19196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        e.printStackTrace();
19296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
19396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
19496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void error(SAXParseException e) {
19596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.out.println("Error (" + e.getLineNumber() + "): parsing XML comments file:" + e);
19696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        e.printStackTrace();
19796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.exit(1);
19896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
19996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
20096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    public void fatalError(SAXParseException e) {
20196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.out.println("Fatal Error (" + e.getLineNumber() + "): parsing XML comments file:" + e);
20296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        e.printStackTrace();
20396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project        System.exit(1);
20496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    }
20596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
20696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    /** Set to enable increased logging verbosity for debugging. */
20796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project    private static final boolean trace = false;
20896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
20996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project}
21096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project
211