langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/LayoutParser.java
changeset 40587 1c355ea550ed
parent 35426 374342e56a56
child 45417 f7479ee8de69
--- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/LayoutParser.java	Wed Jul 05 22:07:34 2017 +0200
+++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/LayoutParser.java	Mon Aug 22 16:32:40 2016 -0700
@@ -31,7 +31,8 @@
 import javax.xml.parsers.*;
 
 import jdk.javadoc.internal.doclets.toolkit.Configuration;
-import jdk.javadoc.internal.doclets.toolkit.util.DocletAbortException;
+import jdk.javadoc.internal.doclets.toolkit.util.DocFileIOException;
+import jdk.javadoc.internal.doclets.toolkit.util.SimpleDocletException;
 import org.xml.sax.*;
 import org.xml.sax.helpers.DefaultHandler;
 
@@ -53,7 +54,7 @@
     /**
      * The map of XML elements that have been parsed.
      */
-    private Map<String,XMLNode> xmlElementsMap;
+    private final Map<String,XMLNode> xmlElementsMap;
     private XMLNode currentNode;
     private final Configuration configuration;
     private String currentRoot;
@@ -77,33 +78,38 @@
     /**
      * Parse the XML specifying the layout of the documentation.
      *
+     * @param root the name of the desired node
      * @return the list of XML elements parsed.
+     * @throws DocFileIOException if there is a problem reading a user-supplied build file
+     * @throws SimpleDocletException if there is a problem reading the system build file
      */
-    public XMLNode parseXML(String root) {
-        if (xmlElementsMap.containsKey(root)) {
-            return xmlElementsMap.get(root);
+    public XMLNode parseXML(String root) throws DocFileIOException, SimpleDocletException {
+        if (!xmlElementsMap.containsKey(root)) {
+            try {
+                currentRoot = root;
+                isParsing = false;
+                SAXParserFactory factory = SAXParserFactory.newInstance();
+                SAXParser saxParser = factory.newSAXParser();
+                InputStream in = configuration.getBuilderXML();
+                saxParser.parse(in, this);
+            } catch (IOException | ParserConfigurationException | SAXException e) {
+                String message = (configuration.builderXMLPath == null)
+                        ? configuration.getResources().getText("doclet.exception.read.resource",
+                                Configuration.DEFAULT_BUILDER_XML, e)
+                        : configuration.getResources().getText("doclet.exception.read.file",
+                                configuration.builderXMLPath, e);
+                throw new SimpleDocletException(message, e);
+            }
         }
-        try {
-            currentRoot = root;
-            isParsing = false;
-            SAXParserFactory factory = SAXParserFactory.newInstance();
-            SAXParser saxParser = factory.newSAXParser();
-            InputStream in = configuration.getBuilderXML();
-            saxParser.parse(in, this);
-            return xmlElementsMap.get(root);
-        } catch (Throwable t) {
-            t.printStackTrace();
-            throw new DocletAbortException(t);
-        }
+        return xmlElementsMap.get(root);
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public void startElement(String namespaceURI, String sName, String qName,
-        Attributes attrs)
-    throws SAXException {
+    public void startElement(String namespaceURI, String sName, String qName, Attributes attrs)
+            throws SAXException {
         if (isParsing || qName.equals(currentRoot)) {
             isParsing = true;
             currentNode = new XMLNode(currentNode, qName);