8000666: javadoc should write directly to Writer instead of composing strings
authorjjg
Mon, 15 Oct 2012 17:07:55 -0700
changeset 14265 4e8e488eeae0
parent 14264 1aca6b2e90a0
child 14266 69453558960d
8000666: javadoc should write directly to Writer instead of composing strings Reviewed-by: bpatel
langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java
langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java
langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java	Mon Oct 15 17:07:55 2012 -0700
@@ -25,6 +25,8 @@
 
 package com.sun.tools.doclets.formats.html;
 
+import java.io.IOException;
+
 import com.sun.javadoc.*;
 import com.sun.tools.doclets.formats.html.markup.*;
 import com.sun.tools.doclets.internal.toolkit.*;
@@ -193,7 +195,7 @@
     /**
      * {@inheritDoc}
      */
-    public void printDocument(Content contentTree) {
+    public void printDocument(Content contentTree) throws IOException {
         printHtmlDocument(configuration.metakeywords.getMetaKeywords(annotationType),
                 true, contentTree);
     }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java	Mon Oct 15 17:07:55 2012 -0700
@@ -25,6 +25,7 @@
 
 package com.sun.tools.doclets.formats.html;
 
+import java.io.IOException;
 import java.util.*;
 
 import com.sun.javadoc.*;
@@ -202,7 +203,7 @@
     /**
      * {@inheritDoc}
      */
-    public void printDocument(Content contentTree) {
+    public void printDocument(Content contentTree) throws IOException {
         printHtmlDocument(configuration.metakeywords.getMetaKeywords(classDoc),
                 true, contentTree);
     }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java	Mon Oct 15 17:07:55 2012 -0700
@@ -303,7 +303,7 @@
     /**
      * {@inheritDoc}
      */
-    public void printDocument(Content contentTree) {
+    public void printDocument(Content contentTree) throws IOException {
         printHtmlDocument(null, true, contentTree);
     }
 }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java	Mon Oct 15 17:07:55 2012 -0700
@@ -95,7 +95,7 @@
      * Generate the contants in the "index.html" file. Print the frame details
      * as well as warning if browser is not supporting the Html frames.
      */
-    protected void generateFrameFile() {
+    protected void generateFrameFile() throws IOException {
         Content frameset = getFrameDetails();
         if (configuration.windowtitle.length() > 0) {
             printFramesetDocument(configuration.windowtitle, configuration.notimestamp,
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java	Mon Oct 15 17:07:55 2012 -0700
@@ -79,7 +79,7 @@
     /**
      * Generate the help file contents.
      */
-    protected void generateHelpFile() {
+    protected void generateHelpFile() throws IOException {
         String title = configuration.getText("doclet.Window_Help_title");
         Content body = getBody(true, getWindowTitle(title));
         addTop(body);
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java	Mon Oct 15 17:07:55 2012 -0700
@@ -361,7 +361,7 @@
      * @param body the body htmltree to be included in the document
      */
     public void printHtmlDocument(String[] metakeywords, boolean includeScript,
-            Content body) {
+            Content body) throws IOException {
         Content htmlDocType = DocType.Transitional();
         Content htmlComment = new Comment(configuration.getText("doclet.New_Page"));
         Content head = new HtmlTree(HtmlTag.HEAD);
@@ -391,7 +391,7 @@
                 head, body);
         Content htmlDocument = new HtmlDocument(htmlDocType,
                 htmlComment, htmlTree);
-        print(htmlDocument.toString());
+        htmlDocument.write(this, true);
     }
 
     /**
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java	Mon Oct 15 17:07:55 2012 -0700
@@ -254,7 +254,7 @@
     /**
      * {@inheritDoc}
      */
-    public void printDocument(Content contentTree) {
+    public void printDocument(Content contentTree) throws IOException {
         printHtmlDocument(configuration.metakeywords.getMetaKeywords(packageDoc),
                 true, contentTree);
     }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java	Mon Oct 15 17:07:55 2012 -0700
@@ -42,7 +42,7 @@
  * @author Atul M Dambalkar
  */
 public class SerializedFormWriterImpl extends SubWriterHolderWriter
-    implements com.sun.tools.doclets.internal.toolkit.SerializedFormWriter {
+    implements SerializedFormWriter {
 
     private static final String FILE_NAME = "serialized-form.html";
 
@@ -214,7 +214,7 @@
     /**
      * {@inheritDoc}
      */
-    public void printDocument(Content serializedTree) {
+    public void printDocument(Content serializedTree) throws IOException {
         printHtmlDocument(null, true, serializedTree);
     }
 
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java	Mon Oct 15 17:07:55 2012 -0700
@@ -25,6 +25,9 @@
 
 package com.sun.tools.doclets.formats.html.markup;
 
+import java.io.IOException;
+import java.io.Writer;
+
 import com.sun.tools.doclets.internal.toolkit.Content;
 import com.sun.tools.doclets.internal.toolkit.util.*;
 
@@ -38,7 +41,7 @@
  *
  * @author Bhavesh Patel
  */
-public class Comment extends Content{
+public class Comment extends Content {
 
     private String commentText;
 
@@ -85,11 +88,13 @@
     /**
      * {@inheritDoc}
      */
-    public void write(StringBuilder contentBuilder) {
-        if (!endsWithNewLine(contentBuilder))
-            contentBuilder.append(DocletConstants.NL);
-        contentBuilder.append("<!-- ");
-        contentBuilder.append(commentText);
-        contentBuilder.append(" -->" + DocletConstants.NL);
+    @Override
+    public boolean write(Writer out, boolean atNewline) throws IOException {
+        if (!atNewline)
+            out.write(DocletConstants.NL);
+        out.write("<!-- ");
+        out.write(commentText);
+        out.write(" -->" + DocletConstants.NL);
+        return true;
     }
 }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java	Mon Oct 15 17:07:55 2012 -0700
@@ -25,6 +25,9 @@
 
 package com.sun.tools.doclets.formats.html.markup;
 
+import java.io.IOException;
+import java.io.Writer;
+
 import com.sun.tools.doclets.internal.toolkit.Content;
 import com.sun.tools.doclets.internal.toolkit.util.*;
 
@@ -112,7 +115,9 @@
     /**
      * {@inheritDoc}
      */
-    public void write(StringBuilder contentBuilder) {
-        contentBuilder.append(docType);
+    @Override
+    public boolean write(Writer out, boolean atNewline) throws IOException {
+        out.write(docType);
+        return true; // guaranteed by constructor
     }
 }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java	Mon Oct 15 17:07:55 2012 -0700
@@ -325,7 +325,7 @@
      * @param frameset the frameset to be added to the HTML document
      */
     public void printFramesetDocument(String title, boolean noTimeStamp,
-            Content frameset) {
+            Content frameset) throws IOException {
         Content htmlDocType = DocType.Frameset();
         Content htmlComment = new Comment(configuration.getText("doclet.New_Page"));
         Content head = new HtmlTree(HtmlTag.HEAD);
@@ -345,7 +345,7 @@
                 head, frameset);
         Content htmlDocument = new HtmlDocument(htmlDocType,
                 htmlComment, htmlTree);
-        print(htmlDocument.toString());
+        htmlDocument.write(this, true);
     }
 
     /**
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java	Mon Oct 15 17:07:55 2012 -0700
@@ -25,7 +25,10 @@
 
 package com.sun.tools.doclets.formats.html.markup;
 
+import java.io.IOException;
+import java.io.Writer;
 import java.util.*;
+
 import com.sun.tools.doclets.internal.toolkit.Content;
 import com.sun.tools.doclets.internal.toolkit.util.*;
 
@@ -74,7 +77,7 @@
      *
      * @param htmlContent html content to be added
      */
-    public void addContent(Content htmlContent) {
+    public final void addContent(Content htmlContent) {
         if (htmlContent.isValid())
             docContent.add(htmlContent);
     }
@@ -101,8 +104,9 @@
     /**
      * {@inheritDoc}
      */
-    public void write(StringBuilder contentBuilder) {
+    public boolean write(Writer out,  boolean atNewline) throws IOException {
         for (Content c : docContent)
-            c.write(contentBuilder);
+            atNewline = c.write(out, atNewline);
+        return atNewline;
     }
 }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java	Mon Oct 15 17:07:55 2012 -0700
@@ -25,7 +25,10 @@
 
 package com.sun.tools.doclets.formats.html.markup;
 
+import java.io.IOException;
+import java.io.Writer;
 import java.util.*;
+
 import com.sun.tools.doclets.internal.toolkit.Content;
 import com.sun.tools.doclets.internal.toolkit.util.*;
 
@@ -756,35 +759,41 @@
     /**
      * {@inheritDoc}
      */
-    public void write(StringBuilder contentBuilder) {
-        if (!isInline() && !endsWithNewLine(contentBuilder))
-            contentBuilder.append(DocletConstants.NL);
+    @Override
+    public boolean write(Writer out, boolean atNewline) throws IOException {
+        if (!isInline() && !atNewline)
+            out.write(DocletConstants.NL);
         String tagString = htmlTag.toString();
-        contentBuilder.append("<");
-        contentBuilder.append(tagString);
+        out.write("<");
+        out.write(tagString);
         Iterator<HtmlAttr> iterator = attrs.keySet().iterator();
         HtmlAttr key;
         String value = "";
         while (iterator.hasNext()) {
             key = iterator.next();
             value = attrs.get(key);
-            contentBuilder.append(" ");
-            contentBuilder.append(key.toString());
+            out.write(" ");
+            out.write(key.toString());
             if (!value.isEmpty()) {
-                contentBuilder.append("=\"");
-                contentBuilder.append(value);
-                contentBuilder.append("\"");
+                out.write("=\"");
+                out.write(value);
+                out.write("\"");
             }
         }
-        contentBuilder.append(">");
+        out.write(">");
+        boolean nl = false;
         for (Content c : content)
-            c.write(contentBuilder);
+            nl = c.write(out, nl);
         if (htmlTag.endTagRequired()) {
-            contentBuilder.append("</");
-            contentBuilder.append(tagString);
-            contentBuilder.append(">");
+            out.write("</");
+            out.write(tagString);
+            out.write(">");
         }
-        if (!isInline())
-            contentBuilder.append(DocletConstants.NL);
+        if (!isInline()) {
+            out.write(DocletConstants.NL);
+            return true;
+        } else {
+            return false;
+        }
     }
 }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java	Mon Oct 15 17:07:55 2012 -0700
@@ -266,7 +266,7 @@
     }
 
     /**
-     * Print the script code to be embeded before the  &lt;/HEAD&gt; tag.
+     * Print the script code to be embedded before the  &lt;/HEAD&gt; tag.
      */
     protected void printWinTitleScript(String winTitle){
         if(winTitle != null && winTitle.length() > 0) {
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java	Mon Oct 15 17:07:55 2012 -0700
@@ -25,6 +25,9 @@
 
 package com.sun.tools.doclets.formats.html.markup;
 
+import java.io.IOException;
+import java.io.Writer;
+
 import com.sun.tools.doclets.internal.toolkit.Content;
 import com.sun.tools.doclets.internal.toolkit.util.*;
 
@@ -87,7 +90,16 @@
     /**
      * {@inheritDoc}
      */
-    public void write(StringBuilder contentBuilder) {
-        contentBuilder.append(rawHtmlContent);
+    public String toString() {
+        return rawHtmlContent;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean write(Writer out, boolean atNewline) throws IOException {
+        out.write(rawHtmlContent);
+        return rawHtmlContent.endsWith(DocletConstants.NL);
     }
 }
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java	Mon Oct 15 17:07:55 2012 -0700
@@ -25,6 +25,9 @@
 
 package com.sun.tools.doclets.formats.html.markup;
 
+import java.io.IOException;
+import java.io.Writer;
+
 import com.sun.tools.doclets.internal.toolkit.Content;
 import com.sun.tools.doclets.internal.toolkit.util.*;
 
@@ -98,7 +101,10 @@
     /**
      * {@inheritDoc}
      */
-    public void write(StringBuilder contentBuilder) {
-        contentBuilder.append(stringContent);
+    @Override
+    public boolean write(Writer out, boolean atNewline) throws IOException {
+        String s = stringContent.toString();
+        out.write(s);
+        return s.endsWith(DocletConstants.NL);
     }
 }
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java	Mon Oct 15 17:07:55 2012 -0700
@@ -153,7 +153,7 @@
      *
      * @param contentTree content tree that will be printed as a document
      */
-    public void printDocument(Content contentTree);
+    public void printDocument(Content contentTree) throws IOException ;
 
     /**
      * Close the writer.
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java	Mon Oct 15 17:07:55 2012 -0700
@@ -180,7 +180,7 @@
      *
      * @param contentTree content tree that will be printed as a document
      */
-    public void printDocument(Content contentTree);
+    public void printDocument(Content contentTree) throws IOException;
 
     /**
      * Close the writer.
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java	Mon Oct 15 17:07:55 2012 -0700
@@ -139,6 +139,6 @@
      *
      * @param contentTree content tree which should be printed
      */
-    public abstract void printDocument(Content contentTree);
+    public abstract void printDocument(Content contentTree) throws IOException;
 
 }
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java	Mon Oct 15 17:07:55 2012 -0700
@@ -25,6 +25,10 @@
 
 package com.sun.tools.doclets.internal.toolkit;
 
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+
 import com.sun.tools.doclets.internal.toolkit.util.*;
 
 /**
@@ -44,10 +48,16 @@
      *
      * @return string representation of the content
      */
+    @Override
     public String toString() {
-        StringBuilder contentBuilder = new StringBuilder();
-        write(contentBuilder);
-        return contentBuilder.toString();
+        StringWriter out = new StringWriter();
+        try {
+            write(out, true);
+        } catch (IOException e) {
+            // cannot happen from StringWriter
+            throw new DocletAbortException();
+        }
+        return out.toString();
     }
 
     /**
@@ -65,10 +75,10 @@
     public abstract void addContent(String stringContent);
 
     /**
-     * Writes content to a StringBuilder.
+     * Writes content to a writer.
      *
      */
-    public abstract void write(StringBuilder contentBuilder);
+    public abstract boolean write(Writer writer, boolean atNewline) throws IOException ;
 
     /**
      * Returns true if the content is empty.
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java	Mon Oct 15 17:07:55 2012 -0700
@@ -115,7 +115,7 @@
      *
      * @param contentTree the content tree that will be printed
      */
-    public abstract void printDocument(Content contentTree);
+    public abstract void printDocument(Content contentTree) throws IOException;
 
     /**
      * Close the writer.
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java	Mon Oct 15 17:07:55 2012 -0700
@@ -151,7 +151,7 @@
      *
      * @param serializedTree the content tree that will be printed
      */
-    public abstract void printDocument(Content serializedTree);
+    public abstract void printDocument(Content serializedTree) throws IOException;
 
     /**
      * Write the serialized form for a given field.
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java	Fri Oct 12 14:53:50 2012 -0700
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java	Mon Oct 15 17:07:55 2012 -0700
@@ -650,9 +650,9 @@
             fos = new FileOutputStream(filename);
         }
         if (docencoding == null) {
-            return new OutputStreamWriter(fos);
+            return new BufferedWriter(new OutputStreamWriter(fos));
         } else {
-            return new OutputStreamWriter(fos, docencoding);
+            return new BufferedWriter(new OutputStreamWriter(fos, docencoding));
         }
     }