diff options
author | Jung-uk Kim <jkim@FreeBSD.org> | 2013-07-16 21:07:25 +0000 |
---|---|---|
committer | Jung-uk Kim <jkim@FreeBSD.org> | 2013-07-16 21:07:25 +0000 |
commit | ab26ef78141c6d3e19e8011b7d5e5570b4e53f59 (patch) | |
tree | 2f06d03438c702d537ce93a79f7930297e601de0 /java/openjdk6/files/icedtea/openjdk/6851834-restructure.patch | |
parent | HostDB is a system for generating internal DNS zones, (diff) |
Add multiple security patches and improvements from IcedTea6 1.12.6.
http://mail.openjdk.java.net/pipermail/distro-pkg-dev/2013-July/023941.html
Obtained from: IcedTea Project
PR: ports/180541
Notes
Notes:
svn path=/head/; revision=323126
Diffstat (limited to 'java/openjdk6/files/icedtea/openjdk/6851834-restructure.patch')
-rw-r--r-- | java/openjdk6/files/icedtea/openjdk/6851834-restructure.patch | 26853 |
1 files changed, 26853 insertions, 0 deletions
diff --git a/java/openjdk6/files/icedtea/openjdk/6851834-restructure.patch b/java/openjdk6/files/icedtea/openjdk/6851834-restructure.patch new file mode 100644 index 000000000000..66011ee8189e --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/6851834-restructure.patch @@ -0,0 +1,26853 @@ +# HG changeset patch +# User andrew +# Date 1371730814 18000 +# Node ID 5761891cfee48bc9382dd68e5e1bf164cff9bfbf +# Parent 741c190d6989de395cb95895dc0320415af6b131 +# PLEASE SEE the other 6851834 patch which handles renames more generally +6851834: Javadoc doclet needs a structured approach to generate the output HTML. +Reviewed-by: jjg + +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java +@@ -26,12 +26,16 @@ + package com.sun.tools.doclets.formats.html; + + import com.sun.javadoc.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.tools.doclets.internal.toolkit.*; ++import com.sun.tools.doclets.internal.toolkit.util.*; + + /** + * Print method and constructor info. + * + * @author Robert Field + * @author Atul M Dambalkar ++ * @author Bhavesh Patel (Modified) + */ + public abstract class AbstractExecutableMemberWriter extends AbstractMemberWriter { + +@@ -45,82 +49,111 @@ + } + + /** +- * Write the type parameters for the executable member. ++ * Add the type parameters for the executable member. + * + * @param member the member to write type parameters for. ++ * @param htmltree the content tree to which the parameters will be added. + * @return the display length required to write this information. + */ +- protected int writeTypeParameters(ExecutableMemberDoc member) { ++ protected int addTypeParameters(ExecutableMemberDoc member, Content htmltree) { + LinkInfoImpl linkInfo = new LinkInfoImpl( + LinkInfoImpl.CONTEXT_MEMBER_TYPE_PARAMS, member, false); + String typeParameters = writer.getTypeParameterLinks(linkInfo); + if (linkInfo.displayLength > 0) { +- writer.print(typeParameters + " "); ++ Content linkContent = new RawHtml(typeParameters); ++ htmltree.addContent(linkContent); ++ htmltree.addContent(writer.getSpace()); + writer.displayLength += linkInfo.displayLength + 1; + } + return linkInfo.displayLength; + } + +- protected void writeSignature(ExecutableMemberDoc member) { +- writer.displayLength = 0; +- writer.pre(); +- writer.writeAnnotationInfo(member); +- printModifiers(member); +- writeTypeParameters(member); +- if (configuration().linksource && +- member.position().line() != classdoc.position().line()) { +- writer.printSrcLink(member, member.name()); +- } else { +- strong(member.name()); +- } +- writeParameters(member); +- writeExceptions(member); +- writer.preEnd(); ++ /** ++ * {@inheritDoc} ++ */ ++ protected Content getDeprecatedLink(ProgramElementDoc member) { ++ ExecutableMemberDoc emd = (ExecutableMemberDoc)member; ++ return writer.getDocLink(LinkInfoImpl.CONTEXT_MEMBER, (MemberDoc) emd, ++ emd.qualifiedName() + emd.flatSignature()); + } + +- protected void writeDeprecatedLink(ProgramElementDoc member) { ++ /** ++ * Add the summary link for the member. ++ * ++ * @param context the id of the context where the link will be printed ++ * @param classDoc the classDoc that we should link to ++ * @param member the member being linked to ++ * @param tdSummary the content tree to which the link will be added ++ */ ++ protected void addSummaryLink(int context, ClassDoc cd, ProgramElementDoc member, ++ Content tdSummary) { + ExecutableMemberDoc emd = (ExecutableMemberDoc)member; +- writer.printDocLink(LinkInfoImpl.CONTEXT_MEMBER, (MemberDoc) emd, +- emd.qualifiedName() + emd.flatSignature(), false); ++ String name = emd.name(); ++ Content strong = HtmlTree.STRONG(new RawHtml( ++ writer.getDocLink(context, cd, (MemberDoc) emd, ++ name, false))); ++ Content code = HtmlTree.CODE(strong); ++ writer.displayLength = name.length(); ++ addParameters(emd, false, code); ++ tdSummary.addContent(code); + } + +- protected void writeSummaryLink(int context, ClassDoc cd, ProgramElementDoc member) { +- ExecutableMemberDoc emd = (ExecutableMemberDoc)member; +- String name = emd.name(); +- writer.strong(); +- writer.printDocLink(context, cd, (MemberDoc) emd, +- name, false); +- writer.strongEnd(); +- writer.displayLength = name.length(); +- writeParameters(emd, false); ++ /** ++ * Add the inherited summary link for the member. ++ * ++ * @param classDoc the classDoc that we should link to ++ * @param member the member being linked to ++ * @param linksTree the content tree to which the link will be added ++ */ ++ protected void addInheritedSummaryLink(ClassDoc cd, ++ ProgramElementDoc member, Content linksTree) { ++ linksTree.addContent(new RawHtml( ++ writer.getDocLink(LinkInfoImpl.CONTEXT_MEMBER, cd, (MemberDoc) member, ++ member.name(), false))); + } + +- protected void writeInheritedSummaryLink(ClassDoc cd, +- ProgramElementDoc member) { +- writer.printDocLink(LinkInfoImpl.CONTEXT_MEMBER, cd, (MemberDoc) member, +- member.name(), false); +- } +- +- protected void writeParam(ExecutableMemberDoc member, Parameter param, +- boolean isVarArg) { ++ /** ++ * Add the parameter for the executable member. ++ * ++ * @param member the member to write parameter for. ++ * @param param the parameter that needs to be written. ++ * @param isVarArg true if this is a link to var arg. ++ * @param tree the content tree to which the parameter information will be added. ++ */ ++ protected void addParam(ExecutableMemberDoc member, Parameter param, ++ boolean isVarArg, Content tree) { + if (param.type() != null) { +- writer.printLink(new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_EXECUTABLE_MEMBER_PARAM, param.type(), +- isVarArg)); ++ Content link = new RawHtml(writer.getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_EXECUTABLE_MEMBER_PARAM, param.type(), ++ isVarArg))); ++ tree.addContent(link); + } + if(param.name().length() > 0) { +- writer.space(); +- writer.print(param.name()); ++ tree.addContent(writer.getSpace()); ++ tree.addContent(param.name()); + } + } + +- protected void writeParameters(ExecutableMemberDoc member) { +- writeParameters(member, true); ++ /** ++ * Add all the parameters for the executable member. ++ * ++ * @param member the member to write parameters for. ++ * @param tree the content tree to which the parameters information will be added. ++ */ ++ protected void addParameters(ExecutableMemberDoc member, Content htmltree) { ++ addParameters(member, true, htmltree); + } + +- protected void writeParameters(ExecutableMemberDoc member, +- boolean includeAnnotations) { +- print('('); ++ /** ++ * Add all the parameters for the executable member. ++ * ++ * @param member the member to write parameters for. ++ * @param includeAnnotations true if annotation information needs to be added. ++ * @param tree the content tree to which the parameters information will be added. ++ */ ++ protected void addParameters(ExecutableMemberDoc member, ++ boolean includeAnnotations, Content htmltree) { ++ htmltree.addContent("("); + Parameter[] params = member.parameters(); + String indent = makeSpace(writer.displayLength); + if (configuration().linksource) { +@@ -132,58 +165,70 @@ + Parameter param = params[paramstart]; + if (!param.name().startsWith("this$")) { + if (includeAnnotations) { +- boolean foundAnnotations = +- writer.writeAnnotationInfo(indent.length(), member, param); +- if (foundAnnotations) { +- writer.println(); +- writer.print(indent); ++ boolean foundAnnotations = ++ writer.addAnnotationInfo(indent.length(), ++ member, param, htmltree); ++ if (foundAnnotations) { ++ htmltree.addContent(DocletConstants.NL); ++ htmltree.addContent(indent); + } + } +- writeParam(member, param, +- (paramstart == params.length - 1) && member.isVarArgs()); ++ addParam(member, param, ++ (paramstart == params.length - 1) && member.isVarArgs(), htmltree); + break; + } + } + + for (int i = paramstart + 1; i < params.length; i++) { +- writer.print(','); +- writer.println(); +- writer.print(indent); ++ htmltree.addContent(","); ++ htmltree.addContent(DocletConstants.NL); ++ htmltree.addContent(indent); + if (includeAnnotations) { + boolean foundAnnotations = +- writer.writeAnnotationInfo(indent.length(), member, params[i]); ++ writer.addAnnotationInfo(indent.length(), member, params[i], ++ htmltree); + if (foundAnnotations) { +- writer.println(); +- writer.print(indent); ++ htmltree.addContent(DocletConstants.NL); ++ htmltree.addContent(indent); + } + } +- writeParam(member, params[i], (i == params.length - 1) && member.isVarArgs()); ++ addParam(member, params[i], (i == params.length - 1) && member.isVarArgs(), ++ htmltree); + } +- writer.print(')'); ++ htmltree.addContent(")"); + } + +- protected void writeExceptions(ExecutableMemberDoc member) { ++ /** ++ * Add exceptions for the executable member. ++ * ++ * @param member the member to write exceptions for. ++ * @param htmltree the content tree to which the exceptions information will be added. ++ */ ++ protected void addExceptions(ExecutableMemberDoc member, Content htmltree) { + Type[] exceptions = member.thrownExceptionTypes(); + if(exceptions.length > 0) { + LinkInfoImpl memberTypeParam = new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_MEMBER, member, false); ++ LinkInfoImpl.CONTEXT_MEMBER, member, false); + int retlen = getReturnTypeLength(member); + writer.getTypeParameterLinks(memberTypeParam); + retlen += memberTypeParam.displayLength == 0 ? + 0 : memberTypeParam.displayLength + 1; + String indent = makeSpace(modifierString(member).length() + +- member.name().length() + retlen - 4); +- writer.println(); +- writer.print(indent); +- writer.print("throws "); ++ member.name().length() + retlen - 4); ++ htmltree.addContent(DocletConstants.NL); ++ htmltree.addContent(indent); ++ htmltree.addContent("throws "); + indent += " "; +- writer.printLink(new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_MEMBER, exceptions[0])); ++ Content link = new RawHtml(writer.getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_MEMBER, exceptions[0]))); ++ htmltree.addContent(link); + for(int i = 1; i < exceptions.length; i++) { +- writer.println(","); +- writer.print(indent); +- writer.printLink(new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_MEMBER, exceptions[i])); ++ htmltree.addContent(","); ++ htmltree.addContent(DocletConstants.NL); ++ htmltree.addContent(indent); ++ Content exceptionLink = new RawHtml(writer.getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_MEMBER, exceptions[i]))); ++ htmltree.addContent(exceptionLink); + } + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java +@@ -30,6 +30,8 @@ + + import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.tools.doclets.internal.toolkit.*; + + /** + * Generate Index for all the Member Names with Indexing in +@@ -39,6 +41,7 @@ + * + * @see IndexBuilder + * @author Atul M Dambalkar ++ * @author Bhavesh Patel (Modified) + */ + public class AbstractIndexWriter extends HtmlDocletWriter { + +@@ -78,175 +81,187 @@ + } + + /** +- * Print the text "Index" in strong format in the navigation bar. ++ * Get the index label for navigation bar. ++ * ++ * @return a content tree for the tree label + */ +- protected void navLinkIndex() { +- navCellRevStart(); +- fontStyle("NavBarFont1Rev"); +- strongText("doclet.Index"); +- fontEnd(); +- navCellEnd(); ++ protected Content getNavLinkIndex() { ++ Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, indexLabel); ++ return li; + } + + /** +- * Generate the member information for the unicode character along with the ++ * Add the member information for the unicode character along with the + * list of the members. + * +- * @param unicode Unicode for which member list information to be generated. +- * @param memberlist List of members for the unicode character. ++ * @param unicode Unicode for which member list information to be generated ++ * @param memberlist List of members for the unicode character ++ * @param contentTree the content tree to which the information will be added + */ +- protected void generateContents(Character unicode, List memberlist) { +- anchor("_" + unicode + "_"); +- h2(); +- strong(unicode.toString()); +- h2End(); ++ protected void addContents(Character unicode, List<? extends Doc> memberlist, ++ Content contentTree) { ++ contentTree.addContent(getMarkerAnchor("_" + unicode + "_")); ++ Content headContent = new StringContent(unicode.toString()); ++ Content heading = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, false, ++ HtmlStyle.title, headContent); ++ contentTree.addContent(heading); + int memberListSize = memberlist.size(); + // Display the list only if there are elements to be displayed. + if (memberListSize > 0) { +- dl(); ++ Content dl = new HtmlTree(HtmlTag.DL); + for (int i = 0; i < memberListSize; i++) { + Doc element = memberlist.get(i); + if (element instanceof MemberDoc) { +- printDescription((MemberDoc)element); ++ addDescription((MemberDoc)element, dl); + } else if (element instanceof ClassDoc) { +- printDescription((ClassDoc)element); ++ addDescription((ClassDoc)element, dl); + } else if (element instanceof PackageDoc) { +- printDescription((PackageDoc)element); ++ addDescription((PackageDoc)element, dl); + } + } +- dlEnd(); ++ contentTree.addContent(dl); + } +- hr(); +- } +- +- +- /** +- * Print one line summary comment for the package. +- * +- * @param pkg PackageDoc passed. +- */ +- protected void printDescription(PackageDoc pkg) { +- dt(); +- printPackageLink(pkg, Util.getPackageName(pkg), true); +- print(" - "); +- print(configuration.getText("doclet.package") + " " + pkg.name()); +- dtEnd(); +- dd(); +- printSummaryComment(pkg); +- ddEnd(); + } + + /** +- * Print one line summary comment for the class. ++ * Add one line summary comment for the package. + * +- * @param cd ClassDoc passed. ++ * @param pkg the package to be documented ++ * @param dlTree the content tree to which the description will be added + */ +- protected void printDescription(ClassDoc cd) { +- dt(); +- printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_INDEX, cd, true)); +- print(" - "); +- printClassInfo(cd); +- dtEnd(); +- dd(); +- printComment(cd); +- ddEnd(); ++ protected void addDescription(PackageDoc pkg, Content dlTree) { ++ Content link = getPackageLink(pkg, new StringContent(Util.getPackageName(pkg))); ++ Content dt = HtmlTree.DT(link); ++ dt.addContent(" - "); ++ dt.addContent(getResource("doclet.package")); ++ dt.addContent(" " + pkg.name()); ++ dlTree.addContent(dt); ++ Content dd = new HtmlTree(HtmlTag.DD); ++ addSummaryComment(pkg, dd); ++ dlTree.addContent(dd); + } + + /** +- * Print the classkind(class, interface, exception, error of the class ++ * Add one line summary comment for the class. ++ * ++ * @param cd the class being documented ++ * @param dlTree the content tree to which the description will be added ++ */ ++ protected void addDescription(ClassDoc cd, Content dlTree) { ++ Content link = new RawHtml( ++ getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_INDEX, cd, true))); ++ Content dt = HtmlTree.DT(link); ++ dt.addContent(" - "); ++ addClassInfo(cd, dt); ++ dlTree.addContent(dt); ++ Content dd = new HtmlTree(HtmlTag.DD); ++ addComment(cd, dd); ++ dlTree.addContent(dd); ++ } ++ ++ /** ++ * Add the classkind(class, interface, exception, error of the class + * passed. + * +- * @param cd ClassDoc. ++ * @param cd the class being documented ++ * @param contentTree the content tree to which the class info will be added + */ +- protected void printClassInfo(ClassDoc cd) { +- print(configuration.getText("doclet.in", +- Util.getTypeName(configuration, cd, false), +- getPackageLink(cd.containingPackage(), ++ protected void addClassInfo(ClassDoc cd, Content contentTree) { ++ contentTree.addContent(getResource("doclet.in", ++ Util.getTypeName(configuration, cd, false), ++ getPackageLinkString(cd.containingPackage(), + Util.getPackageName(cd.containingPackage()), false))); + } + +- + /** +- * Generate Description for Class, Field, Method or Constructor. +- * for Java.* Packages Class Members. ++ * Add description for Class, Field, Method or Constructor. + * +- * @param member MemberDoc for the member of the Class Kind. +- * @see com.sun.javadoc.MemberDoc ++ * @param member MemberDoc for the member of the Class Kind ++ * @param dlTree the content tree to which the description will be added + */ +- protected void printDescription(MemberDoc member) { ++ protected void addDescription(MemberDoc member, Content dlTree) { + String name = (member instanceof ExecutableMemberDoc)? + member.name() + ((ExecutableMemberDoc)member).flatSignature() : + member.name(); + if (name.indexOf("<") != -1 || name.indexOf(">") != -1) { + name = Util.escapeHtmlChars(name); + } +- ClassDoc containing = member.containingClass(); +- dt(); +- printDocLink(LinkInfoImpl.CONTEXT_INDEX, member, name, true); +- println(" - "); +- printMemberDesc(member); +- println(); +- dtEnd(); +- dd(); +- printComment(member); +- ddEnd(); +- println(); ++ Content span = HtmlTree.SPAN(HtmlStyle.strong, ++ getDocLink(LinkInfoImpl.CONTEXT_INDEX, member, name)); ++ Content dt = HtmlTree.DT(span); ++ dt.addContent(" - "); ++ addMemberDesc(member, dt); ++ dlTree.addContent(dt); ++ Content dd = new HtmlTree(HtmlTag.DD); ++ addComment(member, dd); ++ dlTree.addContent(dd); + } + +- + /** +- * Print comment for each element in the index. If the element is deprecated ++ * Add comment for each element in the index. If the element is deprecated + * and it has a @deprecated tag, use that comment. Else if the containing + * class for this element is deprecated, then add the word "Deprecated." at + * the start and then print the normal comment. + * +- * @param element Index element. ++ * @param element Index element ++ * @param contentTree the content tree to which the comment will be added + */ +- protected void printComment(ProgramElementDoc element) { ++ protected void addComment(ProgramElementDoc element, Content contentTree) { + Tag[] tags; ++ Content span = HtmlTree.SPAN(HtmlStyle.strong, deprecatedPhrase); ++ HtmlTree div = new HtmlTree(HtmlTag.DIV); ++ div.addStyle(HtmlStyle.block); + if (Util.isDeprecated(element)) { +- strongText("doclet.Deprecated"); space(); ++ div.addContent(span); + if ((tags = element.tags("deprecated")).length > 0) +- printInlineDeprecatedComment(element, tags[0]); ++ addInlineDeprecatedComment(element, tags[0], div); ++ contentTree.addContent(div); + } else { + ClassDoc cont = element.containingClass(); + while (cont != null) { + if (Util.isDeprecated(cont)) { +- strongText("doclet.Deprecated"); space(); ++ div.addContent(span); ++ contentTree.addContent(div); + break; + } + cont = cont.containingClass(); + } +- printSummaryComment(element); ++ addSummaryComment(element, contentTree); + } + } + + /** +- * Print description about the Static Varible/Method/Constructor for a ++ * Add description about the Static Varible/Method/Constructor for a + * member. + * +- * @param member MemberDoc for the member within the Class Kind. +- * @see com.sun.javadoc.MemberDoc ++ * @param member MemberDoc for the member within the Class Kind ++ * @param contentTree the content tree to which the member description will be added + */ +- protected void printMemberDesc(MemberDoc member) { ++ protected void addMemberDesc(MemberDoc member, Content contentTree) { + ClassDoc containing = member.containingClass(); +- String classdesc = Util.getTypeName(configuration, containing, true) + " " + +- getPreQualifiedClassLink(LinkInfoImpl.CONTEXT_INDEX, containing, +- false); ++ String classdesc = Util.getTypeName( ++ configuration, containing, true) + " "; + if (member.isField()) { + if (member.isStatic()) { +- printText("doclet.Static_variable_in", classdesc); ++ contentTree.addContent( ++ getResource("doclet.Static_variable_in", classdesc)); + } else { +- printText("doclet.Variable_in", classdesc); ++ contentTree.addContent( ++ getResource("doclet.Variable_in", classdesc)); + } + } else if (member.isConstructor()) { +- printText("doclet.Constructor_for", classdesc); ++ contentTree.addContent( ++ getResource("doclet.Constructor_for", classdesc)); + } else if (member.isMethod()) { + if (member.isStatic()) { +- printText("doclet.Static_method_in", classdesc); ++ contentTree.addContent( ++ getResource("doclet.Static_method_in", classdesc)); + } else { +- printText("doclet.Method_in", classdesc); ++ contentTree.addContent( ++ getResource("doclet.Method_in", classdesc)); + } + } ++ addPreQualifiedClassLink(LinkInfoImpl.CONTEXT_INDEX, containing, ++ false, contentTree); + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java +@@ -25,10 +25,11 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.util.*; + import java.lang.reflect.Modifier; +-import java.util.*; +- + import com.sun.javadoc.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.taglets.*; + +@@ -60,36 +61,125 @@ + + /*** abstracts ***/ + +- public abstract void printSummaryLabel(); ++ /** ++ * Add the summary label for the member. ++ * ++ * @param memberTree the content tree to which the label will be added ++ */ ++ public abstract void addSummaryLabel(Content memberTree); + +- public abstract void printTableSummary(); ++ /** ++ * Get the summary for the member summary table. ++ * ++ * @return a string for the table summary ++ */ ++ public abstract String getTableSummary(); + +- public abstract void printSummaryTableHeader(ProgramElementDoc member); ++ /** ++ * Get the caption for the member summary table. ++ * ++ * @return a string for the table caption ++ */ ++ public abstract String getCaption(); + +- public abstract void printInheritedSummaryLabel(ClassDoc cd); ++ /** ++ * Get the summary table header for the member. ++ * ++ * @param member the member to be documented ++ * @return the summary table header ++ */ ++ public abstract String[] getSummaryTableHeader(ProgramElementDoc member); + +- public abstract void printSummaryAnchor(ClassDoc cd); ++ /** ++ * Add inherited summary lable for the member. ++ * ++ * @param cd the class doc to which to link to ++ * @param inheritedTree the content tree to which the inherited summary label will be added ++ */ ++ public abstract void addInheritedSummaryLabel(ClassDoc cd, Content inheritedTree); + +- public abstract void printInheritedSummaryAnchor(ClassDoc cd); ++ /** ++ * Add the anchor for the summary section of the member. ++ * ++ * @param cd the class doc to be documented ++ * @param memberTree the content tree to which the summary anchor will be added ++ */ ++ public abstract void addSummaryAnchor(ClassDoc cd, Content memberTree); + +- protected abstract void printSummaryType(ProgramElementDoc member); ++ /** ++ * Add the anchor for the inherited summary section of the member. ++ * ++ * @param cd the class doc to be documented ++ * @param inheritedTree the content tree to which the inherited summary anchor will be added ++ */ ++ public abstract void addInheritedSummaryAnchor(ClassDoc cd, Content inheritedTree); + +- protected void writeSummaryLink(ClassDoc cd, ProgramElementDoc member) { +- writeSummaryLink(LinkInfoImpl.CONTEXT_MEMBER, cd, member); ++ /** ++ * Add the summary type for the member. ++ * ++ * @param member the member to be documented ++ * @param tdSummaryType the content tree to which the type will be added ++ */ ++ protected abstract void addSummaryType(ProgramElementDoc member, ++ Content tdSummaryType); ++ ++ /** ++ * Add the summary link for the member. ++ * ++ * @param cd the class doc to be documented ++ * @param member the member to be documented ++ * @param tdSummary the content tree to which the link will be added ++ */ ++ protected void addSummaryLink(ClassDoc cd, ProgramElementDoc member, ++ Content tdSummary) { ++ addSummaryLink(LinkInfoImpl.CONTEXT_MEMBER, cd, member, tdSummary); + } + +- protected abstract void writeSummaryLink(int context, +- ClassDoc cd, +- ProgramElementDoc member); ++ /** ++ * Add the summary link for the member. ++ * ++ * @param context the id of the context where the link will be printed ++ * @param cd the class doc to be documented ++ * @param member the member to be documented ++ * @param tdSummary the content tree to which the summary link will be added ++ */ ++ protected abstract void addSummaryLink(int context, ++ ClassDoc cd, ProgramElementDoc member, Content tdSummary); + +- protected abstract void writeInheritedSummaryLink(ClassDoc cd, +- ProgramElementDoc member); ++ /** ++ * Add the inherited summary link for the member. ++ * ++ * @param cd the class doc to be documented ++ * @param member the member to be documented ++ * @param linksTree the content tree to which the inherited summary link will be added ++ */ ++ protected abstract void addInheritedSummaryLink(ClassDoc cd, ++ ProgramElementDoc member, Content linksTree); + +- protected abstract void writeDeprecatedLink(ProgramElementDoc member); ++ /** ++ * Get the deprecated link. ++ * ++ * @param member the member being linked to ++ * @return a content tree representing the link ++ */ ++ protected abstract Content getDeprecatedLink(ProgramElementDoc member); + +- protected abstract void printNavSummaryLink(ClassDoc cd, boolean link); ++ /** ++ * Get the navigation summary link. ++ * ++ * @param cd the class doc to be documented ++ * @param link true if its a link else the label to be printed ++ * @return a content tree for the navigation summary link. ++ */ ++ protected abstract Content getNavSummaryLink(ClassDoc cd, boolean link); + +- protected abstract void printNavDetailLink(boolean link); ++ /** ++ * Add the navigation detail link. ++ * ++ * @param link true if its a link else the label to be printed ++ * @param liNav the content tree to which the navigation detail link will be added ++ */ ++ protected abstract void addNavDetailLink(boolean link, Content liNav); + + /*** ***/ + +@@ -109,6 +199,17 @@ + } + + /** ++ * Add the member name to the content tree and modifies the display length. ++ * ++ * @param name the member name to be added to the content tree. ++ * @param htmltree the content tree to which the name will be added. ++ */ ++ protected void addName(String name, Content htmltree) { ++ htmltree.addContent(name); ++ writer.displayLength += name.length(); ++ } ++ ++ /** + * Return a string describing the access modifier flags. + * Don't include native or synchronized. + * +@@ -131,18 +232,24 @@ + return type; + } + +- protected void printModifiers(MemberDoc member) { ++ /** ++ * Add the modifier for the member. ++ * ++ * @param member the member for which teh modifier will be added. ++ * @param htmltree the content tree to which the modifier information will be added. ++ */ ++ protected void addModifiers(MemberDoc member, Content htmltree) { + String mod = modifierString(member); + // According to JLS, we should not be showing public modifier for + // interface methods. + if ((member.isField() || member.isMethod()) && + writer instanceof ClassWriterImpl && +- ((ClassWriterImpl) writer).getClassDoc().isInterface()) { ++ ((ClassWriterImpl) writer).getClassDoc().isInterface()) { + mod = Util.replaceText(mod, "public", "").trim(); + } + if(mod.length() > 0) { +- print(mod); +- print(' '); ++ htmltree.addContent(mod); ++ htmltree.addContent(writer.getSpace()); + } + } + +@@ -158,66 +265,43 @@ + } + + /** +- * Print 'static' if static and type link. ++ * Add the modifier and type for the member in the member summary. ++ * ++ * @param member the member to add the type for ++ * @param type the type to add ++ * @param tdSummaryType the content tree to which the modified and type will be added + */ +- protected void printStaticAndType(boolean isStatic, Type type) { +- writer.printTypeSummaryHeader(); +- if (isStatic) { +- print("static"); +- } +- writer.space(); +- if (type != null) { +- writer.printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, +- type)); +- } +- writer.printTypeSummaryFooter(); +- } +- +- /** +- * Print the modifier and type for the member in the member summary. +- * +- * @param member the member to print the type for. +- * @param type the type to print. +- */ +- protected void printModifierAndType(ProgramElementDoc member, Type type) { +- writer.printTypeSummaryHeader(); +- printModifier(member); ++ protected void addModifierAndType(ProgramElementDoc member, Type type, ++ Content tdSummaryType) { ++ HtmlTree code = new HtmlTree(HtmlTag.CODE); ++ addModifier(member, code); + if (type == null) { +- writer.space(); + if (member.isClass()) { +- print("class"); ++ code.addContent("class"); + } else { +- print("interface"); ++ code.addContent("interface"); + } ++ code.addContent(writer.getSpace()); + } else { + if (member instanceof ExecutableMemberDoc && + ((ExecutableMemberDoc) member).typeParameters().length > 0) { + //Code to avoid ugly wrapping in member summary table. +- writer.table(0,0,0); +- writer.trAlignVAlign("right", ""); +- writer.tdNowrap(); +- writer.font("-1"); +- writer.code(); +- int displayLength = ((AbstractExecutableMemberWriter) this). +- writeTypeParameters((ExecutableMemberDoc) member); ++ int displayLength = ((AbstractExecutableMemberWriter) this).addTypeParameters( ++ (ExecutableMemberDoc) member, code); + if (displayLength > 10) { +- writer.br(); ++ code.addContent(new HtmlTree(HtmlTag.BR)); + } +- writer.printLink(new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_SUMMARY_RETURN_TYPE, type)); +- writer.codeEnd(); +- writer.fontEnd(); +- writer.tdEnd(); +- writer.trEnd(); +- writer.tableEnd(); ++ code.addContent(new RawHtml( ++ writer.getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_SUMMARY_RETURN_TYPE, type)))); + } else { +- writer.space(); +- writer.printLink(new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_SUMMARY_RETURN_TYPE, type)); ++ code.addContent(new RawHtml( ++ writer.getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_SUMMARY_RETURN_TYPE, type)))); + } + + } +- writer.printTypeSummaryFooter(); ++ tdSummaryType.addContent(code); + } + + private void printModifier(ProgramElementDoc member) { +@@ -238,25 +322,53 @@ + } + + /** +- * Print the deprecated output for the given member. ++ * Add the modifier for the member. ++ * ++ * @param member the member to add the type for ++ * @param code the content tree to which the modified will be added ++ */ ++ private void addModifier(ProgramElementDoc member, Content code) { ++ if (member.isProtected()) { ++ code.addContent("protected "); ++ } else if (member.isPrivate()) { ++ code.addContent("private "); ++ } else if (!member.isPublic()) { // Package private ++ code.addContent(configuration().getText("doclet.Package_private")); ++ code.addContent(" "); ++ } ++ if (member.isMethod() && ((MethodDoc)member).isAbstract()) { ++ code.addContent("abstract "); ++ } ++ if (member.isStatic()) { ++ code.addContent("static "); ++ } ++ } ++ ++ /** ++ * Add the deprecated information for the given member. + * + * @param member the member being documented. ++ * @param contentTree the content tree to which the deprecated information will be added. + */ +- protected void printDeprecated(ProgramElementDoc member) { ++ protected void addDeprecatedInfo(ProgramElementDoc member, Content contentTree) { + String output = (new DeprecatedTaglet()).getTagletOutput(member, + writer.getTagletWriterInstance(false)).toString().trim(); + if (!output.isEmpty()) { +- writer.printMemberDetailsListStartTag(); +- writer.print(output); ++ Content deprecatedContent = new RawHtml(output); ++ Content div = HtmlTree.DIV(HtmlStyle.block, deprecatedContent); ++ contentTree.addContent(div); + } + } + +- protected void printComment(ProgramElementDoc member) { ++ /** ++ * Add the comment for the given member. ++ * ++ * @param member the member being documented. ++ * @param contentTree the content tree to which the comment will be added. ++ */ ++ protected void addComment(ProgramElementDoc member, Content htmltree) { + if (member.inlineTags().length > 0) { +- writer.printMemberDetailsListStartTag(); +- writer.dd(); +- writer.printInlineComment(member); +- writer.ddEnd(); ++ writer.addInlineComment(member, htmltree); + } + } + +@@ -264,67 +376,19 @@ + return member.name(); + } + +- protected void printHead(MemberDoc member) { +- writer.h3(); +- writer.print(member.name()); +- writer.h3End(); +- } +- +- protected void printFullComment(ProgramElementDoc member) { +- if(configuration().nocomment){ +- return; +- } +- writer.dl(); +- print(((TagletOutputImpl) +- (new DeprecatedTaglet()).getTagletOutput(member, +- writer.getTagletWriterInstance(false))).toString()); +- printCommentAndTags(member); +- writer.dlEnd(); +- } +- +- protected void printCommentAndTags(ProgramElementDoc member) { +- printComment(member); +- writer.printTags(member); ++ /** ++ * Get the header for the section. ++ * ++ * @param member the member being documented. ++ * @return a header content for the section. ++ */ ++ protected Content getHead(MemberDoc member) { ++ Content memberContent = new RawHtml(member.name()); ++ Content heading = HtmlTree.HEADING(HtmlConstants.MEMBER_HEADING, memberContent); ++ return heading; + } + + /** +- * Write the member footer. +- */ +- protected void printMemberFooter() { +- writer.printMemberDetailsListEndTag(); +- assert !writer.getMemberDetailsListPrinted(); +- } +- +- /** +- * Forward to containing writer +- */ +- public void printSummaryHeader(ClassDoc cd) { +- printedSummaryHeader = true; +- writer.printSummaryHeader(this, cd); +- } +- +- /** +- * Forward to containing writer +- */ +- public void printInheritedSummaryHeader(ClassDoc cd) { +- writer.printInheritedSummaryHeader(this, cd); +- } +- +- /** +- * Forward to containing writer +- */ +- public void printInheritedSummaryFooter(ClassDoc cd) { +- writer.printInheritedSummaryFooter(this, cd); +- } +- +- /** +- * Forward to containing writer +- */ +- public void printSummaryFooter(ClassDoc cd) { +- writer.printSummaryFooter(this, cd); +- } +- +- /** + * Return true if the given <code>ProgramElement</code> is inherited + * by the class that is being documented. + * +@@ -340,102 +404,134 @@ + return true; + } + +- + /** +- * Generate the code for listing the deprecated APIs. Create the table +- * format for listing the API. Call methods from the sub-class to complete +- * the generation. ++ * Add deprecated information to the documentation tree ++ * ++ * @param deprmembers list of deprecated members ++ * @param headingKey the caption for the deprecated members table ++ * @param tableSummary the summary for the deprecated members table ++ * @param tableHeader table headers for the deprecated members table ++ * @param contentTree the content tree to which the deprecated members table will be added + */ +- protected void printDeprecatedAPI(List<Doc> deprmembers, String headingKey, String tableSummary, String[] tableHeader) { ++ protected void addDeprecatedAPI(List<Doc> deprmembers, String headingKey, ++ String tableSummary, String[] tableHeader, Content contentTree) { + if (deprmembers.size() > 0) { +- writer.tableIndexSummary(tableSummary); +- writer.tableCaptionStart(); +- writer.printText(headingKey); +- writer.tableCaptionEnd(); +- writer.summaryTableHeader(tableHeader, "col"); ++ Content table = HtmlTree.TABLE(0, 3, 0, tableSummary, ++ writer.getTableCaption(configuration().getText(headingKey))); ++ table.addContent(writer.getSummaryTableHeader(tableHeader, "col")); ++ Content tbody = new HtmlTree(HtmlTag.TBODY); + for (int i = 0; i < deprmembers.size(); i++) { + ProgramElementDoc member =(ProgramElementDoc)deprmembers.get(i); +- writer.trBgcolorStyle("white", "TableRowColor"); +- writer.summaryRow(0); +- writeDeprecatedLink(member); +- writer.br(); +- writer.printNbsps(); ++ HtmlTree td = HtmlTree.TD(HtmlStyle.colOne, getDeprecatedLink(member)); + if (member.tags("deprecated").length > 0) +- writer.printInlineDeprecatedComment(member, member.tags("deprecated")[0]); +- writer.space(); +- writer.summaryRowEnd(); +- writer.trEnd(); ++ writer.addInlineDeprecatedComment(member, ++ member.tags("deprecated")[0], td); ++ HtmlTree tr = HtmlTree.TR(td); ++ if (i%2 == 0) ++ tr.addStyle(HtmlStyle.altColor); ++ else ++ tr.addStyle(HtmlStyle.rowColor); ++ tbody.addContent(tr); + } +- writer.tableEnd(); +- writer.space(); +- writer.p(); ++ table.addContent(tbody); ++ Content li = HtmlTree.LI(HtmlStyle.blockList, table); ++ Content ul = HtmlTree.UL(HtmlStyle.blockList, li); ++ contentTree.addContent(ul); + } + } + + /** +- * Print use info. ++ * Add use information to the documentation tree. ++ * ++ * @param mems list of program elements for which the use information will be added ++ * @param heading the section heading ++ * @param tableSummary the summary for the use table ++ * @param contentTree the content tree to which the use information will be added + */ +- protected void printUseInfo(List<? extends ProgramElementDoc> mems, String heading, String tableSummary) { ++ protected void addUseInfo(List<? extends ProgramElementDoc> mems, ++ String heading, String tableSummary, Content contentTree) { + if (mems == null) { + return; + } + List members = (List)mems; + boolean printedUseTableHeader = false; + if (members.size() > 0) { +- writer.tableIndexSummary(tableSummary); +- writer.tableSubCaptionStart(); +- writer.print(heading); +- writer.tableCaptionEnd(); +- for (Iterator it = members.iterator(); it.hasNext(); ) { ++ Content table = HtmlTree.TABLE(0, 3, 0, tableSummary, ++ writer.getTableCaption(heading)); ++ Content tbody = new HtmlTree(HtmlTag.TBODY); ++ Iterator<? extends ProgramElementDoc> it = members.iterator(); ++ for (int i = 0; it.hasNext(); i++) { + ProgramElementDoc pgmdoc = (ProgramElementDoc)it.next(); + ClassDoc cd = pgmdoc.containingClass(); + if (!printedUseTableHeader) { +- // Passing ProgramElementDoc helps decides printing +- // interface or class header in case of nested classes. +- this.printSummaryTableHeader(pgmdoc); ++ table.addContent(writer.getSummaryTableHeader( ++ this.getSummaryTableHeader(pgmdoc), "col")); + printedUseTableHeader = true; + } +- +- writer.printSummaryLinkType(this, pgmdoc); ++ HtmlTree tr = new HtmlTree(HtmlTag.TR); ++ if (i % 2 == 0) { ++ tr.addStyle(HtmlStyle.altColor); ++ } else { ++ tr.addStyle(HtmlStyle.rowColor); ++ } ++ HtmlTree tdFirst = new HtmlTree(HtmlTag.TD); ++ tdFirst.addStyle(HtmlStyle.colFirst); ++ writer.addSummaryType(this, pgmdoc, tdFirst); ++ tr.addContent(tdFirst); ++ HtmlTree tdLast = new HtmlTree(HtmlTag.TD); ++ tdLast.addStyle(HtmlStyle.colLast); + if (cd != null && !(pgmdoc instanceof ConstructorDoc) +- && !(pgmdoc instanceof ClassDoc)) { +- // Add class context +- writer.strong(cd.name() + "."); ++ && !(pgmdoc instanceof ClassDoc)) { ++ HtmlTree name = new HtmlTree(HtmlTag.SPAN); ++ name.addStyle(HtmlStyle.strong); ++ name.addContent(cd.name() + "."); ++ tdLast.addContent(name); + } +- writeSummaryLink( +- pgmdoc instanceof ClassDoc ? +- LinkInfoImpl.CONTEXT_CLASS_USE : LinkInfoImpl.CONTEXT_MEMBER, +- cd, pgmdoc); +- writer.printSummaryLinkComment(this, pgmdoc); ++ addSummaryLink(pgmdoc instanceof ClassDoc ? ++ LinkInfoImpl.CONTEXT_CLASS_USE : LinkInfoImpl.CONTEXT_MEMBER, ++ cd, pgmdoc, tdLast); ++ writer.addSummaryLinkComment(this, pgmdoc, tdLast); ++ tr.addContent(tdLast); ++ tbody.addContent(tr); + } +- writer.tableEnd(); +- writer.space(); +- writer.p(); ++ table.addContent(tbody); ++ contentTree.addContent(table); + } + } + +- protected void navDetailLink(List members) { +- printNavDetailLink(members.size() > 0? true: false); ++ /** ++ * Add the navigation detail link. ++ * ++ * @param members the members to be linked ++ * @param liNav the content tree to which the navigation detail link will be added ++ */ ++ protected void addNavDetailLink(List<?> members, Content liNav) { ++ addNavDetailLink(members.size() > 0 ? true : false, liNav); + } + +- +- protected void navSummaryLink(List members, +- VisibleMemberMap visibleMemberMap) { ++ /** ++ * Add the navigation summary link. ++ * ++ * @param members members to be linked ++ * @param visibleMemberMap the visible inherited members map ++ * @param liNav the content tree to which the navigation summary link will be added ++ */ ++ protected void addNavSummaryLink(List<?> members, ++ VisibleMemberMap visibleMemberMap, Content liNav) { + if (members.size() > 0) { +- printNavSummaryLink(null, true); ++ liNav.addContent(getNavSummaryLink(null, true)); + return; +- } else { +- ClassDoc icd = classdoc.superclass(); +- while (icd != null) { +- List inhmembers = visibleMemberMap.getMembersFor(icd); +- if (inhmembers.size() > 0) { +- printNavSummaryLink(icd, true); +- return; +- } +- icd = icd.superclass(); ++ } ++ ClassDoc icd = classdoc.superclass(); ++ while (icd != null) { ++ List<?> inhmembers = visibleMemberMap.getMembersFor(icd); ++ if (inhmembers.size() > 0) { ++ liNav.addContent(getNavSummaryLink(icd, true)); ++ return; + } ++ icd = icd.superclass(); + } +- printNavSummaryLink(null, false); ++ liNav.addContent(getNavSummaryLink(null, false)); + } + + protected void serialWarning(SourcePosition pos, String key, String a1, String a2) { +@@ -453,12 +549,109 @@ + } + + /** +- * {@inheritDoc} ++ * Add the member summary for the given class. ++ * ++ * @param classDoc the class that is being documented ++ * @param member the member being documented ++ * @param firstSentenceTags the first sentence tags to be added to the summary ++ * @param tableTree the content tree to which the documentation will be added ++ * @param counter the counter for determing style for the table row + */ +- public void writeMemberSummary(ClassDoc classDoc, ProgramElementDoc member, +- Tag[] firstSentenceTags, boolean isFirst, boolean isLast) { +- writer.printSummaryLinkType(this, member); +- writeSummaryLink(classDoc, member); +- writer.printSummaryLinkComment(this, member, firstSentenceTags); ++ public void addMemberSummary(ClassDoc classDoc, ProgramElementDoc member, ++ Tag[] firstSentenceTags, Content tableTree, int counter) { ++ HtmlTree tdSummaryType = new HtmlTree(HtmlTag.TD); ++ tdSummaryType.addStyle(HtmlStyle.colFirst); ++ writer.addSummaryType(this, member, tdSummaryType); ++ HtmlTree tdSummary = new HtmlTree(HtmlTag.TD); ++ setSummaryColumnStyle(tdSummary); ++ addSummaryLink(classDoc, member, tdSummary); ++ writer.addSummaryLinkComment(this, member, firstSentenceTags, tdSummary); ++ HtmlTree tr = HtmlTree.TR(tdSummaryType); ++ tr.addContent(tdSummary); ++ if (counter%2 == 0) ++ tr.addStyle(HtmlStyle.altColor); ++ else ++ tr.addStyle(HtmlStyle.rowColor); ++ tableTree.addContent(tr); ++ } ++ ++ /** ++ * Set the style for the summary column. ++ * ++ * @param tdTree the column for which the style will be set ++ */ ++ public void setSummaryColumnStyle(HtmlTree tdTree) { ++ tdTree.addStyle(HtmlStyle.colLast); ++ } ++ ++ /** ++ * Add inherited member summary for the given class and member. ++ * ++ * @param classDoc the class the inherited member belongs to ++ * @param nestedClass the inherited member that is summarized ++ * @param isFirst true if this is the first member in the list ++ * @param isLast true if this is the last member in the list ++ * @param linksTree the content tree to which the summary will be added ++ */ ++ public void addInheritedMemberSummary(ClassDoc classDoc, ++ ProgramElementDoc nestedClass, boolean isFirst, boolean isLast, ++ Content linksTree) { ++ writer.addInheritedMemberSummary(this, classDoc, nestedClass, isFirst, ++ linksTree); ++ } ++ ++ /** ++ * Get the inherited summary header for the given class. ++ * ++ * @param classDoc the class the inherited member belongs to ++ * @return a content tree for the inherited summary header ++ */ ++ public Content getInheritedSummaryHeader(ClassDoc classDoc) { ++ Content inheritedTree = writer.getMemberTreeHeader(); ++ writer.addInheritedSummaryHeader(this, classDoc, inheritedTree); ++ return inheritedTree; ++ } ++ ++ /** ++ * Get the inherited summary links tree. ++ * ++ * @return a content tree for the inherited summary links ++ */ ++ public Content getInheritedSummaryLinksTree() { ++ return new HtmlTree(HtmlTag.CODE); ++ } ++ ++ /** ++ * Get the summary table tree for the given class. ++ * ++ * @param classDoc the class for which the summary table is generated ++ * @return a content tree for the summary table ++ */ ++ public Content getSummaryTableTree(ClassDoc classDoc) { ++ return writer.getSummaryTableTree(this, classDoc); ++ } ++ ++ /** ++ * Get the member tree to be documented. ++ * ++ * @param memberTree the content tree of member to be documented ++ * @return a content tree that will be added to the class documentation ++ */ ++ public Content getMemberTree(Content memberTree) { ++ return writer.getMemberTree(memberTree); ++ } ++ ++ /** ++ * Get the member tree to be documented. ++ * ++ * @param memberTree the content tree of member to be documented ++ * @param isLastContent true if the content to be added is the last content ++ * @return a content tree that will be added to the class documentation ++ */ ++ public Content getMemberTree(Content memberTree, boolean isLastContent) { ++ if (isLastContent) ++ return HtmlTree.UL(HtmlStyle.blockListLast, memberTree); ++ else ++ return HtmlTree.UL(HtmlStyle.blockList, memberTree); + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java +@@ -25,9 +25,11 @@ + + package com.sun.tools.doclets.formats.html; + +-import com.sun.javadoc.*; + import java.io.*; + import java.util.*; ++import com.sun.javadoc.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.tools.doclets.internal.toolkit.*; + + /** + * Abstract class to generate the overview files in +@@ -56,105 +58,127 @@ + packages = configuration.packages; + } + +- protected abstract void printNavigationBarHeader(); +- +- protected abstract void printNavigationBarFooter(); +- +- protected abstract void printOverviewHeader(); +- +- protected abstract void printIndexHeader(String text, String tableSummary); +- +- protected abstract void printIndexRow(PackageDoc pkg); +- +- protected abstract void printIndexFooter(); ++ /** ++ * Adds the navigation bar header to the documentation tree. ++ * ++ * @param body the document tree to which the navigation bar header will be added ++ */ ++ protected abstract void addNavigationBarHeader(Content body); + + /** +- * Generate the contants in the package index file. Call appropriate ++ * Adds the navigation bar footer to the documentation tree. ++ * ++ * @param body the document tree to which the navigation bar footer will be added ++ */ ++ protected abstract void addNavigationBarFooter(Content body); ++ ++ /** ++ * Adds the overview header to the documentation tree. ++ * ++ * @param body the document tree to which the overview header will be added ++ */ ++ protected abstract void addOverviewHeader(Content body); ++ ++ /** ++ * Adds the packages list to the documentation tree. ++ * ++ * @param packages an array of packagedoc objects ++ * @param text caption for the table ++ * @param tableSummary summary for the table ++ * @param body the document tree to which the packages list will be added ++ */ ++ protected abstract void addPackagesList(PackageDoc[] packages, String text, ++ String tableSummary, Content body); ++ ++ /** ++ * Generate and prints the contents in the package index file. Call appropriate + * methods from the sub-class in order to generate Frame or Non + * Frame format. ++ * + * @param title the title of the window. + * @param includeScript boolean set true if windowtitle script is to be included + */ +- protected void generatePackageIndexFile(String title, boolean includeScript) throws IOException { ++ protected void buildPackageIndexFile(String title, boolean includeScript) throws IOException { + String windowOverview = configuration.getText(title); +- printHtmlHeader(windowOverview, +- configuration.metakeywords.getOverviewMetaKeywords(title, +- configuration.doctitle), +- includeScript); +- printNavigationBarHeader(); +- printOverviewHeader(); +- +- generateIndex(); +- +- printOverview(); +- +- printNavigationBarFooter(); +- printBodyHtmlEnd(); ++ Content body = getBody(includeScript, getWindowTitle(windowOverview)); ++ addNavigationBarHeader(body); ++ addOverviewHeader(body); ++ addIndex(body); ++ addOverview(body); ++ addNavigationBarFooter(body); ++ printHtmlDocument(configuration.metakeywords.getOverviewMetaKeywords(title, ++ configuration.doctitle), includeScript, body); + } + + /** +- * Default to no overview, overwrite to add overview. ++ * Default to no overview, override to add overview. ++ * ++ * @param body the document tree to which the overview will be added + */ +- protected void printOverview() throws IOException { ++ protected void addOverview(Content body) throws IOException { + } + + /** +- * Generate the frame or non-frame package index. ++ * Adds the frame or non-frame package index to the documentation tree. ++ * ++ * @param body the document tree to which the index will be added + */ +- protected void generateIndex() { +- printIndexContents(packages, "doclet.Package_Summary", ++ protected void addIndex(Content body) { ++ addIndexContents(packages, "doclet.Package_Summary", + configuration.getText("doclet.Member_Table_Summary", + configuration.getText("doclet.Package_Summary"), +- configuration.getText("doclet.packages"))); ++ configuration.getText("doclet.packages")), body); + } + + /** +- * Generate code for package index contents. Call appropriate methods from +- * the sub-classes. ++ * Adds package index contents. Call appropriate methods from ++ * the sub-classes. Adds it to the body HtmlTree + * +- * @param packages Array of packages to be documented. +- * @param text String which will be used as the heading. ++ * @param packages array of packages to be documented ++ * @param text string which will be used as the heading ++ * @param tableSummary summary for the table ++ * @param body the document tree to which the index contents will be added + */ +- protected void printIndexContents(PackageDoc[] packages, String text, String tableSummary) { ++ protected void addIndexContents(PackageDoc[] packages, String text, ++ String tableSummary, Content body) { + if (packages.length > 0) { + Arrays.sort(packages); +- printIndexHeader(text, tableSummary); +- printAllClassesPackagesLink(); +- for(int i = 0; i < packages.length; i++) { +- if (packages[i] != null) { +- printIndexRow(packages[i]); +- } +- } +- printIndexFooter(); ++ addAllClassesLink(body); ++ addPackagesList(packages, text, tableSummary, body); + } + } + + /** +- * Print the doctitle, if it is specified on the command line. ++ * Adds the doctitle to the documentation tree, if it is specified on the command line. ++ * ++ * @param body the document tree to which the title will be added + */ +- protected void printConfigurationTitle() { ++ protected void addConfigurationTitle(Content body) { + if (configuration.doctitle.length() > 0) { +- center(); +- h1(configuration.doctitle); +- centerEnd(); ++ Content title = new RawHtml(configuration.doctitle); ++ Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, ++ HtmlStyle.title, title); ++ Content div = HtmlTree.DIV(HtmlStyle.header, heading); ++ body.addContent(div); + } + } + + /** +- * Highlight "Overview" in the strong format, in the navigation bar as this +- * is the overview page. ++ * Returns highlighted "Overview", in the navigation bar as this is the ++ * overview page. ++ * ++ * @return a Content object to be added to the documentation tree + */ +- protected void navLinkContents() { +- navCellRevStart(); +- fontStyle("NavBarFont1Rev"); +- strongText("doclet.Overview"); +- fontEnd(); +- navCellEnd(); ++ protected Content getNavLinkContents() { ++ Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, overviewLabel); ++ return li; + } + + /** + * Do nothing. This will be overridden in PackageIndexFrameWriter. ++ * ++ * @param body the document tree to which the all classes link will be added + */ +- protected void printAllClassesPackagesLink() { ++ protected void addAllClassesLink(Content body) { + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java +@@ -25,11 +25,12 @@ + + package com.sun.tools.doclets.formats.html; + +-import com.sun.tools.doclets.internal.toolkit.util.*; +- +-import com.sun.javadoc.*; + import java.io.*; + import java.util.*; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.doclets.internal.toolkit.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.javadoc.*; + + /** + * Abstract class to print the class hierarchy page for all the Classes. This +@@ -46,6 +47,8 @@ + */ + protected final ClassTree classtree; + ++ private static final String LI_CIRCLE = "circle"; ++ + /** + * Constructor initilises classtree variable. This constructor will be used + * while generating global tree file "overview-tree.html". +@@ -87,55 +90,64 @@ + } + + /** +- * Generate each level of the class tree. For each sub-class or ++ * Add each level of the class tree. For each sub-class or + * sub-interface indents the next level information. +- * Recurses itself to generate subclasses info. +- * To iterate is human, to recurse is divine - L. Peter Deutsch. ++ * Recurses itself to add subclasses info. + * +- * @param parent the superclass or superinterface of the list. +- * @param list list of the sub-classes at this level. +- * @param isEnum true if we are generating a tree for enums. ++ * @param parent the superclass or superinterface of the list ++ * @param list list of the sub-classes at this level ++ * @param isEnum true if we are generating a tree for enums ++ * @param contentTree the content tree to which the level information will be added + */ +- protected void generateLevelInfo(ClassDoc parent, List list, +- boolean isEnum) { +- if (list.size() > 0) { +- ul(); +- for (int i = 0; i < list.size(); i++) { ++ protected void addLevelInfo(ClassDoc parent, List<ClassDoc> list, ++ boolean isEnum, Content contentTree) { ++ int size = list.size(); ++ if (size > 0) { ++ Content ul = new HtmlTree(HtmlTag.UL); ++ for (int i = 0; i < size; i++) { + ClassDoc local = (ClassDoc)list.get(i); +- printPartialInfo(local); +- printExtendsImplements(parent, local); +- generateLevelInfo(local, classtree.subs(local, isEnum), +- isEnum); // Recurse ++ HtmlTree li = new HtmlTree(HtmlTag.LI); ++ li.addAttr(HtmlAttr.TYPE, LI_CIRCLE); ++ addPartialInfo(local, li); ++ addExtendsImplements(parent, local, li); ++ addLevelInfo(local, classtree.subs(local, isEnum), ++ isEnum, li); // Recurse ++ ul.addContent(li); + } +- ulEnd(); ++ contentTree.addContent(ul); + } + } + + /** +- * Generate the heading for the tree depending upon tree type if it's a +- * Class Tree or Interface tree and also print the tree. ++ * Add the heading for the tree depending upon tree type if it's a ++ * Class Tree or Interface tree. + * + * @param list List of classes which are at the most base level, all the +- * other classes in this run will derive from these classes. +- * @param heading Heading for the tree. ++ * other classes in this run will derive from these classes ++ * @param heading heading for the tree ++ * @param div the content tree to which the tree will be added + */ +- protected void generateTree(List list, String heading) { ++ protected void addTree(List<ClassDoc> list, String heading, Content div) { + if (list.size() > 0) { + ClassDoc firstClassDoc = (ClassDoc)list.get(0); +- printTreeHeading(heading); +- generateLevelInfo(!firstClassDoc.isInterface()? firstClassDoc : null, +- list, +- list == classtree.baseEnums()); ++ Content headingContent = getResource(heading); ++ div.addContent(HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, true, ++ headingContent)); ++ addLevelInfo(!firstClassDoc.isInterface()? firstClassDoc : null, ++ list, list == classtree.baseEnums(), div); + } + } + + /** +- * Print the information regarding the classes which this class extends or ++ * Add information regarding the classes which this class extends or + * implements. + * +- * @param cd The classdoc under consideration. ++ * @param parent the parent class of the class being documented ++ * @param cd the classdoc under consideration ++ * @param contentTree the content tree to which the information will be added + */ +- protected void printExtendsImplements(ClassDoc parent, ClassDoc cd) { ++ protected void addExtendsImplements(ClassDoc parent, ClassDoc cd, ++ Content contentTree) { + ClassDoc[] interfaces = cd.interfaces(); + if (interfaces.length > (cd.isInterface()? 1 : 0)) { + Arrays.sort(interfaces); +@@ -148,53 +160,43 @@ + } + if (counter == 0) { + if (cd.isInterface()) { +- print(" (" + configuration.getText("doclet.also") + " extends "); ++ contentTree.addContent(" ("); ++ contentTree.addContent(getResource("doclet.also")); ++ contentTree.addContent(" extends "); + } else { +- print(" (implements "); ++ contentTree.addContent(" (implements "); + } + } else { +- print(", "); ++ contentTree.addContent(", "); + } +- printPreQualifiedClassLink(LinkInfoImpl.CONTEXT_TREE, +- interfaces[i]); ++ addPreQualifiedClassLink(LinkInfoImpl.CONTEXT_TREE, ++ interfaces[i], contentTree); + counter++; + } + } + if (counter > 0) { +- println(")"); ++ contentTree.addContent(")"); + } + } + } + + /** +- * Print information about the class kind, if it's a "class" or "interface". ++ * Add information about the class kind, if it's a "class" or "interface". + * +- * @param cd classdoc. ++ * @param cd the class being documented ++ * @param contentTree the content tree to which the information will be added + */ +- protected void printPartialInfo(ClassDoc cd) { +- li("circle"); +- printPreQualifiedStrongClassLink(LinkInfoImpl.CONTEXT_TREE, cd); ++ protected void addPartialInfo(ClassDoc cd, Content contentTree) { ++ addPreQualifiedStrongClassLink(LinkInfoImpl.CONTEXT_TREE, cd, contentTree); + } + + /** +- * Print the heading for the tree. ++ * Get the tree label for the navigation bar. + * +- * @param heading Heading for the tree. ++ * @return a content tree for the tree label + */ +- protected void printTreeHeading(String heading) { +- h2(); +- println(configuration.getText(heading)); +- h2End(); +- } +- +- /** +- * Highlight "Tree" word in the navigation bar, since this is the tree page. +- */ +- protected void navLinkTree() { +- navCellRevStart(); +- fontStyle("NavBarFont1Rev"); +- strongText("doclet.Tree"); +- fontEnd(); +- navCellEnd(); ++ protected Content getNavLinkTree() { ++ Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, treeLabel); ++ return li; + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java +@@ -25,11 +25,14 @@ + + package com.sun.tools.doclets.formats.html; + +-import com.sun.tools.doclets.internal.toolkit.util.*; +-import com.sun.javadoc.*; + import java.io.*; + import java.util.*; + ++import com.sun.javadoc.*; ++import com.sun.tools.doclets.internal.toolkit.*; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++ + /** + * Generate the file with list of all the classes in this run. This page will be + * used in the left-hand bottom frame, when "All Classes" link is clicked in +@@ -38,6 +41,7 @@ + * + * @author Atul M Dambalkar + * @author Doug Kramer ++ * @author Bhavesh Patel (Modified) + */ + public class AllClassesFrameWriter extends HtmlDocletWriter { + +@@ -57,6 +61,11 @@ + protected IndexBuilder indexbuilder; + + /** ++ * BR tag to be used within a document tree. ++ */ ++ final HtmlTree BR = new HtmlTree(HtmlTag.BR); ++ ++ /** + * Construct AllClassesFrameWriter object. Also initilises the indexbuilder + * variable in this class. + * @throws IOException +@@ -84,12 +93,12 @@ + try { + allclassgen = new AllClassesFrameWriter(configuration, + filename, indexbuilder); +- allclassgen.generateAllClassesFile(true); ++ allclassgen.buildAllClassesFile(true); + allclassgen.close(); + filename = OUTPUT_FILE_NAME_NOFRAMES; + allclassgen = new AllClassesFrameWriter(configuration, + filename, indexbuilder); +- allclassgen.generateAllClassesFile(false); ++ allclassgen.buildAllClassesFile(false); + allclassgen.close(); + } catch (IOException exc) { + configuration.standardmessage. +@@ -100,30 +109,34 @@ + } + + /** +- * Print all the classes in table format in the file. ++ * Print all the classes in the file. + * @param wantFrames True if we want frames. + */ +- protected void generateAllClassesFile(boolean wantFrames) throws IOException { ++ protected void buildAllClassesFile(boolean wantFrames) throws IOException { + String label = configuration.getText("doclet.All_Classes"); +- +- printHtmlHeader(label, null, false); +- +- printAllClassesTableHeader(); +- printAllClasses(wantFrames); +- printAllClassesTableFooter(); +- +- printBodyHtmlEnd(); ++ Content body = getBody(false, getWindowTitle(label)); ++ Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, ++ HtmlStyle.bar, allclassesLabel); ++ body.addContent(heading); ++ Content ul = new HtmlTree(HtmlTag.UL); ++ // Generate the class links and add it to the tdFont tree. ++ addAllClasses(ul, wantFrames); ++ Content div = HtmlTree.DIV(HtmlStyle.indexContainer, ul); ++ body.addContent(div); ++ printHtmlDocument(null, false, body); + } + + /** +- * Use the sorted index of all the classes and print all the classes. ++ * Use the sorted index of all the classes and add all the classes to the ++ * content list. + * ++ * @param content HtmlTree content to which all classes information will be added + * @param wantFrames True if we want frames. + */ +- protected void printAllClasses(boolean wantFrames) { ++ protected void addAllClasses(Content content, boolean wantFrames) { + for (int i = 0; i < indexbuilder.elements().length; i++) { + Character unicode = (Character)((indexbuilder.elements())[i]); +- generateContents(indexbuilder.getMemberList(unicode), wantFrames); ++ addContents(indexbuilder.getMemberList(unicode), wantFrames, content); + } + } + +@@ -136,46 +149,25 @@ + * + * @param classlist Sorted list of classes. + * @param wantFrames True if we want frames. ++ * @param content HtmlTree content to which the links will be added + */ +- protected void generateContents(List classlist, boolean wantFrames) { ++ protected void addContents(List<Doc> classlist, boolean wantFrames, ++ Content content) { + for (int i = 0; i < classlist.size(); i++) { + ClassDoc cd = (ClassDoc)(classlist.get(i)); + if (!Util.isCoreClass(cd)) { + continue; + } + String label = italicsClassName(cd, false); ++ Content linkContent; + if(wantFrames){ +- printLink(new LinkInfoImpl(LinkInfoImpl.ALL_CLASSES_FRAME, cd, +- label, "classFrame") +- ); ++ linkContent = new RawHtml(getLink(new LinkInfoImpl( ++ LinkInfoImpl.ALL_CLASSES_FRAME, cd, label, "classFrame"))); + } else { +- printLink(new LinkInfoImpl(cd, label)); ++ linkContent = new RawHtml(getLink(new LinkInfoImpl(cd, label))); + } +- br(); ++ Content li = HtmlTree.LI(linkContent); ++ content.addContent(li); + } + } +- +- /** +- * Print the heading "All Classes" and also print Html table tag. +- */ +- protected void printAllClassesTableHeader() { +- fontSizeStyle("+1", "FrameHeadingFont"); +- strongText("doclet.All_Classes"); +- fontEnd(); +- br(); +- table(); +- tr(); +- tdNowrap(); +- fontStyle("FrameItemFont"); +- } +- +- /** +- * Print Html closing table tag. +- */ +- protected void printAllClassesTableFooter() { +- fontEnd(); +- tdEnd(); +- trEnd(); +- tableEnd(); +- } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java +@@ -28,6 +28,7 @@ + import java.io.*; + + import com.sun.javadoc.*; ++import com.sun.tools.doclets.formats.html.markup.*; + import com.sun.tools.doclets.internal.toolkit.*; + + /** +@@ -54,29 +55,26 @@ + /** + * {@inheritDoc} + */ +- public void writeMemberSummaryHeader(ClassDoc classDoc) { +- writer.println("<!-- =========== ANNOTATION TYPE OPTIONAL MEMBER SUMMARY =========== -->"); +- writer.println(); +- writer.printSummaryHeader(this, classDoc); ++ public Content getMemberSummaryHeader(ClassDoc classDoc, ++ Content memberSummaryTree) { ++ memberSummaryTree.addContent( ++ HtmlConstants.START_OF_ANNOTATION_TYPE_OPTIONAL_MEMBER_SUMMARY); ++ Content memberTree = writer.getMemberTreeHeader(); ++ writer.addSummaryHeader(this, classDoc, memberTree); ++ return memberTree; + } + + /** + * {@inheritDoc} + */ +- public void writeDefaultValueInfo(MemberDoc member) { ++ public void addDefaultValueInfo(MemberDoc member, Content annotationDocTree) { + if (((AnnotationTypeElementDoc) member).defaultValue() != null) { +- writer.printMemberDetailsListStartTag(); +- writer.dd(); +- writer.dl(); +- writer.dt(); +- writer.strong(ConfigurationImpl.getInstance(). +- getText("doclet.Default")); +- writer.dtEnd(); +- writer.dd(); +- writer.print(((AnnotationTypeElementDoc) member).defaultValue()); +- writer.ddEnd(); +- writer.dlEnd(); +- writer.ddEnd(); ++ Content dt = HtmlTree.DT(writer.getResource("doclet.Default")); ++ Content dl = HtmlTree.DL(dt); ++ Content dd = HtmlTree.DD(new StringContent( ++ ((AnnotationTypeElementDoc) member).defaultValue().toString())); ++ dl.addContent(dd); ++ annotationDocTree.addContent(dl); + } + } + +@@ -90,45 +88,58 @@ + /** + * {@inheritDoc} + */ +- public void printSummaryLabel() { +- writer.printText("doclet.Annotation_Type_Optional_Member_Summary"); ++ public void addSummaryLabel(Content memberTree) { ++ Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING, ++ writer.getResource("doclet.Annotation_Type_Optional_Member_Summary")); ++ memberTree.addContent(label); + } + + /** + * {@inheritDoc} + */ +- public void printTableSummary() { +- writer.tableIndexSummary(configuration().getText("doclet.Member_Table_Summary", ++ public String getTableSummary() { ++ return configuration().getText("doclet.Member_Table_Summary", + configuration().getText("doclet.Annotation_Type_Optional_Member_Summary"), +- configuration().getText("doclet.annotation_type_optional_members"))); ++ configuration().getText("doclet.annotation_type_optional_members")); + } + +- public void printSummaryTableHeader(ProgramElementDoc member) { ++ /** ++ * {@inheritDoc} ++ */ ++ public String getCaption() { ++ return configuration().getText("doclet.Annotation_Type_Optional_Members"); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String[] getSummaryTableHeader(ProgramElementDoc member) { + String[] header = new String[] { + writer.getModifierTypeHeader(), + configuration().getText("doclet.0_and_1", + configuration().getText("doclet.Annotation_Type_Optional_Member"), + configuration().getText("doclet.Description")) + }; +- writer.summaryTableHeader(header, "col"); ++ return header; + } + + /** + * {@inheritDoc} + */ +- public void printSummaryAnchor(ClassDoc cd) { +- writer.anchor("annotation_type_optional_element_summary"); ++ public void addSummaryAnchor(ClassDoc cd, Content memberTree) { ++ memberTree.addContent(writer.getMarkerAnchor( ++ "annotation_type_optional_element_summary")); + } + + /** + * {@inheritDoc} + */ +- protected void printNavSummaryLink(ClassDoc cd, boolean link) { ++ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { + if (link) { +- writer.printHyperLink("", "annotation_type_optional_element_summary", +- configuration().getText("doclet.navAnnotationTypeOptionalMember")); ++ return writer.getHyperLink("", "annotation_type_optional_element_summary", ++ writer.getResource("doclet.navAnnotationTypeOptionalMember")); + } else { +- writer.printText("doclet.navAnnotationTypeOptionalMember"); ++ return writer.getResource("doclet.navAnnotationTypeOptionalMember"); + } + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java +@@ -28,6 +28,7 @@ + import java.io.*; + + import com.sun.javadoc.*; ++import com.sun.tools.doclets.formats.html.markup.*; + import com.sun.tools.doclets.internal.toolkit.*; + + /** +@@ -51,122 +52,102 @@ + } + + /** +- * Write the annotation type member summary header for the given class. +- * +- * @param classDoc the class the summary belongs to. ++ * {@inheritDoc} + */ +- public void writeMemberSummaryHeader(ClassDoc classDoc) { +- writer.println("<!-- =========== ANNOTATION TYPE REQUIRED MEMBER SUMMARY =========== -->"); +- writer.println(); +- writer.printSummaryHeader(this, classDoc); +- } +- +- /** +- * Write the annotation type member summary footer for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeMemberSummaryFooter(ClassDoc classDoc) { +- writer.printSummaryFooter(this, classDoc); ++ public Content getMemberSummaryHeader(ClassDoc classDoc, ++ Content memberSummaryTree) { ++ memberSummaryTree.addContent( ++ HtmlConstants.START_OF_ANNOTATION_TYPE_REQUIRED_MEMBER_SUMMARY); ++ Content memberTree = writer.getMemberTreeHeader(); ++ writer.addSummaryHeader(this, classDoc, memberTree); ++ return memberTree; + } + + /** + * {@inheritDoc} + */ +- public void writeInheritedMemberSummaryHeader(ClassDoc classDoc) { +- //Not appliable. ++ public void addAnnotationDetailsTreeHeader(ClassDoc classDoc, ++ Content memberDetailsTree) { ++ if (!writer.printedAnnotationHeading) { ++ memberDetailsTree.addContent(writer.getMarkerAnchor( ++ "annotation_type_element_detail")); ++ Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, ++ writer.annotationTypeDetailsLabel); ++ memberDetailsTree.addContent(heading); ++ writer.printedAnnotationHeading = true; ++ } + } + + /** + * {@inheritDoc} + */ +- public void writeInheritedMemberSummary(ClassDoc classDoc, +- ProgramElementDoc member, boolean isFirst, boolean isLast) { +- //Not appliable. ++ public Content getAnnotationDocTreeHeader(MemberDoc member, ++ Content annotationDetailsTree) { ++ annotationDetailsTree.addContent( ++ writer.getMarkerAnchor(member.name() + ++ ((ExecutableMemberDoc) member).signature())); ++ Content annotationDocTree = writer.getMemberTreeHeader(); ++ Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); ++ heading.addContent(member.name()); ++ annotationDocTree.addContent(heading); ++ return annotationDocTree; + } + + /** + * {@inheritDoc} + */ +- public void writeInheritedMemberSummaryFooter(ClassDoc classDoc) { +- //Not appliable. ++ public Content getSignature(MemberDoc member) { ++ Content pre = new HtmlTree(HtmlTag.PRE); ++ writer.addAnnotationInfo(member, pre); ++ addModifiers(member, pre); ++ Content link = new RawHtml( ++ writer.getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, ++ getType(member)))); ++ pre.addContent(link); ++ pre.addContent(writer.getSpace()); ++ if (configuration().linksource) { ++ Content memberName = new StringContent(member.name()); ++ writer.addSrcLink(member, memberName, pre); ++ } else { ++ addName(member.name(), pre); ++ } ++ return pre; + } + + /** + * {@inheritDoc} + */ +- public void writeHeader(ClassDoc classDoc, String header) { +- writer.println(); +- writer.println("<!-- ============ ANNOTATION TYPE MEMBER DETAIL =========== -->"); +- writer.println(); +- writer.anchor("annotation_type_element_detail"); +- writer.printTableHeadingBackground(header); +- writer.println(); ++ public void addDeprecated(MemberDoc member, Content annotationDocTree) { ++ addDeprecatedInfo(member, annotationDocTree); + } + + /** + * {@inheritDoc} + */ +- public void writeMemberHeader(MemberDoc member, boolean isFirst) { +- if (! isFirst) { +- writer.printMemberHeader(); +- writer.println(""); +- } +- writer.anchor(member.name() + ((ExecutableMemberDoc) member).signature()); +- writer.h3(); +- writer.print(member.name()); +- writer.h3End(); ++ public void addComments(MemberDoc member, Content annotationDocTree) { ++ addComment(member, annotationDocTree); + } + + /** + * {@inheritDoc} + */ +- public void writeSignature(MemberDoc member) { +- writer.pre(); +- writer.writeAnnotationInfo(member); +- printModifiers(member); +- writer.printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, +- getType(member))); +- print(' '); +- if (configuration().linksource) { +- writer.printSrcLink(member, member.name()); +- } else { +- strong(member.name()); +- } +- writer.preEnd(); +- assert !writer.getMemberDetailsListPrinted(); ++ public void addTags(MemberDoc member, Content annotationDocTree) { ++ writer.addTagsInfo(member, annotationDocTree); + } + + /** + * {@inheritDoc} + */ +- public void writeComments(MemberDoc member) { +- printComment(member); ++ public Content getAnnotationDetails(Content annotationDetailsTree) { ++ return getMemberTree(annotationDetailsTree); + } + + /** +- * Write the tag output for the given member. +- * +- * @param member the member being documented. ++ * {@inheritDoc} + */ +- public void writeTags(MemberDoc member) { +- writer.printTags(member); +- } +- +- /** +- * Write the annotation type member footer. +- */ +- public void writeMemberFooter() { +- printMemberFooter(); +- } +- +- /** +- * Write the footer for the annotation type member documentation. +- * +- * @param classDoc the class that the annotation type member belong to. +- */ +- public void writeFooter(ClassDoc classDoc) { +- //No footer to write for annotation type member documentation ++ public Content getAnnotationDoc(Content annotationDocTree, ++ boolean isLastContent) { ++ return getMemberTree(annotationDocTree, isLastContent); + } + + /** +@@ -179,113 +160,120 @@ + /** + * {@inheritDoc} + */ +- public void printSummaryLabel() { +- writer.printText("doclet.Annotation_Type_Required_Member_Summary"); ++ public void addSummaryLabel(Content memberTree) { ++ Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING, ++ writer.getResource("doclet.Annotation_Type_Required_Member_Summary")); ++ memberTree.addContent(label); + } + + /** + * {@inheritDoc} + */ +- public void printTableSummary() { +- writer.tableIndexSummary(configuration().getText("doclet.Member_Table_Summary", ++ public String getTableSummary() { ++ return configuration().getText("doclet.Member_Table_Summary", + configuration().getText("doclet.Annotation_Type_Required_Member_Summary"), +- configuration().getText("doclet.annotation_type_required_members"))); ++ configuration().getText("doclet.annotation_type_required_members")); + } + +- public void printSummaryTableHeader(ProgramElementDoc member) { ++ /** ++ * {@inheritDoc} ++ */ ++ public String getCaption() { ++ return configuration().getText("doclet.Annotation_Type_Required_Members"); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String[] getSummaryTableHeader(ProgramElementDoc member) { + String[] header = new String[] { + writer.getModifierTypeHeader(), + configuration().getText("doclet.0_and_1", + configuration().getText("doclet.Annotation_Type_Required_Member"), + configuration().getText("doclet.Description")) + }; +- writer.summaryTableHeader(header, "col"); ++ return header; + } + + /** + * {@inheritDoc} + */ +- public void printSummaryAnchor(ClassDoc cd) { +- writer.anchor("annotation_type_required_element_summary"); ++ public void addSummaryAnchor(ClassDoc cd, Content memberTree) { ++ memberTree.addContent(writer.getMarkerAnchor( ++ "annotation_type_required_element_summary")); + } + + /** + * {@inheritDoc} + */ +- public void printInheritedSummaryAnchor(ClassDoc cd) { +- } // no such +- +- /** +- * {@inheritDoc} +- */ +- public void printInheritedSummaryLabel(ClassDoc cd) { +- // no such ++ public void addInheritedSummaryAnchor(ClassDoc cd, Content inheritedTree) { + } + + /** + * {@inheritDoc} + */ +- protected void writeSummaryLink(int context, ClassDoc cd, ProgramElementDoc member) { +- writer.strong(); +- writer.printDocLink(context, (MemberDoc) member, member.name(), false); +- writer.strongEnd(); ++ public void addInheritedSummaryLabel(ClassDoc cd, Content inheritedTree) { + } + + /** + * {@inheritDoc} + */ +- protected void writeInheritedSummaryLink(ClassDoc cd, +- ProgramElementDoc member) { ++ protected void addSummaryLink(int context, ClassDoc cd, ProgramElementDoc member, ++ Content tdSummary) { ++ Content strong = HtmlTree.STRONG(new RawHtml( ++ writer.getDocLink(context, (MemberDoc) member, member.name(), false))); ++ Content code = HtmlTree.CODE(strong); ++ tdSummary.addContent(code); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addInheritedSummaryLink(ClassDoc cd, ++ ProgramElementDoc member, Content linksTree) { + //Not applicable. + } + + /** + * {@inheritDoc} + */ +- protected void printSummaryType(ProgramElementDoc member) { ++ protected void addSummaryType(ProgramElementDoc member, Content tdSummaryType) { + MemberDoc m = (MemberDoc)member; +- printModifierAndType(m, getType(m)); ++ addModifierAndType(m, getType(m), tdSummaryType); + } + + /** + * {@inheritDoc} + */ +- protected void writeDeprecatedLink(ProgramElementDoc member) { +- writer.printDocLink(LinkInfoImpl.CONTEXT_MEMBER, +- (MemberDoc) member, ((MemberDoc)member).qualifiedName(), false); ++ protected Content getDeprecatedLink(ProgramElementDoc member) { ++ return writer.getDocLink(LinkInfoImpl.CONTEXT_MEMBER, ++ (MemberDoc) member, ((MemberDoc)member).qualifiedName()); + } + + /** + * {@inheritDoc} + */ +- protected void printNavSummaryLink(ClassDoc cd, boolean link) { ++ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { + if (link) { +- writer.printHyperLink("", "annotation_type_required_element_summary", +- configuration().getText("doclet.navAnnotationTypeRequiredMember")); ++ return writer.getHyperLink("", "annotation_type_required_element_summary", ++ writer.getResource("doclet.navAnnotationTypeRequiredMember")); + } else { +- writer.printText("doclet.navAnnotationTypeRequiredMember"); ++ return writer.getResource("doclet.navAnnotationTypeRequiredMember"); + } + } + + /** + * {@inheritDoc} + */ +- protected void printNavDetailLink(boolean link) { ++ protected void addNavDetailLink(boolean link, Content liNav) { + if (link) { +- writer.printHyperLink("", "annotation_type_element_detail", +- configuration().getText("doclet.navAnnotationTypeMember")); ++ liNav.addContent(writer.getHyperLink("", "annotation_type_element_detail", ++ writer.getResource("doclet.navAnnotationTypeMember"))); + } else { +- writer.printText("doclet.navAnnotationTypeMember"); ++ liNav.addContent(writer.getResource("doclet.navAnnotationTypeMember")); + } + } + +- /** +- * {@inheritDoc} +- */ +- public void writeDeprecated(MemberDoc member) { +- printDeprecated(member); +- } +- + private Type getType(MemberDoc member) { + if (member instanceof FieldDoc) { + return ((FieldDoc) member).type(); +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java +@@ -29,6 +29,7 @@ + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.builders.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Generate the Class Information Page. +@@ -40,6 +41,7 @@ + * + * @author Atul M Dambalkar + * @author Robert Field ++ * @author Bhavesh Patel (Modified) + */ + public class AnnotationTypeWriterImpl extends SubWriterHolderWriter + implements AnnotationTypeWriter { +@@ -69,126 +71,168 @@ + } + + /** +- * Print this package link ++ * Get this package link. ++ * ++ * @return a content tree for the package link + */ +- protected void navLinkPackage() { +- navCellStart(); +- printHyperLink("package-summary.html", "", +- configuration.getText("doclet.Package"), true, "NavBarFont1"); +- navCellEnd(); ++ protected Content getNavLinkPackage() { ++ Content linkContent = getHyperLink("package-summary.html", "", ++ packageLabel); ++ Content li = HtmlTree.LI(linkContent); ++ return li; + } + + /** +- * Print class page indicator ++ * Get the class link. ++ * ++ * @return a content tree for the class link + */ +- protected void navLinkClass() { +- navCellRevStart(); +- fontStyle("NavBarFont1Rev"); +- strongText("doclet.Class"); +- fontEnd(); +- navCellEnd(); ++ protected Content getNavLinkClass() { ++ Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, classLabel); ++ return li; + } + + /** +- * Print class use link ++ * Get the class use link. ++ * ++ * @return a content tree for the class use link + */ +- protected void navLinkClassUse() { +- navCellStart(); +- printHyperLink("class-use/" + filename, "", +- configuration.getText("doclet.navClassUse"), true, "NavBarFont1"); +- navCellEnd(); ++ protected Content getNavLinkClassUse() { ++ Content linkContent = getHyperLink("class-use/" + filename, "", useLabel); ++ Content li = HtmlTree.LI(linkContent); ++ return li; + } + + /** +- * Print previous package link ++ * Get link to previous class. ++ * ++ * @return a content tree for the previous class link + */ +- protected void navLinkPrevious() { +- if (prev == null) { +- printText("doclet.Prev_Class"); +- } else { +- printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, +- prev.asClassDoc(), "", +- configuration.getText("doclet.Prev_Class"), true)); ++ public Content getNavLinkPrevious() { ++ Content li; ++ if (prev != null) { ++ Content prevLink = new RawHtml(getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CLASS, prev.asClassDoc(), "", ++ configuration.getText("doclet.Prev_Class"), true))); ++ li = HtmlTree.LI(prevLink); + } ++ else ++ li = HtmlTree.LI(prevclassLabel); ++ return li; + } + + /** +- * Print next package link ++ * Get link to next class. ++ * ++ * @return a content tree for the next class link + */ +- protected void navLinkNext() { +- if (next == null) { +- printText("doclet.Next_Class"); +- } else { +- printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, +- next.asClassDoc(), "", +- configuration.getText("doclet.Next_Class"), true)); ++ public Content getNavLinkNext() { ++ Content li; ++ if (next != null) { ++ Content nextLink = new RawHtml(getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CLASS, next.asClassDoc(), "", ++ configuration.getText("doclet.Next_Class"), true))); ++ li = HtmlTree.LI(nextLink); + } ++ else ++ li = HtmlTree.LI(nextclassLabel); ++ return li; + } + + /** + * {@inheritDoc} + */ +- public void writeHeader(String header) { +- ++ public Content getHeader(String header) { + String pkgname = (annotationType.containingPackage() != null)? + annotationType.containingPackage().name(): ""; + String clname = annotationType.name(); +- +- printHtmlHeader(clname, +- configuration.metakeywords.getMetaKeywords(annotationType), true); +- printTop(); +- navLinks(true); +- hr(); +- println("<!-- ======== START OF CLASS DATA ======== -->"); +- h2(); ++ Content bodyTree = getBody(true, getWindowTitle(clname)); ++ addTop(bodyTree); ++ addNavLinks(true, bodyTree); ++ bodyTree.addContent(HtmlConstants.START_OF_CLASS_DATA); ++ HtmlTree div = new HtmlTree(HtmlTag.DIV); ++ div.addStyle(HtmlStyle.header); + if (pkgname.length() > 0) { +- font("-1"); print(pkgname); fontEnd(); br(); ++ Content pkgNameContent = new StringContent(pkgname); ++ Content pkgNamePara = HtmlTree.P(HtmlStyle.subTitle, pkgNameContent); ++ div.addContent(pkgNamePara); + } +- print(header + getTypeParameterLinks(new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_CLASS_HEADER, +- annotationType, false))); +- h2End(); ++ LinkInfoImpl linkInfo = new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CLASS_HEADER, annotationType, false); ++ Content headerContent = new StringContent(header); ++ Content heading = HtmlTree.HEADING(HtmlConstants.CLASS_PAGE_HEADING, true, ++ HtmlStyle.title, headerContent); ++ heading.addContent(new RawHtml(getTypeParameterLinks(linkInfo))); ++ div.addContent(heading); ++ bodyTree.addContent(div); ++ return bodyTree; + } + + /** + * {@inheritDoc} + */ +- public void writeFooter() { +- println("<!-- ========= END OF CLASS DATA ========= -->"); +- hr(); +- navLinks(false); +- printBottom(); +- printBodyHtmlEnd(); ++ public Content getAnnotationContentHeader() { ++ return getContentHeader(); + } + + /** + * {@inheritDoc} + */ +- public void writeAnnotationTypeSignature(String modifiers) { +- preNoNewLine(); +- writeAnnotationInfo(annotationType); +- print(modifiers); +- String name = annotationType.name() + +- getTypeParameterLinks(new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_CLASS_SIGNATURE, annotationType, false)); +- if (configuration().linksource) { +- printSrcLink(annotationType, name); +- } else { +- strong(name); +- } +- preEnd(); +- p(); ++ public void addFooter(Content contentTree) { ++ contentTree.addContent(HtmlConstants.END_OF_CLASS_DATA); ++ addNavLinks(false, contentTree); ++ addBottom(contentTree); + } + + /** + * {@inheritDoc} + */ +- public void writeAnnotationTypeDescription() { ++ public void printDocument(Content contentTree) { ++ printHtmlDocument(configuration.metakeywords.getMetaKeywords(annotationType), ++ true, contentTree); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public Content getAnnotationInfoTreeHeader() { ++ return getMemberTreeHeader(); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public Content getAnnotationInfo(Content annotationInfoTree) { ++ return getMemberTree(HtmlStyle.description, annotationInfoTree); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void addAnnotationTypeSignature(String modifiers, Content annotationInfoTree) { ++ annotationInfoTree.addContent(new HtmlTree(HtmlTag.BR)); ++ Content pre = new HtmlTree(HtmlTag.PRE); ++ addAnnotationInfo(annotationType, pre); ++ pre.addContent(modifiers); ++ LinkInfoImpl linkInfo = new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CLASS_SIGNATURE, annotationType, false); ++ Content name = new RawHtml (annotationType.name() + ++ getTypeParameterLinks(linkInfo)); ++ if (configuration().linksource) { ++ addSrcLink(annotationType, name, pre); ++ } else { ++ pre.addContent(HtmlTree.STRONG(name)); ++ } ++ annotationInfoTree.addContent(pre); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void addAnnotationTypeDescription(Content annotationInfoTree) { + if(!configuration.nocomment) { +- // generate documentation for the class. + if (annotationType.inlineTags().length > 0) { +- printInlineComment(annotationType); +- p(); ++ addInlineComment(annotationType, annotationInfoTree); + } + } + } +@@ -196,148 +240,152 @@ + /** + * {@inheritDoc} + */ +- public void writeAnnotationTypeTagInfo() { +- boolean needHr = annotationType.elements().length > 0; ++ public void addAnnotationTypeTagInfo(Content annotationInfoTree) { + if(!configuration.nocomment) { +- // Print Information about all the tags here +- printTags(annotationType); +- if (needHr) { +- hr(); +- } +- p(); +- } else if (needHr) { +- hr(); ++ addTagsInfo(annotationType, annotationInfoTree); + } + } + + /** + * {@inheritDoc} + */ +- public void writeAnnotationTypeDeprecationInfo() { +- hr(); ++ public void addAnnotationTypeDeprecationInfo(Content annotationInfoTree) { ++ Content hr = new HtmlTree(HtmlTag.HR); ++ annotationInfoTree.addContent(hr); + Tag[] deprs = annotationType.tags("deprecated"); + if (Util.isDeprecated(annotationType)) { +- strongText("doclet.Deprecated"); ++ Content strong = HtmlTree.STRONG(deprecatedPhrase); ++ Content div = HtmlTree.DIV(HtmlStyle.block, strong); + if (deprs.length > 0) { + Tag[] commentTags = deprs[0].inlineTags(); + if (commentTags.length > 0) { +- +- space(); +- printInlineDeprecatedComment(annotationType, deprs[0]); ++ div.addContent(getSpace()); ++ addInlineDeprecatedComment(annotationType, deprs[0], div); + } + } +- p(); ++ annotationInfoTree.addContent(div); + } + } + +- protected void navLinkTree() { +- navCellStart(); +- printHyperLink("package-tree.html", "", +- configuration.getText("doclet.Tree"), true, "NavBarFont1"); +- navCellEnd(); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addAnnotationDetailsMarker(Content memberDetails) { ++ memberDetails.addContent(HtmlConstants.START_OF_ANNOTATION_TYPE_DETAILS); + } + +- protected void printSummaryDetailLinks() { ++ /** ++ * {@inheritDoc} ++ */ ++ protected Content getNavLinkTree() { ++ Content treeLinkContent = getHyperLink("package-tree.html", ++ "", treeLabel, "", ""); ++ Content li = HtmlTree.LI(treeLinkContent); ++ return li; ++ } ++ ++ /** ++ * Add summary details to the navigation bar. ++ * ++ * @param subDiv the content tree to which the summary detail links will be added ++ */ ++ protected void addSummaryDetailLinks(Content subDiv) { + try { +- tr(); +- tdVAlignClass("top", "NavBarCell3"); +- font("-2"); +- print(" "); +- navSummaryLinks(); +- fontEnd(); +- tdEnd(); +- +- tdVAlignClass("top", "NavBarCell3"); +- font("-2"); +- navDetailLinks(); +- fontEnd(); +- tdEnd(); +- trEnd(); ++ Content div = HtmlTree.DIV(getNavSummaryLinks()); ++ div.addContent(getNavDetailLinks()); ++ subDiv.addContent(div); + } catch (Exception e) { + e.printStackTrace(); + throw new DocletAbortException(); + } + } + +- protected void navSummaryLinks() throws Exception { +- printText("doclet.Summary"); +- space(); ++ /** ++ * Get summary links for navigation bar. ++ * ++ * @return the content tree for the navigation summary links ++ */ ++ protected Content getNavSummaryLinks() throws Exception { ++ Content li = HtmlTree.LI(summaryLabel); ++ li.addContent(getSpace()); ++ Content ulNav = HtmlTree.UL(HtmlStyle.subNavList, li); + MemberSummaryBuilder memberSummaryBuilder = (MemberSummaryBuilder) +- configuration.getBuilderFactory().getMemberSummaryBuilder(this); +- writeNavSummaryLink(memberSummaryBuilder, +- "doclet.navAnnotationTypeRequiredMember", +- VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED); +- navGap(); +- writeNavSummaryLink(memberSummaryBuilder, +- "doclet.navAnnotationTypeOptionalMember", +- VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL); ++ configuration.getBuilderFactory().getMemberSummaryBuilder(this); ++ Content liNavReq = new HtmlTree(HtmlTag.LI); ++ addNavSummaryLink(memberSummaryBuilder, ++ "doclet.navAnnotationTypeRequiredMember", ++ VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED, liNavReq); ++ addNavGap(liNavReq); ++ ulNav.addContent(liNavReq); ++ Content liNavOpt = new HtmlTree(HtmlTag.LI); ++ addNavSummaryLink(memberSummaryBuilder, ++ "doclet.navAnnotationTypeOptionalMember", ++ VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL, liNavOpt); ++ ulNav.addContent(liNavOpt); ++ return ulNav; + } + +- private void writeNavSummaryLink(MemberSummaryBuilder builder, +- String label, int type) { ++ /** ++ * Add the navigation summary link. ++ * ++ * @param builder builder for the member to be documented ++ * @param label the label for the navigation ++ * @param type type to be documented ++ * @param liNav the content tree to which the navigation summary link will be added ++ */ ++ protected void addNavSummaryLink(MemberSummaryBuilder builder, ++ String label, int type, Content liNav) { + AbstractMemberWriter writer = ((AbstractMemberWriter) builder. +- getMemberSummaryWriter(type)); ++ getMemberSummaryWriter(type)); + if (writer == null) { +- printText(label); ++ liNav.addContent(getResource(label)); + } else { +- writer.printNavSummaryLink(null, +- ! builder.getVisibleMemberMap(type).noVisibleMembers()); ++ liNav.addContent(writer.getNavSummaryLink(null, ++ ! builder.getVisibleMemberMap(type).noVisibleMembers())); + } + } + + /** +- * Method navDetailLinks ++ * Get detail links for the navigation bar. + * +- * @throws Exception +- * ++ * @return the content tree for the detail links + */ +- protected void navDetailLinks() throws Exception { +- printText("doclet.Detail"); +- space(); ++ protected Content getNavDetailLinks() throws Exception { ++ Content li = HtmlTree.LI(detailLabel); ++ li.addContent(getSpace()); ++ Content ulNav = HtmlTree.UL(HtmlStyle.subNavList, li); + MemberSummaryBuilder memberSummaryBuilder = (MemberSummaryBuilder) +- configuration.getBuilderFactory().getMemberSummaryBuilder(this); ++ configuration.getBuilderFactory().getMemberSummaryBuilder(this); + AbstractMemberWriter writerOptional = +- ((AbstractMemberWriter) memberSummaryBuilder. ++ ((AbstractMemberWriter) memberSummaryBuilder. + getMemberSummaryWriter(VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL)); + AbstractMemberWriter writerRequired = +- ((AbstractMemberWriter) memberSummaryBuilder. ++ ((AbstractMemberWriter) memberSummaryBuilder. + getMemberSummaryWriter(VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED)); + if (writerOptional != null){ +- writerOptional.printNavDetailLink(annotationType.elements().length > 0); ++ Content liNavOpt = new HtmlTree(HtmlTag.LI); ++ writerOptional.addNavDetailLink(annotationType.elements().length > 0, liNavOpt); ++ ulNav.addContent(liNavOpt); + } else if (writerRequired != null){ +- writerRequired.printNavDetailLink(annotationType.elements().length > 0); ++ Content liNavReq = new HtmlTree(HtmlTag.LI); ++ writerRequired.addNavDetailLink(annotationType.elements().length > 0, liNavReq); ++ ulNav.addContent(liNavReq); + } else { +- printText("doclet.navAnnotationTypeMember"); ++ Content liNav = HtmlTree.LI(getResource("doclet.navAnnotationTypeMember")); ++ ulNav.addContent(liNav); + } +- } +- +- protected void navGap() { +- space(); +- print('|'); +- space(); ++ return ulNav; + } + + /** +- * If this is an inner class or interface, write the enclosing class or +- * interface. ++ * Add gap between navigation bar elements. ++ * ++ * @param liNav the content tree to which the gap will be added + */ +- public void writeNestedClassInfo() { +- ClassDoc outerClass = annotationType.containingClass(); +- if (outerClass != null) { +- dl(); +- dt(); +- if (annotationType.isInterface()) { +- strongText("doclet.Enclosing_Interface"); +- } else { +- strongText("doclet.Enclosing_Class"); +- } +- dtEnd(); +- dd(); +- printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, outerClass, +- false)); +- ddEnd(); +- dlEnd(); +- } ++ protected void addNavGap(Content liNav) { ++ liNav.addContent(getSpace()); ++ liNav.addContent("|"); ++ liNav.addContent(getSpace()); + } + + /** +@@ -346,11 +394,4 @@ + public AnnotationTypeDoc getAnnotationTypeDoc() { + return annotationType; + } +- +- /** +- * {@inheritDoc} +- */ +- public void completeMemberSummaryBuild() { +- p(); +- } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java +@@ -25,10 +25,12 @@ + + package com.sun.tools.doclets.formats.html; + +-import com.sun.tools.doclets.internal.toolkit.util.*; +-import com.sun.javadoc.*; + import java.io.*; + import java.util.*; ++import com.sun.javadoc.*; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.tools.doclets.internal.toolkit.*; + + /** + * Generate class usage information. +@@ -207,257 +209,301 @@ + } + + /** +- * Print the class use list. ++ * Generate the class use list. + */ + protected void generateClassUseFile() throws IOException { +- +- printClassUseHeader(); +- ++ Content body = getClassUseHeader(); ++ HtmlTree div = new HtmlTree(HtmlTag.DIV); ++ div.addStyle(HtmlStyle.classUseContainer); + if (pkgSet.size() > 0) { +- generateClassUse(); ++ addClassUse(div); + } else { +- printText("doclet.ClassUse_No.usage.of.0", +- classdoc.qualifiedName()); +- p(); ++ div.addContent(getResource("doclet.ClassUse_No.usage.of.0", ++ classdoc.qualifiedName())); + } +- +- printClassUseFooter(); +- } +- +- protected void generateClassUse() throws IOException { +- if (configuration.packages.length > 1) { +- generatePackageList(); +- generatePackageAnnotationList(); +- } +- generateClassList(); +- } +- +- protected void generatePackageList() throws IOException { +- tableIndexSummary(useTableSummary); +- tableCaptionStart(); +- printText("doclet.ClassUse_Packages.that.use.0", +- getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS_USE_HEADER, classdoc, +- false))); +- tableCaptionEnd(); +- summaryTableHeader(packageTableHeader, "col"); +- +- for (Iterator it = pkgSet.iterator(); it.hasNext();) { +- PackageDoc pkg = (PackageDoc)it.next(); +- generatePackageUse(pkg); +- } +- tableEnd(); +- space(); +- p(); +- } +- +- protected void generatePackageAnnotationList() throws IOException { +- if ((! classdoc.isAnnotationType()) || +- pkgToPackageAnnotations == null || +- pkgToPackageAnnotations.size() == 0) +- return; +- tableIndexSummary(useTableSummary); +- tableCaptionStart(); +- printText("doclet.ClassUse_PackageAnnotation", +- getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS_USE_HEADER, classdoc, +- false))); +- tableCaptionEnd(); +- summaryTableHeader(packageTableHeader, "col"); +- for (Iterator it = pkgToPackageAnnotations.iterator(); it.hasNext();) { +- PackageDoc pkg = (PackageDoc)it.next(); +- trBgcolorStyle("white", "TableRowColor"); +- summaryRow(0); +- //Just want an anchor here. +- printPackageLink(pkg, pkg.name(), true); +- summaryRowEnd(); +- summaryRow(0); +- printSummaryComment(pkg); +- space(); +- summaryRowEnd(); +- trEnd(); +- } +- tableEnd(); +- space(); +- p(); +- } +- +- protected void generateClassList() throws IOException { +- for (Iterator it = pkgSet.iterator(); it.hasNext();) { +- PackageDoc pkg = (PackageDoc)it.next(); +- anchor(pkg.name()); +- tableIndexSummary(); +- tableHeaderStart("#CCCCFF"); +- printText("doclet.ClassUse_Uses.of.0.in.1", +- getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS_USE_HEADER, +- classdoc, false)), +- getPackageLink(pkg, Util.getPackageName(pkg), false)); +- tableHeaderEnd(); +- tableEnd(); +- space(); +- p(); +- generateClassUse(pkg); +- } ++ body.addContent(div); ++ addNavLinks(false, body); ++ addBottom(body); ++ printHtmlDocument(null, true, body); + } + + /** +- * Print the package use list. ++ * Add the class use documentation. ++ * ++ * @param contentTree the content tree to which the class use information will be added + */ +- protected void generatePackageUse(PackageDoc pkg) throws IOException { +- trBgcolorStyle("white", "TableRowColor"); +- summaryRow(0); +- //Just want an anchor here. +- printHyperLink("", pkg.name(), Util.getPackageName(pkg), true); +- summaryRowEnd(); +- summaryRow(0); +- printSummaryComment(pkg); +- space(); +- summaryRowEnd(); +- trEnd(); ++ protected void addClassUse(Content contentTree) throws IOException { ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.blockList); ++ if (configuration.packages.length > 1) { ++ addPackageList(ul); ++ addPackageAnnotationList(ul); ++ } ++ addClassList(ul); ++ contentTree.addContent(ul); + } + + /** +- * Print the class use list. ++ * Add the packages list that use the given class. ++ * ++ * @param contentTree the content tree to which the packages list will be added + */ +- protected void generateClassUse(PackageDoc pkg) throws IOException { +- String classLink = getLink(new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_CLASS_USE_HEADER, classdoc, false)); +- String pkgLink = getPackageLink(pkg, Util.getPackageName(pkg), false); +- classSubWriter.printUseInfo(pkgToClassAnnotations.get(pkg.name()), +- configuration.getText("doclet.ClassUse_Annotation", classLink, +- pkgLink), classUseTableSummary); +- classSubWriter.printUseInfo(pkgToClassTypeParameter.get(pkg.name()), +- configuration.getText("doclet.ClassUse_TypeParameter", classLink, +- pkgLink), classUseTableSummary); +- classSubWriter.printUseInfo(pkgToSubclass.get(pkg.name()), +- configuration.getText("doclet.ClassUse_Subclass", classLink, +- pkgLink), subclassUseTableSummary); +- classSubWriter.printUseInfo(pkgToSubinterface.get(pkg.name()), +- configuration.getText("doclet.ClassUse_Subinterface", classLink, +- pkgLink), subinterfaceUseTableSummary); +- classSubWriter.printUseInfo(pkgToImplementingClass.get(pkg.name()), +- configuration.getText("doclet.ClassUse_ImplementingClass", classLink, +- pkgLink), classUseTableSummary); +- fieldSubWriter.printUseInfo(pkgToField.get(pkg.name()), +- configuration.getText("doclet.ClassUse_Field", classLink, +- pkgLink), fieldUseTableSummary); +- fieldSubWriter.printUseInfo(pkgToFieldAnnotations.get(pkg.name()), +- configuration.getText("doclet.ClassUse_FieldAnnotations", classLink, +- pkgLink), fieldUseTableSummary); +- fieldSubWriter.printUseInfo(pkgToFieldTypeParameter.get(pkg.name()), +- configuration.getText("doclet.ClassUse_FieldTypeParameter", classLink, +- pkgLink), fieldUseTableSummary); +- methodSubWriter.printUseInfo(pkgToMethodAnnotations.get(pkg.name()), +- configuration.getText("doclet.ClassUse_MethodAnnotations", classLink, +- pkgLink), methodUseTableSummary); +- methodSubWriter.printUseInfo(pkgToMethodParameterAnnotations.get(pkg.name()), +- configuration.getText("doclet.ClassUse_MethodParameterAnnotations", classLink, +- pkgLink), methodUseTableSummary); +- methodSubWriter.printUseInfo(pkgToMethodTypeParameter.get(pkg.name()), +- configuration.getText("doclet.ClassUse_MethodTypeParameter", classLink, +- pkgLink), methodUseTableSummary); +- methodSubWriter.printUseInfo(pkgToMethodReturn.get(pkg.name()), +- configuration.getText("doclet.ClassUse_MethodReturn", classLink, +- pkgLink), methodUseTableSummary); +- methodSubWriter.printUseInfo(pkgToMethodReturnTypeParameter.get(pkg.name()), +- configuration.getText("doclet.ClassUse_MethodReturnTypeParameter", classLink, +- pkgLink), methodUseTableSummary); +- methodSubWriter.printUseInfo(pkgToMethodArgs.get(pkg.name()), +- configuration.getText("doclet.ClassUse_MethodArgs", classLink, +- pkgLink), methodUseTableSummary); +- methodSubWriter.printUseInfo(pkgToMethodArgTypeParameter.get(pkg.name()), +- configuration.getText("doclet.ClassUse_MethodArgsTypeParameters", classLink, +- pkgLink), methodUseTableSummary); +- methodSubWriter.printUseInfo(pkgToMethodThrows.get(pkg.name()), +- configuration.getText("doclet.ClassUse_MethodThrows", classLink, +- pkgLink), methodUseTableSummary); +- constrSubWriter.printUseInfo(pkgToConstructorAnnotations.get(pkg.name()), +- configuration.getText("doclet.ClassUse_ConstructorAnnotations", classLink, +- pkgLink), constructorUseTableSummary); +- constrSubWriter.printUseInfo(pkgToConstructorParameterAnnotations.get(pkg.name()), +- configuration.getText("doclet.ClassUse_ConstructorParameterAnnotations", classLink, +- pkgLink), constructorUseTableSummary); +- constrSubWriter.printUseInfo(pkgToConstructorArgs.get(pkg.name()), +- configuration.getText("doclet.ClassUse_ConstructorArgs", classLink, +- pkgLink), constructorUseTableSummary); +- constrSubWriter.printUseInfo(pkgToConstructorArgTypeParameter.get(pkg.name()), +- configuration.getText("doclet.ClassUse_ConstructorArgsTypeParameters", classLink, +- pkgLink), constructorUseTableSummary); +- constrSubWriter.printUseInfo(pkgToConstructorThrows.get(pkg.name()), +- configuration.getText("doclet.ClassUse_ConstructorThrows", classLink, +- pkgLink), constructorUseTableSummary); ++ protected void addPackageList(Content contentTree) throws IOException { ++ Content table = HtmlTree.TABLE(0, 3, 0, useTableSummary, ++ getTableCaption(configuration().getText( ++ "doclet.ClassUse_Packages.that.use.0", ++ getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS_USE_HEADER, classdoc, ++ false))))); ++ table.addContent(getSummaryTableHeader(packageTableHeader, "col")); ++ Content tbody = new HtmlTree(HtmlTag.TBODY); ++ Iterator<PackageDoc> it = pkgSet.iterator(); ++ for (int i = 0; it.hasNext(); i++) { ++ PackageDoc pkg = it.next(); ++ HtmlTree tr = new HtmlTree(HtmlTag.TR); ++ if (i % 2 == 0) { ++ tr.addStyle(HtmlStyle.altColor); ++ } else { ++ tr.addStyle(HtmlStyle.rowColor); ++ } ++ addPackageUse(pkg, tr); ++ tbody.addContent(tr); ++ } ++ table.addContent(tbody); ++ Content li = HtmlTree.LI(HtmlStyle.blockList, table); ++ contentTree.addContent(li); + } + + /** +- * Print the header for the class use Listing. ++ * Add the package annotation list. ++ * ++ * @param contentTree the content tree to which the package annotation list will be added + */ +- protected void printClassUseHeader() { +- String cltype = configuration.getText(classdoc.isInterface()? +- "doclet.Interface": +- "doclet.Class"); +- String clname = classdoc.qualifiedName(); +- printHtmlHeader(configuration.getText("doclet.Window_ClassUse_Header", +- cltype, clname), null, true); +- printTop(); +- navLinks(true); +- hr(); +- center(); +- h2(); +- strongText("doclet.ClassUse_Title", cltype, clname); +- h2End(); +- centerEnd(); ++ protected void addPackageAnnotationList(Content contentTree) throws IOException { ++ if ((!classdoc.isAnnotationType()) || ++ pkgToPackageAnnotations == null || ++ pkgToPackageAnnotations.size() == 0) { ++ return; ++ } ++ Content table = HtmlTree.TABLE(0, 3, 0, useTableSummary, ++ getTableCaption(configuration().getText( ++ "doclet.ClassUse_PackageAnnotation", ++ getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS_USE_HEADER, classdoc, ++ false))))); ++ table.addContent(getSummaryTableHeader(packageTableHeader, "col")); ++ Content tbody = new HtmlTree(HtmlTag.TBODY); ++ Iterator<PackageDoc> it = pkgToPackageAnnotations.iterator(); ++ for (int i = 0; it.hasNext(); i++) { ++ PackageDoc pkg = it.next(); ++ HtmlTree tr = new HtmlTree(HtmlTag.TR); ++ if (i % 2 == 0) { ++ tr.addStyle(HtmlStyle.altColor); ++ } else { ++ tr.addStyle(HtmlStyle.rowColor); ++ } ++ Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst, ++ getPackageLink(pkg, new StringContent(pkg.name()))); ++ tr.addContent(tdFirst); ++ HtmlTree tdLast = new HtmlTree(HtmlTag.TD); ++ tdLast.addStyle(HtmlStyle.colLast); ++ if (pkg != null) { ++ addSummaryComment(pkg, tdLast); ++ } else { ++ tdLast.addContent(getSpace()); ++ } ++ tr.addContent(tdLast); ++ tbody.addContent(tr); ++ } ++ table.addContent(tbody); ++ Content li = HtmlTree.LI(HtmlStyle.blockList, table); ++ contentTree.addContent(li); + } + + /** +- * Print the footer for the class use Listing. ++ * Add the class list that use the given class. ++ * ++ * @param contentTree the content tree to which the class list will be added + */ +- protected void printClassUseFooter() { +- hr(); +- navLinks(false); +- printBottom(); +- printBodyHtmlEnd(); +- } +- +- +- /** +- * Print this package link +- */ +- protected void navLinkPackage() { +- navCellStart(); +- printHyperLink("../package-summary.html", "", +- configuration.getText("doclet.Package"), true, "NavBarFont1"); +- navCellEnd(); ++ protected void addClassList(Content contentTree) throws IOException { ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.blockList); ++ for (Iterator<PackageDoc> it = pkgSet.iterator(); it.hasNext();) { ++ PackageDoc pkg = it.next(); ++ Content li = HtmlTree.LI(HtmlStyle.blockList, getMarkerAnchor(pkg.name())); ++ Content link = new RawHtml( ++ configuration.getText("doclet.ClassUse_Uses.of.0.in.1", ++ getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS_USE_HEADER, ++ classdoc, false)), ++ getPackageLinkString(pkg, Util.getPackageName(pkg), false))); ++ Content heading = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING, link); ++ li.addContent(heading); ++ addClassUse(pkg, li); ++ ul.addContent(li); ++ } ++ Content li = HtmlTree.LI(HtmlStyle.blockList, ul); ++ contentTree.addContent(li); + } + + /** +- * Print class page indicator ++ * Add the package use information. ++ * ++ * @param pkg the package that uses the given class ++ * @param contentTree the content tree to which the package use information will be added + */ +- protected void navLinkClass() { +- navCellStart(); +- printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS_USE_HEADER, classdoc, "", +- configuration.getText("doclet.Class"), true, "NavBarFont1")); +- navCellEnd(); ++ protected void addPackageUse(PackageDoc pkg, Content contentTree) throws IOException { ++ Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst, ++ getHyperLink("", pkg.name(), new StringContent(Util.getPackageName(pkg)))); ++ contentTree.addContent(tdFirst); ++ HtmlTree tdLast = new HtmlTree(HtmlTag.TD); ++ tdLast.addStyle(HtmlStyle.colLast); ++ if (pkg != null) ++ addSummaryComment(pkg, tdLast); ++ else ++ tdLast.addContent(getSpace()); ++ contentTree.addContent(tdLast); + } + + /** +- * Print class use link ++ * Add the class use information. ++ * ++ * @param pkg the package that uses the given class ++ * @param contentTree the content tree to which the class use information will be added + */ +- protected void navLinkClassUse() { +- navCellRevStart(); +- fontStyle("NavBarFont1Rev"); +- strongText("doclet.navClassUse"); +- fontEnd(); +- navCellEnd(); ++ protected void addClassUse(PackageDoc pkg, Content contentTree) throws IOException { ++ String classLink = getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CLASS_USE_HEADER, classdoc, false)); ++ String pkgLink = getPackageLinkString(pkg, Util.getPackageName(pkg), false); ++ classSubWriter.addUseInfo(pkgToClassAnnotations.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_Annotation", classLink, ++ pkgLink), classUseTableSummary, contentTree); ++ classSubWriter.addUseInfo(pkgToClassTypeParameter.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_TypeParameter", classLink, ++ pkgLink), classUseTableSummary, contentTree); ++ classSubWriter.addUseInfo(pkgToSubclass.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_Subclass", classLink, ++ pkgLink), subclassUseTableSummary, contentTree); ++ classSubWriter.addUseInfo(pkgToSubinterface.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_Subinterface", classLink, ++ pkgLink), subinterfaceUseTableSummary, contentTree); ++ classSubWriter.addUseInfo(pkgToImplementingClass.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_ImplementingClass", classLink, ++ pkgLink), classUseTableSummary, contentTree); ++ fieldSubWriter.addUseInfo(pkgToField.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_Field", classLink, ++ pkgLink), fieldUseTableSummary, contentTree); ++ fieldSubWriter.addUseInfo(pkgToFieldAnnotations.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_FieldAnnotations", classLink, ++ pkgLink), fieldUseTableSummary, contentTree); ++ fieldSubWriter.addUseInfo(pkgToFieldTypeParameter.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_FieldTypeParameter", classLink, ++ pkgLink), fieldUseTableSummary, contentTree); ++ methodSubWriter.addUseInfo(pkgToMethodAnnotations.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_MethodAnnotations", classLink, ++ pkgLink), methodUseTableSummary, contentTree); ++ methodSubWriter.addUseInfo(pkgToMethodParameterAnnotations.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_MethodParameterAnnotations", classLink, ++ pkgLink), methodUseTableSummary, contentTree); ++ methodSubWriter.addUseInfo(pkgToMethodTypeParameter.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_MethodTypeParameter", classLink, ++ pkgLink), methodUseTableSummary, contentTree); ++ methodSubWriter.addUseInfo(pkgToMethodReturn.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_MethodReturn", classLink, ++ pkgLink), methodUseTableSummary, contentTree); ++ methodSubWriter.addUseInfo(pkgToMethodReturnTypeParameter.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_MethodReturnTypeParameter", classLink, ++ pkgLink), methodUseTableSummary, contentTree); ++ methodSubWriter.addUseInfo(pkgToMethodArgs.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_MethodArgs", classLink, ++ pkgLink), methodUseTableSummary, contentTree); ++ methodSubWriter.addUseInfo(pkgToMethodArgTypeParameter.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_MethodArgsTypeParameters", classLink, ++ pkgLink), methodUseTableSummary, contentTree); ++ methodSubWriter.addUseInfo(pkgToMethodThrows.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_MethodThrows", classLink, ++ pkgLink), methodUseTableSummary, contentTree); ++ constrSubWriter.addUseInfo(pkgToConstructorAnnotations.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_ConstructorAnnotations", classLink, ++ pkgLink), constructorUseTableSummary, contentTree); ++ constrSubWriter.addUseInfo(pkgToConstructorParameterAnnotations.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_ConstructorParameterAnnotations", classLink, ++ pkgLink), constructorUseTableSummary, contentTree); ++ constrSubWriter.addUseInfo(pkgToConstructorArgs.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_ConstructorArgs", classLink, ++ pkgLink), constructorUseTableSummary, contentTree); ++ constrSubWriter.addUseInfo(pkgToConstructorArgTypeParameter.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_ConstructorArgsTypeParameters", classLink, ++ pkgLink), constructorUseTableSummary, contentTree); ++ constrSubWriter.addUseInfo(pkgToConstructorThrows.get(pkg.name()), ++ configuration.getText("doclet.ClassUse_ConstructorThrows", classLink, ++ pkgLink), constructorUseTableSummary, contentTree); + } + +- protected void navLinkTree() { +- navCellStart(); +- if (classdoc.containingPackage().isIncluded()) { +- printHyperLink("../package-tree.html", "", +- configuration.getText("doclet.Tree"), true, "NavBarFont1"); +- } else { +- printHyperLink(relativePath + "overview-tree.html", "", +- configuration.getText("doclet.Tree"), true, "NavBarFont1"); +- } +- navCellEnd(); ++ /** ++ * Get the header for the class use Listing. ++ * ++ * @return a content tree representing the class use header ++ */ ++ protected Content getClassUseHeader() { ++ String cltype = configuration.getText(classdoc.isInterface()? ++ "doclet.Interface":"doclet.Class"); ++ String clname = classdoc.qualifiedName(); ++ String title = configuration.getText("doclet.Window_ClassUse_Header", ++ cltype, clname); ++ Content bodyTree = getBody(true, getWindowTitle(title)); ++ addTop(bodyTree); ++ addNavLinks(true, bodyTree); ++ Content headContent = getResource("doclet.ClassUse_Title", cltype, clname); ++ Content heading = HtmlTree.HEADING(HtmlConstants.CLASS_PAGE_HEADING, ++ true, HtmlStyle.title, headContent); ++ Content div = HtmlTree.DIV(HtmlStyle.header, heading); ++ bodyTree.addContent(div); ++ return bodyTree; + } + ++ /** ++ * Get this package link. ++ * ++ * @return a content tree for the package link ++ */ ++ protected Content getNavLinkPackage() { ++ Content linkContent = getHyperLink("../package-summary.html", "", ++ packageLabel); ++ Content li = HtmlTree.LI(linkContent); ++ return li; ++ } ++ ++ /** ++ * Get class page link. ++ * ++ * @return a content tree for the class page link ++ */ ++ protected Content getNavLinkClass() { ++ Content linkContent = new RawHtml(getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CLASS_USE_HEADER, classdoc, "", ++ configuration.getText("doclet.Class"), false))); ++ Content li = HtmlTree.LI(linkContent); ++ return li; ++ } ++ ++ /** ++ * Get the use link. ++ * ++ * @return a content tree for the use link ++ */ ++ protected Content getNavLinkClassUse() { ++ Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, useLabel); ++ return li; ++ } ++ ++ /** ++ * Get the tree link. ++ * ++ * @return a content tree for the tree link ++ */ ++ protected Content getNavLinkTree() { ++ Content linkContent = classdoc.containingPackage().isIncluded() ? ++ getHyperLink("../package-tree.html", "", treeLabel) : ++ getHyperLink(relativePath + "overview-tree.html", "", treeLabel); ++ Content li = HtmlTree.LI(linkContent); ++ return li; ++ } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java +@@ -32,6 +32,7 @@ + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.builders.*; + import com.sun.tools.doclets.internal.toolkit.taglets.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Generate the Class Information Page. +@@ -43,6 +44,7 @@ + * + * @author Atul M Dambalkar + * @author Robert Field ++ * @author Bhavesh Patel (Modified) + */ + public class ClassWriterImpl extends SubWriterHolderWriter + implements ClassWriter { +@@ -76,124 +78,173 @@ + } + + /** +- * Print this package link ++ * Get this package link. ++ * ++ * @return a content tree for the package link + */ +- protected void navLinkPackage() { +- navCellStart(); +- printHyperLink("package-summary.html", "", +- configuration.getText("doclet.Package"), true, "NavBarFont1"); +- navCellEnd(); ++ protected Content getNavLinkPackage() { ++ Content linkContent = getHyperLink("package-summary.html", "", ++ packageLabel); ++ Content li = HtmlTree.LI(linkContent); ++ return li; + } + + /** +- * Print class page indicator ++ * Get the class link. ++ * ++ * @return a content tree for the class link + */ +- protected void navLinkClass() { +- navCellRevStart(); +- fontStyle("NavBarFont1Rev"); +- strongText("doclet.Class"); +- fontEnd(); +- navCellEnd(); ++ protected Content getNavLinkClass() { ++ Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, classLabel); ++ return li; + } + + /** +- * Print class use link ++ * Get the class use link. ++ * ++ * @return a content tree for the class use link + */ +- protected void navLinkClassUse() { +- navCellStart(); +- printHyperLink("class-use/" + filename, "", +- configuration.getText("doclet.navClassUse"), true, "NavBarFont1"); +- navCellEnd(); ++ protected Content getNavLinkClassUse() { ++ Content linkContent = getHyperLink("class-use/" + filename, "", useLabel); ++ Content li = HtmlTree.LI(linkContent); ++ return li; + } + + /** +- * Print previous package link ++ * Get link to previous class. ++ * ++ * @return a content tree for the previous class link + */ +- protected void navLinkPrevious() { +- if (prev == null) { +- printText("doclet.Prev_Class"); +- } else { +- printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, prev, "", +- configuration.getText("doclet.Prev_Class"), true)); ++ public Content getNavLinkPrevious() { ++ Content li; ++ if (prev != null) { ++ Content prevLink = new RawHtml(getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CLASS, prev, "", ++ configuration.getText("doclet.Prev_Class"), true))); ++ li = HtmlTree.LI(prevLink); + } ++ else ++ li = HtmlTree.LI(prevclassLabel); ++ return li; + } + + /** +- * Print next package link ++ * Get link to next class. ++ * ++ * @return a content tree for the next class link + */ +- protected void navLinkNext() { +- if (next == null) { +- printText("doclet.Next_Class"); +- } else { +- printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, next, "", +- configuration.getText("doclet.Next_Class"), true)); ++ public Content getNavLinkNext() { ++ Content li; ++ if (next != null) { ++ Content nextLink = new RawHtml(getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CLASS, next, "", ++ configuration.getText("doclet.Next_Class"), true))); ++ li = HtmlTree.LI(nextLink); + } ++ else ++ li = HtmlTree.LI(nextclassLabel); ++ return li; + } + + /** + * {@inheritDoc} + */ +- public void writeHeader(String header) { ++ public Content getHeader(String header) { + String pkgname = (classDoc.containingPackage() != null)? + classDoc.containingPackage().name(): ""; + String clname = classDoc.name(); +- printHtmlHeader(clname, +- configuration.metakeywords.getMetaKeywords(classDoc), true); +- printTop(); +- navLinks(true); +- hr(); +- println("<!-- ======== START OF CLASS DATA ======== -->"); +- h2(); ++ Content bodyTree = getBody(true, getWindowTitle(clname)); ++ addTop(bodyTree); ++ addNavLinks(true, bodyTree); ++ bodyTree.addContent(HtmlConstants.START_OF_CLASS_DATA); ++ HtmlTree div = new HtmlTree(HtmlTag.DIV); ++ div.addStyle(HtmlStyle.header); + if (pkgname.length() > 0) { +- font("-1"); print(pkgname); fontEnd(); br(); ++ Content pkgNameContent = new StringContent(pkgname); ++ Content pkgNamePara = HtmlTree.P(HtmlStyle.subTitle, pkgNameContent); ++ div.addContent(pkgNamePara); + } + LinkInfoImpl linkInfo = new LinkInfoImpl( LinkInfoImpl.CONTEXT_CLASS_HEADER, +- classDoc, false); ++ classDoc, false); + //Let's not link to ourselves in the header. + linkInfo.linkToSelf = false; +- print(header + getTypeParameterLinks(linkInfo)); +- h2End(); ++ Content headerContent = new StringContent(header); ++ Content heading = HtmlTree.HEADING(HtmlConstants.CLASS_PAGE_HEADING, true, ++ HtmlStyle.title, headerContent); ++ heading.addContent(new RawHtml(getTypeParameterLinks(linkInfo))); ++ div.addContent(heading); ++ bodyTree.addContent(div); ++ return bodyTree; + } + + /** + * {@inheritDoc} + */ +- public void writeFooter() { +- println("<!-- ========= END OF CLASS DATA ========= -->"); +- hr(); +- navLinks(false); +- printBottom(); +- printBodyHtmlEnd(); ++ public Content getClassContentHeader() { ++ return getContentHeader(); + } + + /** + * {@inheritDoc} + */ +- public void writeClassSignature(String modifiers) { ++ public void addFooter(Content contentTree) { ++ contentTree.addContent(HtmlConstants.END_OF_CLASS_DATA); ++ addNavLinks(false, contentTree); ++ addBottom(contentTree); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void printDocument(Content contentTree) { ++ printHtmlDocument(configuration.metakeywords.getMetaKeywords(classDoc), ++ true, contentTree); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public Content getClassInfoTreeHeader() { ++ return getMemberTreeHeader(); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public Content getClassInfo(Content classInfoTree) { ++ return getMemberTree(HtmlStyle.description, classInfoTree); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void addClassSignature(String modifiers, Content classInfoTree) { + boolean isInterface = classDoc.isInterface(); +- preNoNewLine(); +- writeAnnotationInfo(classDoc); +- print(modifiers); ++ classInfoTree.addContent(new HtmlTree(HtmlTag.BR)); ++ Content pre = new HtmlTree(HtmlTag.PRE); ++ addAnnotationInfo(classDoc, pre); ++ pre.addContent(modifiers); + LinkInfoImpl linkInfo = new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_CLASS_SIGNATURE, classDoc, false); ++ LinkInfoImpl.CONTEXT_CLASS_SIGNATURE, classDoc, false); + //Let's not link to ourselves in the signature. + linkInfo.linkToSelf = false; +- String name = classDoc.name() + +- getTypeParameterLinks(linkInfo); ++ Content name = new RawHtml (classDoc.name() + ++ getTypeParameterLinks(linkInfo)); + if (configuration().linksource) { +- printSrcLink(classDoc, name); ++ addSrcLink(classDoc, name, pre); + } else { +- strong(name); ++ pre.addContent(HtmlTree.STRONG(name)); + } + if (!isInterface) { + Type superclass = Util.getFirstVisibleSuperClass(classDoc, +- configuration()); ++ configuration()); + if (superclass != null) { +- println(); +- print("extends "); +- printLink(new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_CLASS_SIGNATURE_PARENT_NAME, +- superclass)); ++ pre.addContent("\n"); ++ pre.addContent("extends "); ++ Content link = new RawHtml(getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CLASS_SIGNATURE_PARENT_NAME, ++ superclass))); ++ pre.addContent(link); + } + } + Type[] implIntfacs = classDoc.interfaceTypes(); +@@ -202,34 +253,33 @@ + for (int i = 0; i < implIntfacs.length; i++) { + ClassDoc classDoc = implIntfacs[i].asClassDoc(); + if (! (classDoc.isPublic() || +- Util.isLinkable(classDoc, configuration()))) { ++ Util.isLinkable(classDoc, configuration()))) { + continue; + } + if (counter == 0) { +- println(); +- print(isInterface? "extends " : "implements "); ++ pre.addContent("\n"); ++ pre.addContent(isInterface? "extends " : "implements "); + } else { +- print(", "); ++ pre.addContent(", "); + } +- printLink(new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_CLASS_SIGNATURE_PARENT_NAME, +- implIntfacs[i])); ++ Content link = new RawHtml(getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CLASS_SIGNATURE_PARENT_NAME, ++ implIntfacs[i]))); ++ pre.addContent(link); + counter++; + } + } +- preEnd(); +- p(); ++ classInfoTree.addContent(pre); + } + + /** + * {@inheritDoc} + */ +- public void writeClassDescription() { ++ public void addClassDescription(Content classInfoTree) { + if(!configuration.nocomment) { + // generate documentation for the class. + if (classDoc.inlineTags().length > 0) { +- printInlineComment(classDoc); +- p(); ++ addInlineComment(classDoc, classInfoTree); + } + } + } +@@ -237,131 +287,118 @@ + /** + * {@inheritDoc} + */ +- public void writeClassTagInfo() { ++ public void addClassTagInfo(Content classInfoTree) { + if(!configuration.nocomment) { + // Print Information about all the tags here +- printTags(classDoc); +- hr(); +- p(); ++ addTagsInfo(classDoc, classInfoTree); ++ } ++ } ++ ++ /** ++ * Get the class hierarchy tree for the given class. ++ * ++ * @param type the class to print the hierarchy for ++ * @return a content tree for class inheritence ++ */ ++ private Content getClassInheritenceTree(Type type) { ++ Type sup; ++ HtmlTree classTreeUl = new HtmlTree(HtmlTag.UL); ++ classTreeUl.addStyle(HtmlStyle.inheritance); ++ Content liTree = null; ++ do { ++ sup = Util.getFirstVisibleSuperClass( ++ type instanceof ClassDoc ? (ClassDoc) type : type.asClassDoc(), ++ configuration()); ++ if (sup != null) { ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.inheritance); ++ ul.addContent(getTreeForClassHelper(type)); ++ if (liTree != null) ++ ul.addContent(liTree); ++ Content li = HtmlTree.LI(ul); ++ liTree = li; ++ type = sup; ++ } ++ else ++ classTreeUl.addContent(getTreeForClassHelper(type)); ++ } ++ while (sup != null); ++ if (liTree != null) ++ classTreeUl.addContent(liTree); ++ return classTreeUl; ++ } ++ ++ /** ++ * Get the class helper tree for the given class. ++ * ++ * @param type the class to print the helper for ++ * @return a content tree for class helper ++ */ ++ private Content getTreeForClassHelper(Type type) { ++ Content li = new HtmlTree(HtmlTag.LI); ++ if (type.equals(classDoc)) { ++ String typeParameters = getTypeParameterLinks( ++ new LinkInfoImpl(LinkInfoImpl.CONTEXT_TREE, ++ classDoc, false)); ++ if (configuration.shouldExcludeQualifier( ++ classDoc.containingPackage().name())) { ++ li.addContent(type.asClassDoc().name()); ++ li.addContent(new RawHtml(typeParameters)); ++ } else { ++ li.addContent(type.asClassDoc().qualifiedName()); ++ li.addContent(new RawHtml(typeParameters)); ++ } + } else { +- hr(); ++ Content link = new RawHtml(getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CLASS_TREE_PARENT, ++ type instanceof ClassDoc ? (ClassDoc) type : type, ++ configuration.getClassName(type.asClassDoc()), false))); ++ li.addContent(link); ++ } ++ return li; ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void addClassTree(Content classContentTree) { ++ if (!classDoc.isClass()) { ++ return; ++ } ++ classContentTree.addContent(getClassInheritenceTree(classDoc)); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void addTypeParamInfo(Content classInfoTree) { ++ if (classDoc.typeParamTags().length > 0) { ++ TagletOutput output = (new ParamTaglet()).getTagletOutput(classDoc, ++ getTagletWriterInstance(false)); ++ Content typeParam = new RawHtml(output.toString()); ++ Content dl = HtmlTree.DL(typeParam); ++ classInfoTree.addContent(dl); + } + } + + /** + * {@inheritDoc} + */ +- public void writeClassDeprecationInfo() { +- hr(); +- Tag[] deprs = classDoc.tags("deprecated"); +- if (Util.isDeprecated(classDoc)) { +- strongText("doclet.Deprecated"); +- if (deprs.length > 0) { +- Tag[] commentTags = deprs[0].inlineTags(); +- if (commentTags.length > 0) { +- space(); +- printInlineDeprecatedComment(classDoc, deprs[0]); +- } +- } +- p(); +- } +- } +- +- /** +- * Generate the indent and get the line image for the class tree. +- * For user accessibility, the image includes the alt attribute +- * "extended by". (This method is not intended for a class +- * implementing an interface, where "implemented by" would be required.) +- * +- * indent integer indicating the number of spaces to indent +- */ +- private void writeStep(int indent) { +- print(spaces(4 * indent - 2)); +- print("<IMG SRC=\"" + relativepathNoSlash + "/resources/inherit.gif\" " + +- "ALT=\"" + configuration.getText("doclet.extended_by") + " \">"); +- } +- +- /** +- * Print the class hierarchy tree for the given class. +- * @param type the class to print the hierarchy for. +- * @return return the amount that should be indented in +- * the next level of the tree. +- */ +- private int writeTreeForClassHelper(Type type) { +- Type sup = Util.getFirstVisibleSuperClass( +- type instanceof ClassDoc ? (ClassDoc) type : type.asClassDoc(), +- configuration()); +- int indent = 0; +- if (sup != null) { +- indent = writeTreeForClassHelper(sup); +- writeStep(indent); +- } +- +- if (type.equals(classDoc)) { +- String typeParameters = getTypeParameterLinks( +- new LinkInfoImpl( +- LinkInfoImpl.CONTEXT_TREE, +- classDoc, false)); +- if (configuration.shouldExcludeQualifier( +- classDoc.containingPackage().name())) { +- strong(type.asClassDoc().name() + typeParameters); +- } else { +- strong(type.asClassDoc().qualifiedName() + typeParameters); +- } +- } else { +- print(getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS_TREE_PARENT, +- type instanceof ClassDoc ? (ClassDoc) type : type, +- configuration.getClassName(type.asClassDoc()), false))); +- } +- println(); +- return indent + 1; +- } +- +- /** +- * Print the class hierarchy tree for this class only. +- */ +- public void writeClassTree() { +- if (! classDoc.isClass()) { +- return; +- } +- pre(); +- writeTreeForClassHelper(classDoc); +- preEnd(); +- } +- +- /** +- * Write the type parameter information. +- */ +- public void writeTypeParamInfo() { +- if (classDoc.typeParamTags().length > 0) { +- dl(); +- dt(); +- TagletOutput output = (new ParamTaglet()).getTagletOutput(classDoc, +- getTagletWriterInstance(false)); +- print(output.toString()); +- dtEnd(); +- dlEnd(); +- } +- } +- +- /** +- * {@inheritDoc} +- */ +- public void writeSubClassInfo() { ++ public void addSubClassInfo(Content classInfoTree) { + if (classDoc.isClass()) { + if (classDoc.qualifiedName().equals("java.lang.Object") || +- classDoc.qualifiedName().equals("org.omg.CORBA.Object")) { ++ classDoc.qualifiedName().equals("org.omg.CORBA.Object")) { + return; // Don't generate the list, too huge + } + List subclasses = classtree.subs(classDoc, false); + if (subclasses.size() > 0) { +- dl(); +- dt(); +- strongText("doclet.Subclasses"); +- dtEnd(); +- writeClassLinks(LinkInfoImpl.CONTEXT_SUBCLASSES, +- subclasses); +- dlEnd(); ++ Content label = getResource( ++ "doclet.Subclasses"); ++ Content dt = HtmlTree.DT(label); ++ Content dl = HtmlTree.DL(dt); ++ dl.addContent(getClassLinks(LinkInfoImpl.CONTEXT_SUBCLASSES, ++ subclasses)); ++ classInfoTree.addContent(dl); + } + } + } +@@ -369,140 +406,196 @@ + /** + * {@inheritDoc} + */ +- public void writeSubInterfacesInfo() { ++ public void addSubInterfacesInfo(Content classInfoTree) { + if (classDoc.isInterface()) { + List subInterfaces = classtree.allSubs(classDoc, false); + if (subInterfaces.size() > 0) { +- dl(); +- dt(); +- strongText("doclet.Subinterfaces"); +- dtEnd(); +- writeClassLinks(LinkInfoImpl.CONTEXT_SUBINTERFACES, +- subInterfaces); +- dlEnd(); ++ Content label = getResource( ++ "doclet.Subinterfaces"); ++ Content dt = HtmlTree.DT(label); ++ Content dl = HtmlTree.DL(dt); ++ dl.addContent(getClassLinks(LinkInfoImpl.CONTEXT_SUBINTERFACES, ++ subInterfaces)); ++ classInfoTree.addContent(dl); + } + } + } + + /** +- * If this is the interface which are the classes, that implement this? +- */ +- public void writeInterfaceUsageInfo () { +- if (! classDoc.isInterface()) { +- return; +- } +- if (classDoc.qualifiedName().equals("java.lang.Cloneable") || +- classDoc.qualifiedName().equals("java.io.Serializable")) { +- return; // Don't generate the list, too big +- } +- List implcl = classtree.implementingclasses(classDoc); +- if (implcl.size() > 0) { +- dl(); +- dt(); +- strongText("doclet.Implementing_Classes"); +- dtEnd(); +- writeClassLinks(LinkInfoImpl.CONTEXT_IMPLEMENTED_CLASSES, +- implcl); +- dlEnd(); +- } +- } +- +- /** + * {@inheritDoc} + */ +- public void writeImplementedInterfacesInfo() { +- //NOTE: we really should be using ClassDoc.interfaceTypes() here, but +- // it doesn't walk up the tree like we want it to. +- List interfaceArray = Util.getAllInterfaces(classDoc, configuration); +- if (classDoc.isClass() && interfaceArray.size() > 0) { +- dl(); +- dt(); +- strongText("doclet.All_Implemented_Interfaces"); +- dtEnd(); +- writeClassLinks(LinkInfoImpl.CONTEXT_IMPLEMENTED_INTERFACES, +- interfaceArray); +- dlEnd(); ++ public void addInterfaceUsageInfo (Content classInfoTree) { ++ if (! classDoc.isInterface()) { ++ return; ++ } ++ if (classDoc.qualifiedName().equals("java.lang.Cloneable") || ++ classDoc.qualifiedName().equals("java.io.Serializable")) { ++ return; // Don't generate the list, too big ++ } ++ List<ClassDoc> implcl = classtree.implementingclasses(classDoc); ++ if (implcl.size() > 0) { ++ Content label = getResource( ++ "doclet.Implementing_Classes"); ++ Content dt = HtmlTree.DT(label); ++ Content dl = HtmlTree.DL(dt); ++ dl.addContent(getClassLinks(LinkInfoImpl.CONTEXT_IMPLEMENTED_CLASSES, ++ implcl)); ++ classInfoTree.addContent(dl); + } + } + + /** + * {@inheritDoc} + */ +- public void writeSuperInterfacesInfo() { ++ public void addImplementedInterfacesInfo(Content classInfoTree) { ++ //NOTE: we really should be using ClassDoc.interfaceTypes() here, but ++ // it doesn't walk up the tree like we want it to. ++ List<Type> interfaceArray = Util.getAllInterfaces(classDoc, configuration); ++ if (classDoc.isClass() && interfaceArray.size() > 0) { ++ Content label = getResource( ++ "doclet.All_Implemented_Interfaces"); ++ Content dt = HtmlTree.DT(label); ++ Content dl = HtmlTree.DL(dt); ++ dl.addContent(getClassLinks(LinkInfoImpl.CONTEXT_IMPLEMENTED_INTERFACES, ++ interfaceArray)); ++ classInfoTree.addContent(dl); ++ } ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void addSuperInterfacesInfo(Content classInfoTree) { + //NOTE: we really should be using ClassDoc.interfaceTypes() here, but + // it doesn't walk up the tree like we want it to. + List interfaceArray = Util.getAllInterfaces(classDoc, configuration); + if (classDoc.isInterface() && interfaceArray.size() > 0) { +- dl(); +- dt(); +- strongText("doclet.All_Superinterfaces"); +- dtEnd(); +- writeClassLinks(LinkInfoImpl.CONTEXT_SUPER_INTERFACES, +- interfaceArray); +- dlEnd(); ++ Content label = getResource( ++ "doclet.All_Superinterfaces"); ++ Content dt = HtmlTree.DT(label); ++ Content dl = HtmlTree.DL(dt); ++ dl.addContent(getClassLinks(LinkInfoImpl.CONTEXT_SUPER_INTERFACES, ++ interfaceArray)); ++ classInfoTree.addContent(dl); + } + } + + /** +- * Generate links to the given classes. ++ * {@inheritDoc} + */ +- private void writeClassLinks(int context, List list) { ++ public void addNestedClassInfo(Content classInfoTree) { ++ ClassDoc outerClass = classDoc.containingClass(); ++ if (outerClass != null) { ++ Content label; ++ if (outerClass.isInterface()) { ++ label = getResource( ++ "doclet.Enclosing_Interface"); ++ } else { ++ label = getResource( ++ "doclet.Enclosing_Class"); ++ } ++ Content dt = HtmlTree.DT(label); ++ Content dl = HtmlTree.DL(dt); ++ Content dd = new HtmlTree(HtmlTag.DD); ++ dd.addContent(new RawHtml(getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, outerClass, ++ false)))); ++ dl.addContent(dd); ++ classInfoTree.addContent(dl); ++ } ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void addClassDeprecationInfo(Content classInfoTree) { ++ Content hr = new HtmlTree(HtmlTag.HR); ++ classInfoTree.addContent(hr); ++ Tag[] deprs = classDoc.tags("deprecated"); ++ if (Util.isDeprecated(classDoc)) { ++ Content strong = HtmlTree.STRONG(deprecatedPhrase); ++ Content div = HtmlTree.DIV(HtmlStyle.block, strong); ++ if (deprs.length > 0) { ++ Tag[] commentTags = deprs[0].inlineTags(); ++ if (commentTags.length > 0) { ++ div.addContent(getSpace()); ++ addInlineDeprecatedComment(classDoc, deprs[0], div); ++ } ++ } ++ classInfoTree.addContent(div); ++ } ++ } ++ ++ /** ++ * Get links to the given classes. ++ * ++ * @param context the id of the context where the link will be printed ++ * @param list the list of classes ++ * @return a content tree for the class list ++ */ ++ private Content getClassLinks(int context, List<?> list) { + Object[] typeList = list.toArray(); +- //Sort the list to be printed. +- print(' '); +- dd(); ++ Content dd = new HtmlTree(HtmlTag.DD); + for (int i = 0; i < list.size(); i++) { + if (i > 0) { +- print(", "); ++ Content separator = new StringContent(", "); ++ dd.addContent(separator); + } + if (typeList[i] instanceof ClassDoc) { +- printLink(new LinkInfoImpl(context, (ClassDoc)(typeList[i]))); +- ++ Content link = new RawHtml(getLink( ++ new LinkInfoImpl(context, (ClassDoc)(typeList[i])))); ++ dd.addContent(link); + } else { +- printLink(new LinkInfoImpl(context, (Type)(typeList[i]))); ++ Content link = new RawHtml(getLink( ++ new LinkInfoImpl(context, (Type)(typeList[i])))); ++ dd.addContent(link); + } + } +- ddEnd(); ++ return dd; + } + +- protected void navLinkTree() { +- navCellStart(); +- printHyperLink("package-tree.html", "", +- configuration.getText("doclet.Tree"), true, "NavBarFont1"); +- navCellEnd(); ++ /** ++ * {@inheritDoc} ++ */ ++ protected Content getNavLinkTree() { ++ Content treeLinkContent = getHyperLink("package-tree.html", ++ "", treeLabel, "", ""); ++ Content li = HtmlTree.LI(treeLinkContent); ++ return li; + } + +- protected void printSummaryDetailLinks() { ++ /** ++ * Add summary details to the navigation bar. ++ * ++ * @param subDiv the content tree to which the summary detail links will be added ++ */ ++ protected void addSummaryDetailLinks(Content subDiv) { + try { +- tr(); +- tdVAlignClass("top", "NavBarCell3"); +- font("-2"); +- print(" "); +- navSummaryLinks(); +- fontEnd(); +- tdEnd(); +- tdVAlignClass("top", "NavBarCell3"); +- font("-2"); +- navDetailLinks(); +- fontEnd(); +- tdEnd(); +- trEnd(); ++ Content div = HtmlTree.DIV(getNavSummaryLinks()); ++ div.addContent(getNavDetailLinks()); ++ subDiv.addContent(div); + } catch (Exception e) { + e.printStackTrace(); + throw new DocletAbortException(); + } + } + +- protected void navSummaryLinks() throws Exception { +- printText("doclet.Summary"); +- space(); ++ /** ++ * Get summary links for navigation bar. ++ * ++ * @return the content tree for the navigation summary links ++ */ ++ protected Content getNavSummaryLinks() throws Exception { ++ Content li = HtmlTree.LI(summaryLabel); ++ li.addContent(getSpace()); ++ Content ulNav = HtmlTree.UL(HtmlStyle.subNavList, li); + MemberSummaryBuilder memberSummaryBuilder = (MemberSummaryBuilder) +- configuration.getBuilderFactory().getMemberSummaryBuilder(this); ++ configuration.getBuilderFactory().getMemberSummaryBuilder(this); + String[] navLinkLabels = new String[] { + "doclet.navNested", "doclet.navEnum", "doclet.navField", "doclet.navConstructor", +- "doclet.navMethod" ++ "doclet.navMethod" + }; + for (int i = 0; i < navLinkLabels.length; i++ ) { ++ Content liNav = new HtmlTree(HtmlTag.LI); + if (i == VisibleMemberMap.ENUM_CONSTANTS && ! classDoc.isEnum()) { + continue; + } +@@ -511,38 +604,41 @@ + } + AbstractMemberWriter writer = + ((AbstractMemberWriter) memberSummaryBuilder. +- getMemberSummaryWriter(i)); ++ getMemberSummaryWriter(i)); + if (writer == null) { +- printText(navLinkLabels[i]); ++ liNav.addContent(getResource(navLinkLabels[i])); + } else { +- writer.navSummaryLink( +- memberSummaryBuilder.members(i), +- memberSummaryBuilder.getVisibleMemberMap(i)); ++ writer.addNavSummaryLink( ++ memberSummaryBuilder.members(i), ++ memberSummaryBuilder.getVisibleMemberMap(i), liNav); + } + if (i < navLinkLabels.length-1) { +- navGap(); ++ addNavGap(liNav); + } ++ ulNav.addContent(liNav); + } ++ return ulNav; + } + + /** +- * Method navDetailLinks ++ * Get detail links for the navigation bar. + * +- * @throws Exception +- * ++ * @return the content tree for the detail links + */ +- protected void navDetailLinks() throws Exception { +- printText("doclet.Detail"); +- space(); ++ protected Content getNavDetailLinks() throws Exception { ++ Content li = HtmlTree.LI(detailLabel); ++ li.addContent(getSpace()); ++ Content ulNav = HtmlTree.UL(HtmlStyle.subNavList, li); + MemberSummaryBuilder memberSummaryBuilder = (MemberSummaryBuilder) +- configuration.getBuilderFactory().getMemberSummaryBuilder(this); ++ configuration.getBuilderFactory().getMemberSummaryBuilder(this); + String[] navLinkLabels = new String[] { + "doclet.navNested", "doclet.navEnum", "doclet.navField", "doclet.navConstructor", +- "doclet.navMethod" ++ "doclet.navMethod" + }; + for (int i = 1; i < navLinkLabels.length; i++ ) { ++ Content liNav = new HtmlTree(HtmlTag.LI); + AbstractMemberWriter writer = +- ((AbstractMemberWriter) memberSummaryBuilder. ++ ((AbstractMemberWriter) memberSummaryBuilder. + getMemberSummaryWriter(i)); + if (i == VisibleMemberMap.ENUM_CONSTANTS && ! classDoc.isEnum()) { + continue; +@@ -551,43 +647,27 @@ + continue; + } + if (writer == null) { +- printText(navLinkLabels[i]); ++ liNav.addContent(getResource(navLinkLabels[i])); + } else { +- writer.navDetailLink(memberSummaryBuilder.members(i)); ++ writer.addNavDetailLink(memberSummaryBuilder.members(i), liNav); + } + if (i < navLinkLabels.length - 1) { +- navGap(); ++ addNavGap(liNav); + } ++ ulNav.addContent(liNav); + } +- } +- +- protected void navGap() { +- space(); +- print('|'); +- space(); ++ return ulNav; + } + + /** +- * If this is an inner class or interface, write the enclosing class or +- * interface. ++ * Add gap between navigation bar elements. ++ * ++ * @param liNav the content tree to which the gap will be added + */ +- public void writeNestedClassInfo() { +- ClassDoc outerClass = classDoc.containingClass(); +- if (outerClass != null) { +- dl(); +- dt(); +- if (outerClass.isInterface()) { +- strongText("doclet.Enclosing_Interface"); +- } else { +- strongText("doclet.Enclosing_Class"); +- } +- dtEnd(); +- dd(); +- printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CLASS, outerClass, +- false)); +- ddEnd(); +- dlEnd(); +- } ++ protected void addNavGap(Content liNav) { ++ liNav.addContent(getSpace()); ++ liNav.addContent("|"); ++ liNav.addContent(getSpace()); + } + + /** +@@ -598,11 +678,4 @@ + public ClassDoc getClassDoc() { + return classDoc; + } +- +- /** +- * {@inheritDoc} +- */ +- public void completeMemberSummaryBuild() { +- p(); +- } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java +@@ -25,11 +25,12 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.io.*; ++import java.util.*; ++import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; +-import com.sun.javadoc.*; +-import java.io.*; +-import java.util.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Write the Constants Summary Page in HTML format. +@@ -76,67 +77,106 @@ + /** + * {@inheritDoc} + */ +- public void writeHeader() { +- printHtmlHeader(configuration.getText("doclet.Constants_Summary"), +- null, true); +- printTop(); +- navLinks(true); +- hr(); +- +- center(); +- h1(); printText("doclet.Constants_Summary"); h1End(); +- centerEnd(); +- +- hr(4, "noshade"); ++ public Content getHeader() { ++ String label = configuration.getText("doclet.Constants_Summary"); ++ Content bodyTree = getBody(true, getWindowTitle(label)); ++ addTop(bodyTree); ++ addNavLinks(true, bodyTree); ++ return bodyTree; + } + + /** + * {@inheritDoc} + */ +- public void writeFooter() { +- hr(); +- navLinks(false); +- printBottom(); +- printBodyHtmlEnd(); ++ public Content getContentsHeader() { ++ return new HtmlTree(HtmlTag.UL); + } + + /** + * {@inheritDoc} + */ +- public void writeContentsHeader() { +- strong(configuration.getText("doclet.Contents")); +- ul(); ++ public void addLinkToPackageContent(PackageDoc pkg, String parsedPackageName, ++ Set<String> printedPackageHeaders, Content contentListTree) { ++ String packageName = pkg.name(); ++ //add link to summary ++ Content link; ++ if (packageName.length() == 0) { ++ link = getHyperLink("#" + DocletConstants.UNNAMED_PACKAGE_ANCHOR, ++ "", defaultPackageLabel, "", ""); ++ } else { ++ Content packageNameContent = getPackageLabel(parsedPackageName); ++ packageNameContent.addContent(".*"); ++ link = getHyperLink("#" + parsedPackageName, ++ "", packageNameContent, "", ""); ++ printedPackageHeaders.add(parsedPackageName); ++ } ++ contentListTree.addContent(HtmlTree.LI(link)); + } + + /** + * {@inheritDoc} + */ +- public void writeContentsFooter() { +- ulEnd(); +- println(); ++ public Content getContentsList(Content contentListTree) { ++ Content titleContent = getResource( ++ "doclet.Constants_Summary"); ++ Content pHeading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, true, ++ HtmlStyle.title, titleContent); ++ Content div = HtmlTree.DIV(HtmlStyle.header, pHeading); ++ Content headingContent = getResource( ++ "doclet.Contents"); ++ div.addContent(HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, true, ++ headingContent)); ++ div.addContent(contentListTree); ++ return div; + } + + /** + * {@inheritDoc} + */ +- public void writeLinkToPackageContent(PackageDoc pkg, String parsedPackageName, Set printedPackageHeaders) { +- String packageName = pkg.name(); +- //add link to summary +- li(); +- if (packageName.length() == 0) { +- printHyperLink("#" + DocletConstants.UNNAMED_PACKAGE_ANCHOR, +- DocletConstants.DEFAULT_PACKAGE_NAME); +- } else { +- printHyperLink("#" + parsedPackageName, parsedPackageName + ".*"); +- printedPackageHeaders.add(parsedPackageName); +- } +- println(); ++ public Content getConstantSummaries() { ++ HtmlTree summariesDiv = new HtmlTree(HtmlTag.DIV); ++ summariesDiv.addStyle(HtmlStyle.constantValuesContainer); ++ return summariesDiv; + } + + /** + * {@inheritDoc} + */ +- public void writeConstantMembersHeader(ClassDoc cd) { ++ public void addPackageName(PackageDoc pkg, String parsedPackageName, ++ Content summariesTree) { ++ Content pkgNameContent; ++ if (parsedPackageName.length() == 0) { ++ summariesTree.addContent(getMarkerAnchor( ++ DocletConstants.UNNAMED_PACKAGE_ANCHOR)); ++ pkgNameContent = defaultPackageLabel; ++ } else { ++ summariesTree.addContent(getMarkerAnchor( ++ parsedPackageName)); ++ pkgNameContent = getPackageLabel(parsedPackageName); ++ } ++ Content headingContent = new StringContent(".*"); ++ Content heading = HtmlTree.HEADING(HtmlConstants.PACKAGE_HEADING, true, ++ pkgNameContent); ++ heading.addContent(headingContent); ++ summariesTree.addContent(heading); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public Content getClassConstantHeader() { ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.blockList); ++ return ul; ++ } ++ ++ /** ++ * Get the table caption and header for the constant summary table ++ * ++ * @param cd classdoc to be documented ++ * @return constant members header content ++ */ ++ public Content getConstantMembersHeader(ClassDoc cd) { + //generate links backward only to public classes. + String classlink = (cd.isPublic() || cd.isProtected())? + getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CONSTANT_SUMMARY, cd, +@@ -144,112 +184,120 @@ + cd.qualifiedName(); + String name = cd.containingPackage().name(); + if (name.length() > 0) { +- writeClassName(name + "." + classlink); ++ return getClassName(name + "." + classlink); + } else { +- writeClassName(classlink); ++ return getClassName(classlink); + } + } + + /** ++ * Get the class name in the table caption and the table header. ++ * ++ * @param classStr the class name to print. ++ * @return the table caption and header ++ */ ++ protected Content getClassName(String classStr) { ++ Content table = HtmlTree.TABLE(0, 3, 0, constantsTableSummary, ++ getTableCaption(classStr)); ++ table.addContent(getSummaryTableHeader(constantsTableHeader, "col")); ++ return table; ++ } ++ ++ /** + * {@inheritDoc} + */ +- public void writeConstantMembersFooter(ClassDoc cd) { +- tableFooter(false); +- p(); ++ public void addConstantMembers(ClassDoc cd, List<FieldDoc> fields, ++ Content classConstantTree) { ++ currentClassDoc = cd; ++ Content tbody = new HtmlTree(HtmlTag.TBODY); ++ for (int i = 0; i < fields.size(); ++i) { ++ HtmlTree tr = new HtmlTree(HtmlTag.TR); ++ if (i%2 == 0) ++ tr.addStyle(HtmlStyle.altColor); ++ else ++ tr.addStyle(HtmlStyle.rowColor); ++ addConstantMember(fields.get(i), tr); ++ tbody.addContent(tr); ++ } ++ Content table = getConstantMembersHeader(cd); ++ table.addContent(tbody); ++ Content li = HtmlTree.LI(HtmlStyle.blockList, table); ++ classConstantTree.addContent(li); + } + + /** +- * Print the class name in the table heading. +- * @param classStr the heading to print. ++ * Add the row for the constant summary table. ++ * ++ * @param member the field to be documented. ++ * @param trTree an htmltree object for the table row + */ +- protected void writeClassName(String classStr) { +- table(1, 3, 0, constantsTableSummary); +- tableSubCaptionStart(); +- write(classStr); +- tableCaptionEnd(); +- summaryTableHeader(constantsTableHeader, "col"); ++ private void addConstantMember(FieldDoc member, HtmlTree trTree) { ++ trTree.addContent(getTypeColumn(member)); ++ trTree.addContent(getNameColumn(member)); ++ trTree.addContent(getValue(member)); + } + +- private void tableFooter(boolean isHeader) { +- fontEnd(); +- if (isHeader) { +- thEnd(); +- } else { +- tdEnd(); ++ /** ++ * Get the type column for the constant summary table row. ++ * ++ * @param member the field to be documented. ++ * @return the type column of the constant table row ++ */ ++ private Content getTypeColumn(FieldDoc member) { ++ Content anchor = getMarkerAnchor(currentClassDoc.qualifiedName() + ++ "." + member.name()); ++ Content tdType = HtmlTree.TD(HtmlStyle.colFirst, anchor); ++ Content code = new HtmlTree(HtmlTag.CODE); ++ StringTokenizer mods = new StringTokenizer(member.modifiers()); ++ while(mods.hasMoreTokens()) { ++ Content modifier = new StringContent(mods.nextToken()); ++ code.addContent(modifier); ++ code.addContent(getSpace()); + } +- trEnd(); +- tableEnd(); +- p(); ++ Content type = new RawHtml(getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_CONSTANT_SUMMARY, member.type()))); ++ code.addContent(type); ++ tdType.addContent(code); ++ return tdType; ++ } ++ ++ /** ++ * Get the name column for the constant summary table row. ++ * ++ * @param member the field to be documented. ++ * @return the name column of the constant table row ++ */ ++ private Content getNameColumn(FieldDoc member) { ++ Content nameContent = new RawHtml(getDocLink( ++ LinkInfoImpl.CONTEXT_CONSTANT_SUMMARY, member, member.name(), false)); ++ Content code = HtmlTree.CODE(nameContent); ++ return HtmlTree.TD(code); ++ } ++ ++ /** ++ * Get the value column for the constant summary table row. ++ * ++ * @param member the field to be documented. ++ * @return the value column of the constant table row ++ */ ++ private Content getValue(FieldDoc member) { ++ Content valueContent = new StringContent(member.constantValueExpression()); ++ Content code = HtmlTree.CODE(valueContent); ++ return HtmlTree.TD(HtmlStyle.colLast, code); + } + + /** + * {@inheritDoc} + */ +- public void writePackageName(PackageDoc pkg, String parsedPackageName) { +- String pkgname; +- if (parsedPackageName.length() == 0) { +- anchor(DocletConstants.UNNAMED_PACKAGE_ANCHOR); +- pkgname = DocletConstants.DEFAULT_PACKAGE_NAME; +- } else { +- anchor(parsedPackageName); +- pkgname = parsedPackageName; +- } +- table(1, "100%", 3, 0); +- trBgcolorStyle("#CCCCFF", "TableHeadingColor"); +- thAlign("left"); +- font("+2"); +- write(pkgname + ".*"); +- tableFooter(true); ++ public void addFooter(Content contentTree) { ++ addNavLinks(false, contentTree); ++ addBottom(contentTree); + } + + /** + * {@inheritDoc} + */ +- public void writeConstantMembers(ClassDoc cd, List fields) { +- currentClassDoc = cd; +- for (int i = 0; i < fields.size(); ++i) { +- writeConstantMember((FieldDoc)(fields.get(i))); +- } +- } +- +- private void writeConstantMember(FieldDoc member) { +- trBgcolorStyle("white", "TableRowColor"); +- anchor(currentClassDoc.qualifiedName() + "." + member.name()); +- writeTypeColumn(member); +- writeNameColumn(member); +- writeValue(member); +- trEnd(); +- } +- +- private void writeTypeColumn(FieldDoc member) { +- tdAlign("right"); +- font("-1"); +- code(); +- StringTokenizer mods = new StringTokenizer(member.modifiers()); +- while(mods.hasMoreTokens()) { +- print(mods.nextToken() + " "); +- } +- printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_CONSTANT_SUMMARY, +- member.type())); +- codeEnd(); +- fontEnd(); +- tdEnd(); +- } +- +- private void writeNameColumn(FieldDoc member) { +- tdAlign("left"); +- code(); +- printDocLink(LinkInfoImpl.CONTEXT_CONSTANT_SUMMARY, member, +- member.name(), false); +- codeEnd(); +- tdEnd(); +- } +- +- private void writeValue(FieldDoc member) { +- tdAlign("right"); +- code(); +- print(Util.escapeHtmlChars(member.constantValueExpression())); +- codeEnd(); +- tdEnd(); ++ public void printDocument(Content contentTree) { ++ printHtmlDocument(null, true, contentTree); + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java +@@ -29,6 +29,7 @@ + import java.util.*; + + import com.sun.javadoc.*; ++import com.sun.tools.doclets.formats.html.markup.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + +@@ -43,7 +44,6 @@ + implements ConstructorWriter, MemberSummaryWriter { + + private boolean foundNonPubConstructor = false; +- private boolean printedSummaryHeader = false; + + /** + * Construct a new ConstructorWriterImpl. +@@ -75,125 +75,112 @@ + } + + /** +- * Write the constructors summary header for the given class. +- * +- * @param classDoc the class the summary belongs to. ++ * {@inheritDoc} + */ +- public void writeMemberSummaryHeader(ClassDoc classDoc) { +- printedSummaryHeader = true; +- writer.println(); +- writer.println("<!-- ======== CONSTRUCTOR SUMMARY ======== -->"); +- writer.println(); +- writer.printSummaryHeader(this, classDoc); ++ public Content getMemberSummaryHeader(ClassDoc classDoc, ++ Content memberSummaryTree) { ++ memberSummaryTree.addContent(HtmlConstants.START_OF_CONSTRUCTOR_SUMMARY); ++ Content memberTree = writer.getMemberTreeHeader(); ++ writer.addSummaryHeader(this, classDoc, memberTree); ++ return memberTree; + } + + /** +- * Write the constructors summary footer for the given class. +- * +- * @param classDoc the class the summary belongs to. ++ * {@inheritDoc} + */ +- public void writeMemberSummaryFooter(ClassDoc classDoc) { +- writer.printSummaryFooter(this, classDoc); ++ public Content getConstructorDetailsTreeHeader(ClassDoc classDoc, ++ Content memberDetailsTree) { ++ memberDetailsTree.addContent(HtmlConstants.START_OF_CONSTRUCTOR_DETAILS); ++ Content constructorDetailsTree = writer.getMemberTreeHeader(); ++ constructorDetailsTree.addContent(writer.getMarkerAnchor("constructor_detail")); ++ Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, ++ writer.constructorDetailsLabel); ++ constructorDetailsTree.addContent(heading); ++ return constructorDetailsTree; + } + + /** +- * Write the header for the constructor documentation. +- * +- * @param classDoc the class that the constructors belong to. ++ * {@inheritDoc} + */ +- public void writeHeader(ClassDoc classDoc, String header) { +- writer.println(); +- writer.println("<!-- ========= CONSTRUCTOR DETAIL ======== -->"); +- writer.println(); +- writer.anchor("constructor_detail"); +- writer.printTableHeadingBackground(header); ++ public Content getConstructorDocTreeHeader(ConstructorDoc constructor, ++ Content constructorDetailsTree) { ++ String erasureAnchor; ++ if ((erasureAnchor = getErasureAnchor(constructor)) != null) { ++ constructorDetailsTree.addContent(writer.getMarkerAnchor((erasureAnchor))); ++ } ++ constructorDetailsTree.addContent( ++ writer.getMarkerAnchor(writer.getAnchor(constructor))); ++ Content constructorDocTree = writer.getMemberTreeHeader(); ++ Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); ++ heading.addContent(constructor.name()); ++ constructorDocTree.addContent(heading); ++ return constructorDocTree; + } + + /** +- * Write the constructor header for the given constructor. +- * +- * @param constructor the constructor being documented. +- * @param isFirst the flag to indicate whether or not the constructor is the +- * first to be documented. ++ * {@inheritDoc} + */ +- public void writeConstructorHeader(ConstructorDoc constructor, boolean isFirst) { +- if (! isFirst) { +- writer.printMemberHeader(); ++ public Content getSignature(ConstructorDoc constructor) { ++ writer.displayLength = 0; ++ Content pre = new HtmlTree(HtmlTag.PRE); ++ writer.addAnnotationInfo(constructor, pre); ++ addModifiers(constructor, pre); ++ if (configuration().linksource) { ++ Content constructorName = new StringContent(constructor.name()); ++ writer.addSrcLink(constructor, constructorName, pre); ++ } else { ++ addName(constructor.name(), pre); + } +- writer.println(); +- String erasureAnchor; +- if ((erasureAnchor = getErasureAnchor(constructor)) != null) { +- writer.anchor(erasureAnchor); +- } +- writer.anchor(constructor); +- writer.h3(); +- writer.print(constructor.name()); +- writer.h3End(); ++ addParameters(constructor, pre); ++ addExceptions(constructor, pre); ++ return pre; + } + + /** +- * Write the signature for the given constructor. +- * +- * @param constructor the constructor being documented. ++ * {@inheritDoc} + */ +- public void writeSignature(ConstructorDoc constructor) { +- writer.displayLength = 0; +- writer.pre(); +- writer.writeAnnotationInfo(constructor); +- printModifiers(constructor); +- //printReturnType((ConstructorDoc)constructor); +- if (configuration().linksource) { +- writer.printSrcLink(constructor, constructor.name()); +- } else { +- strong(constructor.name()); +- } +- writeParameters(constructor); +- writeExceptions(constructor); +- writer.preEnd(); +- assert !writer.getMemberDetailsListPrinted(); ++ @Override ++ public void setSummaryColumnStyle(HtmlTree tdTree) { ++ if (foundNonPubConstructor) ++ tdTree.addStyle(HtmlStyle.colLast); ++ else ++ tdTree.addStyle(HtmlStyle.colOne); + } + + /** +- * Write the deprecated output for the given constructor. +- * +- * @param constructor the constructor being documented. ++ * {@inheritDoc} + */ +- public void writeDeprecated(ConstructorDoc constructor) { +- printDeprecated(constructor); ++ public void addDeprecated(ConstructorDoc constructor, Content constructorDocTree) { ++ addDeprecatedInfo(constructor, constructorDocTree); + } + + /** +- * Write the comments for the given constructor. +- * +- * @param constructor the constructor being documented. ++ * {@inheritDoc} + */ +- public void writeComments(ConstructorDoc constructor) { +- printComment(constructor); ++ public void addComments(ConstructorDoc constructor, Content constructorDocTree) { ++ addComment(constructor, constructorDocTree); + } + + /** +- * Write the tag output for the given constructor. +- * +- * @param constructor the constructor being documented. ++ * {@inheritDoc} + */ +- public void writeTags(ConstructorDoc constructor) { +- writer.printTags(constructor); ++ public void addTags(ConstructorDoc constructor, Content constructorDocTree) { ++ writer.addTagsInfo(constructor, constructorDocTree); + } + + /** +- * Write the constructor footer. ++ * {@inheritDoc} + */ +- public void writeConstructorFooter() { +- printMemberFooter(); ++ public Content getConstructorDetails(Content constructorDetailsTree) { ++ return getMemberTree(constructorDetailsTree); + } + + /** +- * Write the footer for the constructor documentation. +- * +- * @param classDoc the class that the constructors belong to. ++ * {@inheritDoc} + */ +- public void writeFooter(ClassDoc classDoc) { +- //No footer to write for constructor documentation ++ public Content getConstructorDoc(Content constructorDocTree, ++ boolean isLastContent) { ++ return getMemberTree(constructorDocTree, isLastContent); + } + + /** +@@ -212,17 +199,35 @@ + this.foundNonPubConstructor = foundNonPubConstructor; + } + +- public void printSummaryLabel() { +- writer.printText("doclet.Constructor_Summary"); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addSummaryLabel(Content memberTree) { ++ Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING, ++ writer.getResource("doclet.Constructor_Summary")); ++ memberTree.addContent(label); + } + +- public void printTableSummary() { +- writer.tableIndexSummary(configuration().getText("doclet.Member_Table_Summary", ++ /** ++ * {@inheritDoc} ++ */ ++ public String getTableSummary() { ++ return configuration().getText("doclet.Member_Table_Summary", + configuration().getText("doclet.Constructor_Summary"), +- configuration().getText("doclet.constructors"))); ++ configuration().getText("doclet.constructors")); + } + +- public void printSummaryTableHeader(ProgramElementDoc member) { ++ /** ++ * {@inheritDoc} ++ */ ++ public String getCaption() { ++ return configuration().getText("doclet.Constructors"); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String[] getSummaryTableHeader(ProgramElementDoc member) { + String[] header; + if (foundNonPubConstructor) { + header = new String[] { +@@ -239,87 +244,73 @@ + configuration().getText("doclet.Description")) + }; + } +- writer.summaryTableHeader(header, "col"); ++ return header; + } + +- public void printSummaryAnchor(ClassDoc cd) { +- writer.anchor("constructor_summary"); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addSummaryAnchor(ClassDoc cd, Content memberTree) { ++ memberTree.addContent(writer.getMarkerAnchor("constructor_summary")); + } + +- public void printInheritedSummaryAnchor(ClassDoc cd) { +- } // no such ++ /** ++ * {@inheritDoc} ++ */ ++ public void addInheritedSummaryAnchor(ClassDoc cd, Content inheritedTree) { ++ } + +- public void printInheritedSummaryLabel(ClassDoc cd) { +- // no such ++ /** ++ * {@inheritDoc} ++ */ ++ public void addInheritedSummaryLabel(ClassDoc cd, Content inheritedTree) { + } + + public int getMemberKind() { + return VisibleMemberMap.CONSTRUCTORS; + } + +- protected void navSummaryLink(List members) { +- printNavSummaryLink(classdoc, +- members.size() > 0? true: false); +- } +- +- protected void printNavSummaryLink(ClassDoc cd, boolean link) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { + if (link) { +- writer.printHyperLink("", "constructor_summary", +- ConfigurationImpl.getInstance().getText("doclet.navConstructor")); ++ return writer.getHyperLink("", "constructor_summary", ++ writer.getResource("doclet.navConstructor")); + } else { +- writer.printText("doclet.navConstructor"); +- } +- } +- +- protected void printNavDetailLink(boolean link) { +- if (link) { +- writer.printHyperLink("", "constructor_detail", +- ConfigurationImpl.getInstance().getText("doclet.navConstructor")); +- } else { +- writer.printText("doclet.navConstructor"); +- } +- } +- +- protected void printSummaryType(ProgramElementDoc member) { +- if (foundNonPubConstructor) { +- writer.printTypeSummaryHeader(); +- if (member.isProtected()) { +- print("protected "); +- } else if (member.isPrivate()) { +- print("private "); +- } else if (member.isPublic()) { +- writer.space(); +- } else { +- writer.printText("doclet.Package_private"); +- } +- writer.printTypeSummaryFooter(); +- } +- } +- +- /** +- * Write the inherited member summary header for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeInheritedMemberSummaryHeader(ClassDoc classDoc) { +- if(! printedSummaryHeader){ +- //We don't want inherited summary to not be under heading. +- writeMemberSummaryHeader(classDoc); +- writeMemberSummaryFooter(classDoc); +- printedSummaryHeader = true; ++ return writer.getResource("doclet.navConstructor"); + } + } + + /** + * {@inheritDoc} + */ +- public void writeInheritedMemberSummary(ClassDoc classDoc, +- ProgramElementDoc member, boolean isFirst, boolean isLast) {} ++ protected void addNavDetailLink(boolean link, Content liNav) { ++ if (link) { ++ liNav.addContent(writer.getHyperLink("", "constructor_detail", ++ writer.getResource("doclet.navConstructor"))); ++ } else { ++ liNav.addContent(writer.getResource("doclet.navConstructor")); ++ } ++ } + + /** +- * Write the inherited member summary footer for the given class. +- * +- * @param classDoc the class the summary belongs to. ++ * {@inheritDoc} + */ +- public void writeInheritedMemberSummaryFooter(ClassDoc classDoc) {} ++ protected void addSummaryType(ProgramElementDoc member, Content tdSummaryType) { ++ if (foundNonPubConstructor) { ++ Content code = new HtmlTree(HtmlTag.CODE); ++ if (member.isProtected()) { ++ code.addContent("protected "); ++ } else if (member.isPrivate()) { ++ code.addContent("private "); ++ } else if (member.isPublic()) { ++ code.addContent(writer.getSpace()); ++ } else { ++ code.addContent( ++ configuration().getText("doclet.Package_private")); ++ } ++ tdSummaryType.addContent(code); ++ } ++ } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java +@@ -25,9 +25,11 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.io.*; ++import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.DeprecatedAPIListBuilder; + import com.sun.tools.doclets.internal.toolkit.util.*; +-import java.io.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Generate File to list all the deprecated classes and class members with the +@@ -125,28 +127,21 @@ + } + + /** +- * Print the deprecated API list. Separately print all class kinds and +- * member kinds. ++ * Generate the deprecated API list. + * + * @param deprapi list of deprecated API built already. + */ + protected void generateDeprecatedListFile(DeprecatedAPIListBuilder deprapi) +- throws IOException { +- writeHeader(); +- +- strong(configuration.getText("doclet.Contents")); +- ul(); +- for (int i = 0; i < DeprecatedAPIListBuilder.NUM_TYPES; i++) { +- writeIndexLink(deprapi, i); +- } +- ulEnd(); +- println(); +- ++ throws IOException { ++ Content body = getHeader(); ++ body.addContent(getContentsList(deprapi)); + String memberTableSummary; + String[] memberTableHeader = new String[1]; ++ HtmlTree div = new HtmlTree(HtmlTag.DIV); ++ div.addStyle(HtmlStyle.contentContainer); + for (int i = 0; i < DeprecatedAPIListBuilder.NUM_TYPES; i++) { + if (deprapi.hasDocumentation(i)) { +- writeAnchor(deprapi, i); ++ addAnchor(deprapi, i, div); + memberTableSummary = + configuration.getText("doclet.Member_Table_Summary", + configuration.getText(HEADING_KEYS[i]), +@@ -154,66 +149,87 @@ + memberTableHeader[0] = configuration.getText("doclet.0_and_1", + configuration.getText(HEADER_KEYS[i]), + configuration.getText("doclet.Description")); +- writers[i].printDeprecatedAPI(deprapi.getList(i), +- HEADING_KEYS[i], memberTableSummary, memberTableHeader); ++ writers[i].addDeprecatedAPI(deprapi.getList(i), ++ HEADING_KEYS[i], memberTableSummary, memberTableHeader, div); + } + } +- printDeprecatedFooter(); ++ body.addContent(div); ++ addNavLinks(false, body); ++ addBottom(body); ++ printHtmlDocument(null, true, body); + } + +- private void writeIndexLink(DeprecatedAPIListBuilder builder, +- int type) { ++ /** ++ * Add the index link. ++ * ++ * @param builder the deprecated list builder ++ * @param type the type of list being documented ++ * @param contentTree the content tree to which the index link will be added ++ */ ++ private void addIndexLink(DeprecatedAPIListBuilder builder, ++ int type, Content contentTree) { + if (builder.hasDocumentation(type)) { +- li(); +- printHyperLink("#" + ANCHORS[type], +- configuration.getText(HEADING_KEYS[type])); +- println(); +- } +- } +- +- private void writeAnchor(DeprecatedAPIListBuilder builder, int type) { +- if (builder.hasDocumentation(type)) { +- anchor(ANCHORS[type]); ++ Content li = HtmlTree.LI(getHyperLink("#" + ANCHORS[type], ++ getResource(HEADING_KEYS[type]))); ++ contentTree.addContent(li); + } + } + + /** +- * Print the navigation bar and header for the deprecated API Listing. ++ * Get the contents list. ++ * ++ * @param deprapi the deprecated list builder ++ * @return a content tree for the contents list + */ +- protected void writeHeader() { +- printHtmlHeader(configuration.getText("doclet.Window_Deprecated_List"), +- null, true); +- printTop(); +- navLinks(true); +- hr(); +- center(); +- h2(); +- strongText("doclet.Deprecated_API"); +- h2End(); +- centerEnd(); +- +- hr(4, "noshade"); ++ public Content getContentsList(DeprecatedAPIListBuilder deprapi) { ++ Content headContent = getResource("doclet.Deprecated_API"); ++ Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, true, ++ HtmlStyle.title, headContent); ++ Content div = HtmlTree.DIV(HtmlStyle.header, heading); ++ Content headingContent = getResource("doclet.Contents"); ++ div.addContent(HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, true, ++ headingContent)); ++ Content ul = new HtmlTree(HtmlTag.UL); ++ for (int i = 0; i < DeprecatedAPIListBuilder.NUM_TYPES; i++) { ++ addIndexLink(deprapi, i, ul); ++ } ++ div.addContent(ul); ++ return div; + } + + /** +- * Print the navigation bar and the footer for the deprecated API Listing. ++ * Add the anchor. ++ * ++ * @param builder the deprecated list builder ++ * @param type the type of list being documented ++ * @param contentTree the content tree to which the anchor will be added + */ +- protected void printDeprecatedFooter() { +- hr(); +- navLinks(false); +- printBottom(); +- printBodyHtmlEnd(); ++ private void addAnchor(DeprecatedAPIListBuilder builder, int type, Content htmlTree) { ++ if (builder.hasDocumentation(type)) { ++ htmlTree.addContent(getMarkerAnchor(ANCHORS[type])); ++ } + } + + /** +- * Highlight the word "Deprecated" in the navigation bar as this is the same +- * page. ++ * Get the header for the deprecated API Listing. ++ * ++ * @return a content tree for the header + */ +- protected void navLinkDeprecated() { +- navCellRevStart(); +- fontStyle("NavBarFont1Rev"); +- strongText("doclet.navDeprecated"); +- fontEnd(); +- navCellEnd(); ++ public Content getHeader() { ++ String title = configuration.getText("doclet.Window_Deprecated_List"); ++ Content bodyTree = getBody(true, getWindowTitle(title)); ++ addTop(bodyTree); ++ addNavLinks(true, bodyTree); ++ return bodyTree; ++ } ++ ++ /** ++ * Get the deprecated label. ++ * ++ * @return a content tree for the deprecated label ++ */ ++ protected Content getNavLinkDeprecated() { ++ Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, deprecatedLabel); ++ return li; + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java +@@ -28,6 +28,7 @@ + import java.io.*; + + import com.sun.javadoc.*; ++import com.sun.tools.doclets.formats.html.markup.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + +@@ -40,8 +41,6 @@ + public class EnumConstantWriterImpl extends AbstractMemberWriter + implements EnumConstantWriter, MemberSummaryWriter { + +- private boolean printedSummaryHeader = false; +- + public EnumConstantWriterImpl(SubWriterHolderWriter writer, + ClassDoc classdoc) { + super(writer, classdoc); +@@ -52,136 +51,98 @@ + } + + /** +- * Write the enum constant summary header for the given class. +- * +- * @param classDoc the class the summary belongs to. ++ * {@inheritDoc} + */ +- public void writeMemberSummaryHeader(ClassDoc classDoc) { +- printedSummaryHeader = true; +- writer.println("<!-- =========== ENUM CONSTANT SUMMARY =========== -->"); +- writer.println(); +- writer.printSummaryHeader(this, classDoc); +- } +- +- /** +- * Write the enum constant summary footer for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeMemberSummaryFooter(ClassDoc classDoc) { +- writer.printSummaryFooter(this, classDoc); +- } +- +- /** +- * Write the inherited enum constant summary header for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeInheritedMemberSummaryHeader(ClassDoc classDoc) { +- if(! printedSummaryHeader){ +- //We don't want inherited summary to not be under heading. +- writeMemberSummaryHeader(classDoc); +- writeMemberSummaryFooter(classDoc); +- printedSummaryHeader = true; +- } +- writer.printInheritedSummaryHeader(this, classDoc); ++ public Content getMemberSummaryHeader(ClassDoc classDoc, ++ Content memberSummaryTree) { ++ memberSummaryTree.addContent(HtmlConstants.START_OF_ENUM_CONSTANT_SUMMARY); ++ Content memberTree = writer.getMemberTreeHeader(); ++ writer.addSummaryHeader(this, classDoc, memberTree); ++ return memberTree; + } + + /** + * {@inheritDoc} + */ +- public void writeInheritedMemberSummary(ClassDoc classDoc, +- ProgramElementDoc enumConstant, boolean isFirst, boolean isLast) { +- writer.printInheritedSummaryMember(this, classDoc, enumConstant, isFirst); +- } +- +- /** +- * Write the inherited enum constant summary footer for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeInheritedMemberSummaryFooter(ClassDoc classDoc) { +- writer.printInheritedSummaryFooter(this, classDoc); ++ public Content getEnumConstantsDetailsTreeHeader(ClassDoc classDoc, ++ Content memberDetailsTree) { ++ memberDetailsTree.addContent(HtmlConstants.START_OF_ENUM_CONSTANT_DETAILS); ++ Content enumConstantsDetailsTree = writer.getMemberTreeHeader(); ++ enumConstantsDetailsTree.addContent(writer.getMarkerAnchor("enum_constant_detail")); ++ Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, ++ writer.enumConstantsDetailsLabel); ++ enumConstantsDetailsTree.addContent(heading); ++ return enumConstantsDetailsTree; + } + + /** + * {@inheritDoc} + */ +- public void writeHeader(ClassDoc classDoc, String header) { +- writer.println(); +- writer.println("<!-- ============ ENUM CONSTANT DETAIL =========== -->"); +- writer.println(); +- writer.anchor("enum_constant_detail"); +- writer.printTableHeadingBackground(header); +- writer.println(); ++ public Content getEnumConstantsTreeHeader(FieldDoc enumConstant, ++ Content enumConstantsDetailsTree) { ++ enumConstantsDetailsTree.addContent( ++ writer.getMarkerAnchor(enumConstant.name())); ++ Content enumConstantsTree = writer.getMemberTreeHeader(); ++ Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); ++ heading.addContent(enumConstant.name()); ++ enumConstantsTree.addContent(heading); ++ return enumConstantsTree; + } + + /** + * {@inheritDoc} + */ +- public void writeEnumConstantHeader(FieldDoc enumConstant, boolean isFirst) { +- if (! isFirst) { +- writer.printMemberHeader(); +- writer.println(""); ++ public Content getSignature(FieldDoc enumConstant) { ++ Content pre = new HtmlTree(HtmlTag.PRE); ++ writer.addAnnotationInfo(enumConstant, pre); ++ addModifiers(enumConstant, pre); ++ Content enumConstantLink = new RawHtml(writer.getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, ++ enumConstant.type()))); ++ pre.addContent(enumConstantLink); ++ pre.addContent(" "); ++ if (configuration().linksource) { ++ Content enumConstantName = new StringContent(enumConstant.name()); ++ writer.addSrcLink(enumConstant, enumConstantName, pre); ++ } else { ++ addName(enumConstant.name(), pre); + } +- writer.anchor(enumConstant.name()); +- writer.h3(); +- writer.print(enumConstant.name()); +- writer.h3End(); ++ return pre; + } + + /** + * {@inheritDoc} + */ +- public void writeSignature(FieldDoc enumConstant) { +- writer.pre(); +- writer.writeAnnotationInfo(enumConstant); +- printModifiers(enumConstant); +- writer.printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, +- enumConstant.type())); +- print(' '); +- if (configuration().linksource) { +- writer.printSrcLink(enumConstant, enumConstant.name()); +- } else { +- strong(enumConstant.name()); +- } +- writer.preEnd(); +- assert !writer.getMemberDetailsListPrinted(); ++ public void addDeprecated(FieldDoc enumConstant, Content enumConstantsTree) { ++ addDeprecatedInfo(enumConstant, enumConstantsTree); + } + + /** + * {@inheritDoc} + */ +- public void writeDeprecated(FieldDoc enumConstant) { +- printDeprecated(enumConstant); ++ public void addComments(FieldDoc enumConstant, Content enumConstantsTree) { ++ addComment(enumConstant, enumConstantsTree); + } + + /** + * {@inheritDoc} + */ +- public void writeComments(FieldDoc enumConstant) { +- printComment(enumConstant); ++ public void addTags(FieldDoc enumConstant, Content enumConstantsTree) { ++ writer.addTagsInfo(enumConstant, enumConstantsTree); + } + + /** + * {@inheritDoc} + */ +- public void writeTags(FieldDoc enumConstant) { +- writer.printTags(enumConstant); ++ public Content getEnumConstantsDetails(Content enumConstantsDetailsTree) { ++ return getMemberTree(enumConstantsDetailsTree); + } + + /** + * {@inheritDoc} + */ +- public void writeEnumConstantFooter() { +- printMemberFooter(); +- } +- +- /** +- * {@inheritDoc} +- */ +- public void writeFooter(ClassDoc classDoc) { +- //No footer to write for enum constant documentation ++ public Content getEnumConstants(Content enumConstantsTree, ++ boolean isLastContent) { ++ return getMemberTree(enumConstantsTree, isLastContent); + } + + /** +@@ -195,75 +156,127 @@ + return VisibleMemberMap.ENUM_CONSTANTS; + } + +- public void printSummaryLabel() { +- writer.printText("doclet.Enum_Constant_Summary"); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addSummaryLabel(Content memberTree) { ++ Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING, ++ writer.getResource("doclet.Enum_Constant_Summary")); ++ memberTree.addContent(label); + } + +- public void printTableSummary() { +- writer.tableIndexSummary(configuration().getText("doclet.Member_Table_Summary", ++ /** ++ * {@inheritDoc} ++ */ ++ public String getTableSummary() { ++ return configuration().getText("doclet.Member_Table_Summary", + configuration().getText("doclet.Enum_Constant_Summary"), +- configuration().getText("doclet.enum_constants"))); ++ configuration().getText("doclet.enum_constants")); + } + +- public void printSummaryTableHeader(ProgramElementDoc member) { ++ /** ++ * {@inheritDoc} ++ */ ++ public String getCaption() { ++ return configuration().getText("doclet.Enum_Constants"); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String[] getSummaryTableHeader(ProgramElementDoc member) { + String[] header = new String[] { + configuration().getText("doclet.0_and_1", + configuration().getText("doclet.Enum_Constant"), + configuration().getText("doclet.Description")) + }; +- writer.summaryTableHeader(header, "col"); ++ return header; + } + +- public void printSummaryAnchor(ClassDoc cd) { +- writer.anchor("enum_constant_summary"); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addSummaryAnchor(ClassDoc cd, Content memberTree) { ++ memberTree.addContent(writer.getMarkerAnchor("enum_constant_summary")); + } + +- public void printInheritedSummaryAnchor(ClassDoc cd) { +- } // no such +- +- public void printInheritedSummaryLabel(ClassDoc cd) { +- // no such ++ /** ++ * {@inheritDoc} ++ */ ++ public void addInheritedSummaryAnchor(ClassDoc cd, Content inheritedTree) { + } + +- protected void writeSummaryLink(int context, ClassDoc cd, ProgramElementDoc member) { +- writer.strong(); +- writer.printDocLink(context, (MemberDoc) member, member.name(), false); +- writer.strongEnd(); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addInheritedSummaryLabel(ClassDoc cd, Content inheritedTree) { + } + +- protected void writeInheritedSummaryLink(ClassDoc cd, +- ProgramElementDoc member) { +- writer.printDocLink(LinkInfoImpl.CONTEXT_MEMBER, (MemberDoc)member, +- member.name(), false); ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addSummaryLink(int context, ClassDoc cd, ProgramElementDoc member, ++ Content tdSummary) { ++ Content strong = HtmlTree.STRONG(new RawHtml( ++ writer.getDocLink(context, (MemberDoc) member, member.name(), false))); ++ Content code = HtmlTree.CODE(strong); ++ tdSummary.addContent(code); + } + +- protected void printSummaryType(ProgramElementDoc member) { ++ /** ++ * {@inheritDoc} ++ */ ++ @Override ++ public void setSummaryColumnStyle(HtmlTree tdTree) { ++ tdTree.addStyle(HtmlStyle.colOne); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addInheritedSummaryLink(ClassDoc cd, ++ ProgramElementDoc member, Content linksTree) { ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addSummaryType(ProgramElementDoc member, Content tdSummaryType) { + //Not applicable. + } + +- protected void writeDeprecatedLink(ProgramElementDoc member) { +- writer.printDocLink(LinkInfoImpl.CONTEXT_MEMBER, +- (MemberDoc) member, ((FieldDoc)member).qualifiedName(), false); ++ /** ++ * {@inheritDoc} ++ */ ++ protected Content getDeprecatedLink(ProgramElementDoc member) { ++ return writer.getDocLink(LinkInfoImpl.CONTEXT_MEMBER, ++ (MemberDoc) member, ((FieldDoc)member).qualifiedName()); + } + +- protected void printNavSummaryLink(ClassDoc cd, boolean link) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { + if (link) { +- writer.printHyperLink("", (cd == null)? +- "enum_constant_summary": +- "enum_constants_inherited_from_class_" + +- configuration().getClassName(cd), +- configuration().getText("doclet.navEnum")); ++ return writer.getHyperLink("", (cd == null)? ++ "enum_constant_summary": ++ "enum_constants_inherited_from_class_" + ++ configuration().getClassName(cd), ++ writer.getResource("doclet.navEnum")); + } else { +- writer.printText("doclet.navEnum"); ++ return writer.getResource("doclet.navEnum"); + } + } + +- protected void printNavDetailLink(boolean link) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addNavDetailLink(boolean link, Content liNav) { + if (link) { +- writer.printHyperLink("", "enum_constant_detail", +- configuration().getText("doclet.navEnum")); ++ liNav.addContent(writer.getHyperLink("", "enum_constant_detail", ++ writer.getResource("doclet.navEnum"))); + } else { +- writer.printText("doclet.navEnum"); ++ liNav.addContent(writer.getResource("doclet.navEnum")); + } + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java +@@ -28,6 +28,7 @@ + import java.io.*; + + import com.sun.javadoc.*; ++import com.sun.tools.doclets.formats.html.markup.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + +@@ -42,8 +43,6 @@ + public class FieldWriterImpl extends AbstractMemberWriter + implements FieldWriter, MemberSummaryWriter { + +- private boolean printedSummaryHeader = false; +- + public FieldWriterImpl(SubWriterHolderWriter writer, ClassDoc classdoc) { + super(writer, classdoc); + } +@@ -53,177 +52,118 @@ + } + + /** +- * Write the fields summary header for the given class. +- * +- * @param classDoc the class the summary belongs to. ++ * {@inheritDoc} + */ +- public void writeMemberSummaryHeader(ClassDoc classDoc) { +- printedSummaryHeader = true; +- writer.println("<!-- =========== FIELD SUMMARY =========== -->"); +- writer.println(); +- writer.printSummaryHeader(this, classDoc); +- } +- +- /** +- * Write the fields summary footer for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeMemberSummaryFooter(ClassDoc classDoc) { +- writer.tableEnd(); +- writer.space(); +- } +- +- /** +- * Write the inherited fields summary header for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeInheritedMemberSummaryHeader(ClassDoc classDoc) { +- if(! printedSummaryHeader){ +- //We don't want inherited summary to not be under heading. +- writeMemberSummaryHeader(classDoc); +- writeMemberSummaryFooter(classDoc); +- printedSummaryHeader = true; +- } +- writer.printInheritedSummaryHeader(this, classDoc); ++ public Content getMemberSummaryHeader(ClassDoc classDoc, ++ Content memberSummaryTree) { ++ memberSummaryTree.addContent(HtmlConstants.START_OF_FIELD_SUMMARY); ++ Content memberTree = writer.getMemberTreeHeader(); ++ writer.addSummaryHeader(this, classDoc, memberTree); ++ return memberTree; + } + + /** + * {@inheritDoc} + */ +- public void writeInheritedMemberSummary(ClassDoc classDoc, +- ProgramElementDoc field, boolean isFirst, boolean isLast) { +- writer.printInheritedSummaryMember(this, classDoc, field, isFirst); ++ public Content getFieldDetailsTreeHeader(ClassDoc classDoc, ++ Content memberDetailsTree) { ++ memberDetailsTree.addContent(HtmlConstants.START_OF_FIELD_DETAILS); ++ Content fieldDetailsTree = writer.getMemberTreeHeader(); ++ fieldDetailsTree.addContent(writer.getMarkerAnchor("field_detail")); ++ Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, ++ writer.fieldDetailsLabel); ++ fieldDetailsTree.addContent(heading); ++ return fieldDetailsTree; + } + + /** +- * Write the inherited fields summary footer for the given class. +- * +- * @param classDoc the class the summary belongs to. ++ * {@inheritDoc} + */ +- public void writeInheritedMemberSummaryFooter(ClassDoc classDoc) { +- writer.printInheritedSummaryFooter(this, classDoc); ++ public Content getFieldDocTreeHeader(FieldDoc field, ++ Content fieldDetailsTree) { ++ fieldDetailsTree.addContent( ++ writer.getMarkerAnchor(field.name())); ++ Content fieldDocTree = writer.getMemberTreeHeader(); ++ Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); ++ heading.addContent(field.name()); ++ fieldDocTree.addContent(heading); ++ return fieldDocTree; + } + + /** +- * Write the header for the field documentation. +- * +- * @param classDoc the class that the fields belong to. ++ * {@inheritDoc} + */ +- public void writeHeader(ClassDoc classDoc, String header) { +- writer.println(); +- writer.println("<!-- ============ FIELD DETAIL =========== -->"); +- writer.println(); +- writer.anchor("field_detail"); +- writer.printTableHeadingBackground(header); +- writer.println(); ++ public Content getSignature(FieldDoc field) { ++ Content pre = new HtmlTree(HtmlTag.PRE); ++ writer.addAnnotationInfo(field, pre); ++ addModifiers(field, pre); ++ Content fieldlink = new RawHtml(writer.getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, ++ field.type()))); ++ pre.addContent(fieldlink); ++ pre.addContent(" "); ++ if (configuration().linksource) { ++ Content fieldName = new StringContent(field.name()); ++ writer.addSrcLink(field, fieldName, pre); ++ } else { ++ addName(field.name(), pre); ++ } ++ return pre; + } + + /** +- * Write the field header for the given field. +- * +- * @param field the field being documented. +- * @param isFirst the flag to indicate whether or not the field is the +- * first to be documented. ++ * {@inheritDoc} + */ +- public void writeFieldHeader(FieldDoc field, boolean isFirst) { +- if (! isFirst) { +- writer.printMemberHeader(); +- writer.println(""); +- } +- writer.anchor(field.name()); +- writer.h3(); +- writer.print(field.name()); +- writer.h3End(); ++ public void addDeprecated(FieldDoc field, Content fieldDocTree) { ++ addDeprecatedInfo(field, fieldDocTree); + } + + /** +- * Write the signature for the given field. +- * +- * @param field the field being documented. ++ * {@inheritDoc} + */ +- public void writeSignature(FieldDoc field) { +- writer.pre(); +- writer.writeAnnotationInfo(field); +- printModifiers(field); +- writer.printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, +- field.type())); +- print(' '); +- if (configuration().linksource) { +- writer.printSrcLink(field, field.name()); +- } else { +- strong(field.name()); +- } +- writer.preEnd(); +- assert !writer.getMemberDetailsListPrinted(); +- } +- +- /** +- * Write the deprecated output for the given field. +- * +- * @param field the field being documented. +- */ +- public void writeDeprecated(FieldDoc field) { +- printDeprecated(field); +- } +- +- /** +- * Write the comments for the given field. +- * +- * @param field the field being documented. +- */ +- public void writeComments(FieldDoc field) { ++ public void addComments(FieldDoc field, Content fieldDocTree) { + ClassDoc holder = field.containingClass(); + if (field.inlineTags().length > 0) { +- writer.printMemberDetailsListStartTag(); + if (holder.equals(classdoc) || +- (! (holder.isPublic() || Util.isLinkable(holder, configuration())))) { +- writer.dd(); +- writer.printInlineComment(field); +- writer.ddEnd(); ++ (! (holder.isPublic() || Util.isLinkable(holder, configuration())))) { ++ writer.addInlineComment(field, fieldDocTree); + } else { +- String classlink = writer.codeText( +- writer.getDocLink(LinkInfoImpl.CONTEXT_FIELD_DOC_COPY, ++ Content link = new RawHtml( ++ writer.getDocLink(LinkInfoImpl.CONTEXT_FIELD_DOC_COPY, + holder, field, + holder.isIncluded() ? + holder.typeName() : holder.qualifiedTypeName(), +- false)); +- writer.dd(); +- writer.strong(configuration().getText(holder.isClass()? +- "doclet.Description_From_Class" : +- "doclet.Description_From_Interface", classlink)); +- writer.ddEnd(); +- writer.dd(); +- writer.printInlineComment(field); +- writer.ddEnd(); ++ false)); ++ Content codeLink = HtmlTree.CODE(link); ++ Content strong = HtmlTree.STRONG(holder.isClass()? ++ writer.descfrmClassLabel : writer.descfrmInterfaceLabel); ++ strong.addContent(writer.getSpace()); ++ strong.addContent(codeLink); ++ fieldDocTree.addContent(HtmlTree.DIV(HtmlStyle.block, strong)); ++ writer.addInlineComment(field, fieldDocTree); + } + } + } + + /** +- * Write the tag output for the given field. +- * +- * @param field the field being documented. ++ * {@inheritDoc} + */ +- public void writeTags(FieldDoc field) { +- writer.printTags(field); ++ public void addTags(FieldDoc field, Content fieldDocTree) { ++ writer.addTagsInfo(field, fieldDocTree); + } + + /** +- * Write the field footer. ++ * {@inheritDoc} + */ +- public void writeFieldFooter() { +- printMemberFooter(); ++ public Content getFieldDetails(Content fieldDetailsTree) { ++ return getMemberTree(fieldDetailsTree); + } + + /** +- * Write the footer for the field documentation. +- * +- * @param classDoc the class that the fields belong to. ++ * {@inheritDoc} + */ +- public void writeFooter(ClassDoc classDoc) { +- //No footer to write for field documentation ++ public Content getFieldDoc(Content fieldDocTree, ++ boolean isLastContent) { ++ return getMemberTree(fieldDocTree, isLastContent); + } + + /** +@@ -237,85 +177,136 @@ + return VisibleMemberMap.FIELDS; + } + +- public void printSummaryLabel() { +- writer.printText("doclet.Field_Summary"); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addSummaryLabel(Content memberTree) { ++ Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING, ++ writer.getResource("doclet.Field_Summary")); ++ memberTree.addContent(label); + } + +- public void printTableSummary() { +- writer.tableIndexSummary(configuration().getText("doclet.Member_Table_Summary", ++ /** ++ * {@inheritDoc} ++ */ ++ public String getTableSummary() { ++ return configuration().getText("doclet.Member_Table_Summary", + configuration().getText("doclet.Field_Summary"), +- configuration().getText("doclet.fields"))); ++ configuration().getText("doclet.fields")); + } + +- public void printSummaryTableHeader(ProgramElementDoc member) { ++ /** ++ * {@inheritDoc} ++ */ ++ public String getCaption() { ++ return configuration().getText("doclet.Fields"); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String[] getSummaryTableHeader(ProgramElementDoc member) { + String[] header = new String[] { + writer.getModifierTypeHeader(), + configuration().getText("doclet.0_and_1", + configuration().getText("doclet.Field"), + configuration().getText("doclet.Description")) + }; +- writer.summaryTableHeader(header, "col"); ++ return header; + } + +- public void printSummaryAnchor(ClassDoc cd) { +- writer.anchor("field_summary"); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addSummaryAnchor(ClassDoc cd, Content memberTree) { ++ memberTree.addContent(writer.getMarkerAnchor("field_summary")); + } + +- public void printInheritedSummaryAnchor(ClassDoc cd) { +- writer.anchor("fields_inherited_from_class_" + configuration().getClassName(cd)); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addInheritedSummaryAnchor(ClassDoc cd, Content inheritedTree) { ++ inheritedTree.addContent(writer.getMarkerAnchor( ++ "fields_inherited_from_class_" + configuration().getClassName(cd))); + } + +- public void printInheritedSummaryLabel(ClassDoc cd) { +- String classlink = writer.getPreQualifiedClassLink( +- LinkInfoImpl.CONTEXT_MEMBER, cd, false); +- writer.strong(); +- String key = cd.isClass()? +- "doclet.Fields_Inherited_From_Class" : +- "doclet.Fields_Inherited_From_Interface"; +- writer.printText(key, classlink); +- writer.strongEnd(); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addInheritedSummaryLabel(ClassDoc cd, Content inheritedTree) { ++ Content classLink = new RawHtml(writer.getPreQualifiedClassLink( ++ LinkInfoImpl.CONTEXT_MEMBER, cd, false)); ++ Content label = new StringContent(cd.isClass() ? ++ configuration().getText("doclet.Fields_Inherited_From_Class") : ++ configuration().getText("doclet.Fields_Inherited_From_Interface")); ++ Content labelHeading = HtmlTree.HEADING(HtmlConstants.INHERITED_SUMMARY_HEADING, ++ label); ++ labelHeading.addContent(writer.getSpace()); ++ labelHeading.addContent(classLink); ++ inheritedTree.addContent(labelHeading); + } + +- protected void writeSummaryLink(int context, ClassDoc cd, ProgramElementDoc member) { +- writer.strong(); +- writer.printDocLink(context, cd , (MemberDoc) member, member.name(), false); +- writer.strongEnd(); ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addSummaryLink(int context, ClassDoc cd, ProgramElementDoc member, ++ Content tdSummary) { ++ Content strong = HtmlTree.STRONG(new RawHtml( ++ writer.getDocLink(context, cd , (MemberDoc) member, member.name(), false))); ++ Content code = HtmlTree.CODE(strong); ++ tdSummary.addContent(code); + } + +- protected void writeInheritedSummaryLink(ClassDoc cd, +- ProgramElementDoc member) { +- writer.printDocLink(LinkInfoImpl.CONTEXT_MEMBER, cd, (MemberDoc)member, +- member.name(), false); ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addInheritedSummaryLink(ClassDoc cd, ++ ProgramElementDoc member, Content linksTree) { ++ linksTree.addContent(new RawHtml( ++ writer.getDocLink(LinkInfoImpl.CONTEXT_MEMBER, cd, (MemberDoc)member, ++ member.name(), false))); + } + +- protected void printSummaryType(ProgramElementDoc member) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addSummaryType(ProgramElementDoc member, Content tdSummaryType) { + FieldDoc field = (FieldDoc)member; +- printModifierAndType(field, field.type()); ++ addModifierAndType(field, field.type(), tdSummaryType); + } + +- protected void writeDeprecatedLink(ProgramElementDoc member) { +- writer.printDocLink(LinkInfoImpl.CONTEXT_MEMBER, +- (MemberDoc) member, ((FieldDoc)member).qualifiedName(), false); ++ /** ++ * {@inheritDoc} ++ */ ++ protected Content getDeprecatedLink(ProgramElementDoc member) { ++ return writer.getDocLink(LinkInfoImpl.CONTEXT_MEMBER, ++ (MemberDoc) member, ((FieldDoc)member).qualifiedName()); + } + +- protected void printNavSummaryLink(ClassDoc cd, boolean link) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { + if (link) { +- writer.printHyperLink("", (cd == null)? +- "field_summary": +- "fields_inherited_from_class_" + +- configuration().getClassName(cd), +- configuration().getText("doclet.navField")); ++ return writer.getHyperLink("", (cd == null)? ++ "field_summary": ++ "fields_inherited_from_class_" + ++ configuration().getClassName(cd), ++ writer.getResource("doclet.navField")); + } else { +- writer.printText("doclet.navField"); ++ return writer.getResource("doclet.navField"); + } + } + +- protected void printNavDetailLink(boolean link) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addNavDetailLink(boolean link, Content liNav) { + if (link) { +- writer.printHyperLink("", "field_detail", +- configuration().getText("doclet.navField")); ++ liNav.addContent(writer.getHyperLink("", "field_detail", ++ writer.getResource("doclet.navField"))); + } else { +- writer.printText("doclet.navField"); ++ liNav.addContent(writer.getResource("doclet.navField")); + } + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java +@@ -25,8 +25,10 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.io.*; + import com.sun.tools.doclets.internal.toolkit.util.*; +-import java.io.*; ++import com.sun.tools.doclets.internal.toolkit.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Generate the documentation in the Html "frame" format in the browser. The +@@ -47,6 +49,8 @@ + */ + int noOfPackages; + ++ private final String SCROLL_YES = "yes"; ++ + /** + * Constructor to construct FrameOutputWriter object. + * +@@ -86,82 +90,93 @@ + * as well as warning if browser is not supporting the Html frames. + */ + protected void generateFrameFile() { ++ Content frameset = getFrameDetails(); + if (configuration.windowtitle.length() > 0) { +- printFramesetHeader(configuration.windowtitle, configuration.notimestamp); ++ printFramesetDocument(configuration.windowtitle, configuration.notimestamp, ++ frameset); + } else { +- printFramesetHeader(configuration.getText("doclet.Generated_Docs_Untitled"), +- configuration.notimestamp); ++ printFramesetDocument(configuration.getText("doclet.Generated_Docs_Untitled"), ++ configuration.notimestamp, frameset); + } +- printFrameDetails(); +- printFrameFooter(); + } + + /** +- * Generate the code for issueing the warning for a non-frame capable web ++ * Add the code for issueing the warning for a non-frame capable web + * client. Also provide links to the non-frame version documentation. ++ * ++ * @param contentTree the content tree to which the non-frames information will be added + */ +- protected void printFrameWarning() { +- noFrames(); +- h2(); +- printText("doclet.Frame_Alert"); +- h2End(); +- p(); +- printText("doclet.Frame_Warning_Message"); +- br(); +- printText("doclet.Link_To"); +- printHyperLink(configuration.topFile, +- configuration.getText("doclet.Non_Frame_Version")); +- println(""); +- noFramesEnd(); ++ protected void addFrameWarning(Content contentTree) { ++ Content noframes = new HtmlTree(HtmlTag.NOFRAMES); ++ Content noScript = HtmlTree.NOSCRIPT( ++ HtmlTree.DIV(getResource("doclet.No_Script_Message"))); ++ noframes.addContent(noScript); ++ Content noframesHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Frame_Alert")); ++ noframes.addContent(noframesHead); ++ Content p = HtmlTree.P(getResource("doclet.Frame_Warning_Message")); ++ noframes.addContent(p); ++ noframes.addContent(new HtmlTree(HtmlTag.BR)); ++ noframes.addContent(getResource("doclet.Link_To")); ++ Content link = getHyperLink(configuration.topFile, ++ getResource("doclet.Non_Frame_Version")); ++ noframes.addContent(link); ++ contentTree.addContent(noframes); + } + + /** +- * Print the frame sizes and their contents. ++ * Get the frame sizes and their contents. ++ * ++ * @return a content tree for the frame details + */ +- protected void printFrameDetails() { +- // title attribute intentionally made empty so +- // 508 tests will not flag it as missing +- frameSet("cols=\"20%,80%\" title=\"\" onLoad=\"top.loadFrames()\""); ++ protected Content getFrameDetails() { ++ HtmlTree frameset = HtmlTree.FRAMESET("20%,80%", null, "Documentation frame", ++ "top.loadFrames()"); + if (noOfPackages <= 1) { +- printAllClassesFrameTag(); ++ addAllClassesFrameTag(frameset); + } else if (noOfPackages > 1) { +- frameSet("rows=\"30%,70%\" title=\"\" onLoad=\"top.loadFrames()\""); +- printAllPackagesFrameTag(); +- printAllClassesFrameTag(); +- frameSetEnd(); ++ HtmlTree leftFrameset = HtmlTree.FRAMESET(null, "30%,70%", "Left frames", ++ "top.loadFrames()"); ++ addAllPackagesFrameTag(leftFrameset); ++ addAllClassesFrameTag(leftFrameset); ++ frameset.addContent(leftFrameset); + } +- printClassFrameTag(); +- printFrameWarning(); +- frameSetEnd(); ++ addClassFrameTag(frameset); ++ addFrameWarning(frameset); ++ return frameset; + } + + /** +- * Print the FRAME tag for the frame that lists all packages ++ * Add the FRAME tag for the frame that lists all packages. ++ * ++ * @param contentTree the content tree to which the information will be added + */ +- private void printAllPackagesFrameTag() { +- frame("src=\"overview-frame.html\" name=\"packageListFrame\"" +- + " title=\"" + configuration.getText("doclet.All_Packages") + "\""); ++ private void addAllPackagesFrameTag(Content contentTree) { ++ HtmlTree frame = HtmlTree.FRAME("overview-frame.html", "packageListFrame", ++ configuration.getText("doclet.All_Packages")); ++ contentTree.addContent(frame); + } + + /** +- * Print the FRAME tag for the frame that lists all classes ++ * Add the FRAME tag for the frame that lists all classes. ++ * ++ * @param contentTree the content tree to which the information will be added + */ +- private void printAllClassesFrameTag() { +- frame("src=\"" + "allclasses-frame.html" + "\"" +- + " name=\"packageFrame\"" +- + " title=\"" + configuration.getText("doclet.All_classes_and_interfaces") +- + "\""); ++ private void addAllClassesFrameTag(Content contentTree) { ++ HtmlTree frame = HtmlTree.FRAME("allclasses-frame.html", "packageFrame", ++ configuration.getText("doclet.All_classes_and_interfaces")); ++ contentTree.addContent(frame); + } + + /** +- * Print the FRAME tag for the frame that describes the class in detail ++ * Add the FRAME tag for the frame that describes the class in detail. ++ * ++ * @param contentTree the content tree to which the information will be added + */ +- private void printClassFrameTag() { +- frame("src=\"" + configuration.topFile + "\"" +- + " name=\"classFrame\"" +- + " title=\"" +- + configuration.getText("doclet.Package_class_and_interface_descriptions") +- + "\" scrolling=\"yes\""); ++ private void addClassFrameTag(Content contentTree) { ++ HtmlTree frame = HtmlTree.FRAME(configuration.topFile, "classFrame", ++ configuration.getText("doclet.Package_class_and_interface_descriptions"), ++ SCROLL_YES); ++ contentTree.addContent(frame); + } +- + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java +@@ -25,8 +25,10 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.io.*; + import com.sun.tools.doclets.internal.toolkit.util.*; +-import java.io.*; ++import com.sun.tools.doclets.internal.toolkit.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Generate the Help File for the generated API documentation. The help file +@@ -72,159 +74,242 @@ + * Generate the help file contents. + */ + protected void generateHelpFile() { +- printHtmlHeader(configuration.getText("doclet.Window_Help_title"), +- null, true); +- printTop(); +- navLinks(true); hr(); +- +- printHelpFileContents(); +- +- navLinks(false); +- printBottom(); +- printBodyHtmlEnd(); ++ String title = configuration.getText("doclet.Window_Help_title"); ++ Content body = getBody(true, getWindowTitle(title)); ++ addTop(body); ++ addNavLinks(true, body); ++ addHelpFileContents(body); ++ addNavLinks(false, body); ++ addBottom(body); ++ printHtmlDocument(null, true, body); + } + + /** +- * Print the help file contents from the resource file. While generating the ++ * Add the help file contents from the resource file to the content tree. While adding the + * help file contents it also keeps track of user options. If "-notree" +- * is used, then the "overview-tree.html" will not get generated and hence +- * help information also will not get generated. ++ * is used, then the "overview-tree.html" will not get added and hence ++ * help information also will not get added. ++ * ++ * @param contentTree the content tree to which the help file contents will be added + */ +- protected void printHelpFileContents() { +- center(); h1(); printText("doclet.Help_line_1"); h1End(); centerEnd(); +- printText("doclet.Help_line_2"); ++ protected void addHelpFileContents(Content contentTree) { ++ Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, false, HtmlStyle.title, ++ getResource("doclet.Help_line_1")); ++ Content div = HtmlTree.DIV(HtmlStyle.header, heading); ++ Content line2 = HtmlTree.P(HtmlStyle.subTitle, ++ getResource("doclet.Help_line_2")); ++ div.addContent(line2); ++ contentTree.addContent(div); ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.blockList); + if (configuration.createoverview) { +- h3(); printText("doclet.Overview"); h3End(); +- blockquote(); p(); +- printText("doclet.Help_line_3", +- getHyperLink("overview-summary.html", +- configuration.getText("doclet.Overview"))); +- blockquoteEnd(); ++ Content overviewHeading = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Overview")); ++ Content liOverview = HtmlTree.LI(HtmlStyle.blockList, overviewHeading); ++ Content line3 = getResource("doclet.Help_line_3", ++ getHyperLinkString("overview-summary.html", ++ configuration.getText("doclet.Overview"))); ++ Content overviewPara = HtmlTree.P(line3); ++ liOverview.addContent(overviewPara); ++ ul.addContent(liOverview); + } +- h3(); printText("doclet.Package"); h3End(); +- blockquote(); p(); printText("doclet.Help_line_4"); +- ul(); +- li(); printText("doclet.Interfaces_Italic"); +- li(); printText("doclet.Classes"); +- li(); printText("doclet.Enums"); +- li(); printText("doclet.Exceptions"); +- li(); printText("doclet.Errors"); +- li(); printText("doclet.AnnotationTypes"); +- ulEnd(); +- blockquoteEnd(); +- h3(); printText("doclet.Help_line_5"); h3End(); +- blockquote(); p(); printText("doclet.Help_line_6"); +- ul(); +- li(); printText("doclet.Help_line_7"); +- li(); printText("doclet.Help_line_8"); +- li(); printText("doclet.Help_line_9"); +- li(); printText("doclet.Help_line_10"); +- li(); printText("doclet.Help_line_11"); +- li(); printText("doclet.Help_line_12"); +- p(); +- li(); printText("doclet.Nested_Class_Summary"); +- li(); printText("doclet.Field_Summary"); +- li(); printText("doclet.Constructor_Summary"); +- li(); printText("doclet.Method_Summary"); +- p(); +- li(); printText("doclet.Field_Detail"); +- li(); printText("doclet.Constructor_Detail"); +- li(); printText("doclet.Method_Detail"); +- ulEnd(); +- printText("doclet.Help_line_13"); +- blockquoteEnd(); +- ++ Content packageHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Package")); ++ Content liPackage = HtmlTree.LI(HtmlStyle.blockList, packageHead); ++ Content line4 = getResource("doclet.Help_line_4"); ++ Content packagePara = HtmlTree.P(line4); ++ liPackage.addContent(packagePara); ++ HtmlTree ulPackage = new HtmlTree(HtmlTag.UL); ++ ulPackage.addContent(HtmlTree.LI( ++ getResource("doclet.Interfaces_Italic"))); ++ ulPackage.addContent(HtmlTree.LI( ++ getResource("doclet.Classes"))); ++ ulPackage.addContent(HtmlTree.LI( ++ getResource("doclet.Enums"))); ++ ulPackage.addContent(HtmlTree.LI( ++ getResource("doclet.Exceptions"))); ++ ulPackage.addContent(HtmlTree.LI( ++ getResource("doclet.Errors"))); ++ ulPackage.addContent(HtmlTree.LI( ++ getResource("doclet.AnnotationTypes"))); ++ liPackage.addContent(ulPackage); ++ ul.addContent(liPackage); ++ Content classHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Help_line_5")); ++ Content liClass = HtmlTree.LI(HtmlStyle.blockList, classHead); ++ Content line6 = getResource("doclet.Help_line_6"); ++ Content classPara = HtmlTree.P(line6); ++ liClass.addContent(classPara); ++ HtmlTree ul1 = new HtmlTree(HtmlTag.UL); ++ ul1.addContent(HtmlTree.LI( ++ getResource("doclet.Help_line_7"))); ++ ul1.addContent(HtmlTree.LI( ++ getResource("doclet.Help_line_8"))); ++ ul1.addContent(HtmlTree.LI( ++ getResource("doclet.Help_line_9"))); ++ ul1.addContent(HtmlTree.LI( ++ getResource("doclet.Help_line_10"))); ++ ul1.addContent(HtmlTree.LI( ++ getResource("doclet.Help_line_11"))); ++ ul1.addContent(HtmlTree.LI( ++ getResource("doclet.Help_line_12"))); ++ liClass.addContent(ul1); ++ HtmlTree ul2 = new HtmlTree(HtmlTag.UL); ++ ul2.addContent(HtmlTree.LI( ++ getResource("doclet.Nested_Class_Summary"))); ++ ul2.addContent(HtmlTree.LI( ++ getResource("doclet.Field_Summary"))); ++ ul2.addContent(HtmlTree.LI( ++ getResource("doclet.Constructor_Summary"))); ++ ul2.addContent(HtmlTree.LI( ++ getResource("doclet.Method_Summary"))); ++ liClass.addContent(ul2); ++ HtmlTree ul3 = new HtmlTree(HtmlTag.UL); ++ ul3.addContent(HtmlTree.LI( ++ getResource("doclet.Field_Detail"))); ++ ul3.addContent(HtmlTree.LI( ++ getResource("doclet.Constructor_Detail"))); ++ ul3.addContent(HtmlTree.LI( ++ getResource("doclet.Method_Detail"))); ++ liClass.addContent(ul3); ++ Content line13 = getResource("doclet.Help_line_13"); ++ Content para = HtmlTree.P(line13); ++ liClass.addContent(para); ++ ul.addContent(liClass); + //Annotation Types +- blockquoteEnd(); +- h3(); printText("doclet.AnnotationType"); h3End(); +- blockquote(); p(); printText("doclet.Help_annotation_type_line_1"); +- ul(); +- li(); printText("doclet.Help_annotation_type_line_2"); +- li(); printText("doclet.Help_annotation_type_line_3"); +- li(); printText("doclet.Annotation_Type_Required_Member_Summary"); +- li(); printText("doclet.Annotation_Type_Optional_Member_Summary"); +- li(); printText("doclet.Annotation_Type_Member_Detail"); +- ulEnd(); +- blockquoteEnd(); +- ++ Content aHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.AnnotationType")); ++ Content liAnnotation = HtmlTree.LI(HtmlStyle.blockList, aHead); ++ Content aline1 = getResource("doclet.Help_annotation_type_line_1"); ++ Content aPara = HtmlTree.P(aline1); ++ liAnnotation.addContent(aPara); ++ HtmlTree aul = new HtmlTree(HtmlTag.UL); ++ aul.addContent(HtmlTree.LI( ++ getResource("doclet.Help_annotation_type_line_2"))); ++ aul.addContent(HtmlTree.LI( ++ getResource("doclet.Help_annotation_type_line_3"))); ++ aul.addContent(HtmlTree.LI( ++ getResource("doclet.Annotation_Type_Required_Member_Summary"))); ++ aul.addContent(HtmlTree.LI( ++ getResource("doclet.Annotation_Type_Optional_Member_Summary"))); ++ aul.addContent(HtmlTree.LI( ++ getResource("doclet.Annotation_Type_Member_Detail"))); ++ liAnnotation.addContent(aul); ++ ul.addContent(liAnnotation); + //Enums +- blockquoteEnd(); +- h3(); printText("doclet.Enum"); h3End(); +- blockquote(); p(); printText("doclet.Help_enum_line_1"); +- ul(); +- li(); printText("doclet.Help_enum_line_2"); +- li(); printText("doclet.Help_enum_line_3"); +- li(); printText("doclet.Enum_Constant_Summary"); +- li(); printText("doclet.Enum_Constant_Detail"); +- ulEnd(); +- blockquoteEnd(); +- ++ Content enumHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Enum")); ++ Content liEnum = HtmlTree.LI(HtmlStyle.blockList, enumHead); ++ Content eline1 = getResource("doclet.Help_enum_line_1"); ++ Content enumPara = HtmlTree.P(eline1); ++ liEnum.addContent(enumPara); ++ HtmlTree eul = new HtmlTree(HtmlTag.UL); ++ eul.addContent(HtmlTree.LI( ++ getResource("doclet.Help_enum_line_2"))); ++ eul.addContent(HtmlTree.LI( ++ getResource("doclet.Help_enum_line_3"))); ++ eul.addContent(HtmlTree.LI( ++ getResource("doclet.Enum_Constant_Summary"))); ++ eul.addContent(HtmlTree.LI( ++ getResource("doclet.Enum_Constant_Detail"))); ++ liEnum.addContent(eul); ++ ul.addContent(liEnum); + if (configuration.classuse) { +- h3(); printText("doclet.Help_line_14"); h3End(); +- blockquote(); +- printText("doclet.Help_line_15"); +- blockquoteEnd(); ++ Content useHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Help_line_14")); ++ Content liUse = HtmlTree.LI(HtmlStyle.blockList, useHead); ++ Content line15 = getResource("doclet.Help_line_15"); ++ Content usePara = HtmlTree.P(line15); ++ liUse.addContent(usePara); ++ ul.addContent(liUse); + } + if (configuration.createtree) { +- h3(); printText("doclet.Help_line_16"); h3End(); +- blockquote(); +- printText("doclet.Help_line_17_with_tree_link", +- getHyperLink("overview-tree.html", +- configuration.getText("doclet.Class_Hierarchy"))); +- ul(); +- li(); printText("doclet.Help_line_18"); +- li(); printText("doclet.Help_line_19"); +- ulEnd(); +- blockquoteEnd(); ++ Content treeHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Help_line_16")); ++ Content liTree = HtmlTree.LI(HtmlStyle.blockList, treeHead); ++ Content line17 = getResource("doclet.Help_line_17_with_tree_link", ++ getHyperLinkString("overview-tree.html", ++ configuration.getText("doclet.Class_Hierarchy"))); ++ Content treePara = HtmlTree.P(line17); ++ liTree.addContent(treePara); ++ HtmlTree tul = new HtmlTree(HtmlTag.UL); ++ tul.addContent(HtmlTree.LI( ++ getResource("doclet.Help_line_18"))); ++ tul.addContent(HtmlTree.LI( ++ getResource("doclet.Help_line_19"))); ++ liTree.addContent(tul); ++ ul.addContent(liTree); + } + if (!(configuration.nodeprecatedlist || + configuration.nodeprecated)) { +- h3(); printText("doclet.Deprecated_API"); h3End(); +- blockquote(); +- printText("doclet.Help_line_20_with_deprecated_api_link", +- getHyperLink("deprecated-list.html", +- configuration.getText("doclet.Deprecated_API"))); +- blockquoteEnd(); ++ Content dHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Deprecated_API")); ++ Content liDeprecated = HtmlTree.LI(HtmlStyle.blockList, dHead); ++ Content line20 = getResource("doclet.Help_line_20_with_deprecated_api_link", ++ getHyperLinkString("deprecated-list.html", ++ configuration.getText("doclet.Deprecated_API"))); ++ Content dPara = HtmlTree.P(line20); ++ liDeprecated.addContent(dPara); ++ ul.addContent(liDeprecated); + } + if (configuration.createindex) { + String indexlink; + if (configuration.splitindex) { +- indexlink = getHyperLink("index-files/index-1.html", +- configuration.getText("doclet.Index")); ++ indexlink = getHyperLinkString("index-files/index-1.html", ++ configuration.getText("doclet.Index")); + } else { +- indexlink = getHyperLink("index-all.html", +- configuration.getText("doclet.Index")); ++ indexlink = getHyperLinkString("index-all.html", ++ configuration.getText("doclet.Index")); + } +- h3(); printText("doclet.Help_line_21"); h3End(); +- blockquote(); +- printText("doclet.Help_line_22", indexlink); +- blockquoteEnd(); ++ Content indexHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Help_line_21")); ++ Content liIndex = HtmlTree.LI(HtmlStyle.blockList, indexHead); ++ Content line22 = getResource("doclet.Help_line_22", indexlink); ++ Content indexPara = HtmlTree.P(line22); ++ liIndex.addContent(indexPara); ++ ul.addContent(liIndex); + } +- h3(); printText("doclet.Help_line_23"); h3End(); +- printText("doclet.Help_line_24"); +- h3(); printText("doclet.Help_line_25"); h3End(); +- printText("doclet.Help_line_26"); p(); +- +- h3(); printText("doclet.Serialized_Form"); h3End(); +- printText("doclet.Help_line_27"); p(); +- +- h3(); printText("doclet.Constants_Summary"); h3End(); +- printText("doclet.Help_line_28"); p(); +- +- font("-1"); em(); +- printText("doclet.Help_line_29"); +- emEnd(); fontEnd(); br(); +- hr(); ++ Content prevHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Help_line_23")); ++ Content liPrev = HtmlTree.LI(HtmlStyle.blockList, prevHead); ++ Content line24 = getResource("doclet.Help_line_24"); ++ Content prevPara = HtmlTree.P(line24); ++ liPrev.addContent(prevPara); ++ ul.addContent(liPrev); ++ Content frameHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Help_line_25")); ++ Content liFrame = HtmlTree.LI(HtmlStyle.blockList, frameHead); ++ Content line26 = getResource("doclet.Help_line_26"); ++ Content framePara = HtmlTree.P(line26); ++ liFrame.addContent(framePara); ++ ul.addContent(liFrame); ++ Content sHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Serialized_Form")); ++ Content liSerial = HtmlTree.LI(HtmlStyle.blockList, sHead); ++ Content line27 = getResource("doclet.Help_line_27"); ++ Content serialPara = HtmlTree.P(line27); ++ liSerial.addContent(serialPara); ++ ul.addContent(liSerial); ++ Content constHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ getResource("doclet.Constants_Summary")); ++ Content liConst = HtmlTree.LI(HtmlStyle.blockList, constHead); ++ Content line28 = getResource("doclet.Help_line_28"); ++ Content constPara = HtmlTree.P(line28); ++ liConst.addContent(constPara); ++ ul.addContent(liConst); ++ Content divContent = HtmlTree.DIV(HtmlStyle.contentContainer, ul); ++ Content line29 = HtmlTree.EM(getResource("doclet.Help_line_29")); ++ divContent.addContent(line29); ++ contentTree.addContent(divContent); + } + + /** +- * Highlight the word "Help" in the navigation bar as this is the help file. ++ * Get the help label. ++ * ++ * @return a content tree for the help label + */ +- protected void navLinkHelp() { +- navCellRevStart(); +- fontStyle("NavBarFont1Rev"); +- strongText("doclet.Help"); +- fontEnd(); +- navCellEnd(); ++ protected Content getNavLinkHelp() { ++ Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, helpLabel); ++ return li; + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java b/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java +@@ -144,8 +144,11 @@ + !configuration.nohelp) { + HelpWriter.generate(configuration); + } ++ // If a stylesheet file is not specified, copy the default stylesheet. + if (configuration.stylesheetfile.length() == 0) { +- StylesheetWriter.generate(configuration); ++ Util.copyFile(configuration, "stylesheet.css", Util.RESOURCESDIR, ++ (configdestdir.isEmpty()) ? ++ System.getProperty("user.dir") : configdestdir, false); + } + } + +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java +@@ -88,6 +88,11 @@ + public ConfigurationImpl configuration; + + /** ++ * To check whether annotation heading is printed or not. ++ */ ++ protected boolean printedAnnotationHeading = false; ++ ++ /** + * Constructor to construct the HtmlStandardWriter object. + * + * @param filename File to be generated. +@@ -169,7 +174,7 @@ + // Append slash if next character is not a slash + if (relativepathNoSlash.length() > 0 && previndex < htmlstr.length() + && htmlstr.charAt(previndex) != '/') { +- buf.append(DirectoryManager.URL_FILE_SEPERATOR); ++ buf.append(DirectoryManager.URL_FILE_SEPARATOR); + } + } + return buf.toString(); +@@ -192,17 +197,47 @@ + println(" <!--"); + println(" if(window==top) {"); + println(" document.writeln('" +- + getHyperLink(link, where, label, strong, "", "", target) + "');"); ++ + getHyperLinkString(link, where, label, strong, "", "", target) + "');"); + println(" }"); + println(" //-->"); + scriptEnd(); + noScript(); +- println(" " + getHyperLink(link, where, label, strong, "", "", target)); ++ println(" " + getHyperLinkString(link, where, label, strong, "", "", target)); + noScriptEnd(); + println(DocletConstants.NL); + } + +- private void printMethodInfo(MethodDoc method) { ++ /** ++ * Get the script to show or hide the All classes link. ++ * ++ * @param id id of the element to show or hide ++ * @return a content tree for the script ++ */ ++ public Content getAllClassesLinkScript(String id) { ++ HtmlTree script = new HtmlTree(HtmlTag.SCRIPT); ++ script.addAttr(HtmlAttr.TYPE, "text/javascript"); ++ String scriptCode = "<!--\n" + ++ " allClassesLink = document.getElementById(\"" + id + "\");\n" + ++ " if(window==top) {\n" + ++ " allClassesLink.style.display = \"block\";\n" + ++ " }\n" + ++ " else {\n" + ++ " allClassesLink.style.display = \"none\";\n" + ++ " }\n" + ++ " //-->\n"; ++ Content scriptContent = new RawHtml(scriptCode); ++ script.addContent(scriptContent); ++ Content div = HtmlTree.DIV(script); ++ return div; ++ } ++ ++ /** ++ * Add method information. ++ * ++ * @param method the method to be documented ++ * @param dl the content tree to which the method information will be added ++ */ ++ private void addMethodInfo(MethodDoc method, Content dl) { + ClassDoc[] intfacs = method.containingClass().interfaces(); + MethodDoc overriddenMethod = method.overriddenMethod(); + // Check whether there is any implementation or overridden info to be +@@ -211,44 +246,38 @@ + if ((intfacs.length > 0 && + new ImplementedMethods(method, this.configuration).build().length > 0) || + overriddenMethod != null) { +- printMemberDetailsListStartTag(); +- dd(); +- printTagsInfoHeader(); +- MethodWriterImpl.printImplementsInfo(this, method); ++ MethodWriterImpl.addImplementsInfo(this, method, dl); + if (overriddenMethod != null) { +- MethodWriterImpl.printOverridden(this, +- method.overriddenType(), overriddenMethod); ++ MethodWriterImpl.addOverridden(this, ++ method.overriddenType(), overriddenMethod, dl); + } +- printTagsInfoFooter(); +- ddEnd(); + } + } + +- protected void printTags(Doc doc) { +- if(configuration.nocomment){ ++ /** ++ * Adds the tags information. ++ * ++ * @param doc the doc for which the tags will be generated ++ * @param htmltree the documentation tree to which the tags will be added ++ */ ++ protected void addTagsInfo(Doc doc, Content htmltree) { ++ if (configuration.nocomment) { + return; + } ++ Content dl = new HtmlTree(HtmlTag.DL); + if (doc instanceof MethodDoc) { +- printMethodInfo((MethodDoc) doc); ++ addMethodInfo((MethodDoc) doc, dl); + } + TagletOutputImpl output = new TagletOutputImpl(""); + TagletWriter.genTagOuput(configuration.tagletManager, doc, + configuration.tagletManager.getCustomTags(doc), + getTagletWriterInstance(false), output); + String outputString = output.toString().trim(); +- // For RootDoc and ClassDoc, this section is not the definition description +- // but the start of definition list. + if (!outputString.isEmpty()) { +- if (!(doc instanceof RootDoc || doc instanceof ClassDoc)) { +- printMemberDetailsListStartTag(); +- dd(); +- } +- printTagsInfoHeader(); +- print(outputString); +- printTagsInfoFooter(); +- if (!(doc instanceof RootDoc || doc instanceof ClassDoc)) +- ddEnd(); ++ Content resultString = new RawHtml(outputString); ++ dl.addContent(resultString); + } ++ htmltree.addContent(dl); + } + + /** +@@ -284,17 +313,16 @@ + } + + /** +- * Print Package link, with target frame. ++ * Get Package link, with target frame. + * +- * @param pd The link will be to the "package-summary.html" page for this +- * package. +- * @param target Name of the target frame. +- * @param label Tag for the link. ++ * @param pd The link will be to the "package-summary.html" page for this package ++ * @param target name of the target frame ++ * @param label tag for the link ++ * @return a content for the target package link + */ +- public void printTargetPackageLink(PackageDoc pd, String target, +- String label) { +- print(getHyperLink(pathString(pd, "package-summary.html"), "", label, +- false, "", "", target)); ++ public Content getTargetPackageLink(PackageDoc pd, String target, ++ Content label) { ++ return getHyperLink(pathString(pd, "package-summary.html"), "", label, "", target); + } + + /** +@@ -358,6 +386,64 @@ + } + + /** ++ * Generates the HTML document tree and prints it out. ++ * ++ * @param metakeywords Array of String keywords for META tag. Each element ++ * of the array is assigned to a separate META tag. ++ * Pass in null for no array ++ * @param includeScript true if printing windowtitle script ++ * false for files that appear in the left-hand frames ++ * @param body the body htmltree to be included in the document ++ */ ++ public void printHtmlDocument(String[] metakeywords, boolean includeScript, ++ Content body) { ++ Content htmlDocType = DocType.Transitional(); ++ Content htmlComment = new Comment(configuration.getText("doclet.New_Page")); ++ Content head = new HtmlTree(HtmlTag.HEAD); ++ if (!configuration.notimestamp) { ++ Content headComment = new Comment("Generated by javadoc (version " + ++ ConfigurationImpl.BUILD_DATE + ") on " + today()); ++ head.addContent(headComment); ++ } ++ if (configuration.charset.length() > 0) { ++ Content meta = HtmlTree.META("Content-Type", "text/html", ++ configuration.charset); ++ head.addContent(meta); ++ } ++ head.addContent(getTitle()); ++ if (!configuration.notimestamp) { ++ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); ++ Content meta = HtmlTree.META("date", dateFormat.format(new Date())); ++ head.addContent(meta); ++ } ++ if (metakeywords != null) { ++ for (int i=0; i < metakeywords.length; i++) { ++ Content meta = HtmlTree.META("keywords", metakeywords[i]); ++ head.addContent(meta); ++ } ++ } ++ head.addContent(getStyleSheetProperties()); ++ Content htmlTree = HtmlTree.HTML(configuration.getLocale().getLanguage(), ++ head, body); ++ Content htmlDocument = new HtmlDocument(htmlDocType, ++ htmlComment, htmlTree); ++ print(htmlDocument.toString()); ++ } ++ ++ /** ++ * Get the window title. ++ * ++ * @param title the title string to construct the complete window title ++ * @return the window title string ++ */ ++ public String getWindowTitle(String title) { ++ if (configuration.windowtitle.length() > 0) { ++ title += " (" + configuration.windowtitle + ")"; ++ } ++ return title; ++ } ++ ++ /** + * Print user specified header and the footer. + * + * @param header if true print the user provided header else print the +@@ -378,6 +464,28 @@ + } + + /** ++ * Get user specified header and the footer. ++ * ++ * @param header if true print the user provided header else print the ++ * user provided footer. ++ */ ++ public Content getUserHeaderFooter(boolean header) { ++ String content; ++ if (header) { ++ content = replaceDocRootDir(configuration.header); ++ } else { ++ if (configuration.footer.length() != 0) { ++ content = replaceDocRootDir(configuration.footer); ++ } else { ++ content = replaceDocRootDir(configuration.header); ++ } ++ } ++ Content rawContent = new RawHtml(content); ++ Content em = HtmlTree.EM(rawContent); ++ return em; ++ } ++ ++ /** + * Print the user specified top. + */ + public void printTop() { +@@ -386,6 +494,16 @@ + } + + /** ++ * Adds the user specified top. ++ * ++ * @param body the content tree to which user specified top will be added ++ */ ++ public void addTop(Content body) { ++ Content top = new RawHtml(replaceDocRootDir(configuration.top)); ++ body.addContent(top); ++ } ++ ++ /** + * Print the user specified bottom. + */ + public void printBottom() { +@@ -394,6 +512,18 @@ + } + + /** ++ * Adds the user specified bottom. ++ * ++ * @param body the content tree to which user specified bottom will be added ++ */ ++ public void addBottom(Content body) { ++ Content bottom = new RawHtml(replaceDocRootDir(configuration.bottom)); ++ Content small = HtmlTree.SMALL(bottom); ++ Content p = HtmlTree.P(HtmlStyle.legalCopy, small); ++ body.addContent(p); ++ } ++ ++ /** + * Print the navigation bar for the Html page at the top and and the bottom. + * + * @param header If true print navigation bar at the top of the page else +@@ -406,13 +536,13 @@ + println(DocletConstants.NL + "<!-- ========= START OF TOP NAVBAR ======= -->"); + anchor("navbar_top"); + println(); +- print(getHyperLink("", "skip-navbar_top", "", false, "", ++ print(getHyperLinkString("", "skip-navbar_top", "", false, "", + configuration.getText("doclet.Skip_navigation_links"), "")); + } else { + println(DocletConstants.NL + "<!-- ======= START OF BOTTOM NAVBAR ====== -->"); + anchor("navbar_bottom"); + println(); +- print(getHyperLink("", "skip-navbar_bottom", "", false, "", ++ print(getHyperLinkString("", "skip-navbar_bottom", "", false, "", + configuration.getText("doclet.Skip_navigation_links"), "")); + } + table(0, "100%", 1, 0); +@@ -516,6 +646,97 @@ + } + + /** ++ * Adds the navigation bar for the Html page at the top and and the bottom. ++ * ++ * @param header If true print navigation bar at the top of the page else ++ * @param body the HtmlTree to which the nav links will be added ++ */ ++ protected void addNavLinks(boolean header, Content body) { ++ if (!configuration.nonavbar) { ++ String allClassesId = "allclasses_"; ++ HtmlTree navDiv = new HtmlTree(HtmlTag.DIV); ++ if (header) { ++ body.addContent(HtmlConstants.START_OF_TOP_NAVBAR); ++ navDiv.addStyle(HtmlStyle.topNav); ++ allClassesId += "navbar_top"; ++ Content a = getMarkerAnchor("navbar_top"); ++ navDiv.addContent(a); ++ Content skipLinkContent = getHyperLink("", ++ "skip-navbar_top", HtmlTree.EMPTY, configuration.getText( ++ "doclet.Skip_navigation_links"), ""); ++ navDiv.addContent(skipLinkContent); ++ } else { ++ body.addContent(HtmlConstants.START_OF_BOTTOM_NAVBAR); ++ navDiv.addStyle(HtmlStyle.bottomNav); ++ allClassesId += "navbar_bottom"; ++ Content a = getMarkerAnchor("navbar_bottom"); ++ navDiv.addContent(a); ++ Content skipLinkContent = getHyperLink("", ++ "skip-navbar_bottom", HtmlTree.EMPTY, configuration.getText( ++ "doclet.Skip_navigation_links"), ""); ++ navDiv.addContent(skipLinkContent); ++ } ++ if (header) { ++ navDiv.addContent(getMarkerAnchor("navbar_top_firstrow")); ++ } else { ++ navDiv.addContent(getMarkerAnchor("navbar_bottom_firstrow")); ++ } ++ HtmlTree navList = new HtmlTree(HtmlTag.UL); ++ navList.addStyle(HtmlStyle.navList); ++ navList.addAttr(HtmlAttr.TITLE, "Navigation"); ++ if (configuration.createoverview) { ++ navList.addContent(getNavLinkContents()); ++ } ++ if (configuration.packages.length == 1) { ++ navList.addContent(getNavLinkPackage(configuration.packages[0])); ++ } else if (configuration.packages.length > 1) { ++ navList.addContent(getNavLinkPackage()); ++ } ++ navList.addContent(getNavLinkClass()); ++ if(configuration.classuse) { ++ navList.addContent(getNavLinkClassUse()); ++ } ++ if(configuration.createtree) { ++ navList.addContent(getNavLinkTree()); ++ } ++ if(!(configuration.nodeprecated || ++ configuration.nodeprecatedlist)) { ++ navList.addContent(getNavLinkDeprecated()); ++ } ++ if(configuration.createindex) { ++ navList.addContent(getNavLinkIndex()); ++ } ++ if (!configuration.nohelp) { ++ navList.addContent(getNavLinkHelp()); ++ } ++ navDiv.addContent(navList); ++ Content aboutDiv = HtmlTree.DIV(HtmlStyle.aboutLanguage, getUserHeaderFooter(header)); ++ navDiv.addContent(aboutDiv); ++ body.addContent(navDiv); ++ Content ulNav = HtmlTree.UL(HtmlStyle.navList, getNavLinkPrevious()); ++ ulNav.addContent(getNavLinkNext()); ++ Content subDiv = HtmlTree.DIV(HtmlStyle.subNav, ulNav); ++ Content ulFrames = HtmlTree.UL(HtmlStyle.navList, getNavShowLists()); ++ ulFrames.addContent(getNavHideLists(filename)); ++ subDiv.addContent(ulFrames); ++ HtmlTree ulAllClasses = HtmlTree.UL(HtmlStyle.navList, getNavLinkClassIndex()); ++ ulAllClasses.addAttr(HtmlAttr.ID, allClassesId.toString()); ++ subDiv.addContent(ulAllClasses); ++ subDiv.addContent(getAllClassesLinkScript(allClassesId.toString())); ++ addSummaryDetailLinks(subDiv); ++ if (header) { ++ subDiv.addContent(getMarkerAnchor("skip-navbar_top")); ++ body.addContent(subDiv); ++ body.addContent(HtmlConstants.END_OF_TOP_NAVBAR); ++ } else { ++ subDiv.addContent(getMarkerAnchor("skip-navbar_bottom")); ++ body.addContent(subDiv); ++ body.addContent(HtmlConstants.END_OF_BOTTOM_NAVBAR); ++ } ++ } ++ } ++ ++ /** + * Print the word "NEXT" to indicate that no link is available. Override + * this method to customize next link. + */ +@@ -524,6 +745,16 @@ + } + + /** ++ * Get the word "NEXT" to indicate that no link is available. Override ++ * this method to customize next link. ++ * ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkNext() { ++ return getNavLinkNext(null); ++ } ++ ++ /** + * Print the word "PREV" to indicate that no link is available. Override + * this method to customize prev link. + */ +@@ -532,12 +763,28 @@ + } + + /** ++ * Get the word "PREV" to indicate that no link is available. Override ++ * this method to customize prev link. ++ * ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkPrevious() { ++ return getNavLinkPrevious(null); ++ } ++ ++ /** + * Do nothing. This is the default method. + */ + protected void printSummaryDetailLinks() { + } + + /** ++ * Do nothing. This is the default method. ++ */ ++ protected void addSummaryDetailLinks(Content navDiv) { ++ } ++ ++ /** + * Print link to the "overview-summary.html" page. + */ + protected void navLinkContents() { +@@ -548,6 +795,18 @@ + } + + /** ++ * Get link to the "overview-summary.html" page. ++ * ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkContents() { ++ Content linkContent = getHyperLink(relativePath + ++ "overview-summary.html", "", overviewLabel, "", ""); ++ Content li = HtmlTree.LI(linkContent); ++ return li; ++ } ++ ++ /** + * Description for a cell in the navigation bar. + */ + protected void navCellStart() { +@@ -588,6 +847,19 @@ + } + + /** ++ * Get link to the "package-summary.html" page for the package passed. ++ * ++ * @param pkg Package to which link will be generated ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkPackage(PackageDoc pkg) { ++ Content linkContent = getPackageLink(pkg, ++ packageLabel); ++ Content li = HtmlTree.LI(linkContent); ++ return li; ++ } ++ ++ /** + * Print the word "Package" in the navigation bar cell, to indicate that + * link is not available here. + */ +@@ -600,6 +872,16 @@ + } + + /** ++ * Get the word "Package" , to indicate that link is not available here. ++ * ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkPackage() { ++ Content li = HtmlTree.LI(packageLabel); ++ return li; ++ } ++ ++ /** + * Print the word "Use" in the navigation bar cell, to indicate that link + * is not available. + */ +@@ -612,6 +894,16 @@ + } + + /** ++ * Get the word "Use", to indicate that link is not available. ++ * ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkClassUse() { ++ Content li = HtmlTree.LI(useLabel); ++ return li; ++ } ++ ++ /** + * Print link for previous file. + * + * @param prev File name for the prev link. +@@ -626,6 +918,22 @@ + } + + /** ++ * Get link for previous file. ++ * ++ * @param prev File name for the prev link ++ * @return a content tree for the link ++ */ ++ public Content getNavLinkPrevious(String prev) { ++ Content li; ++ if (prev != null) { ++ li = HtmlTree.LI(getHyperLink(prev, "", prevLabel, "", "")); ++ } ++ else ++ li = HtmlTree.LI(prevLabel); ++ return li; ++ } ++ ++ /** + * Print link for next file. If next is null, just print the label + * without linking it anywhere. + * +@@ -641,16 +949,46 @@ + } + + /** ++ * Get link for next file. If next is null, just print the label ++ * without linking it anywhere. ++ * ++ * @param next File name for the next link ++ * @return a content tree for the link ++ */ ++ public Content getNavLinkNext(String next) { ++ Content li; ++ if (next != null) { ++ li = HtmlTree.LI(getHyperLink(next, "", nextLabel, "", "")); ++ } ++ else ++ li = HtmlTree.LI(nextLabel); ++ return li; ++ } ++ ++ /** + * Print "FRAMES" link, to switch to the frame version of the output. + * + * @param link File to be linked, "index.html". + */ + protected void navShowLists(String link) { +- print(getHyperLink(link + "?" + path + filename, "", ++ print(getHyperLinkString(link + "?" + path + filename, "", + configuration.getText("doclet.FRAMES"), true, "", "", "_top")); + } + + /** ++ * Get "FRAMES" link, to switch to the frame version of the output. ++ * ++ * @param link File to be linked, "index.html" ++ * @return a content tree for the link ++ */ ++ protected Content getNavShowLists(String link) { ++ Content framesContent = getHyperLink(link + "?" + path + ++ filename, "", framesLabel, "", "_top"); ++ Content li = HtmlTree.LI(framesContent); ++ return li; ++ } ++ ++ /** + * Print "FRAMES" link, to switch to the frame version of the output. + */ + protected void navShowLists() { +@@ -658,16 +996,37 @@ + } + + /** ++ * Get "FRAMES" link, to switch to the frame version of the output. ++ * ++ * @return a content tree for the link ++ */ ++ protected Content getNavShowLists() { ++ return getNavShowLists(relativePath + "index.html"); ++ } ++ ++ /** + * Print "NO FRAMES" link, to switch to the non-frame version of the output. + * + * @param link File to be linked. + */ + protected void navHideLists(String link) { +- print(getHyperLink(link, "", configuration.getText("doclet.NO_FRAMES"), ++ print(getHyperLinkString(link, "", configuration.getText("doclet.NO_FRAMES"), + true, "", "", "_top")); + } + + /** ++ * Get "NO FRAMES" link, to switch to the non-frame version of the output. ++ * ++ * @param link File to be linked ++ * @return a content tree for the link ++ */ ++ protected Content getNavHideLists(String link) { ++ Content noFramesContent = getHyperLink(link, "", noframesLabel, "", "_top"); ++ Content li = HtmlTree.LI(noFramesContent); ++ return li; ++ } ++ ++ /** + * Print "Tree" link in the navigation bar. If there is only one package + * specified on the command line, then the "Tree" link will be to the + * only "package-tree.html" file otherwise it will be to the +@@ -687,10 +1046,39 @@ + } + + /** +- * Print "Tree" link to the "overview-tree.html" file. ++ * Get "Tree" link in the navigation bar. If there is only one package ++ * specified on the command line, then the "Tree" link will be to the ++ * only "package-tree.html" file otherwise it will be to the ++ * "overview-tree.html" file. ++ * ++ * @return a content tree for the link + */ +- protected void navLinkMainTree(String label) { +- printHyperLink(relativePath + "overview-tree.html", label); ++ protected Content getNavLinkTree() { ++ Content treeLinkContent; ++ PackageDoc[] packages = configuration.root.specifiedPackages(); ++ if (packages.length == 1 && configuration.root.specifiedClasses().length == 0) { ++ treeLinkContent = getHyperLink(pathString(packages[0], ++ "package-tree.html"), "", treeLabel, ++ "", ""); ++ } else { ++ treeLinkContent = getHyperLink(relativePath + "overview-tree.html", ++ "", treeLabel, "", ""); ++ } ++ Content li = HtmlTree.LI(treeLinkContent); ++ return li; ++ } ++ ++ /** ++ * Get the overview tree link for the main tree. ++ * ++ * @param label the label for the link ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkMainTree(String label) { ++ Content mainTreeContent = getHyperLink(relativePath + "overview-tree.html", ++ new StringContent(label)); ++ Content li = HtmlTree.LI(mainTreeContent); ++ return li; + } + + /** +@@ -706,6 +1094,16 @@ + } + + /** ++ * Get the word "Class", to indicate that class link is not available. ++ * ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkClass() { ++ Content li = HtmlTree.LI(classLabel); ++ return li; ++ } ++ ++ /** + * Print "Deprecated" API link in the navigation bar. + */ + protected void navLinkDeprecated() { +@@ -716,6 +1114,18 @@ + } + + /** ++ * Get "Deprecated" API link in the navigation bar. ++ * ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkDeprecated() { ++ Content linkContent = getHyperLink(relativePath + ++ "deprecated-list.html", "", deprecatedLabel, "", ""); ++ Content li = HtmlTree.LI(linkContent); ++ return li; ++ } ++ ++ /** + * Print link for generated index. If the user has used "-splitindex" + * command line option, then link to file "index-files/index-1.html" is + * generated otherwise link to file "index-all.html" is generated. +@@ -725,6 +1135,21 @@ + AllClassesFrameWriter.OUTPUT_FILE_NAME_NOFRAMES, + "", "", configuration.getText("doclet.All_Classes"), true); + } ++ ++ /** ++ * Get link for generated index. If the user has used "-splitindex" ++ * command line option, then link to file "index-files/index-1.html" is ++ * generated otherwise link to file "index-all.html" is generated. ++ * ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkClassIndex() { ++ Content allClassesContent = getHyperLink(relativePath + ++ AllClassesFrameWriter.OUTPUT_FILE_NAME_NOFRAMES, "", ++ allclassesLabel, "", ""); ++ Content li = HtmlTree.LI(allClassesContent); ++ return li; ++ } + /** + * Print link for generated class index. + */ +@@ -741,6 +1166,20 @@ + } + + /** ++ * Get link for generated class index. ++ * ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkIndex() { ++ Content linkContent = getHyperLink(relativePath +(configuration.splitindex? ++ DirectoryManager.getPath("index-files") + fileseparator: "") + ++ (configuration.splitindex?"index-1.html" : "index-all.html"), "", ++ indexLabel, "", ""); ++ Content li = HtmlTree.LI(linkContent); ++ return li; ++ } ++ ++ /** + * Print help file link. If user has provided a help file, then generate a + * link to the user given file, which is already copied to current or + * destination directory. +@@ -762,6 +1201,29 @@ + } + + /** ++ * Get help file link. If user has provided a help file, then generate a ++ * link to the user given file, which is already copied to current or ++ * destination directory. ++ * ++ * @return a content tree for the link ++ */ ++ protected Content getNavLinkHelp() { ++ String helpfilenm = configuration.helpfile; ++ if (helpfilenm.equals("")) { ++ helpfilenm = "help-doc.html"; ++ } else { ++ int lastsep; ++ if ((lastsep = helpfilenm.lastIndexOf(File.separatorChar)) != -1) { ++ helpfilenm = helpfilenm.substring(lastsep + 1); ++ } ++ } ++ Content linkContent = getHyperLink(relativePath + helpfilenm, "", ++ helpLabel, "", ""); ++ Content li = HtmlTree.LI(linkContent); ++ return li; ++ } ++ ++ /** + * Print the word "Detail" in the navigation bar. No link is available. + */ + protected void navDetail() { +@@ -843,6 +1305,96 @@ + } + + /** ++ * Get summary table header. ++ * ++ * @param header the header for the table ++ * @param scope the scope of the headers ++ * @return a content tree for the header ++ */ ++ public Content getSummaryTableHeader(String[] header, String scope) { ++ Content tr = new HtmlTree(HtmlTag.TR); ++ int size = header.length; ++ Content tableHeader; ++ if (size == 1) { ++ tableHeader = new StringContent(header[0]); ++ tr.addContent(HtmlTree.TH(HtmlStyle.colOne, scope, tableHeader)); ++ return tr; ++ } ++ for (int i = 0; i < size; i++) { ++ tableHeader = new StringContent(header[i]); ++ if(i == 0) ++ tr.addContent(HtmlTree.TH(HtmlStyle.colFirst, scope, tableHeader)); ++ else if(i == (size - 1)) ++ tr.addContent(HtmlTree.TH(HtmlStyle.colLast, scope, tableHeader)); ++ else ++ tr.addContent(HtmlTree.TH(scope, tableHeader)); ++ } ++ return tr; ++ } ++ ++ /** ++ * Get table caption. ++ * ++ * @param rawText the caption for the table which could be raw Html ++ * @return a content tree for the caption ++ */ ++ public Content getTableCaption(String rawText) { ++ Content title = new RawHtml(rawText); ++ Content captionSpan = HtmlTree.SPAN(title); ++ Content space = getSpace(); ++ Content tabSpan = HtmlTree.SPAN(HtmlStyle.tabEnd, space); ++ Content caption = HtmlTree.CAPTION(captionSpan); ++ caption.addContent(tabSpan); ++ return caption; ++ } ++ ++ /** ++ * Get the marker anchor which will be added to the documentation tree. ++ * ++ * @param anchorName the anchor name attribute ++ * @return a content tree for the marker anchor ++ */ ++ public Content getMarkerAnchor(String anchorName) { ++ return getMarkerAnchor(anchorName, null); ++ } ++ ++ /** ++ * Get the marker anchor which will be added to the documentation tree. ++ * ++ * @param anchorName the anchor name attribute ++ * @param anchorContent the content that should be added to the anchor ++ * @return a content tree for the marker anchor ++ */ ++ public Content getMarkerAnchor(String anchorName, Content anchorContent) { ++ if (anchorContent == null) ++ anchorContent = new Comment(" "); ++ Content markerAnchor = HtmlTree.A_NAME(anchorName, anchorContent); ++ return markerAnchor; ++ } ++ ++ /** ++ * Returns a packagename content. ++ * ++ * @param packageDoc the package to check ++ * @return package name content ++ */ ++ public Content getPackageName(PackageDoc packageDoc) { ++ return packageDoc == null || packageDoc.name().length() == 0 ? ++ defaultPackageLabel : ++ getPackageLabel(packageDoc.name()); ++ } ++ ++ /** ++ * Returns a package name label. ++ * ++ * @param parsedName the package name ++ * @return the package name content ++ */ ++ public Content getPackageLabel(String packageName) { ++ return new StringContent(packageName); ++ } ++ ++ /** + * Prine table header information about color, column span and the font. + * + * @param color Background color. +@@ -1026,7 +1578,7 @@ + * @param isStrong true if the label should be strong. + */ + public void printPackageLink(PackageDoc pkg, String label, boolean isStrong) { +- print(getPackageLink(pkg, label, isStrong)); ++ print(getPackageLinkString(pkg, label, isStrong)); + } + + /** +@@ -1039,7 +1591,7 @@ + */ + public void printPackageLink(PackageDoc pkg, String label, boolean isStrong, + String style) { +- print(getPackageLink(pkg, label, isStrong, style)); ++ print(getPackageLinkString(pkg, label, isStrong, style)); + } + + /** +@@ -1050,9 +1602,9 @@ + * @param isStrong true if the label should be strong. + * @return the link to the given package. + */ +- public String getPackageLink(PackageDoc pkg, String label, ++ public String getPackageLinkString(PackageDoc pkg, String label, + boolean isStrong) { +- return getPackageLink(pkg, label, isStrong, ""); ++ return getPackageLinkString(pkg, label, isStrong, ""); + } + + /** +@@ -1064,7 +1616,7 @@ + * @param style the font of the package link label. + * @return the link to the given package. + */ +- public String getPackageLink(PackageDoc pkg, String label, boolean isStrong, ++ public String getPackageLinkString(PackageDoc pkg, String label, boolean isStrong, + String style) { + boolean included = pkg != null && pkg.isIncluded(); + if (! included) { +@@ -1077,12 +1629,43 @@ + } + } + if (included || pkg == null) { +- return getHyperLink(pathString(pkg, "package-summary.html"), ++ return getHyperLinkString(pathString(pkg, "package-summary.html"), + "", label, isStrong, style); + } else { + String crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); + if (crossPkgLink != null) { +- return getHyperLink(crossPkgLink, "", label, isStrong, style); ++ return getHyperLinkString(crossPkgLink, "", label, isStrong, style); ++ } else { ++ return label; ++ } ++ } ++ } ++ ++ /** ++ * Return the link to the given package. ++ * ++ * @param pkg the package to link to. ++ * @param label the label for the link. ++ * @return a content tree for the package link. ++ */ ++ public Content getPackageLink(PackageDoc pkg, Content label) { ++ boolean included = pkg != null && pkg.isIncluded(); ++ if (! included) { ++ PackageDoc[] packages = configuration.packages; ++ for (int i = 0; i < packages.length; i++) { ++ if (packages[i].equals(pkg)) { ++ included = true; ++ break; ++ } ++ } ++ } ++ if (included || pkg == null) { ++ return getHyperLink(pathString(pkg, "package-summary.html"), ++ "", label); ++ } else { ++ String crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); ++ if (crossPkgLink != null) { ++ return getHyperLink(crossPkgLink, "", label); + } else { + return label; + } +@@ -1110,6 +1693,29 @@ + } + + /** ++ * Add the link to the content tree. ++ * ++ * @param doc program element doc for which the link will be added ++ * @param label label for the link ++ * @param htmltree the content tree to which the link will be added ++ */ ++ public void addSrcLink(ProgramElementDoc doc, Content label, Content htmltree) { ++ if (doc == null) { ++ return; ++ } ++ ClassDoc cd = doc.containingClass(); ++ if (cd == null) { ++ //d must be a class doc since in has no containing class. ++ cd = (ClassDoc) doc; ++ } ++ String href = relativePath + DocletConstants.SOURCE_OUTPUT_DIR_NAME ++ + DirectoryManager.getDirectoryPath(cd.containingPackage()) ++ + cd.name() + ".html#" + SourceToHTMLConverter.getAnchorName(doc); ++ Content linkContent = getHyperLink(href, "", label, "", ""); ++ htmltree.addContent(linkContent); ++ } ++ ++ /** + * Return the link to the given class. + * + * @param linkInfo the information about the link. +@@ -1173,7 +1779,7 @@ + //the -link option. There are ways to determine if an external package + //exists, but no way to determine if the external class exists. We just + //have to assume that it does. +- return getHyperLink( ++ return getHyperLinkString( + configuration.extern.getExternalLink(packageName, relativePath, + className + ".html?is-external=true"), + refMemName == null ? "" : refMemName, +@@ -1198,17 +1804,27 @@ + "package-summary.html?is-external=true"); + } + +- public void printQualifiedClassLink(int context, ClassDoc cd) { +- printLink(new LinkInfoImpl(context, cd, +- configuration.getClassName(cd), "")); ++ /** ++ * Get the class link. ++ * ++ * @param context the id of the context where the link will be added ++ * @param cd the class doc to link to ++ * @return a content tree for the link ++ */ ++ public Content getQualifiedClassLink(int context, ClassDoc cd) { ++ return new RawHtml(getLink(new LinkInfoImpl(context, cd, ++ configuration.getClassName(cd), ""))); + } + + /** +- * Print Class link, with only class name as the link and prefixing +- * plain package name. ++ * Add the class link. ++ * ++ * @param context the id of the context where the link will be added ++ * @param cd the class doc to link to ++ * @param contentTree the content tree to which the link will be added + */ +- public void printPreQualifiedClassLink(int context, ClassDoc cd) { +- print(getPreQualifiedClassLink(context, cd, false)); ++ public void addPreQualifiedClassLink(int context, ClassDoc cd, Content contentTree) { ++ addPreQualifiedClassLink(context, cd, false, contentTree); + } + + /** +@@ -1231,13 +1847,36 @@ + return classlink; + } + ++ /** ++ * Add the class link with the package portion of the label in ++ * plain text. If the qualifier is excluded, it will not be included in the ++ * link label. ++ * ++ * @param context the id of the context where the link will be added ++ * @param cd the class to link to ++ * @param isStrong true if the link should be strong ++ * @param contentTree the content tree to which the link with be added ++ */ ++ public void addPreQualifiedClassLink(int context, ++ ClassDoc cd, boolean isStrong, Content contentTree) { ++ PackageDoc pd = cd.containingPackage(); ++ if(pd != null && ! configuration.shouldExcludeQualifier(pd.name())) { ++ contentTree.addContent(getPkgName(cd)); ++ } ++ contentTree.addContent(new RawHtml(getLink(new LinkInfoImpl( ++ context, cd, cd.name(), isStrong)))); ++ } + + /** +- * Print Class link, with only class name as the strong link and prefixing ++ * Add the class link, with only class name as the strong link and prefixing + * plain package name. ++ * ++ * @param context the id of the context where the link will be added ++ * @param cd the class to link to ++ * @param contentTree the content tree to which the link with be added + */ +- public void printPreQualifiedStrongClassLink(int context, ClassDoc cd) { +- print(getPreQualifiedClassLink(context, cd, true)); ++ public void addPreQualifiedStrongClassLink(int context, ClassDoc cd, Content contentTree) { ++ addPreQualifiedClassLink(context, cd, true, contentTree); + } + + public void printText(String key) { +@@ -1265,16 +1904,15 @@ + } + + /** +- * Print the link for the given member. ++ * Get the link for the given member. + * +- * @param context the id of the context where the link will be printed. +- * @param doc the member being linked to. +- * @param label the label for the link. +- * @param strong true if the link should be strong. ++ * @param context the id of the context where the link will be added ++ * @param doc the member being linked to ++ * @param label the label for the link ++ * @return a content tree for the doc link + */ +- public void printDocLink(int context, MemberDoc doc, String label, +- boolean strong) { +- print(getDocLink(context, doc, label, strong)); ++ public Content getDocLink(int context, MemberDoc doc, String label) { ++ return getDocLink(context, doc.containingClass(), doc, label); + } + + /** +@@ -1336,6 +1974,34 @@ + } + } + ++ /** ++ * Return the link for the given member. ++ * ++ * @param context the id of the context where the link will be added ++ * @param classDoc the classDoc that we should link to. This is not ++ * necessarily equal to doc.containingClass(). We may be ++ * inheriting comments ++ * @param doc the member being linked to ++ * @param label the label for the link ++ * @return the link for the given member ++ */ ++ public Content getDocLink(int context, ClassDoc classDoc, MemberDoc doc, ++ String label) { ++ if (! (doc.isIncluded() || ++ Util.isLinkable(classDoc, configuration()))) { ++ return new StringContent(label); ++ } else if (doc instanceof ExecutableMemberDoc) { ++ ExecutableMemberDoc emd = (ExecutableMemberDoc)doc; ++ return new RawHtml(getLink(new LinkInfoImpl(context, classDoc, ++ getAnchor(emd), label, false))); ++ } else if (doc instanceof MemberDoc) { ++ return new RawHtml(getLink(new LinkInfoImpl(context, classDoc, ++ doc.name(), label, false))); ++ } else { ++ return new StringContent(label); ++ } ++ } ++ + public void anchor(ExecutableMemberDoc emd) { + anchor(getAnchor(emd)); + } +@@ -1390,14 +2056,14 @@ + //@see is referencing an included package + String packageName = isplaintext ? refPackage.name() : + getCode() + refPackage.name() + getCodeEnd(); +- result.append(getPackageLink(refPackage, ++ result.append(getPackageLinkString(refPackage, + label.length() == 0 ? packageName : label, false)); + } else { + //@see is not referencing an included class or package. Check for cross links. + String classCrossLink, packageCrossLink = getCrossPackageLink(refClassName); + if (packageCrossLink != null) { + //Package cross link found +- result.append(getHyperLink(packageCrossLink, "", ++ result.append(getHyperLinkString(packageCrossLink, "", + (label.length() == 0)? text : label, false)); + } else if ((classCrossLink = getCrossClassLink(refClassName, + refMemName, label, false, "", ! isplaintext)) != null) { +@@ -1456,18 +2122,61 @@ + printCommentTags(doc, tag.inlineTags(), false, false); + } + ++ /** ++ * Add the inline comment. ++ * ++ * @param doc the doc for which the inline comment will be added ++ * @param tag the inline tag to be added ++ * @param htmltree the content tree to which the comment will be added ++ */ ++ public void addInlineComment(Doc doc, Tag tag, Content htmltree) { ++ addCommentTags(doc, tag.inlineTags(), false, false, htmltree); ++ } ++ + public void printInlineDeprecatedComment(Doc doc, Tag tag) { + printCommentTags(doc, tag.inlineTags(), true, false); + } + ++ /** ++ * Add the inline deprecated comment. ++ * ++ * @param doc the doc for which the inline deprecated comment will be added ++ * @param tag the inline tag to be added ++ * @param htmltree the content tree to which the comment will be added ++ */ ++ public void addInlineDeprecatedComment(Doc doc, Tag tag, Content htmltree) { ++ addCommentTags(doc, tag.inlineTags(), true, false, htmltree); ++ } ++ + public void printSummaryComment(Doc doc) { + printSummaryComment(doc, doc.firstSentenceTags()); + } + ++ /** ++ * Adds the summary content. ++ * ++ * @param doc the doc for which the summary will be generated ++ * @param htmltree the documentation tree to which the summary will be added ++ */ ++ public void addSummaryComment(Doc doc, Content htmltree) { ++ addSummaryComment(doc, doc.firstSentenceTags(), htmltree); ++ } ++ + public void printSummaryComment(Doc doc, Tag[] firstSentenceTags) { + printCommentTags(doc, firstSentenceTags, false, true); + } + ++ /** ++ * Adds the summary content. ++ * ++ * @param doc the doc for which the summary will be generated ++ * @param firstSentenceTags the first sentence tags for the doc ++ * @param htmltree the documentation tree to which the summary will be added ++ */ ++ public void addSummaryComment(Doc doc, Tag[] firstSentenceTags, Content htmltree) { ++ addCommentTags(doc, firstSentenceTags, false, true, htmltree); ++ } ++ + public void printSummaryDeprecatedComment(Doc doc) { + printCommentTags(doc, doc.firstSentenceTags(), true, true); + } +@@ -1476,11 +2185,25 @@ + printCommentTags(doc, tag.firstSentenceTags(), true, true); + } + ++ public void addSummaryDeprecatedComment(Doc doc, Tag tag, Content htmltree) { ++ addCommentTags(doc, tag.firstSentenceTags(), true, true, htmltree); ++ } ++ + public void printInlineComment(Doc doc) { + printCommentTags(doc, doc.inlineTags(), false, false); + p(); + } + ++ /** ++ * Adds the inline comment. ++ * ++ * @param doc the doc for which the inline comments will be generated ++ * @param htmltree the documentation tree to which the inline comments will be added ++ */ ++ public void addInlineComment(Doc doc, Content htmltree) { ++ addCommentTags(doc, doc.inlineTags(), false, false, htmltree); ++ } ++ + public void printInlineDeprecatedComment(Doc doc) { + printCommentTags(doc, doc.inlineTags(), true, false); + } +@@ -1503,6 +2226,36 @@ + } + + /** ++ * Adds the comment tags. ++ * ++ * @param doc the doc for which the comment tags will be generated ++ * @param tags the first sentence tags for the doc ++ * @param depr true if it is deprecated ++ * @param first true if the first sentenge tags should be added ++ * @param htmltree the documentation tree to which the comment tags will be added ++ */ ++ private void addCommentTags(Doc doc, Tag[] tags, boolean depr, ++ boolean first, Content htmltree) { ++ if(configuration.nocomment){ ++ return; ++ } ++ Content div; ++ Content result = new RawHtml(commentTagsToString(null, doc, tags, first)); ++ if (depr) { ++ Content italic = HtmlTree.I(result); ++ div = HtmlTree.DIV(HtmlStyle.block, italic); ++ htmltree.addContent(div); ++ } ++ else { ++ div = HtmlTree.DIV(HtmlStyle.block, result); ++ htmltree.addContent(div); ++ } ++ if (tags.length == 0) { ++ htmltree.addContent(getSpace()); ++ } ++ } ++ ++ /** + * Converts inline tags and text to text strings, expanding the + * inline tags along the way. Called wherever text can contain + * an inline tag, such as in comments or in free-form text arguments +@@ -1612,8 +2365,8 @@ + return text; + } + +- if (! redirectPathFromRoot.endsWith(DirectoryManager.URL_FILE_SEPERATOR)) { +- redirectPathFromRoot += DirectoryManager.URL_FILE_SEPERATOR; ++ if (! redirectPathFromRoot.endsWith(DirectoryManager.URL_FILE_SEPARATOR)) { ++ redirectPathFromRoot += DirectoryManager.URL_FILE_SEPARATOR; + } + + //Redirect all relative links. +@@ -1739,6 +2492,27 @@ + } + + /** ++ * Returns a link to the stylesheet file. ++ * ++ * @return an HtmlTree for the lINK tag which provides the stylesheet location ++ */ ++ public HtmlTree getStyleSheetProperties() { ++ String filename = configuration.stylesheetfile; ++ if (filename.length() > 0) { ++ File stylefile = new File(filename); ++ String parent = stylefile.getParent(); ++ filename = (parent == null)? ++ filename: ++ filename.substring(parent.length() + 1); ++ } else { ++ filename = "stylesheet.css"; ++ } ++ filename = relativePath + filename; ++ HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", filename, "Style"); ++ return link; ++ } ++ ++ /** + * According to the Java Language Specifications, all the outer classes + * and static nested classes are core classes. + */ +@@ -1765,6 +2539,16 @@ + } + + /** ++ * Adds the annotatation types for the given doc. ++ * ++ * @param packageDoc the package to write annotations for ++ * @param htmltree the content tree to which the annotation types will be added ++ */ ++ public void addAnnotationInfo(ProgramElementDoc doc, Content htmltree) { ++ addAnnotationInfo(doc, doc.annotations(), htmltree); ++ } ++ ++ /** + * Write the annotatation types for the given doc and parameter. + * + * @param indent the number of spaced to indent the parameters. +@@ -1776,6 +2560,30 @@ + } + + /** ++ * Adds the annotatation types for the given packageDoc. ++ * ++ * @param packageDoc the package to write annotations for. ++ * @param htmltree the documentation tree to which the annotation info will be ++ * added ++ */ ++ public void addAnnotationInfo(PackageDoc packageDoc, Content htmltree) { ++ addAnnotationInfo(packageDoc, packageDoc.annotations(), htmltree); ++ } ++ ++ /** ++ * Add the annotatation types for the given doc and parameter. ++ * ++ * @param indent the number of spaces to indent the parameters. ++ * @param doc the doc to write annotations for. ++ * @param param the parameter to write annotations for. ++ * @param tree the content tree to which the annotation types will be added ++ */ ++ public boolean addAnnotationInfo(int indent, Doc doc, Parameter param, ++ Content tree) { ++ return addAnnotationInfo(indent, doc, param.annotations(), false, tree); ++ } ++ ++ /** + * Write the annotatation types for the given doc. + * + * @param doc the doc to write annotations for. +@@ -1786,6 +2594,19 @@ + } + + /** ++ * Adds the annotatation types for the given doc. ++ * ++ * @param doc the doc to write annotations for. ++ * @param descList the array of {@link AnnotationDesc}. ++ * @param htmltree the documentation tree to which the annotation info will be ++ * added ++ */ ++ private void addAnnotationInfo(Doc doc, AnnotationDesc[] descList, ++ Content htmltree) { ++ addAnnotationInfo(0, doc, descList, true, htmltree); ++ } ++ ++ /** + * Write the annotatation types for the given doc. + * + * @param indent the number of extra spaces to indent the annotations. +@@ -1806,6 +2627,29 @@ + } + + /** ++ * Adds the annotatation types for the given doc. ++ * ++ * @param indent the number of extra spaces to indent the annotations. ++ * @param doc the doc to write annotations for. ++ * @param descList the array of {@link AnnotationDesc}. ++ * @param htmltree the documentation tree to which the annotation info will be ++ * added ++ */ ++ private boolean addAnnotationInfo(int indent, Doc doc, ++ AnnotationDesc[] descList, boolean lineBreak, Content htmltree) { ++ List<String> annotations = getAnnotations(indent, descList, lineBreak); ++ if (annotations.size() == 0) { ++ return false; ++ } ++ Content annotationContent; ++ for (Iterator<String> iter = annotations.iterator(); iter.hasNext();) { ++ annotationContent = new RawHtml(iter.next()); ++ htmltree.addContent(annotationContent); ++ } ++ return true; ++ } ++ ++ /** + * Return the string representations of the annotation types for + * the given doc. + * +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java +@@ -31,6 +31,7 @@ + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.taglets.*; + import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Generate serialized form for serializable fields. +@@ -46,8 +47,6 @@ + + private boolean printedOverallAnchor = false; + +- private boolean printedFirstMember = false; +- + public HtmlSerialFieldWriter(SubWriterHolderWriter writer, + ClassDoc classdoc) { + super(writer, classdoc); +@@ -69,109 +68,143 @@ + } + } + +- public void writeHeader(String heading) { +- if (! printedOverallAnchor) { +- writer.anchor("serializedForm"); +- printedOverallAnchor = true; +- writer.printTableHeadingBackground(heading); +- writer.println(); +- if (heading.equals( +- configuration().getText("doclet.Serialized_Form_class"))) { +- assert !writer.getMemberDetailsListPrinted(); +- } +- } else { +- writer.printTableHeadingBackground(heading); +- writer.println(); +- } +- } +- +- public void writeMemberHeader(ClassDoc fieldType, String fieldTypeStr, +- String fieldDimensions, String fieldName) { +- if (printedFirstMember) { +- writer.printMemberHeader(); +- } +- printedFirstMember = true; +- writer.h3(); +- writer.print(fieldName); +- writer.h3End(); +- writer.pre(); +- if (fieldType == null) { +- writer.print(fieldTypeStr); +- } else { +- writer.printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_SERIAL_MEMBER, +- fieldType)); +- } +- print(fieldDimensions + ' '); +- strong(fieldName); +- writer.preEnd(); +- assert !writer.getMemberDetailsListPrinted(); ++ /** ++ * Return the header for serializable fields section. ++ * ++ * @return a content tree for the header ++ */ ++ public Content getSerializableFieldsHeader() { ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.blockList); ++ return ul; + } + + /** +- * Write the deprecated information for this member. ++ * Return the header for serializable fields content section. + * +- * @param field the field to document. ++ * @param isLastContent true if the cotent being documented is the last content. ++ * @return a content tree for the header + */ +- public void writeMemberDeprecatedInfo(FieldDoc field) { +- printDeprecated(field); ++ public Content getFieldsContentHeader(boolean isLastContent) { ++ HtmlTree li = new HtmlTree(HtmlTag.LI); ++ if (isLastContent) ++ li.addStyle(HtmlStyle.blockListLast); ++ else ++ li.addStyle(HtmlStyle.blockList); ++ return li; + } + + /** +- * Write the description text for this member. ++ * Add serializable fields. ++ * ++ * @param heading the heading for the section ++ * @param serializableFieldsTree the tree to be added to the serializable fileds ++ * content tree ++ * @return a content tree for the serializable fields content ++ */ ++ public Content getSerializableFields(String heading, Content serializableFieldsTree) { ++ HtmlTree li = new HtmlTree(HtmlTag.LI); ++ li.addStyle(HtmlStyle.blockList); ++ if (serializableFieldsTree.isValid()) { ++ if (!printedOverallAnchor) { ++ li.addContent(writer.getMarkerAnchor("serializedForm")); ++ printedOverallAnchor = true; ++ } ++ Content headingContent = new StringContent(heading); ++ Content serialHeading = HtmlTree.HEADING(HtmlConstants.SERIALIZED_MEMBER_HEADING, ++ headingContent); ++ li.addContent(serialHeading); ++ li.addContent(serializableFieldsTree); ++ } ++ return li; ++ } ++ ++ /** ++ * Add the member header. ++ * ++ * @param fieldsType the class document to be listed ++ * @param fieldTypeStr the string for the filed type to be documented ++ * @param fieldDimensions the dimensions of the field string to be added ++ * @param firldName name of the field to be added ++ * @param contentTree the content tree to which the member header will be added ++ */ ++ public void addMemberHeader(ClassDoc fieldType, String fieldTypeStr, ++ String fieldDimensions, String fieldName, Content contentTree) { ++ Content nameContent = new RawHtml(fieldName); ++ Content heading = HtmlTree.HEADING(HtmlConstants.MEMBER_HEADING, nameContent); ++ contentTree.addContent(heading); ++ Content pre = new HtmlTree(HtmlTag.PRE); ++ if (fieldType == null) { ++ pre.addContent(fieldTypeStr); ++ } else { ++ Content fieldContent = new RawHtml(writer.getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_SERIAL_MEMBER, fieldType))); ++ pre.addContent(fieldContent); ++ } ++ pre.addContent(fieldDimensions + " "); ++ pre.addContent(fieldName); ++ contentTree.addContent(pre); ++ } ++ ++ /** ++ * Add the deprecated information for this member. + * + * @param field the field to document. ++ * @param contentTree the tree to which the deprecated info will be added + */ +- public void writeMemberDescription(FieldDoc field) { ++ public void addMemberDeprecatedInfo(FieldDoc field, Content contentTree) { ++ addDeprecatedInfo(field, contentTree); ++ } ++ ++ /** ++ * Add the description text for this member. ++ * ++ * @param field the field to document. ++ * @param contentTree the tree to which the deprecated info will be added ++ */ ++ public void addMemberDescription(FieldDoc field, Content contentTree) { + if (field.inlineTags().length > 0) { +- writer.printMemberDetailsListStartTag(); +- writer.dd(); +- writer.printInlineComment(field); +- writer.ddEnd(); ++ writer.addInlineComment(field, contentTree); + } + Tag[] tags = field.tags("serial"); + if (tags.length > 0) { +- writer.printMemberDetailsListStartTag(); +- writer.dd(); +- writer.printInlineComment(field, tags[0]); +- writer.ddEnd(); ++ writer.addInlineComment(field, tags[0], contentTree); + } + } + + /** +- * Write the description text for this member represented by the tag. ++ * Add the description text for this member represented by the tag. + * +- * @param serialFieldTag the field to document (represented by tag). ++ * @param serialFieldTag the field to document (represented by tag) ++ * @param contentTree the tree to which the deprecated info will be added + */ +- public void writeMemberDescription(SerialFieldTag serialFieldTag) { ++ public void addMemberDescription(SerialFieldTag serialFieldTag, Content contentTree) { + String serialFieldTagDesc = serialFieldTag.description().trim(); + if (!serialFieldTagDesc.isEmpty()) { +- writer.dl(); +- writer.dd(); +- writer.print(serialFieldTagDesc); +- writer.ddEnd(); +- writer.dlEnd(); ++ Content serialFieldContent = new RawHtml(serialFieldTagDesc); ++ Content div = HtmlTree.DIV(HtmlStyle.block, serialFieldContent); ++ contentTree.addContent(div); + } + } + + /** +- * Write the tag information for this member. ++ * Add the tag information for this member. + * + * @param field the field to document. ++ * @param contentTree the tree to which the member tags info will be added + */ +- public void writeMemberTags(FieldDoc field) { ++ public void addMemberTags(FieldDoc field, Content contentTree) { + TagletOutputImpl output = new TagletOutputImpl(""); + TagletWriter.genTagOuput(configuration().tagletManager, field, +- configuration().tagletManager.getCustomTags(field), ++ configuration().tagletManager.getCustomTags(field), + writer.getTagletWriterInstance(false), output); + String outputString = output.toString().trim(); ++ Content dlTags = new HtmlTree(HtmlTag.DL); + if (!outputString.isEmpty()) { +- writer.printMemberDetailsListStartTag(); +- writer.dd(); +- writer.dl(); +- print(outputString); +- writer.dlEnd(); +- writer.ddEnd(); ++ Content tagContent = new RawHtml(outputString); ++ dlTags.addContent(tagContent); + } ++ contentTree.addContent(dlTags); + } + + /** +@@ -192,24 +225,4 @@ + return true; + return false; + } +- +- public void writeMemberFooter() { +- printMemberFooter(); +- } +- +- /** +- * Write the footer information. If the serilization overview section was +- * printed, check for definition list and close list tag. +- * +- * @param heading the heading that was written. +- */ +- public void writeFooter(String heading) { +- if (printedOverallAnchor) { +- if (heading.equals( +- configuration().getText("doclet.Serialized_Form_class"))) { +- writer.printMemberDetailsListEndTag(); +- assert !writer.getMemberDetailsListPrinted(); +- } +- } +- } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java +@@ -28,57 +28,119 @@ + import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.taglets.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Generate serialized form for Serializable/Externalizable methods. + * Documentation denoted by the <code>serialData</code> tag is processed. + * + * @author Joe Fialli ++ * @author Bhavesh Patel (Modified) + */ + public class HtmlSerialMethodWriter extends MethodWriterImpl implements + SerializedFormWriter.SerialMethodWriter{ + +- private boolean printedFirstMember = false; +- + public HtmlSerialMethodWriter(SubWriterHolderWriter writer, + ClassDoc classdoc) { + super(writer, classdoc); + } + +- public void writeHeader(String heading) { +- writer.anchor("serialized_methods"); +- writer.printTableHeadingBackground(heading); +- writer.p(); ++ /** ++ * Return the header for serializable methods section. ++ * ++ * @return a content tree for the header ++ */ ++ public Content getSerializableMethodsHeader() { ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.blockList); ++ return ul; + } + +- public void writeNoCustomizationMsg(String msg) { +- writer.print(msg); +- writer.p(); ++ /** ++ * Return the header for serializable methods content section. ++ * ++ * @param isLastContent true if the cotent being documented is the last content. ++ * @return a content tree for the header ++ */ ++ public Content getMethodsContentHeader(boolean isLastContent) { ++ HtmlTree li = new HtmlTree(HtmlTag.LI); ++ if (isLastContent) ++ li.addStyle(HtmlStyle.blockListLast); ++ else ++ li.addStyle(HtmlStyle.blockList); ++ return li; + } + +- public void writeMemberHeader(MethodDoc member) { +- if (printedFirstMember) { +- writer.printMemberHeader(); +- } +- printedFirstMember = true; +- writer.anchor(member); +- printHead(member); +- writeSignature(member); ++ /** ++ * Add serializable methods. ++ * ++ * @param heading the heading for the section ++ * @param serializableMethodContent the tree to be added to the serializable methods ++ * content tree ++ * @return a content tree for the serializable methods content ++ */ ++ public Content getSerializableMethods(String heading, Content serializableMethodContent) { ++ Content li = HtmlTree.LI(HtmlStyle.blockList, writer.getMarkerAnchor( ++ "serialized_methods")); ++ Content headingContent = new StringContent(heading); ++ Content serialHeading = HtmlTree.HEADING(HtmlConstants.SERIALIZED_MEMBER_HEADING, ++ headingContent); ++ li.addContent(serialHeading); ++ li.addContent(serializableMethodContent); ++ return li; + } + +- public void writeMemberFooter() { +- printMemberFooter(); ++ /** ++ * Return the no customization message. ++ * ++ * @param msg the message to be displayed ++ * @return no customization message content ++ */ ++ public Content getNoCustomizationMsg(String msg) { ++ Content noCustomizationMsg = new StringContent(msg); ++ return noCustomizationMsg; + } + +- public void writeDeprecatedMemberInfo(MethodDoc member) { +- printDeprecated(member); ++ /** ++ * Add the member header. ++ * ++ * @param member the method document to be listed ++ * @param methodsContentTree the content tree to which the member header will be added ++ */ ++ public void addMemberHeader(MethodDoc member, Content methodsContentTree) { ++ methodsContentTree.addContent(writer.getMarkerAnchor( ++ writer.getAnchor(member))); ++ methodsContentTree.addContent(getHead(member)); ++ methodsContentTree.addContent(getSignature(member)); + } + +- public void writeMemberDescription(MethodDoc member) { +- printComment(member); ++ /** ++ * Add the deprecated information for this member. ++ * ++ * @param member the method to document. ++ * @param methodsContentTree the tree to which the deprecated info will be added ++ */ ++ public void addDeprecatedMemberInfo(MethodDoc member, Content methodsContentTree) { ++ addDeprecatedInfo(member, methodsContentTree); + } + +- public void writeMemberTags(MethodDoc member) { ++ /** ++ * Add the description text for this member. ++ * ++ * @param member the method to document. ++ * @param methodsContentTree the tree to which the deprecated info will be added ++ */ ++ public void addMemberDescription(MethodDoc member, Content methodsContentTree) { ++ addComment(member, methodsContentTree); ++ } ++ ++ /** ++ * Add the tag information for this member. ++ * ++ * @param member the method to document. ++ * @param methodsContentTree the tree to which the member tags info will be added ++ */ ++ public void addMemberTags(MethodDoc member, Content methodsContentTree) { + TagletOutputImpl output = new TagletOutputImpl(""); + TagletManager tagletManager = + ConfigurationImpl.getInstance().tagletManager; +@@ -86,14 +148,12 @@ + tagletManager.getSerializedFormTags(), + writer.getTagletWriterInstance(false), output); + String outputString = output.toString().trim(); ++ Content dlTags = new HtmlTree(HtmlTag.DL); + if (!outputString.isEmpty()) { +- writer.printMemberDetailsListStartTag(); +- writer.dd(); +- writer.dl(); +- print(outputString); +- writer.dlEnd(); +- writer.ddEnd(); ++ Content tagContent = new RawHtml(outputString); ++ dlTags.addContent(tagContent); + } ++ methodsContentTree.addContent(dlTags); + MethodDoc method = (MethodDoc)member; + if (method.name().compareTo("writeExternal") == 0 + && method.tags("serialData").length == 0) { +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java +@@ -79,7 +79,7 @@ + String filename = pathString(classLinkInfo); + if (linkInfo.linkToSelf || + !(linkInfo.classDoc.name() + ".html").equals(m_writer.filename)) { +- linkOutput.append(m_writer.getHyperLink(filename, ++ linkOutput.append(m_writer.getHyperLinkString(filename, + classLinkInfo.where, label.toString(), + classLinkInfo.isStrong, classLinkInfo.styleName, + title, classLinkInfo.target)); +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java +@@ -28,9 +28,9 @@ + import java.io.*; + + import com.sun.javadoc.*; ++import com.sun.tools.doclets.formats.html.markup.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; +-import com.sun.tools.doclets.internal.toolkit.taglets.*; + + /** + * Writes method documentation in HTML format. +@@ -43,8 +43,6 @@ + public class MethodWriterImpl extends AbstractExecutableMemberWriter + implements MethodWriter, MemberSummaryWriter { + +- private boolean printedSummaryHeader = false; +- + /** + * Construct a new MethodWriterImpl. + * +@@ -65,184 +63,127 @@ + } + + /** +- * Write the methods summary header for the given class. +- * +- * @param classDoc the class the summary belongs to. ++ * {@inheritDoc} + */ +- public void writeMemberSummaryHeader(ClassDoc classDoc) { +- printedSummaryHeader = true; +- writer.println(); +- writer.println("<!-- ========== METHOD SUMMARY =========== -->"); +- writer.println(); +- writer.printSummaryHeader(this, classDoc); +- } +- +- /** +- * Write the methods summary footer for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeMemberSummaryFooter(ClassDoc classDoc) { +- writer.printSummaryFooter(this, classDoc); +- } +- +- /** +- * Write the inherited methods summary header for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeInheritedMemberSummaryHeader(ClassDoc classDoc) { +- if(! printedSummaryHeader){ +- //We don't want inherited summary to not be under heading. +- writeMemberSummaryHeader(classDoc); +- writeMemberSummaryFooter(classDoc); +- printedSummaryHeader = true; +- } +- writer.printInheritedSummaryHeader(this, classDoc); ++ public Content getMemberSummaryHeader(ClassDoc classDoc, ++ Content memberSummaryTree) { ++ memberSummaryTree.addContent(HtmlConstants.START_OF_METHOD_SUMMARY); ++ Content memberTree = writer.getMemberTreeHeader(); ++ writer.addSummaryHeader(this, classDoc, memberTree); ++ return memberTree; + } + + /** + * {@inheritDoc} + */ +- public void writeInheritedMemberSummary(ClassDoc classDoc, +- ProgramElementDoc method, boolean isFirst, boolean isLast) { +- writer.printInheritedSummaryMember(this, classDoc, method, isFirst); ++ public Content getMethodDetailsTreeHeader(ClassDoc classDoc, ++ Content memberDetailsTree) { ++ memberDetailsTree.addContent(HtmlConstants.START_OF_METHOD_DETAILS); ++ Content methodDetailsTree = writer.getMemberTreeHeader(); ++ methodDetailsTree.addContent(writer.getMarkerAnchor("method_detail")); ++ Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING, ++ writer.methodDetailsLabel); ++ methodDetailsTree.addContent(heading); ++ return methodDetailsTree; + } + + /** +- * Write the inherited methods summary footer for the given class. +- * +- * @param classDoc the class the summary belongs to. ++ * {@inheritDoc} + */ +- public void writeInheritedMemberSummaryFooter(ClassDoc classDoc) { +- writer.printInheritedSummaryFooter(this, classDoc); ; ++ public Content getMethodDocTreeHeader(MethodDoc method, ++ Content methodDetailsTree) { ++ String erasureAnchor; ++ if ((erasureAnchor = getErasureAnchor(method)) != null) { ++ methodDetailsTree.addContent(writer.getMarkerAnchor((erasureAnchor))); ++ } ++ methodDetailsTree.addContent( ++ writer.getMarkerAnchor(writer.getAnchor(method))); ++ Content methodDocTree = writer.getMemberTreeHeader(); ++ Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING); ++ heading.addContent(method.name()); ++ methodDocTree.addContent(heading); ++ return methodDocTree; + } + + /** +- * Write the header for the method documentation. ++ * Get the signature for the given method. + * +- * @param classDoc the class that the methods belong to. ++ * @param method the method being documented. ++ * @return a content object for the signature + */ +- public void writeHeader(ClassDoc classDoc, String header) { +- writer.println(); +- writer.println("<!-- ============ METHOD DETAIL ========== -->"); +- writer.println(); +- writer.anchor("method_detail"); +- writer.printTableHeadingBackground(header); ++ public Content getSignature(MethodDoc method) { ++ writer.displayLength = 0; ++ Content pre = new HtmlTree(HtmlTag.PRE); ++ writer.addAnnotationInfo(method, pre); ++ addModifiers(method, pre); ++ addTypeParameters(method, pre); ++ addReturnType(method, pre); ++ if (configuration().linksource) { ++ Content methodName = new StringContent(method.name()); ++ writer.addSrcLink(method, methodName, pre); ++ } else { ++ addName(method.name(), pre); ++ } ++ addParameters(method, pre); ++ addExceptions(method, pre); ++ return pre; + } + + /** +- * Write the method header for the given method. +- * +- * @param method the method being documented. +- * @param isFirst the flag to indicate whether or not the method is the +- * first to be documented. ++ * {@inheritDoc} + */ +- public void writeMethodHeader(MethodDoc method, boolean isFirst) { +- if (! isFirst) { +- writer.printMemberHeader(); +- } +- writer.println(); +- String erasureAnchor; +- if ((erasureAnchor = getErasureAnchor(method)) != null) { +- writer.anchor(erasureAnchor); +- } +- writer.anchor(method); +- writer.h3(); +- writer.print(method.name()); +- writer.h3End(); ++ public void addDeprecated(MethodDoc method, Content methodDocTree) { ++ addDeprecatedInfo(method, methodDocTree); + } + + /** +- * Write the signature for the given method. +- * +- * @param method the method being documented. ++ * {@inheritDoc} + */ +- public void writeSignature(MethodDoc method) { +- writer.displayLength = 0; +- writer.pre(); +- writer.writeAnnotationInfo(method); +- printModifiers(method); +- writeTypeParameters(method); +- printReturnType(method); +- if (configuration().linksource) { +- writer.printSrcLink(method, method.name()); +- } else { +- strong(method.name()); +- } +- writeParameters(method); +- writeExceptions(method); +- writer.preEnd(); +- assert !writer.getMemberDetailsListPrinted(); +- } +- +- /** +- * Write the deprecated output for the given method. +- * +- * @param method the method being documented. +- */ +- public void writeDeprecated(MethodDoc method) { +- printDeprecated(method); +- } +- +- /** +- * Write the comments for the given method. +- * +- * @param method the method being documented. +- */ +- public void writeComments(Type holder, MethodDoc method) { ++ public void addComments(Type holder, MethodDoc method, Content methodDocTree) { + ClassDoc holderClassDoc = holder.asClassDoc(); + if (method.inlineTags().length > 0) { +- writer.printMemberDetailsListStartTag(); + if (holder.asClassDoc().equals(classdoc) || +- (! (holderClassDoc.isPublic() || ++ (! (holderClassDoc.isPublic() || + Util.isLinkable(holderClassDoc, configuration())))) { +- writer.dd(); +- writer.printInlineComment(method); +- writer.ddEnd(); ++ writer.addInlineComment(method, methodDocTree); + } else { +- String classlink = writer.codeText( +- writer.getDocLink(LinkInfoImpl.CONTEXT_METHOD_DOC_COPY, ++ Content link = new RawHtml( ++ writer.getDocLink(LinkInfoImpl.CONTEXT_METHOD_DOC_COPY, + holder.asClassDoc(), method, + holder.asClassDoc().isIncluded() ? + holder.typeName() : holder.qualifiedTypeName(), +- false)); +- writer.dd(); +- writer.strongText(holder.asClassDoc().isClass()? +- "doclet.Description_From_Class": +- "doclet.Description_From_Interface", +- classlink); +- writer.ddEnd(); +- writer.dd(); +- writer.printInlineComment(method); +- writer.ddEnd(); ++ false)); ++ Content codelLink = HtmlTree.CODE(link); ++ Content strong = HtmlTree.STRONG(holder.asClassDoc().isClass()? ++ writer.descfrmClassLabel : writer.descfrmInterfaceLabel); ++ strong.addContent(writer.getSpace()); ++ strong.addContent(codelLink); ++ methodDocTree.addContent(HtmlTree.DIV(HtmlStyle.block, strong)); ++ writer.addInlineComment(method, methodDocTree); + } + } + } + + /** +- * Write the tag output for the given method. +- * +- * @param method the method being documented. ++ * {@inheritDoc} + */ +- public void writeTags(MethodDoc method) { +- writer.printTags(method); ++ public void addTags(MethodDoc method, Content methodDocTree) { ++ writer.addTagsInfo(method, methodDocTree); + } + + /** +- * Write the method footer. ++ * {@inheritDoc} + */ +- public void writeMethodFooter() { +- printMemberFooter(); ++ public Content getMethodDetails(Content methodDetailsTree) { ++ return getMemberTree(methodDetailsTree); + } + + /** +- * Write the footer for the method documentation. +- * +- * @param classDoc the class that the methods belong to. ++ * {@inheritDoc} + */ +- public void writeFooter(ClassDoc classDoc) { +- //No footer to write for method documentation ++ public Content getMethodDoc(Content methodDocTree, ++ boolean isLastContent) { ++ return getMemberTree(methodDocTree, isLastContent); + } + + /** +@@ -256,53 +197,89 @@ + return VisibleMemberMap.METHODS; + } + +- public void printSummaryLabel() { +- writer.printText("doclet.Method_Summary"); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addSummaryLabel(Content memberTree) { ++ Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING, ++ writer.getResource("doclet.Method_Summary")); ++ memberTree.addContent(label); + } + +- public void printTableSummary() { +- writer.tableIndexSummary(configuration().getText("doclet.Member_Table_Summary", ++ /** ++ * {@inheritDoc} ++ */ ++ public String getTableSummary() { ++ return configuration().getText("doclet.Member_Table_Summary", + configuration().getText("doclet.Method_Summary"), +- configuration().getText("doclet.methods"))); ++ configuration().getText("doclet.methods")); + } + +- public void printSummaryTableHeader(ProgramElementDoc member) { ++ /** ++ * {@inheritDoc} ++ */ ++ public String getCaption() { ++ return configuration().getText("doclet.Methods"); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String[] getSummaryTableHeader(ProgramElementDoc member) { + String[] header = new String[] { + writer.getModifierTypeHeader(), + configuration().getText("doclet.0_and_1", + configuration().getText("doclet.Method"), + configuration().getText("doclet.Description")) + }; +- writer.summaryTableHeader(header, "col"); ++ return header; + } + +- public void printSummaryAnchor(ClassDoc cd) { +- writer.anchor("method_summary"); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addSummaryAnchor(ClassDoc cd, Content memberTree) { ++ memberTree.addContent(writer.getMarkerAnchor("method_summary")); + } + +- public void printInheritedSummaryAnchor(ClassDoc cd) { +- writer.anchor("methods_inherited_from_class_" + +- ConfigurationImpl.getInstance().getClassName(cd)); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addInheritedSummaryAnchor(ClassDoc cd, Content inheritedTree) { ++ inheritedTree.addContent(writer.getMarkerAnchor( ++ "methods_inherited_from_class_" + ++ configuration().getClassName(cd))); + } + +- public void printInheritedSummaryLabel(ClassDoc cd) { +- String classlink = writer.getPreQualifiedClassLink( +- LinkInfoImpl.CONTEXT_MEMBER, cd, false); +- writer.strong(); +- String key = cd.isClass()? +- "doclet.Methods_Inherited_From_Class" : +- "doclet.Methods_Inherited_From_Interface"; +- writer.printText(key, classlink); +- writer.strongEnd(); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addInheritedSummaryLabel(ClassDoc cd, Content inheritedTree) { ++ Content classLink = new RawHtml(writer.getPreQualifiedClassLink( ++ LinkInfoImpl.CONTEXT_MEMBER, cd, false)); ++ Content label = new StringContent(cd.isClass() ? ++ configuration().getText("doclet.Methods_Inherited_From_Class") : ++ configuration().getText("doclet.Methods_Inherited_From_Interface")); ++ Content labelHeading = HtmlTree.HEADING(HtmlConstants.INHERITED_SUMMARY_HEADING, ++ label); ++ labelHeading.addContent(writer.getSpace()); ++ labelHeading.addContent(classLink); ++ inheritedTree.addContent(labelHeading); + } + +- protected void printSummaryType(ProgramElementDoc member) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addSummaryType(ProgramElementDoc member, Content tdSummaryType) { + MethodDoc meth = (MethodDoc)member; +- printModifierAndType(meth, meth.returnType()); ++ addModifierAndType(meth, meth.returnType(), tdSummaryType); + } + +- protected static void printOverridden(HtmlDocletWriter writer, +- Type overriddenType, MethodDoc method) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected static void addOverridden(HtmlDocletWriter writer, ++ Type overriddenType, MethodDoc method, Content dl) { + if(writer.configuration.nocomment){ + return; + } +@@ -317,31 +294,33 @@ + //is not visible so don't document this. + return; + } +- String label = "doclet.Overrides"; ++ Content label = writer.overridesLabel; + int context = LinkInfoImpl.CONTEXT_METHOD_OVERRIDES; + + if (method != null) { + if(overriddenType.asClassDoc().isAbstract() && method.isAbstract()){ + //Abstract method is implemented from abstract class, + //not overridden +- label = "doclet.Specified_By"; ++ label = writer.specifiedByLabel; + context = LinkInfoImpl.CONTEXT_METHOD_SPECIFIED_BY; + } +- String overriddenTypeLink = writer.codeText( +- writer.getLink(new LinkInfoImpl(context, overriddenType))); ++ Content dt = HtmlTree.DT(HtmlTree.STRONG(label)); ++ dl.addContent(dt); ++ Content overriddenTypeLink = new RawHtml( ++ writer.getLink(new LinkInfoImpl(context, overriddenType))); ++ Content codeOverridenTypeLink = HtmlTree.CODE(overriddenTypeLink); + String name = method.name(); +- writer.dt(); +- writer.strongText(label); +- writer.dtEnd(); +- writer.dd(); +- String methLink = writer.codeText( +- writer.getLink( ++ Content methlink = new RawHtml(writer.getLink( + new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, +- overriddenType.asClassDoc(), +- writer.getAnchor(method), name, false) +- )); +- writer.printText("doclet.in_class", methLink, overriddenTypeLink); +- writer.ddEnd(); ++ overriddenType.asClassDoc(), ++ writer.getAnchor(method), name, false))); ++ Content codeMethLink = HtmlTree.CODE(methlink); ++ Content dd = HtmlTree.DD(codeMethLink); ++ dd.addContent(writer.getSpace()); ++ dd.addContent(writer.getResource("doclet.in_class")); ++ dd.addContent(writer.getSpace()); ++ dd.addContent(codeOverridenTypeLink); ++ dl.addContent(dd); + } + } + +@@ -363,61 +342,78 @@ + } + } + +- protected static void printImplementsInfo(HtmlDocletWriter writer, +- MethodDoc method) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected static void addImplementsInfo(HtmlDocletWriter writer, ++ MethodDoc method, Content dl) { + if(writer.configuration.nocomment){ + return; + } + ImplementedMethods implementedMethodsFinder = +- new ImplementedMethods(method, writer.configuration); ++ new ImplementedMethods(method, writer.configuration); + MethodDoc[] implementedMethods = implementedMethodsFinder.build(); + for (int i = 0; i < implementedMethods.length; i++) { + MethodDoc implementedMeth = implementedMethods[i]; + Type intfac = implementedMethodsFinder.getMethodHolder(implementedMeth); +- String methlink = ""; +- String intfaclink = writer.codeText( +- writer.getLink(new LinkInfoImpl( ++ Content intfaclink = new RawHtml(writer.getLink(new LinkInfoImpl( + LinkInfoImpl.CONTEXT_METHOD_SPECIFIED_BY, intfac))); +- writer.dt(); +- writer.strongText("doclet.Specified_By"); +- writer.dtEnd(); +- writer.dd(); +- methlink = writer.codeText(writer.getDocLink( +- LinkInfoImpl.CONTEXT_MEMBER, implementedMeth, +- implementedMeth.name(), false)); +- writer.printText("doclet.in_interface", methlink, intfaclink); +- writer.ddEnd(); +- } +- +- } +- +- protected void printReturnType(MethodDoc method) { +- Type type = method.returnType(); +- if (type != null) { +- writer.printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_RETURN_TYPE, +- type)); +- print(' '); ++ Content codeIntfacLink = HtmlTree.CODE(intfaclink); ++ Content dt = HtmlTree.DT(HtmlTree.STRONG(writer.specifiedByLabel)); ++ dl.addContent(dt); ++ Content methlink = new RawHtml(writer.getDocLink( ++ LinkInfoImpl.CONTEXT_MEMBER, implementedMeth, ++ implementedMeth.name(), false)); ++ Content codeMethLink = HtmlTree.CODE(methlink); ++ Content dd = HtmlTree.DD(codeMethLink); ++ dd.addContent(writer.getSpace()); ++ dd.addContent(writer.getResource("doclet.in_interface")); ++ dd.addContent(writer.getSpace()); ++ dd.addContent(codeIntfacLink); ++ dl.addContent(dd); + } + } + +- protected void printNavSummaryLink(ClassDoc cd, boolean link) { +- if (link) { +- writer.printHyperLink("", (cd == null)? +- "method_summary": +- "methods_inherited_from_class_" + +- ConfigurationImpl.getInstance().getClassName(cd), +- ConfigurationImpl.getInstance().getText("doclet.navMethod")); +- } else { +- writer.printText("doclet.navMethod"); ++ /** ++ * Add the return type. ++ * ++ * @param method the method being documented. ++ * @param htmltree the content tree to which the return type will be added ++ */ ++ protected void addReturnType(MethodDoc method, Content htmltree) { ++ Type type = method.returnType(); ++ if (type != null) { ++ Content linkContent = new RawHtml(writer.getLink( ++ new LinkInfoImpl(LinkInfoImpl.CONTEXT_RETURN_TYPE, type))); ++ htmltree.addContent(linkContent); ++ htmltree.addContent(writer.getSpace()); + } + } + +- protected void printNavDetailLink(boolean link) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { + if (link) { +- writer.printHyperLink("", "method_detail", +- ConfigurationImpl.getInstance().getText("doclet.navMethod")); ++ return writer.getHyperLink("", (cd == null)? ++ "method_summary": ++ "methods_inherited_from_class_" + ++ configuration().getClassName(cd), ++ writer.getResource("doclet.navMethod")); + } else { +- writer.printText("doclet.navMethod"); ++ return writer.getResource("doclet.navMethod"); ++ } ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addNavDetailLink(boolean link, Content liNav) { ++ if (link) { ++ liNav.addContent(writer.getHyperLink("", "method_detail", ++ writer.getResource("doclet.navMethod"))); ++ } else { ++ liNav.addContent(writer.getResource("doclet.navMethod")); + } + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java +@@ -26,8 +26,10 @@ + package com.sun.tools.doclets.formats.html; + + import java.io.*; ++import java.util.*; + + import com.sun.javadoc.*; ++import com.sun.tools.doclets.formats.html.markup.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + +@@ -42,8 +44,6 @@ + public class NestedClassWriterImpl extends AbstractMemberWriter + implements MemberSummaryWriter { + +- private boolean printedSummaryHeader = false; +- + public NestedClassWriterImpl(SubWriterHolderWriter writer, + ClassDoc classdoc) { + super(writer, classdoc); +@@ -54,90 +54,17 @@ + } + + /** +- * Write the classes summary header for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeMemberSummaryHeader(ClassDoc classDoc) { +- printedSummaryHeader = true; +- writer.println("<!-- ======== NESTED CLASS SUMMARY ======== -->"); +- writer.println(); +- writer.printSummaryHeader(this, classDoc); +- } +- +- /** +- * Write the classes summary footer for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeMemberSummaryFooter(ClassDoc classDoc) { +- writer.printSummaryFooter(this, classDoc); +- } +- +- /** +- * Write the inherited classes summary header for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeInheritedMemberSummaryHeader(ClassDoc classDoc) { +- if(! printedSummaryHeader){ +- //We don't want inherited summary to not be under heading. +- writeMemberSummaryHeader(classDoc); +- writeMemberSummaryFooter(classDoc); +- printedSummaryHeader = true; +- } +- writer.printInheritedSummaryHeader(this, classDoc); +- } +- +- /** + * {@inheritDoc} + */ +- public void writeInheritedMemberSummary(ClassDoc classDoc, +- ProgramElementDoc nestedClass, boolean isFirst, boolean isLast) { +- writer.printInheritedSummaryMember(this, classDoc, nestedClass, isFirst); ++ public Content getMemberSummaryHeader(ClassDoc classDoc, ++ Content memberSummaryTree) { ++ memberSummaryTree.addContent(HtmlConstants.START_OF_NESTED_CLASS_SUMMARY); ++ Content memberTree = writer.getMemberTreeHeader(); ++ writer.addSummaryHeader(this, classDoc, memberTree); ++ return memberTree; + } + + /** +- * Write the inherited classes summary footer for the given class. +- * +- * @param classDoc the class the summary belongs to. +- */ +- public void writeInheritedMemberSummaryFooter(ClassDoc classDoc) { +- writer.printInheritedSummaryFooter(this, classDoc); +- writer.println(); +- } +- +- /** +- * Write the header for the nested class documentation. +- * +- * @param classDoc the class that the classes belong to. +- */ +- public void writeHeader(ClassDoc classDoc, String header) { +- writer.anchor("nested class_detail"); +- writer.printTableHeadingBackground(header); +- } +- +- /** +- * Write the nested class header for the given nested class. +- * +- * @param nestedClass the nested class being documented. +- * @param isFirst the flag to indicate whether or not the nested class is the +- * first to be documented. +- */ +- public void writeClassHeader(ClassDoc nestedClass, boolean isFirst) { +- if (! isFirst) { +- writer.printMemberHeader(); +- writer.println(""); +- } +- writer.anchor(nestedClass.name()); +- writer.h3(); +- writer.print(nestedClass.name()); +- writer.h3End(); +- } +- +- +- +- /** + * Close the writer. + */ + public void close() throws IOException { +@@ -148,17 +75,35 @@ + return VisibleMemberMap.INNERCLASSES; + } + +- public void printSummaryLabel() { +- writer.printText("doclet.Nested_Class_Summary"); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addSummaryLabel(Content memberTree) { ++ Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING, ++ writer.getResource("doclet.Nested_Class_Summary")); ++ memberTree.addContent(label); + } + +- public void printTableSummary() { +- writer.tableIndexSummary(configuration().getText("doclet.Member_Table_Summary", ++ /** ++ * {@inheritDoc} ++ */ ++ public String getTableSummary() { ++ return configuration().getText("doclet.Member_Table_Summary", + configuration().getText("doclet.Nested_Class_Summary"), +- configuration().getText("doclet.nested_classes"))); ++ configuration().getText("doclet.nested_classes")); + } + +- public void printSummaryTableHeader(ProgramElementDoc member) { ++ /** ++ * {@inheritDoc} ++ */ ++ public String getCaption() { ++ return configuration().getText("doclet.Nested_Classes"); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String[] getSummaryTableHeader(ProgramElementDoc member) { + String[] header; + if (member.isInterface()) { + header = new String[] { +@@ -176,92 +121,95 @@ + configuration().getText("doclet.Description")) + }; + } +- writer.summaryTableHeader(header, "col"); ++ return header; + } + +- public void printSummaryAnchor(ClassDoc cd) { +- writer.anchor("nested_class_summary"); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addSummaryAnchor(ClassDoc cd, Content memberTree) { ++ memberTree.addContent(writer.getMarkerAnchor("nested_class_summary")); + } + +- public void printInheritedSummaryAnchor(ClassDoc cd) { +- writer.anchor("nested_classes_inherited_from_class_" + +- cd.qualifiedName()); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addInheritedSummaryAnchor(ClassDoc cd, Content inheritedTree) { ++ inheritedTree.addContent(writer.getMarkerAnchor( ++ "nested_classes_inherited_from_class_" + cd.qualifiedName())); + } + +- public void printInheritedSummaryLabel(ClassDoc cd) { +- String clslink = writer.getPreQualifiedClassLink( +- LinkInfoImpl.CONTEXT_MEMBER, cd, false); +- writer.strong(); +- writer.printText(cd.isInterface() ? +- "doclet.Nested_Classes_Interface_Inherited_From_Interface" : +- "doclet.Nested_Classes_Interfaces_Inherited_From_Class", +- clslink); +- writer.strongEnd(); ++ /** ++ * {@inheritDoc} ++ */ ++ public void addInheritedSummaryLabel(ClassDoc cd, Content inheritedTree) { ++ Content classLink = new RawHtml(writer.getPreQualifiedClassLink( ++ LinkInfoImpl.CONTEXT_MEMBER, cd, false)); ++ Content label = new StringContent(cd.isInterface() ? ++ configuration().getText("doclet.Nested_Classes_Interface_Inherited_From_Interface") : ++ configuration().getText("doclet.Nested_Classes_Interfaces_Inherited_From_Class")); ++ Content labelHeading = HtmlTree.HEADING(HtmlConstants.INHERITED_SUMMARY_HEADING, ++ label); ++ labelHeading.addContent(writer.getSpace()); ++ labelHeading.addContent(classLink); ++ inheritedTree.addContent(labelHeading); + } + +- protected void writeSummaryLink(int context, ClassDoc cd, ProgramElementDoc member) { +- writer.strong(); +- writer.printLink(new LinkInfoImpl(context, (ClassDoc)member, false)); +- writer.strongEnd(); ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addSummaryLink(int context, ClassDoc cd, ProgramElementDoc member, ++ Content tdSummary) { ++ Content strong = HtmlTree.STRONG(new RawHtml( ++ writer.getLink(new LinkInfoImpl(context, (ClassDoc)member, false)))); ++ Content code = HtmlTree.CODE(strong); ++ tdSummary.addContent(code); + } + +- protected void writeInheritedSummaryLink(ClassDoc cd, +- ProgramElementDoc member) { +- writer.printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, +- (ClassDoc)member, false)); ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addInheritedSummaryLink(ClassDoc cd, ++ ProgramElementDoc member, Content linksTree) { ++ linksTree.addContent(new RawHtml( ++ writer.getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, ++ (ClassDoc)member, false)))); + } + +- protected void printSummaryType(ProgramElementDoc member) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addSummaryType(ProgramElementDoc member, ++ Content tdSummaryType) { + ClassDoc cd = (ClassDoc)member; +- printModifierAndType(cd, null); ++ addModifierAndType(cd, null, tdSummaryType); + } + +- protected void printHeader(ClassDoc cd) { +- // N.A. ++ /** ++ * {@inheritDoc} ++ */ ++ protected Content getDeprecatedLink(ProgramElementDoc member) { ++ return writer.getQualifiedClassLink(LinkInfoImpl.CONTEXT_MEMBER, ++ (ClassDoc)member); + } + +- protected void printBodyHtmlEnd(ClassDoc cd) { +- // N.A. +- } +- +- protected void printMember(ProgramElementDoc member) { +- // N.A. +- } +- +- protected void writeDeprecatedLink(ProgramElementDoc member) { +- writer.printQualifiedClassLink(LinkInfoImpl.CONTEXT_MEMBER, +- (ClassDoc)member); +- } +- +- protected void printNavSummaryLink(ClassDoc cd, boolean link) { ++ /** ++ * {@inheritDoc} ++ */ ++ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { + if (link) { +- writer.printHyperLink("", (cd == null) ? "nested_class_summary": +- "nested_classes_inherited_from_class_" + ++ return writer.getHyperLink("", (cd == null) ? "nested_class_summary": ++ "nested_classes_inherited_from_class_" + + cd.qualifiedName(), +- ConfigurationImpl.getInstance().getText("doclet.navNested")); ++ writer.getResource("doclet.navNested")); + } else { +- writer.printText("doclet.navNested"); ++ return writer.getResource("doclet.navNested"); + } + } + +- protected void printNavDetailLink(boolean link) { +- } +- +- protected void printMemberLink(ProgramElementDoc member) { +- } +- +- protected void printMembersSummaryLink(ClassDoc cd, ClassDoc icd, +- boolean link) { +- if (link) { +- writer.printHyperLink(cd.name() + ".html", +- (cd == icd)? +- "nested_class_summary": +- "nested_classes_inherited_from_class_" + +- icd.qualifiedName(), +- ConfigurationImpl.getInstance().getText( +- "doclet.Nested_Class_Summary")); +- } else { +- writer.printText("doclet.Nested_Class_Summary"); +- } ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addNavDetailLink(boolean link, Content liNav) { + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java +@@ -25,18 +25,20 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.io.*; ++import java.util.*; ++import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; ++import com.sun.tools.doclets.formats.html.markup.*; + +-import com.sun.javadoc.*; +-import java.io.*; +-import java.util.*; + /** + * Class to generate file for each package contents in the left-hand bottom + * frame. This will list all the Class Kinds in the package. A click on any + * class-kind will update the right-hand frame with the clicked class-kind page. + * + * @author Atul M Dambalkar ++ * @author Bhavesh Patel (Modified) + */ + public class PackageFrameWriter extends HtmlDocletWriter { + +@@ -85,132 +87,107 @@ + * @param packageDoc The package for which "pacakge-frame.html" is to be generated. + */ + public static void generate(ConfigurationImpl configuration, +- PackageDoc packageDoc) { ++ PackageDoc packageDoc) { + PackageFrameWriter packgen; + try { + packgen = new PackageFrameWriter(configuration, packageDoc); + String pkgName = Util.getPackageName(packageDoc); +- packgen.printHtmlHeader(pkgName, configuration.metakeywords.getMetaKeywords(packageDoc), false); +- packgen.printPackageHeader(pkgName); +- packgen.generateClassListing(); +- packgen.printBodyHtmlEnd(); ++ Content body = packgen.getBody(false, packgen.getWindowTitle(pkgName)); ++ Content pkgNameContent = new StringContent(pkgName); ++ Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, HtmlStyle.bar, ++ packgen.getTargetPackageLink(packageDoc, "classFrame", pkgNameContent)); ++ body.addContent(heading); ++ HtmlTree div = new HtmlTree(HtmlTag.DIV); ++ div.addStyle(HtmlStyle.indexContainer); ++ packgen.addClassListing(div); ++ body.addContent(div); ++ packgen.printHtmlDocument( ++ configuration.metakeywords.getMetaKeywords(packageDoc), false, body); + packgen.close(); + } catch (IOException exc) { + configuration.standardmessage.error( +- "doclet.exception_encountered", +- exc.toString(), OUTPUT_FILE_NAME); ++ "doclet.exception_encountered", ++ exc.toString(), OUTPUT_FILE_NAME); + throw new DocletAbortException(); + } + } + + /** +- * Generate class listing for all the classes in this package. Divide class ++ * Add class listing for all the classes in this package. Divide class + * listing as per the class kind and generate separate listing for + * Classes, Interfaces, Exceptions and Errors. ++ * ++ * @param contentTree the content tree to which the listing will be added + */ +- protected void generateClassListing() { ++ protected void addClassListing(Content contentTree) { + Configuration config = configuration(); + if (packageDoc.isIncluded()) { +- generateClassKindListing(packageDoc.interfaces(), +- configuration.getText("doclet.Interfaces")); +- generateClassKindListing(packageDoc.ordinaryClasses(), +- configuration.getText("doclet.Classes")); +- generateClassKindListing(packageDoc.enums(), +- configuration.getText("doclet.Enums")); +- generateClassKindListing(packageDoc.exceptions(), +- configuration.getText("doclet.Exceptions")); +- generateClassKindListing(packageDoc.errors(), +- configuration.getText("doclet.Errors")); +- generateClassKindListing(packageDoc.annotationTypes(), +- configuration.getText("doclet.AnnotationTypes")); ++ addClassKindListing(packageDoc.interfaces(), ++ getResource("doclet.Interfaces"), contentTree); ++ addClassKindListing(packageDoc.ordinaryClasses(), ++ getResource("doclet.Classes"), contentTree); ++ addClassKindListing(packageDoc.enums(), ++ getResource("doclet.Enums"), contentTree); ++ addClassKindListing(packageDoc.exceptions(), ++ getResource("doclet.Exceptions"), contentTree); ++ addClassKindListing(packageDoc.errors(), ++ getResource("doclet.Errors"), contentTree); ++ addClassKindListing(packageDoc.annotationTypes(), ++ getResource("doclet.AnnotationTypes"), contentTree); + } else { + String name = Util.getPackageName(packageDoc); +- generateClassKindListing(config.classDocCatalog.interfaces(name), +- configuration.getText("doclet.Interfaces")); +- generateClassKindListing(config.classDocCatalog.ordinaryClasses(name), +- configuration.getText("doclet.Classes")); +- generateClassKindListing(config.classDocCatalog.enums(name), +- configuration.getText("doclet.Enums")); +- generateClassKindListing(config.classDocCatalog.exceptions(name), +- configuration.getText("doclet.Exceptions")); +- generateClassKindListing(config.classDocCatalog.errors(name), +- configuration.getText("doclet.Errors")); +- generateClassKindListing(config.classDocCatalog.annotationTypes(name), +- configuration.getText("doclet.AnnotationTypes")); ++ addClassKindListing(config.classDocCatalog.interfaces(name), ++ getResource("doclet.Interfaces"), contentTree); ++ addClassKindListing(config.classDocCatalog.ordinaryClasses(name), ++ getResource("doclet.Classes"), contentTree); ++ addClassKindListing(config.classDocCatalog.enums(name), ++ getResource("doclet.Enums"), contentTree); ++ addClassKindListing(config.classDocCatalog.exceptions(name), ++ getResource("doclet.Exceptions"), contentTree); ++ addClassKindListing(config.classDocCatalog.errors(name), ++ getResource("doclet.Errors"), contentTree); ++ addClassKindListing(config.classDocCatalog.annotationTypes(name), ++ getResource("doclet.AnnotationTypes"), contentTree); + } + } + + /** +- * Generate specific class kind listing. Also add label to the listing. ++ * Add specific class kind listing. Also add label to the listing. + * +- * @param arr Array of specific class kinds, namely Class or Interface or +- * Exception or Error. +- * @param label Label for the listing ++ * @param arr Array of specific class kinds, namely Class or Interface or Exception or Error ++ * @param labelContent content tree of the label to be added ++ * @param contentTree the content tree to which the class kind listing will be added + */ +- protected void generateClassKindListing(ClassDoc[] arr, String label) { ++ protected void addClassKindListing(ClassDoc[] arr, Content labelContent, ++ Content contentTree) { + if(arr.length > 0) { + Arrays.sort(arr); +- printPackageTableHeader(); +- fontSizeStyle("+1", "FrameHeadingFont"); + boolean printedHeader = false; ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addAttr(HtmlAttr.TITLE, labelContent.toString()); + for (int i = 0; i < arr.length; i++) { + if (documentedClasses != null && +- !documentedClasses.contains(arr[i])) { ++ !documentedClasses.contains(arr[i])) { + continue; + } + if (!Util.isCoreClass(arr[i]) || ! +- configuration.isGeneratedDoc(arr[i])) { ++ configuration.isGeneratedDoc(arr[i])) { + continue; + } + if (!printedHeader) { +- print(label); +- fontEnd(); +- println(" "); +- fontStyle("FrameItemFont"); ++ Content heading = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, ++ true, labelContent); ++ contentTree.addContent(heading); + printedHeader = true; + } +- br(); +- printLink(new LinkInfoImpl( +- LinkInfoImpl.PACKAGE_FRAME, +- arr[i], +- (arr[i].isInterface() ? +- italicsText(arr[i].name()) : +- arr[i].name()),"classFrame") +- ); ++ Content link = new RawHtml (getLink(new LinkInfoImpl( ++ LinkInfoImpl.PACKAGE_FRAME, arr[i], ++ (arr[i].isInterface() ? italicsText(arr[i].name()) : ++ arr[i].name()),"classFrame"))); ++ Content li = HtmlTree.LI(link); ++ ul.addContent(li); + } +- fontEnd(); +- printPackageTableFooter(); +- println(); ++ contentTree.addContent(ul); + } + } +- +- /** +- * Print the package link at the top of the class kind listing. Clicking +- * this link, package-summary page will appear in the right hand frame. +- * +- * @param heading Top Heading to be used for the class kind listing. +- */ +- protected void printPackageHeader(String heading) { +- fontSizeStyle("+1", "FrameTitleFont"); +- printTargetPackageLink(packageDoc, "classFrame", heading); +- fontEnd(); +- } +- +- /** +- * The table for the class kind listing. +- */ +- protected void printPackageTableHeader() { +- table(); +- tr(); +- tdNowrap(); +- } +- +- /** +- * Closing Html tags for table of class kind listing. +- */ +- protected void printPackageTableFooter() { +- tdEnd(); +- trEnd(); +- tableEnd(); +- } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java +@@ -25,10 +25,11 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.io.*; ++import com.sun.javadoc.*; ++import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; +- +-import com.sun.javadoc.*; +-import java.io.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Generate the package index for the left-hand frame in the generated output. +@@ -58,7 +59,7 @@ + String filename = "overview-frame.html"; + try { + packgen = new PackageIndexFrameWriter(configuration, filename); +- packgen.generatePackageIndexFile("doclet.Window_Overview", false); ++ packgen.buildPackageIndexFile("doclet.Window_Overview", false); + packgen.close(); + } catch (IOException exc) { + configuration.standardmessage.error( +@@ -69,114 +70,86 @@ + } + + /** +- * Print each package name on separate rows. +- * +- * @param pd PackageDoc ++ * {@inheritDoc} + */ +- protected void printIndexRow(PackageDoc pd) { +- fontStyle("FrameItemFont"); +- if (pd.name().length() > 0) { +- print(getHyperLink(pathString(pd, "package-frame.html"), "", +- pd.name(), false, "", "", "packageFrame")); +- } else { +- print(getHyperLink("package-frame.html", "", "<unnamed package>", +- false, "", "", "packageFrame")); ++ protected void addPackagesList(PackageDoc[] packages, String text, ++ String tableSummary, Content body) { ++ Content heading = HtmlTree.HEADING(HtmlConstants.PACKAGE_HEADING, true, ++ packagesLabel); ++ Content div = HtmlTree.DIV(HtmlStyle.indexContainer, heading); ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addAttr(HtmlAttr.TITLE, packagesLabel.toString()); ++ for(int i = 0; i < packages.length; i++) { ++ if (packages[i] != null) { ++ ul.addContent(getPackage(packages[i])); ++ } + } +- fontEnd(); +- br(); ++ div.addContent(ul); ++ body.addContent(div); + } + + /** +- * Print the "-packagesheader" string in strong format, at top of the page, +- * if it is not the empty string. Otherwise print the "-header" string. +- * Despite the name, there is actually no navigation bar for this page. ++ * Gets each package name as a separate link. ++ * ++ * @param pd PackageDoc ++ * @return content for the package link + */ +- protected void printNavigationBarHeader() { +- printTableHeader(true); +- fontSizeStyle("+1", "FrameTitleFont"); ++ protected Content getPackage(PackageDoc pd) { ++ Content packageLinkContent; ++ Content packageLabel; ++ if (pd.name().length() > 0) { ++ packageLabel = getPackageLabel(pd.name()); ++ packageLinkContent = getHyperLink(pathString(pd, ++ "package-frame.html"), "", packageLabel, "", ++ "packageFrame"); ++ } else { ++ packageLabel = new RawHtml("<unnamed package>"); ++ packageLinkContent = getHyperLink("package-frame.html", ++ "", packageLabel, "", "packageFrame"); ++ } ++ Content li = HtmlTree.LI(packageLinkContent); ++ return li; ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ protected void addNavigationBarHeader(Content body) { ++ Content headerContent; + if (configuration.packagesheader.length() > 0) { +- strong(replaceDocRootDir(configuration.packagesheader)); ++ headerContent = new RawHtml(replaceDocRootDir(configuration.packagesheader)); + } else { +- strong(replaceDocRootDir(configuration.header)); ++ headerContent = new RawHtml(replaceDocRootDir(configuration.header)); + } +- fontEnd(); +- printTableFooter(true); ++ Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, true, ++ HtmlStyle.bar, headerContent); ++ body.addContent(heading); + } + + /** + * Do nothing as there is no overview information in this page. + */ +- protected void printOverviewHeader() { ++ protected void addOverviewHeader(Content body) { + } + + /** +- * Print Html "table" tag for the package index format. ++ * Adds "All Classes" link for the top of the left-hand frame page to the ++ * documentation tree. + * +- * @param text Text string will not be used in this method. ++ * @param body the Content object to which the all classes link should be added + */ +- protected void printIndexHeader(String text, String tableSummary) { +- printTableHeader(false); ++ protected void addAllClassesLink(Content body) { ++ Content linkContent = getHyperLink("allclasses-frame.html", "", ++ allclassesLabel, "", "packageFrame"); ++ Content div = HtmlTree.DIV(HtmlStyle.indexHeader, linkContent); ++ body.addContent(div); + } + + /** +- * Print Html closing "table" tag at the end of the package index. ++ * {@inheritDoc} + */ +- protected void printIndexFooter() { +- printTableFooter(false); +- } +- +- /** +- * Print "All Classes" link at the top of the left-hand frame page. +- */ +- protected void printAllClassesPackagesLink() { +- fontStyle("FrameItemFont"); +- print(getHyperLink("allclasses-frame.html", "", +- configuration.getText("doclet.All_Classes"), false, "", "", +- "packageFrame")); +- fontEnd(); +- p(); +- fontSizeStyle("+1", "FrameHeadingFont"); +- printText("doclet.Packages"); +- fontEnd(); +- br(); +- } +- +- /** +- * Just print some space, since there is no navigation bar for this page. +- */ +- protected void printNavigationBarFooter() { +- p(); +- space(); +- } +- +- /** +- * Print Html closing tags for the table for package index. +- * +- * @param isHeading true if this is a table for a heading. +- */ +- private void printTableFooter(boolean isHeading) { +- if (isHeading) { +- thEnd(); +- } else { +- tdEnd(); +- } +- trEnd(); +- tableEnd(); +- } +- +- /** +- * Print Html tags for the table for package index. +- * +- * @param isHeading true if this is a table for a heading. +- */ +- private void printTableHeader(boolean isHeading) { +- table(); +- tr(); +- if (isHeading) { +- thAlignNowrap("left"); +- } else { +- tdNowrap(); +- } +- ++ protected void addNavigationBarFooter(Content body) { ++ Content p = HtmlTree.P(getSpace()); ++ body.addContent(p); + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java +@@ -25,10 +25,12 @@ + + package com.sun.tools.doclets.formats.html; + +-import com.sun.tools.doclets.internal.toolkit.util.*; +-import com.sun.javadoc.*; + import java.io.*; + import java.util.*; ++import com.sun.javadoc.*; ++import com.sun.tools.doclets.internal.toolkit.*; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Generate the package index page "overview-summary.html" for the right-hand +@@ -83,7 +85,7 @@ + String filename = "overview-summary.html"; + try { + packgen = new PackageIndexWriter(configuration, filename); +- packgen.generatePackageIndexFile("doclet.Window_Overview_Summary", true); ++ packgen.buildPackageIndexFile("doclet.Window_Overview_Summary", true); + packgen.close(); + } catch (IOException exc) { + configuration.standardmessage.error( +@@ -94,125 +96,139 @@ + } + + /** +- * Print each package in separate rows in the index table. Generate link +- * to each package. ++ * Depending upon the grouping information and their titles, add ++ * separate table indices for each package group. + * +- * @param pkg Package to which link is to be generated. ++ * @param body the documentation tree to which the index will be added + */ +- protected void printIndexRow(PackageDoc pkg) { +- if(pkg != null && pkg.name().length() > 0) { +- trBgcolorStyle("white", "TableRowColor"); +- summaryRow(20); +- strong(); +- printPackageLink(pkg, Util.getPackageName(pkg), false); +- strongEnd(); +- summaryRowEnd(); +- summaryRow(0); +- printSummaryComment(pkg); +- summaryRowEnd(); +- trEnd(); +- } +- } +- +- /** +- * Depending upon the grouping information and their titles, generate +- * separate table indices for each package group. +- */ +- protected void generateIndex() { ++ protected void addIndex(Content body) { + for (int i = 0; i < groupList.size(); i++) { + String groupname = (String)groupList.get(i); + List list = (List)groupPackageMap.get(groupname); + if (list != null && list.size() > 0) { +- printIndexContents((PackageDoc[])list. +- toArray(new PackageDoc[list.size()]), +- groupname, +- configuration.getText("doclet.Member_Table_Summary", +- groupname, +- configuration.getText("doclet.packages"))); ++ addIndexContents(list.toArray(new PackageDoc[list.size()]), ++ groupname, configuration.getText("doclet.Member_Table_Summary", ++ groupname, configuration.getText("doclet.packages")), body); + } + } + } + + /** +- * Print the overview summary comment for this documentation. Print one line +- * summary at the top of the page and generate a link to the description, +- * which is generated at the end of this page. ++ * {@inheritDoc} + */ +- protected void printOverviewHeader() { +- if (root.inlineTags().length > 0) { +- printSummaryComment(root); +- p(); +- strong(configuration.getText("doclet.See")); +- br(); +- printNbsps(); +- printHyperLink("", "overview_description", +- configuration.getText("doclet.Description"), true); +- p(); ++ protected void addPackagesList(PackageDoc[] packages, String text, ++ String tableSummary, Content body) { ++ Content table = HtmlTree.TABLE(HtmlStyle.overviewSummary, 0, 3, 0, tableSummary, ++ getTableCaption(text)); ++ table.addContent(getSummaryTableHeader(packageTableHeader, "col")); ++ Content tbody = new HtmlTree(HtmlTag.TBODY); ++ addPackagesList(packages, tbody); ++ table.addContent(tbody); ++ Content div = HtmlTree.DIV(HtmlStyle.contentContainer, table); ++ body.addContent(div); ++ } ++ ++ /** ++ * Adds list of packages in the index table. Generate link to each package. ++ * ++ * @param packages Packages to which link is to be generated ++ * @param tbody the documentation tree to which the list will be added ++ */ ++ protected void addPackagesList(PackageDoc[] packages, Content tbody) { ++ for (int i = 0; i < packages.length; i++) { ++ if (packages[i] != null && packages[i].name().length() > 0) { ++ Content packageLinkContent = getPackageLink(packages[i], ++ getPackageName(packages[i])); ++ Content tdPackage = HtmlTree.TD(HtmlStyle.colFirst, packageLinkContent); ++ HtmlTree tdSummary = new HtmlTree(HtmlTag.TD); ++ tdSummary.addStyle(HtmlStyle.colLast); ++ addSummaryComment(packages[i], tdSummary); ++ HtmlTree tr = HtmlTree.TR(tdPackage); ++ tr.addContent(tdSummary); ++ if (i%2 == 0) ++ tr.addStyle(HtmlStyle.altColor); ++ else ++ tr.addStyle(HtmlStyle.rowColor); ++ tbody.addContent(tr); ++ } + } + } + + /** +- * Print Html tags for the table for this package index. ++ * Adds the overview summary comment for this documentation. Add one line ++ * summary at the top of the page and generate a link to the description, ++ * which is added at the end of this page. ++ * ++ * @param body the documentation tree to which the overview header will be added + */ +- protected void printIndexHeader(String text, String tableSummary) { +- tableIndexSummary(tableSummary); +- tableCaptionStart(); +- print(text); +- tableCaptionEnd(); +- summaryTableHeader(packageTableHeader, "col"); +- } +- +- /** +- * Print Html closing tags for the table for this package index. +- */ +- protected void printIndexFooter() { +- tableEnd(); +- p(); +- space(); +- } +- +- /** +- * Print the overview comment as provided in the file specified by the +- * "-overview" option on the command line. +- */ +- protected void printOverviewComment() { ++ protected void addOverviewHeader(Content body) { + if (root.inlineTags().length > 0) { +- anchor("overview_description"); +- p(); +- printInlineComment(root); +- p(); ++ HtmlTree p = new HtmlTree(HtmlTag.P); ++ p.addStyle(HtmlStyle.subTitle); ++ addSummaryComment(root, p); ++ Content div = HtmlTree.DIV(HtmlStyle.header, p); ++ Content see = seeLabel; ++ see.addContent(" "); ++ Content descPara = HtmlTree.P(see); ++ Content descLink = getHyperLink("", "overview_description", ++ descriptionLabel, "", ""); ++ descPara.addContent(descLink); ++ div.addContent(descPara); ++ body.addContent(div); + } + } + + /** +- * Call {@link #printOverviewComment()} and then genrate the tag information +- * as provided in the file specified by the "-overview" option on the +- * command line. ++ * Adds the overview comment as provided in the file specified by the ++ * "-overview" option on the command line. ++ * ++ * @param htmltree the documentation tree to which the overview comment will ++ * be added + */ +- protected void printOverview() throws IOException { +- printOverviewComment(); +- printTags(root); ++ protected void addOverviewComment(Content htmltree) { ++ if (root.inlineTags().length > 0) { ++ htmltree.addContent(getMarkerAnchor("overview_description")); ++ HtmlTree p = new HtmlTree(HtmlTag.P); ++ p.addStyle(HtmlStyle.subTitle); ++ addInlineComment(root, p); ++ htmltree.addContent(p); ++ } + } + + /** +- * Print the top text (from the -top option), the upper +- * navigation bar, and then the title (from the"-title" +- * option), at the top of page. ++ * Adds the tag information as provided in the file specified by the ++ * "-overview" option on the command line. ++ * ++ * @param body the documentation tree to which the overview will be added + */ +- protected void printNavigationBarHeader() { +- printTop(); +- navLinks(true); +- hr(); +- printConfigurationTitle(); ++ protected void addOverview(Content body) throws IOException { ++ HtmlTree div = new HtmlTree(HtmlTag.DIV); ++ div.addStyle(HtmlStyle.footer); ++ addOverviewComment(div); ++ addTagsInfo(root, div); ++ body.addContent(div); + } + + /** +- * Print the lower navigation bar and the bottom text ++ * Adds the top text (from the -top option), the upper ++ * navigation bar, and then the title (from the"-title" ++ * option), at the top of page. ++ * ++ * @body the documentation tree to which the navigation bar header will be added ++ */ ++ protected void addNavigationBarHeader(Content body) { ++ addTop(body); ++ addNavLinks(true, body); ++ addConfigurationTitle(body); ++ } ++ ++ /** ++ * Adds the lower navigation bar and the bottom text + * (from the -bottom option) at the bottom of page. +- */ +- protected void printNavigationBarFooter() { +- hr(); +- navLinks(false); +- printBottom(); ++ * ++ * @param the documentation tree to which the navigation bar footer will be a */ ++ protected void addNavigationBarFooter(Content body) { ++ addNavLinks(false, body); ++ addBottom(body); + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java +@@ -29,12 +29,15 @@ + + import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.tools.doclets.internal.toolkit.*; + + /** + * Class to generate Tree page for a package. The name of the file generated is + * "package-tree.html" and it is generated in the respective package directory. + * + * @author Atul M Dambalkar ++ * @author Bhavesh Patel (Modified) + */ + public class PackageTreeWriter extends AbstractTreeWriter { + +@@ -107,94 +110,96 @@ + * Generate a separate tree file for each package. + */ + protected void generatePackageTreeFile() throws IOException { +- printHtmlHeader(packagedoc.name() + " " +- + configuration.getText("doclet.Window_Class_Hierarchy"), null, true); +- +- printPackageTreeHeader(); +- ++ Content body = getPackageTreeHeader(); ++ Content headContent = getResource("doclet.Hierarchy_For_Package", ++ Util.getPackageName(packagedoc)); ++ Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, false, ++ HtmlStyle.title, headContent); ++ Content div = HtmlTree.DIV(HtmlStyle.header, heading); + if (configuration.packages.length > 1) { +- printLinkToMainTree(); ++ addLinkToMainTree(div); + } +- +- generateTree(classtree.baseclasses(), "doclet.Class_Hierarchy"); +- generateTree(classtree.baseinterfaces(), "doclet.Interface_Hierarchy"); +- generateTree(classtree.baseAnnotationTypes(), "doclet.Annotation_Type_Hierarchy"); +- generateTree(classtree.baseEnums(), "doclet.Enum_Hierarchy"); +- +- printPackageTreeFooter(); +- printBottom(); +- printBodyHtmlEnd(); ++ body.addContent(div); ++ HtmlTree divTree = new HtmlTree(HtmlTag.DIV); ++ divTree.addStyle(HtmlStyle.contentContainer); ++ addTree(classtree.baseclasses(), "doclet.Class_Hierarchy", divTree); ++ addTree(classtree.baseinterfaces(), "doclet.Interface_Hierarchy", divTree); ++ addTree(classtree.baseAnnotationTypes(), "doclet.Annotation_Type_Hierarchy", divTree); ++ addTree(classtree.baseEnums(), "doclet.Enum_Hierarchy", divTree); ++ body.addContent(divTree); ++ addNavLinks(false, body); ++ addBottom(body); ++ printHtmlDocument(null, true, body); + } + + /** +- * Print the navigation bar header for the package tree file. ++ * Get the package tree header. ++ * ++ * @return a content tree for the header + */ +- protected void printPackageTreeHeader() { +- printTop(); +- navLinks(true); +- hr(); +- center(); +- h2(configuration.getText("doclet.Hierarchy_For_Package", +- Util.getPackageName(packagedoc))); +- centerEnd(); ++ protected Content getPackageTreeHeader() { ++ String title = packagedoc.name() + " " + ++ configuration.getText("doclet.Window_Class_Hierarchy"); ++ Content bodyTree = getBody(true, getWindowTitle(title)); ++ addTop(bodyTree); ++ addNavLinks(true, bodyTree); ++ return bodyTree; + } + + /** +- * Generate a link to the tree for all the packages. ++ * Add a link to the tree for all the packages. ++ * ++ * @param div the content tree to which the link will be added + */ +- protected void printLinkToMainTree() { +- dl(); +- dt(); +- strongText("doclet.Package_Hierarchies"); +- dtEnd(); +- dd(); +- navLinkMainTree(configuration.getText("doclet.All_Packages")); +- ddEnd(); +- dlEnd(); +- hr(); ++ protected void addLinkToMainTree(Content div) { ++ Content span = HtmlTree.SPAN(HtmlStyle.strong, ++ getResource("doclet.Package_Hierarchies")); ++ div.addContent(span); ++ HtmlTree ul = new HtmlTree (HtmlTag.UL); ++ ul.addStyle(HtmlStyle.horizontal); ++ ul.addContent(getNavLinkMainTree(configuration.getText("doclet.All_Packages"))); ++ div.addContent(ul); + } + + /** +- * Print the navigation bar footer for the package tree file. ++ * Get link for the previous package tree file. ++ * ++ * @return a content tree for the link + */ +- protected void printPackageTreeFooter() { +- hr(); +- navLinks(false); +- } +- +- /** +- * Link for the previous package tree file. +- */ +- protected void navLinkPrevious() { ++ protected Content getNavLinkPrevious() { + if (prev == null) { +- navLinkPrevious(null); ++ return getNavLinkPrevious(null); + } else { + String path = DirectoryManager.getRelativePath(packagedoc.name(), +- prev.name()); +- navLinkPrevious(path + "package-tree.html"); ++ prev.name()); ++ return getNavLinkPrevious(path + "package-tree.html"); + } + } + + /** +- * Link for the next package tree file. ++ * Get link for the next package tree file. ++ * ++ * @return a content tree for the link + */ +- protected void navLinkNext() { ++ protected Content getNavLinkNext() { + if (next == null) { +- navLinkNext(null); ++ return getNavLinkNext(null); + } else { + String path = DirectoryManager.getRelativePath(packagedoc.name(), +- next.name()); +- navLinkNext(path + "package-tree.html"); ++ next.name()); ++ return getNavLinkNext(path + "package-tree.html"); + } + } + + /** +- * Link to the package summary page for the package of this tree. ++ * Get link to the package summary page for the package of this tree. ++ * ++ * @return a content tree for the package link + */ +- protected void navLinkPackage() { +- navCellStart(); +- printHyperLink("package-summary.html", "", configuration.getText("doclet.Package"), +- true, "NavBarFont1"); +- navCellEnd(); ++ protected Content getNavLinkPackage() { ++ Content linkContent = getHyperLink("package-summary.html", "", ++ packageLabel); ++ Content li = HtmlTree.LI(linkContent); ++ return li; + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java +@@ -25,10 +25,12 @@ + + package com.sun.tools.doclets.formats.html; + +-import com.sun.tools.doclets.internal.toolkit.util.*; +-import com.sun.javadoc.*; + import java.io.*; + import java.util.*; ++import com.sun.javadoc.*; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.tools.doclets.internal.toolkit.*; + + /** + * Generate package usage information. +@@ -106,49 +108,74 @@ + + + /** +- * Print the class use list. ++ * Generate the package use list. + */ + protected void generatePackageUseFile() throws IOException { +- printPackageUseHeader(); +- ++ Content body = getPackageUseHeader(); ++ HtmlTree div = new HtmlTree(HtmlTag.DIV); ++ div.addStyle(HtmlStyle.contentContainer); + if (usingPackageToUsedClasses.isEmpty()) { +- printText("doclet.ClassUse_No.usage.of.0", pkgdoc.name()); +- p(); ++ div.addContent(getResource( ++ "doclet.ClassUse_No.usage.of.0", pkgdoc.name())); + } else { +- generatePackageUse(); ++ addPackageUse(div); + } +- +- printPackageUseFooter(); ++ body.addContent(div); ++ addNavLinks(false, body); ++ addBottom(body); ++ printHtmlDocument(null, true, body); + } + + /** +- * Print the class use list. ++ * Add the package use information. ++ * ++ * @param contentTree the content tree to which the package use information will be added + */ +- protected void generatePackageUse() throws IOException { ++ protected void addPackageUse(Content contentTree) throws IOException { ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.blockList); + if (configuration.packages.length > 1) { +- generatePackageList(); ++ addPackageList(ul); + } +- generateClassList(); ++ addClassList(ul); ++ contentTree.addContent(ul); + } + +- protected void generatePackageList() throws IOException { +- tableIndexSummary(useTableSummary); +- tableCaptionStart(); +- printText("doclet.ClassUse_Packages.that.use.0", +- getPackageLink(pkgdoc, Util.getPackageName(pkgdoc), false)); +- tableCaptionEnd(); +- summaryTableHeader(packageTableHeader, "col"); ++ /** ++ * Add the list of packages that use the given package. ++ * ++ * @param contentTree the content tree to which the package list will be added ++ */ ++ protected void addPackageList(Content contentTree) throws IOException { ++ Content table = HtmlTree.TABLE(0, 3, 0, useTableSummary, ++ getTableCaption(configuration().getText( ++ "doclet.ClassUse_Packages.that.use.0", ++ getPackageLinkString(pkgdoc, Util.getPackageName(pkgdoc), false)))); ++ table.addContent(getSummaryTableHeader(packageTableHeader, "col")); ++ Content tbody = new HtmlTree(HtmlTag.TBODY); + Iterator it = usingPackageToUsedClasses.keySet().iterator(); +- while (it.hasNext()) { ++ for (int i = 0; it.hasNext(); i++) { + PackageDoc pkg = configuration.root.packageNamed((String)it.next()); +- generatePackageUse(pkg); ++ HtmlTree tr = new HtmlTree(HtmlTag.TR); ++ if (i % 2 == 0) { ++ tr.addStyle(HtmlStyle.altColor); ++ } else { ++ tr.addStyle(HtmlStyle.rowColor); ++ } ++ addPackageUse(pkg, tr); ++ tbody.addContent(tr); + } +- tableEnd(); +- space(); +- p(); ++ table.addContent(tbody); ++ Content li = HtmlTree.LI(HtmlStyle.blockList, table); ++ contentTree.addContent(li); + } + +- protected void generateClassList() throws IOException { ++ /** ++ * Add the list of classes that use the given package. ++ * ++ * @param contentTree the content tree to which the class list will be added ++ */ ++ protected void addClassList(Content contentTree) throws IOException { + String[] classTableHeader = new String[] { + configuration.getText("doclet.0_and_1", + configuration.getText("doclet.Class"), +@@ -158,118 +185,127 @@ + while (itp.hasNext()) { + String packageName = (String)itp.next(); + PackageDoc usingPackage = configuration.root.packageNamed(packageName); ++ HtmlTree li = new HtmlTree(HtmlTag.LI); ++ li.addStyle(HtmlStyle.blockList); + if (usingPackage != null) { +- anchor(usingPackage.name()); ++ li.addContent(getMarkerAnchor(usingPackage.name())); + } +- tableIndexSummary(configuration.getText("doclet.Use_Table_Summary", +- configuration.getText("doclet.classes"))); +- tableCaptionStart(); +- printText("doclet.ClassUse_Classes.in.0.used.by.1", +- getPackageLink(pkgdoc, Util.getPackageName(pkgdoc), false), +- getPackageLink(usingPackage,Util.getPackageName(usingPackage), false)); +- tableCaptionEnd(); +- summaryTableHeader(classTableHeader, "col"); ++ String tableSummary = configuration.getText("doclet.Use_Table_Summary", ++ configuration.getText("doclet.classes")); ++ Content table = HtmlTree.TABLE(0, 3, 0, tableSummary, ++ getTableCaption(configuration().getText( ++ "doclet.ClassUse_Classes.in.0.used.by.1", ++ getPackageLinkString(pkgdoc, Util.getPackageName(pkgdoc), false), ++ getPackageLinkString(usingPackage,Util.getPackageName(usingPackage), false)))); ++ table.addContent(getSummaryTableHeader(classTableHeader, "col")); ++ Content tbody = new HtmlTree(HtmlTag.TBODY); + Iterator itc = + ((Collection)usingPackageToUsedClasses.get(packageName)) + .iterator(); +- while (itc.hasNext()) { +- printClassRow((ClassDoc)itc.next(), packageName); ++ for (int i = 0; itc.hasNext(); i++) { ++ HtmlTree tr = new HtmlTree(HtmlTag.TR); ++ if (i % 2 == 0) { ++ tr.addStyle(HtmlStyle.altColor); ++ } else { ++ tr.addStyle(HtmlStyle.rowColor); ++ } ++ addClassRow(itc.next(), packageName, tr); ++ tbody.addContent(tr); + } +- tableEnd(); +- space(); +- p(); ++ table.addContent(tbody); ++ li.addContent(table); ++ contentTree.addContent(li); + } + } + +- protected void printClassRow(ClassDoc usedClass, String packageName) { ++ /** ++ * Add a row for the class that uses the given package. ++ * ++ * @param usedClass the class that uses the given package ++ * @param packageName the name of the package to which the class belongs ++ * @param contentTree the content tree to which the row will be added ++ */ ++ protected void addClassRow(ClassDoc usedClass, String packageName, ++ Content contentTree) { + String path = pathString(usedClass, +- "class-use/" + usedClass.name() + ".html"); +- +- trBgcolorStyle("white", "TableRowColor"); +- summaryRow(0); +- strong(); +- printHyperLink(path, packageName, usedClass.name(), true); +- strongEnd(); +- println(); br(); +- printNbsps(); +- printIndexComment(usedClass); +- summaryRowEnd(); +- trEnd(); ++ "class-use/" + usedClass.name() + ".html"); ++ Content td = HtmlTree.TD(HtmlStyle.colOne, ++ getHyperLink(path, packageName, new StringContent(usedClass.name()))); ++ addIndexComment(usedClass, td); ++ contentTree.addContent(td); + } + + /** +- * Print the package use list. ++ * Add the package use information. ++ * ++ * @param pkg the package that used the given package ++ * @param contentTree the content tree to which the information will be added + */ +- protected void generatePackageUse(PackageDoc pkg) throws IOException { +- trBgcolorStyle("white", "TableRowColor"); +- summaryRow(0); +- //Just want an anchor here. +- printHyperLink("", pkg.name(), Util.getPackageName(pkg), true); +- summaryRowEnd(); +- summaryRow(0); +- if (pkg != null) { +- printSummaryComment(pkg); +- } +- space(); +- summaryRowEnd(); +- trEnd(); ++ protected void addPackageUse(PackageDoc pkg, Content contentTree) throws IOException { ++ Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst, ++ getHyperLink("", pkg.name(), new StringContent(Util.getPackageName(pkg)))); ++ contentTree.addContent(tdFirst); ++ HtmlTree tdLast = new HtmlTree(HtmlTag.TD); ++ tdLast.addStyle(HtmlStyle.colLast); ++ if (pkg != null) ++ addSummaryComment(pkg, tdLast); ++ else ++ tdLast.addContent(getSpace()); ++ contentTree.addContent(tdLast); + } + + /** +- * Print the header for the class use Listing. ++ * Get the header for the package use listing. ++ * ++ * @return a content tree representing the package use header + */ +- protected void printPackageUseHeader() { +- String packageLabel = configuration.getText("doclet.Package"); ++ protected Content getPackageUseHeader() { ++ String packageText = configuration.getText("doclet.Package"); + String name = pkgdoc.name(); +- printHtmlHeader(configuration.getText("doclet.Window_ClassUse_Header", +- packageLabel, name), null, true); +- printTop(); +- navLinks(true); +- hr(); +- center(); +- h2(); +- strongText("doclet.ClassUse_Title", packageLabel, name); +- h2End(); +- centerEnd(); ++ String title = configuration.getText("doclet.Window_ClassUse_Header", ++ packageText, name); ++ Content bodyTree = getBody(true, getWindowTitle(title)); ++ addTop(bodyTree); ++ addNavLinks(true, bodyTree); ++ Content headContent = getResource("doclet.ClassUse_Title", packageText, name); ++ Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, true, ++ HtmlStyle.title, headContent); ++ Content div = HtmlTree.DIV(HtmlStyle.header, heading); ++ bodyTree.addContent(div); ++ return bodyTree; + } + + /** +- * Print the footer for the class use Listing. ++ * Get this package link. ++ * ++ * @return a content tree for the package link + */ +- protected void printPackageUseFooter() { +- hr(); +- navLinks(false); +- printBottom(); +- printBodyHtmlEnd(); +- } +- +- +- /** +- * Print this package link +- */ +- protected void navLinkPackage() { +- navCellStart(); +- printHyperLink("package-summary.html", "", configuration.getText("doclet.Package"), +- true, "NavBarFont1"); +- navCellEnd(); ++ protected Content getNavLinkPackage() { ++ Content linkContent = getHyperLink("package-summary.html", "", ++ packageLabel); ++ Content li = HtmlTree.LI(linkContent); ++ return li; + } + + /** +- * Print class use link ++ * Get the use link. ++ * ++ * @return a content tree for the use link + */ +- protected void navLinkClassUse() { +- navCellRevStart(); +- fontStyle("NavBarFont1Rev"); +- strongText("doclet.navClassUse"); +- fontEnd(); +- navCellEnd(); ++ protected Content getNavLinkClassUse() { ++ Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, useLabel); ++ return li; + } + +- protected void navLinkTree() { +- navCellStart(); +- printHyperLink("package-tree.html", "", configuration.getText("doclet.Tree"), +- true, "NavBarFont1"); +- navCellEnd(); ++ /** ++ * Get the tree link. ++ * ++ * @return a content tree for the tree link ++ */ ++ protected Content getNavLinkTree() { ++ Content linkContent = getHyperLink("package-tree.html", "", ++ treeLabel); ++ Content li = HtmlTree.LI(linkContent); ++ return li; + } +- + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java +@@ -25,12 +25,12 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.io.*; ++import java.util.*; ++import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; +- +-import com.sun.javadoc.*; +-import java.io.*; +-import java.util.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Class to generate file for each package contents in the right-hand +@@ -98,189 +98,206 @@ + /** + * {@inheritDoc} + */ +- public void writeSummaryHeader() {} +- +- /** +- * {@inheritDoc} +- */ +- public void writeSummaryFooter() {} +- +- /** +- * {@inheritDoc} +- */ +- public void writeClassesSummary(ClassDoc[] classes, String label, String tableSummary, String[] tableHeader) { +- if(classes.length > 0) { +- Arrays.sort(classes); +- tableIndexSummary(tableSummary); +- boolean printedHeading = false; +- for (int i = 0; i < classes.length; i++) { +- if (!printedHeading) { +- printTableCaption(label); +- printFirstRow(tableHeader); +- printedHeading = true; +- } +- if (!Util.isCoreClass(classes[i]) || +- !configuration.isGeneratedDoc(classes[i])) { +- continue; +- } +- trBgcolorStyle("white", "TableRowColor"); +- summaryRow(15); +- strong(); +- printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_PACKAGE, +- classes[i], false)); +- strongEnd(); +- summaryRowEnd(); +- summaryRow(0); +- if (Util.isDeprecated(classes[i])) { +- strongText("doclet.Deprecated"); +- if (classes[i].tags("deprecated").length > 0) { +- space(); +- printSummaryDeprecatedComment(classes[i], +- classes[i].tags("deprecated")[0]); +- } +- } else { +- printSummaryComment(classes[i]); +- } +- summaryRowEnd(); +- trEnd(); +- } +- tableEnd(); +- println(" "); +- p(); ++ public Content getPackageHeader(String heading) { ++ String pkgName = packageDoc.name(); ++ Content bodyTree = getBody(true, getWindowTitle(pkgName)); ++ addTop(bodyTree); ++ addNavLinks(true, bodyTree); ++ HtmlTree div = new HtmlTree(HtmlTag.DIV); ++ div.addStyle(HtmlStyle.header); ++ Content annotationContent = new HtmlTree(HtmlTag.P); ++ addAnnotationInfo(packageDoc, annotationContent); ++ div.addContent(annotationContent); ++ Content tHeading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, true, ++ HtmlStyle.title, packageLabel); ++ tHeading.addContent(getSpace()); ++ Content packageHead = new RawHtml(heading); ++ tHeading.addContent(packageHead); ++ div.addContent(tHeading); ++ if (packageDoc.inlineTags().length > 0 && ! configuration.nocomment) { ++ HtmlTree p = new HtmlTree(HtmlTag.P); ++ p.addStyle(HtmlStyle.subTitle); ++ addSummaryComment(packageDoc, p); ++ div.addContent(p); ++ Content space = getSpace(); ++ Content descLink = getHyperLink("", "package_description", ++ descriptionLabel, "", ""); ++ Content descPara = new HtmlTree(HtmlTag.P, seeLabel, space, descLink); ++ div.addContent(descPara); + } +- } +- +- /** +- * Print the table caption for the class-listing. +- * +- * @param label label for the Class kind listing. +- */ +- protected void printTableCaption(String label) { +- tableCaptionStart(); +- print(label); +- tableCaptionEnd(); +- } +- +- /** +- * Print the table heading for the class-listing. +- * +- * @param tableHeader table header string for the Class listing. +- */ +- protected void printFirstRow(String[] tableHeader) { +- summaryTableHeader(tableHeader, "col"); ++ bodyTree.addContent(div); ++ return bodyTree; + } + + /** + * {@inheritDoc} + */ +- public void writePackageDescription() { +- if (packageDoc.inlineTags().length > 0) { +- anchor("package_description"); +- h2(configuration.getText("doclet.Package_Description", packageDoc.name())); +- p(); +- printInlineComment(packageDoc); +- p(); ++ public Content getContentHeader() { ++ HtmlTree div = new HtmlTree(HtmlTag.DIV); ++ div.addStyle(HtmlStyle.contentContainer); ++ return div; ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public Content getSummaryHeader() { ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.blockList); ++ return ul; ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void addClassesSummary(ClassDoc[] classes, String label, ++ String tableSummary, String[] tableHeader, Content summaryContentTree) { ++ if(classes.length > 0) { ++ Arrays.sort(classes); ++ Content caption = getTableCaption(label); ++ Content table = HtmlTree.TABLE(HtmlStyle.packageSummary, 0, 3, 0, ++ tableSummary, caption); ++ table.addContent(getSummaryTableHeader(tableHeader, "col")); ++ Content tbody = new HtmlTree(HtmlTag.TBODY); ++ for (int i = 0; i < classes.length; i++) { ++ if (!Util.isCoreClass(classes[i]) || ++ !configuration.isGeneratedDoc(classes[i])) { ++ continue; ++ } ++ Content classContent = new RawHtml(getLink(new LinkInfoImpl( ++ LinkInfoImpl.CONTEXT_PACKAGE, classes[i], false))); ++ Content tdClass = HtmlTree.TD(HtmlStyle.colFirst, classContent); ++ HtmlTree tr = HtmlTree.TR(tdClass); ++ if (i%2 == 0) ++ tr.addStyle(HtmlStyle.altColor); ++ else ++ tr.addStyle(HtmlStyle.rowColor); ++ HtmlTree tdClassDescription = new HtmlTree(HtmlTag.TD); ++ tdClassDescription.addStyle(HtmlStyle.colLast); ++ if (Util.isDeprecated(classes[i])) { ++ tdClassDescription.addContent(deprecatedLabel); ++ if (classes[i].tags("deprecated").length > 0) { ++ addSummaryDeprecatedComment(classes[i], ++ classes[i].tags("deprecated")[0], tdClassDescription); ++ } ++ } ++ else ++ addSummaryComment(classes[i], tdClassDescription); ++ tr.addContent(tdClassDescription); ++ tbody.addContent(tr); ++ } ++ table.addContent(tbody); ++ Content li = HtmlTree.LI(HtmlStyle.blockList, table); ++ summaryContentTree.addContent(li); + } + } + + /** + * {@inheritDoc} + */ +- public void writePackageTags() { +- printTags(packageDoc); +- } +- +- /** +- * {@inheritDoc} +- */ +- public void writePackageHeader(String heading) { +- String pkgName = packageDoc.name(); +- printHtmlHeader(pkgName, +- configuration.metakeywords.getMetaKeywords(packageDoc), true); +- printTop(); +- navLinks(true); +- hr(); +- writeAnnotationInfo(packageDoc); +- h2(configuration.getText("doclet.Package") + " " + heading); +- if (packageDoc.inlineTags().length > 0 && ! configuration.nocomment) { +- printSummaryComment(packageDoc); +- p(); +- strong(configuration.getText("doclet.See")); +- br(); +- printNbsps(); +- printHyperLink("", "package_description", +- configuration.getText("doclet.Description"), true); +- p(); ++ public void addPackageDescription(Content packageContentTree) { ++ if (packageDoc.inlineTags().length > 0) { ++ packageContentTree.addContent(getMarkerAnchor("package_description")); ++ Content h2Content = new StringContent( ++ configuration.getText("doclet.Package_Description", ++ packageDoc.name())); ++ packageContentTree.addContent(HtmlTree.HEADING(HtmlConstants.PACKAGE_HEADING, ++ true, h2Content)); ++ addInlineComment(packageDoc, packageContentTree); + } + } + + /** + * {@inheritDoc} + */ +- public void writePackageFooter() { +- hr(); +- navLinks(false); +- printBottom(); +- printBodyHtmlEnd(); ++ public void addPackageTags(Content packageContentTree) { ++ addTagsInfo(packageDoc, packageContentTree); + } + + /** +- * Print "Use" link for this pacakge in the navigation bar. ++ * {@inheritDoc} + */ +- protected void navLinkClassUse() { +- navCellStart(); +- printHyperLink("package-use.html", "", configuration.getText("doclet.navClassUse"), +- true, "NavBarFont1"); +- navCellEnd(); ++ public void addPackageFooter(Content contentTree) { ++ addNavLinks(false, contentTree); ++ addBottom(contentTree); + } + + /** +- * Print "PREV PACKAGE" link in the navigation bar. ++ * {@inheritDoc} + */ +- protected void navLinkPrevious() { ++ public void printDocument(Content contentTree) { ++ printHtmlDocument(configuration.metakeywords.getMetaKeywords(packageDoc), ++ true, contentTree); ++ } ++ ++ /** ++ * Get "Use" link for this pacakge in the navigation bar. ++ * ++ * @return a content tree for the class use link ++ */ ++ protected Content getNavLinkClassUse() { ++ Content useLink = getHyperLink("package-use.html", "", ++ useLabel, "", ""); ++ Content li = HtmlTree.LI(useLink); ++ return li; ++ } ++ ++ /** ++ * Get "PREV PACKAGE" link in the navigation bar. ++ * ++ * @return a content tree for the previous link ++ */ ++ public Content getNavLinkPrevious() { ++ Content li; + if (prev == null) { +- printText("doclet.Prev_Package"); ++ li = HtmlTree.LI(prevpackageLabel); + } else { + String path = DirectoryManager.getRelativePath(packageDoc.name(), + prev.name()); +- printHyperLink(path + "package-summary.html", "", +- configuration.getText("doclet.Prev_Package"), true); ++ li = HtmlTree.LI(getHyperLink(path + "package-summary.html", "", ++ prevpackageLabel, "", "")); + } ++ return li; + } + + /** +- * Print "NEXT PACKAGE" link in the navigation bar. ++ * Get "NEXT PACKAGE" link in the navigation bar. ++ * ++ * @return a content tree for the next link + */ +- protected void navLinkNext() { ++ public Content getNavLinkNext() { ++ Content li; + if (next == null) { +- printText("doclet.Next_Package"); ++ li = HtmlTree.LI(nextpackageLabel); + } else { + String path = DirectoryManager.getRelativePath(packageDoc.name(), + next.name()); +- printHyperLink(path + "package-summary.html", "", +- configuration.getText("doclet.Next_Package"), true); ++ li = HtmlTree.LI(getHyperLink(path + "package-summary.html", "", ++ nextpackageLabel, "", "")); + } ++ return li; + } + + /** +- * Print "Tree" link in the navigation bar. This will be link to the package ++ * Get "Tree" link in the navigation bar. This will be link to the package + * tree file. ++ * ++ * @return a content tree for the tree link + */ +- protected void navLinkTree() { +- navCellStart(); +- printHyperLink("package-tree.html", "", configuration.getText("doclet.Tree"), +- true, "NavBarFont1"); +- navCellEnd(); ++ protected Content getNavLinkTree() { ++ Content useLink = getHyperLink("package-tree.html", "", ++ treeLabel, "", ""); ++ Content li = HtmlTree.LI(useLink); ++ return li; + } + + /** + * Highlight "Package" in the navigation bar, as this is the package page. ++ * ++ * @return a content tree for the package link + */ +- protected void navLinkPackage() { +- navCellRevStart(); +- fontStyle("NavBarFont1Rev"); +- strongText("doclet.Package"); +- fontEnd(); +- navCellEnd(); ++ protected Content getNavLinkPackage() { ++ Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, packageLabel); ++ return li; + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java +@@ -25,8 +25,10 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.io.*; + import com.sun.javadoc.*; +-import java.io.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.tools.doclets.internal.toolkit.*; + + /** + * Generate the Serialized Form Information Page. +@@ -64,76 +66,167 @@ + } + + /** +- * Write the given package header. ++ * Get the given header. + * +- * @param packageName the package header to write. ++ * @param header the header to write ++ * @return the body content tree + */ +- public void writePackageHeader(String packageName) { +- hr(4, "noshade"); +- tableHeader(); +- thAlign("center"); +- font("+2"); +- strongText("doclet.Package"); +- print(' '); +- strong(packageName); +- tableFooter(); ++ public Content getHeader(String header) { ++ Content bodyTree = getBody(true, getWindowTitle(header)); ++ addTop(bodyTree); ++ addNavLinks(true, bodyTree); ++ Content h1Content = new StringContent(header); ++ Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, true, ++ HtmlStyle.title, h1Content); ++ Content div = HtmlTree.DIV(HtmlStyle.header, heading); ++ bodyTree.addContent(div); ++ return bodyTree; + } + + /** +- * Write the serial UID info. ++ * Get the serialized form summaries header. + * +- * @param header the header that will show up before the UID. +- * @param serialUID the serial UID to print. ++ * @return the serialized form summary header tree + */ +- public void writeSerialUIDInfo(String header, String serialUID) { +- strong(header + " "); +- println(serialUID); +- p(); ++ public Content getSerializedSummariesHeader() { ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.blockList); ++ return ul; + } + + /** +- * Write the footer. ++ * Get the package serialized form header. ++ * ++ * @return the package serialized form header tree + */ +- public void writeFooter() { +- p(); +- hr(); +- navLinks(false); +- printBottom(); +- printBodyHtmlEnd(); ++ public Content getPackageSerializedHeader() { ++ HtmlTree li = new HtmlTree(HtmlTag.LI); ++ li.addStyle(HtmlStyle.blockList); ++ return li; + } + ++ /** ++ * Get the given package header. ++ * ++ * @param packageName the package header to write ++ * @return a content tree for the package header ++ */ ++ public Content getPackageHeader(String packageName) { ++ Content heading = HtmlTree.HEADING(HtmlConstants.PACKAGE_HEADING, true, ++ packageLabel); ++ heading.addContent(getSpace()); ++ heading.addContent(packageName); ++ return heading; ++ } + + /** +- * Write the serializable class heading. ++ * Get the serialized class header. + * +- * @param classDoc the class being processed. ++ * @return a content tree for the serialized class header + */ +- public void writeClassHeader(ClassDoc classDoc) { ++ public Content getClassSerializedHeader() { ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.blockList); ++ return ul; ++ } ++ ++ /** ++ * Get the serializable class heading. ++ * ++ * @param classDoc the class being processed ++ * @return a content tree for the class header ++ */ ++ public Content getClassHeader(ClassDoc classDoc) { + String classLink = (classDoc.isPublic() || classDoc.isProtected())? + getLink(new LinkInfoImpl(classDoc, +- configuration.getClassName(classDoc))): ++ configuration.getClassName(classDoc))): + classDoc.qualifiedName(); +- p(); +- anchor(classDoc.qualifiedName()); ++ Content li = HtmlTree.LI(HtmlStyle.blockList, getMarkerAnchor( ++ classDoc.qualifiedName())); + String superClassLink = + classDoc.superclassType() != null ? + getLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_SERIALIZED_FORM, +- classDoc.superclassType())) : ++ classDoc.superclassType())) : + null; + + //Print the heading. + String className = superClassLink == null ? + configuration.getText( +- "doclet.Class_0_implements_serializable", classLink) : ++ "doclet.Class_0_implements_serializable", classLink) : + configuration.getText( +- "doclet.Class_0_extends_implements_serializable", classLink, +- superClassLink); +- tableHeader(); +- thAlignColspan("left", 2); +- font("+2"); +- strong(className); +- tableFooter(); +- p(); ++ "doclet.Class_0_extends_implements_serializable", classLink, ++ superClassLink); ++ Content classNameContent = new RawHtml(className); ++ li.addContent(HtmlTree.HEADING(HtmlConstants.SERIALIZED_MEMBER_HEADING, ++ classNameContent)); ++ return li; ++ } ++ ++ /** ++ * Get the serial UID info header. ++ * ++ * @return a content tree for the serial uid info header ++ */ ++ public Content getSerialUIDInfoHeader() { ++ HtmlTree dl = new HtmlTree(HtmlTag.DL); ++ dl.addStyle(HtmlStyle.nameValue); ++ return dl; ++ } ++ ++ /** ++ * Adds the serial UID info. ++ * ++ * @param header the header that will show up before the UID. ++ * @param serialUID the serial UID to print. ++ * @param serialUidTree the serial UID content tree to which the serial UID ++ * content will be added ++ */ ++ public void addSerialUIDInfo(String header, String serialUID, ++ Content serialUidTree) { ++ Content headerContent = new StringContent(header); ++ serialUidTree.addContent(HtmlTree.DT(headerContent)); ++ Content serialContent = new StringContent(serialUID); ++ serialUidTree.addContent(HtmlTree.DD(serialContent)); ++ } ++ ++ /** ++ * Get the class serialize content header. ++ * ++ * @return a content tree for the class serialize content header ++ */ ++ public Content getClassContentHeader() { ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.blockList); ++ return ul; ++ } ++ ++ /** ++ * Get the serialized content tree section. ++ * ++ * @param serializedTreeContent the serialized content tree to be added ++ * @return a div content tree ++ */ ++ public Content getSerializedContent(Content serializedTreeContent) { ++ Content divContent = HtmlTree.DIV(HtmlStyle.serializedFormContainer, ++ serializedTreeContent); ++ return divContent; ++ } ++ ++ /** ++ * Add the footer. ++ * ++ * @param serializedTree the serialized tree to be added ++ */ ++ public void addFooter(Content serializedTree) { ++ addNavLinks(false, serializedTree); ++ addBottom(serializedTree); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void printDocument(Content serializedTree) { ++ printHtmlDocument(null, true, serializedTree); + } + + private void tableHeader() { +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java +@@ -25,9 +25,10 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.io.*; + import com.sun.tools.doclets.internal.toolkit.util.*; +- +-import java.io.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.tools.doclets.internal.toolkit.*; + + /** + * Generate only one index file for all the Member Names with Indexing in +@@ -36,6 +37,7 @@ + * + * @see java.lang.Character + * @author Atul M Dambalkar ++ * @author Bhavesh Patel (Modified) + */ + public class SingleIndexWriter extends AbstractIndexWriter { + +@@ -82,34 +84,35 @@ + * Member Field, Method and Constructor Description. + */ + protected void generateIndexFile() throws IOException { +- printHtmlHeader(configuration.getText("doclet.Window_Single_Index"), +- null, true); +- printTop(); +- navLinks(true); +- printLinksForIndexes(); +- +- hr(); +- ++ String title = configuration.getText("doclet.Window_Single_Index"); ++ Content body = getBody(true, getWindowTitle(title)); ++ addTop(body); ++ addNavLinks(true, body); ++ HtmlTree divTree = new HtmlTree(HtmlTag.DIV); ++ divTree.addStyle(HtmlStyle.contentContainer); ++ addLinksForIndexes(divTree); + for (int i = 0; i < indexbuilder.elements().length; i++) { + Character unicode = (Character)((indexbuilder.elements())[i]); +- generateContents(unicode, indexbuilder.getMemberList(unicode)); ++ addContents(unicode, indexbuilder.getMemberList(unicode), divTree); + } +- +- printLinksForIndexes(); +- navLinks(false); +- +- printBottom(); +- printBodyHtmlEnd(); ++ addLinksForIndexes(divTree); ++ body.addContent(divTree); ++ addNavLinks(false, body); ++ addBottom(body); ++ printHtmlDocument(null, true, body); + } + + /** +- * Print Links for all the Index Files per unicode character. ++ * Add links for all the Index Files per unicode character. ++ * ++ * @param contentTree the content tree to which the links for indexes will be added + */ +- protected void printLinksForIndexes() { ++ protected void addLinksForIndexes(Content contentTree) { + for (int i = 0; i < indexbuilder.elements().length; i++) { + String unicode = (indexbuilder.elements())[i].toString(); +- printHyperLink("#_" + unicode + "_", unicode); +- print(' '); ++ contentTree.addContent( ++ getHyperLink("#_" + unicode + "_", new StringContent(unicode))); ++ contentTree.addContent(getSpace()); + } + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourceToHTMLConverter.java b/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java +# most patch programs can not handle renames +# rename from src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourceToHTMLConverter.java +# rename to src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourceToHTMLConverter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java +@@ -23,14 +23,14 @@ + * questions. + */ + +-package com.sun.tools.doclets.internal.toolkit.util; ++package com.sun.tools.doclets.formats.html; + + import java.io.*; +-import java.util.*; + import javax.tools.FileObject; +- + import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.*; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * Converts Java Source Code to HTML. +@@ -40,27 +40,28 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.4 + */ + public class SourceToHTMLConverter { + + /** +- * The background color. +- */ +- protected static final String BGCOLOR = "white"; +- +- /** +- * The line number color. +- */ +- protected static final String LINE_NO_COLOR = "green"; +- +- /** + * The number of trailing blank lines at the end of the page. + * This is inserted so that anchors at the bottom of small pages + * can be reached. + */ +- protected static final int NUM_BLANK_LINES = 60; ++ private static final int NUM_BLANK_LINES = 60; + ++ /** ++ * New line to be added to the documentation. ++ */ ++ private static final Content NEW_LINE = new RawHtml(DocletConstants.NL); ++ ++ /** ++ * Relative path from the documentation root to the file that is being ++ * generated. ++ */ ++ private static String relativePath = ""; + + /** + * Source is converted to HTML using static methods below. +@@ -69,11 +70,13 @@ + + /** + * Convert the Classes in the given RootDoc to an HTML. ++ * + * @param configuration the configuration. + * @param rd the RootDoc to convert. + * @param outputdir the name of the directory to output to. + */ +- public static void convertRoot(Configuration configuration, RootDoc rd, String outputdir) { ++ public static void convertRoot(ConfigurationImpl configuration, RootDoc rd, ++ String outputdir) { + if (rd == null || outputdir == null) { + return; + } +@@ -84,17 +87,19 @@ + ClassDoc[] cds = rd.specifiedClasses(); + for (int i = 0; i < cds.length; i++) { + convertClass(configuration, cds[i], +- getPackageOutputDir(outputdir, cds[i].containingPackage())); ++ getPackageOutputDir(outputdir, cds[i].containingPackage())); + } + } + + /** + * Convert the Classes in the given Package to an HTML. ++ * + * @param configuration the configuration. + * @param pd the Package to convert. + * @param outputdir the name of the directory to output to. + */ +- public static void convertPackage(Configuration configuration, PackageDoc pd, String outputdir) { ++ public static void convertPackage(ConfigurationImpl configuration, PackageDoc pd, ++ String outputdir) { + if (pd == null || outputdir == null) { + return; + } +@@ -107,8 +112,10 @@ + + /** + * Return the directory write output to for the given package. ++ * + * @param outputDir the directory to output to. + * @param pd the Package to generate output for. ++ * @return the package output directory as a String. + */ + private static String getPackageOutputDir(String outputDir, PackageDoc pd) { + return outputDir + File.separator + +@@ -117,11 +124,13 @@ + + /** + * Convert the given Class to an HTML. ++ * + * @param configuration the configuration. + * @param cd the class to convert. + * @param outputdir the name of the directory to output to. + */ +- public static void convertClass(Configuration configuration, ClassDoc cd, String outputdir) { ++ public static void convertClass(ConfigurationImpl configuration, ClassDoc cd, ++ String outputdir) { + if (cd == null || outputdir == null) { + return; + } +@@ -145,19 +154,23 @@ + LineNumberReader reader = new LineNumberReader(r); + int lineno = 1; + String line; +- StringBuffer output = new StringBuffer(); ++ relativePath = DirectoryManager.getRelativePath(DocletConstants.SOURCE_OUTPUT_DIR_NAME) + ++ DirectoryManager.getRelativePath(cd.containingPackage()); ++ Content body = getHeader(); ++ Content pre = new HtmlTree(HtmlTag.PRE); + try { + while ((line = reader.readLine()) != null) { +- output.append(formatLine(line, configuration.sourcetab, lineno)); ++ addLineNo(pre, lineno); ++ addLine(pre, line, configuration.sourcetab, lineno); + lineno++; + } + } finally { + reader.close(); + } +- output = addLineNumbers(output.toString()); +- output.insert(0, getHeader(configuration)); +- output.append(getFooter()); +- writeToFile(output.toString(), outputdir, cd.name(), configuration); ++ addBlankLines(pre); ++ Content div = HtmlTree.DIV(HtmlStyle.sourceContainer, pre); ++ body.addContent(div); ++ writeToFile(body, outputdir, cd.name(), configuration); + } catch (Exception e){ + e.printStackTrace(); + } +@@ -165,135 +178,117 @@ + + /** + * Write the output to the file. +- * @param output the string to output. ++ * ++ * @param body the documentation content to be written to the file. + * @param outputDir the directory to output to. + * @param className the name of the class that I am converting to HTML. + * @param configuration the Doclet configuration to pass notices to. + */ +- private static void writeToFile(String output, String outputDir, String className, Configuration configuration) throws IOException { ++ private static void writeToFile(Content body, String outputDir, ++ String className, ConfigurationImpl configuration) throws IOException { ++ Content htmlDocType = DocType.Transitional(); ++ Content head = new HtmlTree(HtmlTag.HEAD); ++ head.addContent(HtmlTree.TITLE(new StringContent( ++ configuration.getText("doclet.Window_Source_title")))); ++ head.addContent(getStyleSheetProperties(configuration)); ++ Content htmlTree = HtmlTree.HTML(configuration.getLocale().getLanguage(), ++ head, body); ++ Content htmlDocument = new HtmlDocument(htmlDocType, htmlTree); + File dir = new File(outputDir); + dir.mkdirs(); + File newFile = new File(dir, className + ".html"); + configuration.message.notice("doclet.Generating_0", newFile.getPath()); + FileOutputStream fout = new FileOutputStream(newFile); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fout)); +- bw.write(output); ++ bw.write(htmlDocument.toString()); + bw.close(); + fout.close(); + } + + /** +- * Given a <code>String</code>, add line numbers. +- * @param s the text to add line numbers to. ++ * Returns a link to the stylesheet file. + * +- * @return the string buffer with the line numbering for each line. ++ * @param configuration the doclet configuration for the current run of javadoc ++ * @return an HtmlTree for the lINK tag which provides the stylesheet location + */ +- private static StringBuffer addLineNumbers(String s) { +- StringBuffer sb = new StringBuffer(); +- StringTokenizer st = new StringTokenizer(s, "\n", true); +- int lineno = 1; +- String current; +- while(st.hasMoreTokens()){ +- current = st.nextToken(); +- sb.append(current.equals("\n") ? +- getHTMLLineNo(lineno) + current : +- getHTMLLineNo(lineno) + current + st.nextToken()); +- lineno++; ++ public static HtmlTree getStyleSheetProperties(ConfigurationImpl configuration) { ++ String filename = configuration.stylesheetfile; ++ if (filename.length() > 0) { ++ File stylefile = new File(filename); ++ String parent = stylefile.getParent(); ++ filename = (parent == null)? ++ filename: ++ filename.substring(parent.length() + 1); ++ } else { ++ filename = "stylesheet.css"; + } +- return sb; ++ filename = relativePath + filename; ++ HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", filename, "Style"); ++ return link; + } + + /** + * Get the header. +- * @param configuration the Doclet configuration +- * @return the header to the output file ++ * ++ * @return the header content for the HTML file + */ +- protected static String getHeader(Configuration configuration) { +- StringBuffer result = new StringBuffer("<HTML lang=\"" + configuration.getLocale().getLanguage() + "\">" + DocletConstants.NL); +- result.append("<BODY BGCOLOR=\""+ BGCOLOR + "\">" + DocletConstants.NL); +- result.append("<PRE>" + DocletConstants.NL); +- return result.toString(); ++ private static Content getHeader() { ++ return new HtmlTree(HtmlTag.BODY); + } + + /** +- * Get the footer +- * @return the footer to the output file ++ * Add the line numbers for the source code. ++ * ++ * @param pre the content tree to which the line number will be added ++ * @param lineno The line number + */ +- protected static String getFooter() { +- StringBuffer footer = new StringBuffer(); +- for (int i = 0; i < NUM_BLANK_LINES; i++) { +- footer.append(DocletConstants.NL); ++ private static void addLineNo(Content pre, int lineno) { ++ HtmlTree span = new HtmlTree(HtmlTag.SPAN); ++ span.addStyle(HtmlStyle.sourceLineNo); ++ if (lineno < 10) { ++ span.addContent("00" + Integer.toString(lineno)); ++ } else if (lineno < 100) { ++ span.addContent("0" + Integer.toString(lineno)); ++ } else { ++ span.addContent(Integer.toString(lineno)); + } +- footer.append("</PRE>" + DocletConstants.NL + "</BODY>" + +- DocletConstants.NL + "</HTML>" + DocletConstants.NL); +- return footer.toString(); ++ pre.addContent(span); + } + + /** +- * Get the HTML for the lines. +- * @param lineno The line number +- * @return the HTML code for the line +- */ +- protected static String getHTMLLineNo(int lineno) { +- StringBuffer result = new StringBuffer("<FONT color=\"" + LINE_NO_COLOR +- + "\">"); +- if (lineno < 10) { +- result.append("00" + ((new Integer(lineno)).toString())); +- } else if (lineno < 100) { +- result.append("0" + ((new Integer(lineno)).toString())); +- } else { +- result.append((new Integer(lineno)).toString()); +- } +- result.append("</FONT> "); +- return result.toString(); +- } +- +- /** +- * Format a given line of source. <br> +- * Note: In the future, we will add special colors for constructs in the +- * language. ++ * Add a line from source to the HTML file that is generated. ++ * ++ * @param pre the content tree to which the line will be added. + * @param line the string to format. + * @param tabLength the number of spaces for each tab. + * @param currentLineNo the current number. + */ +- protected static String formatLine(String line, int tabLength, int currentLineNo) { +- if (line == null) { +- return null; +- } +- StringBuffer lineBuffer = new StringBuffer(Util.escapeHtmlChars(line)); +- //Insert an anchor for the line +- lineBuffer.append("<a name=\"line." + Integer.toString(currentLineNo) + "\"></a>"); +- lineBuffer.append(DocletConstants.NL); +- Util.replaceTabs(tabLength, lineBuffer); +- return lineBuffer.toString(); +- } +- +- /** +- * Given an array of <code>Doc</code>s, add to the given <code>HashMap</code> the +- * line numbers and anchors that should be inserted in the output at those lines. +- * @param docs the array of <code>Doc</code>s to add anchors for. +- * @param hash the <code>HashMap</code> to add to. +- */ +- protected static void addToHash(Doc[] docs, HashMap<Integer,String> hash) { +- if(docs == null) { +- return; +- } +- for(int i = 0; i < docs.length; i++) { +- hash.put(docs[i].position().line(), getAnchor(docs[i])); ++ private static void addLine(Content pre, String line, int tabLength, ++ int currentLineNo) { ++ if (line != null) { ++ StringBuffer lineBuffer = new StringBuffer(Util.escapeHtmlChars(line)); ++ Util.replaceTabs(tabLength, lineBuffer); ++ pre.addContent(new RawHtml(lineBuffer.toString())); ++ Content anchor = HtmlTree.A_NAME("line." + Integer.toString(currentLineNo)); ++ pre.addContent(anchor); ++ pre.addContent(NEW_LINE); + } + } + + /** +- * Given a <code>Doc</code>, return an anchor for it. +- * @param d the <code>Doc</code> to check. +- * @return an anchor of the form <a name="my_name"></a> ++ * Add trailing blank lines at the end of the page. ++ * ++ * @param pre the content tree to which the blank lines will be added. + */ +- protected static String getAnchor(Doc d) { +- return " <a name=\"" + getAnchorName(d) + "\"></a>"; ++ private static void addBlankLines(Content pre) { ++ for (int i = 0; i < NUM_BLANK_LINES; i++) { ++ pre.addContent(NEW_LINE); ++ } + } + + /** + * Given a <code>Doc</code>, return an anchor name for it. ++ * + * @param d the <code>Doc</code> to check. + * @return the name of the anchor. + */ +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java +@@ -25,9 +25,10 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.io.*; + import com.sun.tools.doclets.internal.toolkit.util.*; +- +-import java.io.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.tools.doclets.internal.toolkit.*; + + /** + * Generate Separate Index Files for all the member names with Indexing in +@@ -36,6 +37,7 @@ + * + * @see java.lang.Character + * @author Atul M Dambalkar ++ * @author Bhavesh Patel (Modified) + */ + public class SplitIndexWriter extends AbstractIndexWriter { + +@@ -109,56 +111,68 @@ + * index. + */ + protected void generateIndexFile(Character unicode) throws IOException { +- printHtmlHeader(configuration.getText("doclet.Window_Split_Index", +- unicode.toString()), null, true); +- printTop(); +- navLinks(true); +- printLinksForIndexes(); +- +- hr(); +- +- generateContents(unicode, indexbuilder.getMemberList(unicode)); +- +- navLinks(false); +- printLinksForIndexes(); +- +- printBottom(); +- printBodyHtmlEnd(); ++ String title = configuration.getText("doclet.Window_Split_Index", ++ unicode.toString()); ++ Content body = getBody(true, getWindowTitle(title)); ++ addTop(body); ++ addNavLinks(true, body); ++ HtmlTree divTree = new HtmlTree(HtmlTag.DIV); ++ divTree.addStyle(HtmlStyle.contentContainer); ++ addLinksForIndexes(divTree); ++ addContents(unicode, indexbuilder.getMemberList(unicode), divTree); ++ addLinksForIndexes(divTree); ++ body.addContent(divTree); ++ addNavLinks(false, body); ++ addBottom(body); ++ printHtmlDocument(null, true, body); + } + + /** +- * Print Links for all the Index Files per unicode character. ++ * Add links for all the Index Files per unicode character. ++ * ++ * @param contentTree the content tree to which the links for indexes will be added + */ +- protected void printLinksForIndexes() { +- for (int i = 0; i < indexbuilder.elements().length; i++) { ++ protected void addLinksForIndexes(Content contentTree) { ++ Object[] unicodeChars = indexbuilder.elements(); ++ for (int i = 0; i < unicodeChars.length; i++) { + int j = i + 1; +- printHyperLink("index-" + j + ".html", +- indexbuilder.elements()[i].toString()); +- print(' '); ++ contentTree.addContent(getHyperLink("index-" + j + ".html", ++ new StringContent(unicodeChars[i].toString()))); ++ contentTree.addContent(getSpace()); + } + } + + /** +- * Print the previous unicode character index link. ++ * Get link to the previous unicode character. ++ * ++ * @return a content tree for the link + */ +- protected void navLinkPrevious() { ++ public Content getNavLinkPrevious() { ++ Content prevletterLabel = getResource("doclet.Prev_Letter"); + if (prev == -1) { +- printText("doclet.Prev_Letter"); +- } else { +- printHyperLink("index-" + prev + ".html", "", +- configuration.getText("doclet.Prev_Letter"), true); ++ return HtmlTree.LI(prevletterLabel); ++ } ++ else { ++ Content prevLink = getHyperLink("index-" + prev + ".html", "", ++ prevletterLabel); ++ return HtmlTree.LI(prevLink); + } + } + + /** +- * Print the next unicode character index link. ++ * Get link to the next unicode character. ++ * ++ * @return a content tree for the link + */ +- protected void navLinkNext() { ++ public Content getNavLinkNext() { ++ Content nextletterLabel = getResource("doclet.Next_Letter"); + if (next == -1) { +- printText("doclet.Next_Letter"); +- } else { +- printHyperLink("index-" + next + ".html","", +- configuration.getText("doclet.Next_Letter"), true); ++ return HtmlTree.LI(nextletterLabel); ++ } ++ else { ++ Content nextLink = getHyperLink("index-" + next + ".html","", ++ nextletterLabel); ++ return HtmlTree.LI(nextLink); + } + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/StylesheetWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/StylesheetWriter.java +deleted file mode 100644 +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/StylesheetWriter.java ++++ /dev/null +@@ -1,130 +0,0 @@ +-/* +- * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. +- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +- * +- * This code is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License version 2 only, as +- * published by the Free Software Foundation. Oracle designates this +- * particular file as subject to the "Classpath" exception as provided +- * by Oracle in the LICENSE file that accompanied this code. +- * +- * This code is distributed in the hope that it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +- * version 2 for more details (a copy is included in the LICENSE file that +- * accompanied this code). +- * +- * You should have received a copy of the GNU General Public License version +- * 2 along with this work; if not, write to the Free Software Foundation, +- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +- * +- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +- * or visit www.oracle.com if you need additional information or have any +- * questions. +- */ +- +-package com.sun.tools.doclets.formats.html; +- +-import com.sun.tools.doclets.internal.toolkit.util.*; +- +-import java.io.*; +- +-/** +- * Writes the style sheet for the doclet output. +- * +- * @author Atul M Dambalkar +- * @author Bhavesh Patel (Modified) +- */ +-public class StylesheetWriter extends HtmlDocletWriter { +- +- /** +- * Constructor. +- */ +- public StylesheetWriter(ConfigurationImpl configuration, +- String filename) throws IOException { +- super(configuration, filename); +- } +- +- /** +- * Generate the style file contents. +- * @throws DocletAbortException +- */ +- public static void generate(ConfigurationImpl configuration) { +- StylesheetWriter stylegen; +- String filename = ""; +- try { +- filename = "stylesheet.css"; +- stylegen = new StylesheetWriter(configuration, filename); +- stylegen.generateStyleFile(); +- stylegen.close(); +- } catch (IOException exc) { +- configuration.standardmessage.error( +- "doclet.exception_encountered", +- exc.toString(), filename); +- throw new DocletAbortException(); +- } +- } +- +- /** +- * Generate the style file contents. +- */ +- protected void generateStyleFile() { +- print("/* "); printText("doclet.Style_line_1"); println(" */"); +- println(""); +- +- print("/* "); printText("doclet.Style_line_2"); println(" */"); +- println(""); +- +- print("/* "); printText("doclet.Style_line_3"); println(" */"); +- println("body { background-color: #FFFFFF; color:#000000 }"); +- println(""); +- +- print("/* "); printText("doclet.Style_Headings"); println(" */"); +- println("h1 { font-size: 145% }"); +- println(""); +- +- print("/* "); printText("doclet.Style_line_4"); println(" */"); +- print(".TableHeadingColor { background: #CCCCFF; color:#000000 }"); +- print(" /* "); printText("doclet.Style_line_5"); println(" */"); +- print(".TableSubHeadingColor { background: #EEEEFF; color:#000000 }"); +- print(" /* "); printText("doclet.Style_line_6"); println(" */"); +- print(".TableRowColor { background: #FFFFFF; color:#000000 }"); +- print(" /* "); printText("doclet.Style_line_7"); println(" */"); +- println(""); +- +- print("/* "); printText("doclet.Style_line_8"); println(" */"); +- println(".FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 }"); +- println(".FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }"); +- println(".FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }"); +- println(""); +- +- // Removed doclet.Style_line_9 as no longer needed +- +- print("/* "); printText("doclet.Style_line_10"); println(" */"); +- print(".NavBarCell1 { background-color:#EEEEFF; color:#000000}"); +- print(" /* "); printText("doclet.Style_line_6"); println(" */"); +- print(".NavBarCell1Rev { background-color:#00008B; color:#FFFFFF}"); +- print(" /* "); printText("doclet.Style_line_11"); println(" */"); +- +- print(".NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;"); +- println("color:#000000;}"); +- print(".NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;"); +- println("color:#FFFFFF;}"); +- println(""); +- +- print(".NavBarCell2 { font-family: Arial, Helvetica, sans-serif; "); +- println("background-color:#FFFFFF; color:#000000}"); +- print(".NavBarCell3 { font-family: Arial, Helvetica, sans-serif; "); +- println("background-color:#FFFFFF; color:#000000}"); +- +- print("/* "); printText("doclet.Style_line_12"); println(" */"); +- print(".TableCaption { background: #CCCCFF; color:#000000; text-align: left; font-size: 150%; font-weight: bold; border-left: 2px ridge; border-right: 2px ridge; border-top: 2px ridge; padding-left: 5px; }"); +- print(" /* "); printText("doclet.Style_line_5"); println(" */"); +- print(".TableSubCaption { background: #EEEEFF; color:#000000; text-align: left; font-weight: bold; border-left: 2px ridge; border-right: 2px ridge; border-top: 2px ridge; padding-left: 5px; }"); +- print(" /* "); printText("doclet.Style_line_6"); println(" */"); +- print(".TableHeader { text-align: center; font-size: 80%; font-weight: bold; }"); +- println(""); +- +- } +- +-} +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java +@@ -25,10 +25,11 @@ + + package com.sun.tools.doclets.formats.html; + ++import java.io.*; + import com.sun.javadoc.*; ++import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; +- +-import java.io.*; ++import com.sun.tools.doclets.formats.html.markup.*; + + /** + * This abstract class exists to provide functionality needed in the +@@ -71,13 +72,31 @@ + tdEnd(); + } + +- public void printSummaryHeader(AbstractMemberWriter mw, ClassDoc cd) { +- mw.printSummaryAnchor(cd); +- mw.printTableSummary(); +- tableCaptionStart(); +- mw.printSummaryLabel(); +- tableCaptionEnd(); +- mw.printSummaryTableHeader(cd); ++ /** ++ * Add the summary header. ++ * ++ * @param mw the writer for the member being documented ++ * @param cd the classdoc to be documented ++ * @param memberTree the content tree to which the summary header will be added ++ */ ++ public void addSummaryHeader(AbstractMemberWriter mw, ClassDoc cd, ++ Content memberTree) { ++ mw.addSummaryAnchor(cd, memberTree); ++ mw.addSummaryLabel(memberTree); ++ } ++ ++ /** ++ * Get the summary table. ++ * ++ * @param mw the writer for the member being documented ++ * @param cd the classdoc to be documented ++ * @return the content tree for the summary table ++ */ ++ public Content getSummaryTableTree(AbstractMemberWriter mw, ClassDoc cd) { ++ Content table = HtmlTree.TABLE(HtmlStyle.overviewSummary, 0, 3, 0, ++ mw.getTableSummary(), getTableCaption(mw.getCaption())); ++ table.addContent(getSummaryTableHeader(mw.getSummaryTableHeader(cd), "col")); ++ return table; + } + + public void printTableHeadingBackground(String str) { +@@ -88,15 +107,17 @@ + tableEnd(); + } + +- public void printInheritedSummaryHeader(AbstractMemberWriter mw, ClassDoc cd) { +- mw.printInheritedSummaryAnchor(cd); +- tableIndexSummary(); +- tableInheritedHeaderStart("#EEEEFF"); +- mw.printInheritedSummaryLabel(cd); +- tableInheritedHeaderEnd(); +- trBgcolorStyle("white", "TableRowColor"); +- summaryRow(0); +- code(); ++ /** ++ * Add the inherited summary header. ++ * ++ * @param mw the writer for the member being documented ++ * @param cd the classdoc to be documented ++ * @param inheritedTree the content tree to which the inherited summary header will be added ++ */ ++ public void addInheritedSummaryHeader(AbstractMemberWriter mw, ClassDoc cd, ++ Content inheritedTree) { ++ mw.addInheritedSummaryAnchor(cd, inheritedTree); ++ mw.addInheritedSummaryLabel(cd, inheritedTree); + } + + public void printSummaryFooter(AbstractMemberWriter mw, ClassDoc cd) { +@@ -112,8 +133,14 @@ + space(); + } + +- protected void printIndexComment(Doc member) { +- printIndexComment(member, member.firstSentenceTags()); ++ /** ++ * Add the index comment. ++ * ++ * @param member the member being documented ++ * @param contentTree the content tree to which the comment will be added ++ */ ++ protected void addIndexComment(Doc member, Content contentTree) { ++ addIndexComment(member, member.firstSentenceTags(), contentTree); + } + + protected void printIndexComment(Doc member, Tag[] firstSentenceTags) { +@@ -134,17 +161,60 @@ + printSummaryComment(member, firstSentenceTags); + } + +- public void printSummaryLinkType(AbstractMemberWriter mw, +- ProgramElementDoc member) { +- trBgcolorStyle("white", "TableRowColor"); +- mw.printSummaryType(member); +- summaryRow(0); +- code(); ++ /** ++ * Add the index comment. ++ * ++ * @param member the member being documented ++ * @param firstSentenceTags the first sentence tags for the member to be documented ++ * @param tdSummary the content tree to which the comment will be added ++ */ ++ protected void addIndexComment(Doc member, Tag[] firstSentenceTags, ++ Content tdSummary) { ++ Tag[] deprs = member.tags("deprecated"); ++ Content div; ++ if (Util.isDeprecated((ProgramElementDoc) member)) { ++ Content strong = HtmlTree.STRONG(deprecatedPhrase); ++ div = HtmlTree.DIV(HtmlStyle.block, strong); ++ div.addContent(getSpace()); ++ if (deprs.length > 0) { ++ addInlineDeprecatedComment(member, deprs[0], div); ++ } ++ tdSummary.addContent(div); ++ return; ++ } else { ++ ClassDoc cd = ((ProgramElementDoc)member).containingClass(); ++ if (cd != null && Util.isDeprecated(cd)) { ++ Content strong = HtmlTree.STRONG(deprecatedPhrase); ++ div = HtmlTree.DIV(HtmlStyle.block, strong); ++ div.addContent(getSpace()); ++ tdSummary.addContent(div); ++ } ++ } ++ addSummaryComment(member, firstSentenceTags, tdSummary); + } + +- public void printSummaryLinkComment(AbstractMemberWriter mw, +- ProgramElementDoc member) { +- printSummaryLinkComment(mw, member, member.firstSentenceTags()); ++ /** ++ * Add the summary type for the member. ++ * ++ * @param mw the writer for the member being documented ++ * @param member the member to be documented ++ * @param tdSummaryType the content tree to which the type will be added ++ */ ++ public void addSummaryType(AbstractMemberWriter mw, ProgramElementDoc member, ++ Content tdSummaryType) { ++ mw.addSummaryType(member, tdSummaryType); ++ } ++ ++ /** ++ * Add the summary link for the member. ++ * ++ * @param mw the writer for the member being documented ++ * @param member the member to be documented ++ * @param contentTree the content tree to which the link will be added ++ */ ++ public void addSummaryLinkComment(AbstractMemberWriter mw, ++ ProgramElementDoc member, Content contentTree) { ++ addSummaryLinkComment(mw, member, member.firstSentenceTags(), contentTree); + } + + public void printSummaryLinkComment(AbstractMemberWriter mw, +@@ -159,12 +229,34 @@ + trEnd(); + } + +- public void printInheritedSummaryMember(AbstractMemberWriter mw, ClassDoc cd, +- ProgramElementDoc member, boolean isFirst) { ++ /** ++ * Add the summary link comment. ++ * ++ * @param mw the writer for the member being documented ++ * @param member the member being documented ++ * @param firstSentenceTags the first sentence tags for the member to be documented ++ * @param tdSummary the content tree to which the comment will be added ++ */ ++ public void addSummaryLinkComment(AbstractMemberWriter mw, ++ ProgramElementDoc member, Tag[] firstSentenceTags, Content tdSummary) { ++ addIndexComment(member, firstSentenceTags, tdSummary); ++ } ++ ++ /** ++ * Add the inherited member summary. ++ * ++ * @param mw the writer for the member being documented ++ * @param cd the class being documented ++ * @param member the member being documented ++ * @param isFirst true if its the first link being documented ++ * @param linksTree the content tree to which the summary will be added ++ */ ++ public void addInheritedMemberSummary(AbstractMemberWriter mw, ClassDoc cd, ++ ProgramElementDoc member, boolean isFirst, Content linksTree) { + if (! isFirst) { +- mw.print(", "); ++ linksTree.addContent(", "); + } +- mw.writeInheritedSummaryLink(cd, member); ++ mw.addInheritedSummaryLink(cd, member, linksTree); + } + + public void printMemberHeader() { +@@ -174,4 +266,67 @@ + public void printMemberFooter() { + } + ++ /** ++ * Get the document content header tree ++ * ++ * @return a content tree the document content header ++ */ ++ public Content getContentHeader() { ++ HtmlTree div = new HtmlTree(HtmlTag.DIV); ++ div.addStyle(HtmlStyle.contentContainer); ++ return div; ++ } ++ ++ /** ++ * Get the member header tree ++ * ++ * @return a content tree the member header ++ */ ++ public Content getMemberTreeHeader() { ++ HtmlTree li = new HtmlTree(HtmlTag.LI); ++ li.addStyle(HtmlStyle.blockList); ++ return li; ++ } ++ ++ /** ++ * Get the member tree ++ * ++ * @param contentTree the tree used to generate the complete member tree ++ * @return a content tree for the member ++ */ ++ public Content getMemberTree(Content contentTree) { ++ Content ul = HtmlTree.UL(HtmlStyle.blockList, contentTree); ++ return ul; ++ } ++ ++ /** ++ * Get the member summary tree ++ * ++ * @param contentTree the tree used to generate the member summary tree ++ * @return a content tree for the member summary ++ */ ++ public Content getMemberSummaryTree(Content contentTree) { ++ return getMemberTree(HtmlStyle.summary, contentTree); ++ } ++ ++ /** ++ * Get the member details tree ++ * ++ * @param contentTree the tree used to generate the member details tree ++ * @return a content tree for the member details ++ */ ++ public Content getMemberDetailsTree(Content contentTree) { ++ return getMemberTree(HtmlStyle.details, contentTree); ++ } ++ ++ /** ++ * Get the member tree ++ * ++ * @param style the style class to be added to the content tree ++ * @param contentTree the tree used to generate the complete member tree ++ */ ++ public Content getMemberTree(HtmlStyle style, Content contentTree) { ++ Content div = HtmlTree.DIV(style, getMemberTree(contentTree)); ++ return div; ++ } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java b/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java +@@ -70,9 +70,9 @@ + Tag[] deprs = doc.tags("deprecated"); + if (doc instanceof ClassDoc) { + if (Util.isDeprecated((ProgramElementDoc) doc)) { +- output.append("<STRONG>" + ++ output.append("<span class=\"strong\">" + + ConfigurationImpl.getInstance(). +- getText("doclet.Deprecated") + "</STRONG> "); ++ getText("doclet.Deprecated") + "</span> "); + if (deprs.length > 0) { + Tag[] commentTags = deprs[0].inlineTags(); + if (commentTags.length > 0) { +@@ -82,30 +82,24 @@ + ); + } + } +- output.append("<p>"); + } + } else { + MemberDoc member = (MemberDoc) doc; + if (Util.isDeprecated((ProgramElementDoc) doc)) { +- output.append("<DD><STRONG>" + ++ output.append("<span class=\"strong\">" + + ConfigurationImpl.getInstance(). +- getText("doclet.Deprecated") + "</STRONG> "); ++ getText("doclet.Deprecated") + "</span> "); + if (deprs.length > 0) { +- output.append("<I>"); ++ output.append("<i>"); + output.append(commentTagsToOutput(null, doc, + deprs[0].inlineTags(), false).toString()); +- output.append("</I>"); ++ output.append("</i>"); + } +- if (member instanceof ExecutableMemberDoc) { +- output.append(DocletConstants.NL + "<P>" + +- DocletConstants.NL); +- } +- output.append("</DD>"); + } else { + if (Util.isDeprecated(member.containingClass())) { +- output.append("<DD><STRONG>" + ++ output.append("<span class=\"strong\">" + + ConfigurationImpl.getInstance(). +- getText("doclet.Deprecated") + "</STRONG> </DD>"); ++ getText("doclet.Deprecated") + "</span> "); + } + } + } +@@ -124,8 +118,8 @@ + */ + public TagletOutput getParamHeader(String header) { + StringBuffer result = new StringBuffer(); +- result.append("<DT>"); +- result.append("<STRONG>" + header + "</STRONG></DT>"); ++ result.append("<dt>"); ++ result.append("<span class=\"strong\">" + header + "</span></dt>"); + return new TagletOutputImpl(result.toString()); + } + +@@ -133,8 +127,8 @@ + * {@inheritDoc} + */ + public TagletOutput paramTagOutput(ParamTag paramTag, String paramName) { +- TagletOutput result = new TagletOutputImpl("<DD><CODE>" + paramName + "</CODE>" +- + " - " + htmlWriter.commentTagsToString(paramTag, null, paramTag.inlineTags(), false) + "</DD>"); ++ TagletOutput result = new TagletOutputImpl("<dd><code>" + paramName + "</code>" ++ + " - " + htmlWriter.commentTagsToString(paramTag, null, paramTag.inlineTags(), false) + "</dd>"); + return result; + } + +@@ -142,11 +136,11 @@ + * {@inheritDoc} + */ + public TagletOutput returnTagOutput(Tag returnTag) { +- TagletOutput result = new TagletOutputImpl(DocletConstants.NL + "<DT>" + +- "<STRONG>" + htmlWriter.configuration.getText("doclet.Returns") + +- "</STRONG>" + "</DT>" + "<DD>" + ++ TagletOutput result = new TagletOutputImpl(DocletConstants.NL + "<dt>" + ++ "<span class=\"strong\">" + htmlWriter.configuration.getText("doclet.Returns") + ++ "</span>" + "</dt>" + "<dd>" + + htmlWriter.commentTagsToString(returnTag, null, returnTag.inlineTags(), +- false) + "</DD>"); ++ false) + "</dd>"); + return result; + } + +@@ -168,7 +162,7 @@ + htmlWriter instanceof ClassWriterImpl) { + //Automatically add link to constant values page for constant fields. + result = addSeeHeader(result); +- result += htmlWriter.getHyperLink(htmlWriter.relativePath + ++ result += htmlWriter.getHyperLinkString(htmlWriter.relativePath + + ConfigurationImpl.CONSTANTS_FILE_NAME + + "#" + ((ClassWriterImpl) htmlWriter).getClassDoc().qualifiedName() + + "." + ((FieldDoc) holder).name(), +@@ -179,18 +173,19 @@ + if ((SerializedFormBuilder.serialInclude(holder) && + SerializedFormBuilder.serialInclude(((ClassDoc)holder).containingPackage()))) { + result = addSeeHeader(result); +- result += htmlWriter.getHyperLink(htmlWriter.relativePath + "serialized-form.html", ++ result += htmlWriter.getHyperLinkString(htmlWriter.relativePath + "serialized-form.html", + ((ClassDoc)holder).qualifiedName(), htmlWriter.configuration.getText("doclet.Serialized_Form"), false); + } + } +- return result.equals("") ? null : new TagletOutputImpl(result + "</DD>"); ++ return result.equals("") ? null : new TagletOutputImpl(result + "</dd>"); + } + + private String addSeeHeader(String result) { + if (result != null && result.length() > 0) { + return result + ", " + DocletConstants.NL; + } else { +- return "<DT><STRONG>" + htmlWriter.configuration().getText("doclet.See_Also") + "</STRONG></DT><DD>"; ++ return "<dt><span class=\"strong\">" + ++ htmlWriter.configuration().getText("doclet.See_Also") + "</span></dt><dd>"; + } + } + +@@ -198,15 +193,15 @@ + * {@inheritDoc} + */ + public TagletOutput simpleTagOutput(Tag[] simpleTags, String header) { +- String result = "<DT><STRONG>" + header + "</STRONG></DT>" + DocletConstants.NL + +- " <DD>"; ++ String result = "<dt><span class=\"strong\">" + header + "</span></dt>" + DocletConstants.NL + ++ " <dd>"; + for (int i = 0; i < simpleTags.length; i++) { + if (i > 0) { + result += ", "; + } + result += htmlWriter.commentTagsToString(simpleTags[i], null, simpleTags[i].inlineTags(), false); + } +- result += "</DD>" + DocletConstants.NL; ++ result += "</dd>" + DocletConstants.NL; + return new TagletOutputImpl(result); + } + +@@ -214,24 +209,24 @@ + * {@inheritDoc} + */ + public TagletOutput simpleTagOutput(Tag simpleTag, String header) { +- return new TagletOutputImpl("<DT><STRONG>" + header + "</STRONG></DT>" + " <DD>" ++ return new TagletOutputImpl("<dt><span class=\"strong\">" + header + "</span></dt>" + " <dd>" + + htmlWriter.commentTagsToString(simpleTag, null, simpleTag.inlineTags(), false) +- + "</DD>" + DocletConstants.NL); ++ + "</dd>" + DocletConstants.NL); + } + + /** + * {@inheritDoc} + */ + public TagletOutput getThrowsHeader() { +- return new TagletOutputImpl(DocletConstants.NL + "<DT>" + "<STRONG>" + +- htmlWriter.configuration().getText("doclet.Throws") + "</STRONG></DT>"); ++ return new TagletOutputImpl(DocletConstants.NL + "<dt>" + "<span class=\"strong\">" + ++ htmlWriter.configuration().getText("doclet.Throws") + "</span></dt>"); + } + + /** + * {@inheritDoc} + */ + public TagletOutput throwsTagOutput(ThrowsTag throwsTag) { +- String result = DocletConstants.NL + "<DD>"; ++ String result = DocletConstants.NL + "<dd>"; + result += throwsTag.exceptionType() == null ? + htmlWriter.codeText(throwsTag.exceptionName()) : + htmlWriter.codeText( +@@ -243,7 +238,7 @@ + if (text != null && text.toString().length() > 0) { + result += " - " + text; + } +- result += "</DD>"; ++ result += "</dd>"; + return new TagletOutputImpl(result); + } + +@@ -251,9 +246,9 @@ + * {@inheritDoc} + */ + public TagletOutput throwsTagOutput(Type throwsType) { +- return new TagletOutputImpl(DocletConstants.NL + "<DD>" + ++ return new TagletOutputImpl(DocletConstants.NL + "<dd>" + + htmlWriter.codeText(htmlWriter.getLink( +- new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, throwsType))) + "</DD>"); ++ new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER, throwsType))) + "</dd>"); + } + + /** +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java +@@ -29,6 +29,8 @@ + + import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.util.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++import com.sun.tools.doclets.internal.toolkit.*; + + /** + * Generate Class Hierarchy page for all the Classes in this run. Use +@@ -37,6 +39,7 @@ + * current or the destination directory. + * + * @author Atul M Dambalkar ++ * @author Bhavesh Patel (Modified) + */ + public class TreeWriter extends AbstractTreeWriter { + +@@ -90,86 +93,70 @@ + } + + /** +- * Print the interface hierarchy and class hierarchy in the file. ++ * Generate the interface hierarchy and class hierarchy. + */ + public void generateTreeFile() throws IOException { +- printHtmlHeader(configuration.getText("doclet.Window_Class_Hierarchy"), +- null, true); +- +- printTreeHeader(); +- +- printPageHeading(); +- +- printPackageTreeLinks(); +- +- generateTree(classtree.baseclasses(), "doclet.Class_Hierarchy"); +- generateTree(classtree.baseinterfaces(), "doclet.Interface_Hierarchy"); +- generateTree(classtree.baseAnnotationTypes(), "doclet.Annotation_Type_Hierarchy"); +- generateTree(classtree.baseEnums(), "doclet.Enum_Hierarchy"); +- +- printTreeFooter(); ++ Content body = getTreeHeader(); ++ Content headContent = getResource("doclet.Hierarchy_For_All_Packages"); ++ Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, false, ++ HtmlStyle.title, headContent); ++ Content div = HtmlTree.DIV(HtmlStyle.header, heading); ++ addPackageTreeLinks(div); ++ body.addContent(div); ++ HtmlTree divTree = new HtmlTree(HtmlTag.DIV); ++ divTree.addStyle(HtmlStyle.contentContainer); ++ addTree(classtree.baseclasses(), "doclet.Class_Hierarchy", divTree); ++ addTree(classtree.baseinterfaces(), "doclet.Interface_Hierarchy", divTree); ++ addTree(classtree.baseAnnotationTypes(), "doclet.Annotation_Type_Hierarchy", divTree); ++ addTree(classtree.baseEnums(), "doclet.Enum_Hierarchy", divTree); ++ body.addContent(divTree); ++ addNavLinks(false, body); ++ addBottom(body); ++ printHtmlDocument(null, true, body); + } + + /** +- * Generate the links to all the package tree files. ++ * Add the links to all the package tree files. ++ * ++ * @param contentTree the content tree to which the links will be added + */ +- protected void printPackageTreeLinks() { ++ protected void addPackageTreeLinks(Content contentTree) { + //Do nothing if only unnamed package is used + if (packages.length == 1 && packages[0].name().length() == 0) { + return; + } + if (!classesonly) { +- dl(); +- dt(); +- strongText("doclet.Package_Hierarchies"); +- dtEnd(); +- dd(); ++ Content span = HtmlTree.SPAN(HtmlStyle.strong, ++ getResource("doclet.Package_Hierarchies")); ++ contentTree.addContent(span); ++ HtmlTree ul = new HtmlTree(HtmlTag.UL); ++ ul.addStyle(HtmlStyle.horizontal); + for (int i = 0; i < packages.length; i++) { + if (packages[i].name().length() == 0) { + continue; + } +- String filename = pathString(packages[i], "package-tree.html"); +- printHyperLink(filename, "", packages[i].name()); ++ String link = pathString(packages[i], "package-tree.html"); ++ Content li = HtmlTree.LI(getHyperLink( ++ link, "", new StringContent(packages[i].name()))); + if (i < packages.length - 1) { +- print(", "); ++ li.addContent(", "); + } ++ ul.addContent(li); + } +- ddEnd(); +- dlEnd(); +- hr(); ++ contentTree.addContent(ul); + } + } + + /** +- * Print the top text (from the -top option) and +- * navigation bar at the top of page. ++ * Get the tree header. ++ * ++ * @return a content tree for the tree header + */ +- protected void printTreeHeader() { +- printTop(); +- navLinks(true); +- hr(); +- } +- +- /** +- * Print the navigation bar and bottom text (from the -bottom option) +- * at the bottom of page. +- */ +- protected void printTreeFooter() { +- hr(); +- navLinks(false); +- printBottom(); +- printBodyHtmlEnd(); +- } +- +- /** +- * Print the page title "Hierarchy For All Packages" at the top of the tree +- * page. +- */ +- protected void printPageHeading() { +- center(); +- h2(); +- printText("doclet.Hierarchy_For_All_Packages"); +- h2End(); +- centerEnd(); ++ protected Content getTreeHeader() { ++ String title = configuration.getText("doclet.Window_Class_Hierarchy"); ++ Content bodyTree = getBody(true, getWindowTitle(title)); ++ addTop(bodyTree); ++ addNavLinks(true, bodyTree); ++ return bodyTree; + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java +@@ -0,0 +1,90 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.doclets.formats.html.markup; ++ ++import com.sun.tools.doclets.internal.toolkit.Content; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++ ++/** ++ * Class for generating a comment for HTML pages of javadoc output. ++ * ++ * @author Bhavesh Patel ++ */ ++public class Comment extends Content{ ++ ++ private String commentText; ++ ++ /** ++ * Constructor to construct a Comment object. ++ * ++ * @param comment comment text for the comment ++ */ ++ public Comment(String comment) { ++ commentText = nullCheck(comment); ++ } ++ ++ /** ++ * This method is not supported by the class. ++ * ++ * @param content content that needs to be added ++ * @throws DocletAbortException this method will always throw a ++ * DocletAbortException because it ++ * is not supported. ++ */ ++ public void addContent(Content content) { ++ throw new DocletAbortException(); ++ } ++ ++ /** ++ * This method is not supported by the class. ++ * ++ * @param stringContent string content that needs to be added ++ * @throws DocletAbortException this method will always throw a ++ * DocletAbortException because it ++ * is not supported. ++ */ ++ public void addContent(String stringContent) { ++ throw new DocletAbortException(); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public boolean isEmpty() { ++ return commentText.isEmpty(); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void write(StringBuilder contentBuilder) { ++ if (!endsWithNewLine(contentBuilder)) ++ contentBuilder.append("\n"); ++ contentBuilder.append("<!-- "); ++ contentBuilder.append(commentText); ++ contentBuilder.append(" -->\n"); ++ } ++} +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java +@@ -0,0 +1,113 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.doclets.formats.html.markup; ++ ++import com.sun.tools.doclets.internal.toolkit.Content; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++ ++/** ++ * Class for generating document type for HTML pages of javadoc output. ++ * ++ * @author Bhavesh Patel ++ */ ++public class DocType extends Content{ ++ ++ private String docType; ++ ++ private static DocType transitional; ++ ++ private static DocType frameset; ++ ++ /** ++ * Constructor to construct a DocType object. ++ * ++ * @param type the doctype to be added ++ */ ++ private DocType(String type, String dtd) { ++ docType = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 " + type + ++ "//EN\" \"" + dtd + "\">\n"; ++ } ++ ++ /** ++ * Construct and return a HTML 4.01 transitional DocType content ++ * ++ * @return a content tree for transitional DocType ++ */ ++ public static DocType Transitional() { ++ if (transitional == null) ++ transitional = new DocType("Transitional", "http://www.w3.org/TR/html4/loose.dtd"); ++ return transitional; ++ } ++ ++ /** ++ * Construct and return a HTML 4.01 frameset DocType content ++ * ++ * @return a content tree for frameset DocType ++ */ ++ public static DocType Frameset() { ++ if (frameset == null) ++ frameset = new DocType("Frameset", "http://www.w3.org/TR/html4/frameset.dtd"); ++ return frameset; ++ } ++ ++ /** ++ * This method is not supported by the class. ++ * ++ * @param content content that needs to be added ++ * @throws DocletAbortException this method will always throw a ++ * DocletAbortException because it ++ * is not supported. ++ */ ++ public void addContent(Content content) { ++ throw new DocletAbortException(); ++ } ++ ++ /** ++ * This method is not supported by the class. ++ * ++ * @param stringContent string content that needs to be added ++ * @throws DocletAbortException this method will always throw a ++ * DocletAbortException because it ++ * is not supported. ++ */ ++ public void addContent(String stringContent) { ++ throw new DocletAbortException(); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public boolean isEmpty() { ++ return (docType.length() == 0); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void write(StringBuilder contentBuilder) { ++ contentBuilder.append(docType); ++ } ++} +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java +@@ -0,0 +1,73 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.doclets.formats.html.markup; ++ ++/** ++ * Enum representing HTML tag attributes. ++ * ++ * @author Bhavesh Patel ++ */ ++public enum HtmlAttr { ++ ALT, ++ BORDER, ++ CELLPADDING, ++ CELLSPACING, ++ CHARSET, ++ CLASS, ++ CLEAR, ++ COLS, ++ CONTENT, ++ HREF, ++ HTTP_EQUIV("http-equiv"), ++ ID, ++ LANG, ++ NAME, ++ ONLOAD, ++ REL, ++ ROWS, ++ SCOPE, ++ SCROLLING, ++ SRC, ++ SUMMARY, ++ TARGET, ++ TITLE, ++ TYPE, ++ WIDTH; ++ ++ private final String value; ++ ++ HtmlAttr() { ++ this.value = name().toLowerCase(); ++ } ++ ++ HtmlAttr(String name) { ++ this.value = name; ++ } ++ ++ public String toString() { ++ return value; ++ } ++} +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java +@@ -0,0 +1,189 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.doclets.formats.html.markup; ++ ++import com.sun.tools.doclets.internal.toolkit.Content; ++ ++/** ++ * Stores constants for Html Doclet. ++ * ++ * @author Bhavesh Patel ++ */ ++public class HtmlConstants { ++ ++ /** ++ * Marker to identify start of top navigation bar. ++ */ ++ public static final Content START_OF_TOP_NAVBAR = ++ new Comment("========= START OF TOP NAVBAR ======="); ++ ++ /** ++ * Marker to identify start of bottom navigation bar. ++ */ ++ public static final Content START_OF_BOTTOM_NAVBAR = ++ new Comment("======= START OF BOTTOM NAVBAR ======"); ++ ++ /** ++ * Marker to identify end of top navigation bar. ++ */ ++ public static final Content END_OF_TOP_NAVBAR = ++ new Comment("========= END OF TOP NAVBAR ========="); ++ ++ /** ++ * Marker to identify end of bottom navigation bar. ++ */ ++ public static final Content END_OF_BOTTOM_NAVBAR = ++ new Comment("======== END OF BOTTOM NAVBAR ======="); ++ ++ /** ++ * Marker to identify start of class data. ++ */ ++ public static final Content START_OF_CLASS_DATA = ++ new Comment("======== START OF CLASS DATA ========"); ++ ++ /** ++ * Marker to identify end of class data. ++ */ ++ public static final Content END_OF_CLASS_DATA = ++ new Comment("========= END OF CLASS DATA ========="); ++ ++ /** ++ * Marker to identify start of nested class summary. ++ */ ++ public static final Content START_OF_NESTED_CLASS_SUMMARY = ++ new Comment("======== NESTED CLASS SUMMARY ========"); ++ ++ /** ++ * Marker to identify start of annotation type optional member summary. ++ */ ++ public static final Content START_OF_ANNOTATION_TYPE_OPTIONAL_MEMBER_SUMMARY = ++ new Comment("=========== ANNOTATION TYPE OPTIONAL MEMBER SUMMARY ==========="); ++ ++ /** ++ * Marker to identify start of annotation type required member summary. ++ */ ++ public static final Content START_OF_ANNOTATION_TYPE_REQUIRED_MEMBER_SUMMARY = ++ new Comment("=========== ANNOTATION TYPE REQUIRED MEMBER SUMMARY ==========="); ++ ++ /** ++ * Marker to identify start of constructor summary. ++ */ ++ public static final Content START_OF_CONSTRUCTOR_SUMMARY = ++ new Comment("======== CONSTRUCTOR SUMMARY ========"); ++ ++ /** ++ * Marker to identify start of enum constants summary. ++ */ ++ public static final Content START_OF_ENUM_CONSTANT_SUMMARY = ++ new Comment("=========== ENUM CONSTANT SUMMARY ==========="); ++ ++ /** ++ * Marker to identify start of field summary. ++ */ ++ public static final Content START_OF_FIELD_SUMMARY = ++ new Comment("=========== FIELD SUMMARY ==========="); ++ ++ /** ++ * Marker to identify start of method summary. ++ */ ++ public static final Content START_OF_METHOD_SUMMARY = ++ new Comment("========== METHOD SUMMARY ==========="); ++ ++ /** ++ * Marker to identify start of annotation type details. ++ */ ++ public static final Content START_OF_ANNOTATION_TYPE_DETAILS = ++ new Comment("============ ANNOTATION TYPE MEMBER DETAIL ==========="); ++ ++ /** ++ * Marker to identify start of method details. ++ */ ++ public static final Content START_OF_METHOD_DETAILS = ++ new Comment("============ METHOD DETAIL =========="); ++ ++ /** ++ * Marker to identify start of field details. ++ */ ++ public static final Content START_OF_FIELD_DETAILS = ++ new Comment("============ FIELD DETAIL ==========="); ++ ++ /** ++ * Marker to identify start of constructor details. ++ */ ++ public static final Content START_OF_CONSTRUCTOR_DETAILS = ++ new Comment("========= CONSTRUCTOR DETAIL ========"); ++ ++ /** ++ * Marker to identify start of enum constants details. ++ */ ++ public static final Content START_OF_ENUM_CONSTANT_DETAILS = ++ new Comment("============ ENUM CONSTANT DETAIL ==========="); ++ ++ /** ++ * Html tag for the page title heading. ++ */ ++ public static final HtmlTag TITLE_HEADING = HtmlTag.H1; ++ ++ /** ++ * Html tag for the class page title heading. ++ */ ++ public static final HtmlTag CLASS_PAGE_HEADING = HtmlTag.H2; ++ ++ /** ++ * Html tag for the content heading. ++ */ ++ public static final HtmlTag CONTENT_HEADING = HtmlTag.H2; ++ ++ /** ++ * Html tag for the package name heading. ++ */ ++ public static final HtmlTag PACKAGE_HEADING = HtmlTag.H2; ++ ++ /** ++ * Html tag for the member summary heading. ++ */ ++ public static final HtmlTag SUMMARY_HEADING = HtmlTag.H3; ++ ++ /** ++ * Html tag for the inherited member summary heading. ++ */ ++ public static final HtmlTag INHERITED_SUMMARY_HEADING = HtmlTag.H3; ++ ++ /** ++ * Html tag for the member details heading. ++ */ ++ public static final HtmlTag DETAILS_HEADING = HtmlTag.H3; ++ ++ /** ++ * Html tag for the serialized member heading. ++ */ ++ public static final HtmlTag SERIALIZED_MEMBER_HEADING = HtmlTag.H3; ++ ++ /** ++ * Html tag for the member heading. ++ */ ++ public static final HtmlTag MEMBER_HEADING = HtmlTag.H4; ++} +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.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/HtmlDocWriter.java +@@ -87,7 +87,7 @@ + */ + public void printHyperLink(String link, String where, + String label, boolean strong) { +- print(getHyperLink(link, where, label, strong, "", "", "")); ++ print(getHyperLinkString(link, where, label, strong, "", "", "")); + } + + /** +@@ -115,7 +115,7 @@ + public void printHyperLink(String link, String where, + String label, boolean strong, + String stylename) { +- print(getHyperLink(link, where, label, strong, stylename, "", "")); ++ print(getHyperLinkString(link, where, label, strong, stylename, "", "")); + } + + /** +@@ -128,9 +128,9 @@ + * @param strong Boolean that sets label to strong. + * @return String Hyper Link. + */ +- public String getHyperLink(String link, String where, ++ public String getHyperLinkString(String link, String where, + String label, boolean strong) { +- return getHyperLink(link, where, label, strong, "", "", ""); ++ return getHyperLinkString(link, where, label, strong, "", "", ""); + } + + /** +@@ -144,10 +144,24 @@ + * @param stylename String style of text defined in style sheet. + * @return String Hyper Link. + */ +- public String getHyperLink(String link, String where, ++ public String getHyperLinkString(String link, String where, + String label, boolean strong, + String stylename) { +- return getHyperLink(link, where, label, strong, stylename, "", ""); ++ return getHyperLinkString(link, where, label, strong, stylename, "", ""); ++ } ++ ++ /** ++ * Get Html Hyper Link string. ++ * ++ * @param link String name of the file. ++ * @param where Position of the link in the file. Character '#' is not ++ * needed. ++ * @param label Tag for the link. ++ * @return a content tree for the hyper link ++ */ ++ public Content getHyperLink(String link, String where, ++ Content label) { ++ return getHyperLink(link, where, label, "", ""); + } + + /** +@@ -163,11 +177,11 @@ + * @param target Target frame. + * @return String Hyper Link. + */ +- public String getHyperLink(String link, String where, ++ public String getHyperLinkString(String link, String where, + String label, boolean strong, + String stylename, String title, String target) { + StringBuffer retlink = new StringBuffer(); +- retlink.append("<A HREF=\""); ++ retlink.append("<a href=\""); + retlink.append(link); + if (where != null && where.length() != 0) { + retlink.append("#"); +@@ -187,27 +201,54 @@ + retlink.append("\">"); + } + if (strong) { +- retlink.append("<STRONG>"); ++ retlink.append("<span class=\"strong\">"); + } + retlink.append(label); + if (strong) { +- retlink.append("</STRONG>"); ++ retlink.append("</span>"); + } + if (stylename != null && stylename.length() != 0) { + retlink.append("</FONT>"); + } +- retlink.append("</A>"); ++ retlink.append("</a>"); + return retlink.toString(); + } + + /** +- * Print link without positioning in the file. ++ * Get Html Hyper Link. + * + * @param link String name of the file. ++ * @param where Position of the link in the file. Character '#' is not ++ * needed. + * @param label Tag for the link. ++ * @param title String that describes the link's content for accessibility. ++ * @param target Target frame. ++ * @return a content tree for the hyper link. + */ +- public void printHyperLink(String link, String label) { +- print(getHyperLink(link, "", label, false)); ++ public Content getHyperLink(String link, String where, ++ Content label, String title, String target) { ++ if (where != null && where.length() != 0) { ++ link += "#" + where; ++ } ++ HtmlTree anchor = HtmlTree.A(link, label); ++ if (title != null && title.length() != 0) { ++ anchor.addAttr(HtmlAttr.TITLE, title); ++ } ++ if (target != null && target.length() != 0) { ++ anchor.addAttr(HtmlAttr.TARGET, target); ++ } ++ return anchor; ++ } ++ ++ /** ++ * Get a hyperlink to a file. ++ * ++ * @param link String name of the file ++ * @param label Label for the link ++ * @return a content for the hyperlink to the file ++ */ ++ public Content getHyperLink(String link, Content label) { ++ return getHyperLink(link, "", label); + } + + /** +@@ -217,8 +258,8 @@ + * @param label Tag for the link. + * @return Strign Hyper link. + */ +- public String getHyperLink(String link, String label) { +- return getHyperLink(link, "", label, false); ++ public String getHyperLinkString(String link, String label) { ++ return getHyperLinkString(link, "", label, false); + } + + /** +@@ -273,54 +314,32 @@ + * Print the frameset version of the Html file header. + * Called only when generating an HTML frameset file. + * +- * @param title Title of this HTML document. ++ * @param title Title of this HTML document ++ * @param noTimeStamp If true, don't print time stamp in header ++ * @param frameset the frameset to be added to the HTML document + */ +- public void printFramesetHeader(String title) { +- printFramesetHeader(title, false); +- } +- +- /** +- * Print the frameset version of the Html file header. +- * Called only when generating an HTML frameset file. +- * +- * @param title Title of this HTML document. +- * @param noTimeStamp If true, don't print time stamp in header. +- */ +- public void printFramesetHeader(String title, boolean noTimeStamp) { +- println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 " + +- "Frameset//EN\" " + +- "\"http://www.w3.org/TR/html4/frameset.dtd\">"); +- println("<!--NewPage-->"); +- html(); +- head(); ++ public void printFramesetDocument(String title, boolean noTimeStamp, ++ Content frameset) { ++ Content htmlDocType = DocType.Frameset(); ++ Content htmlComment = new Comment(configuration.getText("doclet.New_Page")); ++ Content head = new HtmlTree(HtmlTag.HEAD); + if (! noTimeStamp) { +- print("<!-- Generated by javadoc on "); +- print(today()); +- println("-->"); ++ Content headComment = new Comment("Generated by javadoc on " + today()); ++ head.addContent(headComment); + } + if (configuration.charset.length() > 0) { +- println("<META http-equiv=\"Content-Type\" content=\"text/html; " +- + "charset=" + configuration.charset + "\">"); ++ Content meta = HtmlTree.META("Content-Type", "text/html", ++ configuration.charset); ++ head.addContent(meta); + } +- title(); +- println(title); +- titleEnd(); +- //Script to set the classFrame if necessary. +- script(); +- println(" targetPage = \"\" + window.location.search;"); +- println(" if (targetPage != \"\" && targetPage != \"undefined\")"); +- println(" targetPage = targetPage.substring(1);"); +- println(" if (targetPage.indexOf(\":\") != -1)"); +- println(" targetPage = \"undefined\";"); +- +- println(" function loadFrames() {"); +- println(" if (targetPage != \"\" && targetPage != \"undefined\")"); +- println(" top.classFrame.location = top.targetPage;"); +- println(" }"); +- scriptEnd(); +- noScript(); +- noScriptEnd(); +- headEnd(); ++ Content windowTitle = HtmlTree.TITLE(new StringContent(title)); ++ head.addContent(windowTitle); ++ head.addContent(getFramesetJavaScript()); ++ Content htmlTree = HtmlTree.HTML(configuration.getLocale().getLanguage(), ++ head, frameset); ++ Content htmlDocument = new HtmlDocument(htmlDocType, ++ htmlComment, htmlTree); ++ print(htmlDocument.toString()); + } + + /** +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java +@@ -0,0 +1,103 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.doclets.formats.html.markup; ++ ++import java.util.*; ++import com.sun.tools.doclets.internal.toolkit.Content; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++ ++/** ++ * Class for generating an HTML document for javadoc output. ++ * ++ * @author Bhavesh Patel ++ */ ++public class HtmlDocument extends Content { ++ ++ private List<Content> docContent = Collections.<Content>emptyList(); ++ ++ /** ++ * Constructor to construct an HTML document. ++ * ++ * @param docType document type for the HTML document ++ * @param docComment comment for the document ++ * @param htmlTree HTML tree of the document ++ */ ++ public HtmlDocument(Content docType, Content docComment, Content htmlTree) { ++ docContent = new ArrayList<Content>(); ++ addContent(nullCheck(docType)); ++ addContent(nullCheck(docComment)); ++ addContent(nullCheck(htmlTree)); ++ } ++ ++ /** ++ * Constructor to construct an HTML document. ++ * ++ * @param docType document type for the HTML document ++ * @param htmlTree HTML tree of the document ++ */ ++ public HtmlDocument(Content docType, Content htmlTree) { ++ docContent = new ArrayList<Content>(); ++ addContent(nullCheck(docType)); ++ addContent(nullCheck(htmlTree)); ++ } ++ ++ /** ++ * Adds content for the HTML document. ++ * ++ * @param htmlContent html content to be added ++ */ ++ public void addContent(Content htmlContent) { ++ if (htmlContent.isValid()) ++ docContent.add(htmlContent); ++ } ++ ++ /** ++ * This method is not supported by the class. ++ * ++ * @param stringContent string content that needs to be added ++ * @throws DocletAbortException this method will always throw a ++ * DocletAbortException because it ++ * is not supported. ++ */ ++ public void addContent(String stringContent) { ++ throw new DocletAbortException(); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public boolean isEmpty() { ++ return (docContent.isEmpty()); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void write(StringBuilder contentBuilder) { ++ for (Content c : docContent) ++ c.write(contentBuilder); ++ } ++} +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlStyle.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlStyle.java +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlStyle.java +@@ -0,0 +1,73 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.doclets.formats.html.markup; ++ ++/** ++ * Enum representing HTML styles. The name map to values in the CSS file. ++ * ++ * @author Bhavesh Patel ++ */ ++public enum HtmlStyle { ++ aboutLanguage, ++ altColor, ++ bar, ++ block, ++ blockList, ++ blockListLast, ++ bottomNav, ++ classUseContainer, ++ colFirst, ++ colLast, ++ colOne, ++ constantValuesContainer, ++ contentContainer, ++ description, ++ details, ++ header, ++ horizontal, ++ footer, ++ indexContainer, ++ indexHeader, ++ inheritance, ++ legalCopy, ++ nameValue, ++ navBarCell1Rev, ++ navList, ++ overviewSummary, ++ packageSummary, ++ rowColor, ++ serializedFormContainer, ++ sourceContainer, ++ sourceLineNo, ++ strong, ++ subNav, ++ subNavList, ++ subTitle, ++ summary, ++ tabEnd, ++ title, ++ topNav; ++} +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java +@@ -0,0 +1,126 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.doclets.formats.html.markup; ++ ++/** ++ * Enum representing HTML tags. ++ * ++ * @author Bhavesh Patel ++ */ ++public enum HtmlTag { ++ A(BlockType.INLINE, EndTag.END), ++ BLOCKQUOTE, ++ BODY(BlockType.OTHER, EndTag.END), ++ BR(BlockType.INLINE, EndTag.NOEND), ++ CAPTION, ++ CENTER, ++ CODE(BlockType.INLINE, EndTag.END), ++ DD, ++ DIV, ++ DL, ++ DT, ++ EM(BlockType.INLINE, EndTag.END), ++ FONT(BlockType.INLINE, EndTag.END), ++ FRAME(BlockType.OTHER, EndTag.NOEND), ++ FRAMESET(BlockType.OTHER, EndTag.END), ++ H1, ++ H2, ++ H3, ++ H4, ++ H5, ++ H6, ++ HEAD(BlockType.OTHER, EndTag.END), ++ HR(BlockType.BLOCK, EndTag.NOEND), ++ HTML(BlockType.OTHER, EndTag.END), ++ I(BlockType.INLINE, EndTag.END), ++ IMG(BlockType.INLINE, EndTag.NOEND), ++ LI, ++ LINK(BlockType.OTHER, EndTag.NOEND), ++ MENU, ++ META(BlockType.OTHER, EndTag.NOEND), ++ NOFRAMES(BlockType.OTHER, EndTag.END), ++ NOSCRIPT(BlockType.OTHER, EndTag.END), ++ OL, ++ P, ++ PRE, ++ SCRIPT(BlockType.OTHER, EndTag.END), ++ SMALL(BlockType.INLINE, EndTag.END), ++ SPAN(BlockType.INLINE, EndTag.END), ++ STRONG(BlockType.INLINE, EndTag.END), ++ TABLE, ++ TBODY, ++ TD, ++ TH, ++ TITLE(BlockType.OTHER, EndTag.END), ++ TR, ++ TT(BlockType.INLINE, EndTag.END), ++ UL; ++ ++ protected final BlockType blockType; ++ protected final EndTag endTag; ++ private final String value; ++ ++ /** ++ * Enum representing the type of HTML element. ++ */ ++ protected static enum BlockType { ++ BLOCK, ++ INLINE, ++ OTHER; ++ } ++ ++ /** ++ * Enum representing HTML end tag requirement. ++ */ ++ protected static enum EndTag { ++ END, ++ NOEND; ++ } ++ ++ HtmlTag() { ++ this(BlockType.BLOCK, EndTag.END); ++ } ++ ++ HtmlTag(BlockType blockType, EndTag endTag ) { ++ this.blockType = blockType; ++ this.endTag = endTag; ++ this.value = name().toLowerCase(); ++ } ++ ++ /** ++ * Returns true if the end tag is required. This is specific to the standard ++ * doclet and does not exactly resemble the W3C specifications. ++ * ++ * @return true if end tag needs to be displayed else return false ++ */ ++ public boolean endTagRequired() { ++ return (endTag == EndTag.END); ++ } ++ ++ public String toString() { ++ return value; ++ } ++} +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java +@@ -0,0 +1,777 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.doclets.formats.html.markup; ++ ++import java.util.*; ++import com.sun.tools.doclets.internal.toolkit.Content; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++ ++/** ++ * Class for generating HTML tree for javadoc output. ++ * ++ * @author Bhavesh Patel ++ */ ++public class HtmlTree extends Content { ++ ++ private HtmlTag htmlTag; ++ private Map<HtmlAttr,String> attrs = Collections.<HtmlAttr,String>emptyMap(); ++ private List<Content> content = Collections.<Content>emptyList(); ++ public static final Content EMPTY = new StringContent(""); ++ ++ /** ++ * Constructor to construct HtmlTree object. ++ * ++ * @param tag HTML tag for the HtmlTree object ++ */ ++ public HtmlTree(HtmlTag tag) { ++ htmlTag = nullCheck(tag); ++ } ++ ++ /** ++ * Constructor to construct HtmlTree object. ++ * ++ * @param tag HTML tag for the HtmlTree object ++ * @param contents contents to be added to the tree ++ */ ++ public HtmlTree(HtmlTag tag, Content... contents) { ++ this(tag); ++ for (Content content: contents) ++ addContent(content); ++ } ++ ++ /** ++ * Adds an attribute for the HTML tag. ++ * ++ * @param attrName name of the attribute ++ * @param attrValue value of the attribute ++ */ ++ public void addAttr(HtmlAttr attrName, String attrValue) { ++ if (attrs.isEmpty()) ++ attrs = new LinkedHashMap<HtmlAttr,String>(); ++ attrs.put(nullCheck(attrName), nullCheck(attrValue)); ++ } ++ ++ /** ++ * Adds a style for the HTML tag. ++ * ++ * @param style style to be added ++ */ ++ public void addStyle(HtmlStyle style) { ++ addAttr(HtmlAttr.CLASS, style.toString()); ++ } ++ ++ /** ++ * Adds content for the HTML tag. ++ * ++ * @param tagContent tag content to be added ++ */ ++ public void addContent(Content tagContent) { ++ if (tagContent == HtmlTree.EMPTY || tagContent.isValid()) { ++ if (content.isEmpty()) ++ content = new ArrayList<Content>(); ++ content.add(tagContent); ++ } ++ } ++ ++ /** ++ * This method adds a string content to the htmltree. If the last content member ++ * added is a StringContent, append the string to that StringContent or else ++ * create a new StringContent and add it to the html tree. ++ * ++ * @param stringContent string content that needs to be added ++ */ ++ public void addContent(String stringContent) { ++ if (!content.isEmpty()) { ++ Content lastContent = content.get(content.size() - 1); ++ if (lastContent instanceof StringContent) ++ lastContent.addContent(stringContent); ++ else ++ addContent(new StringContent(stringContent)); ++ } ++ else ++ addContent(new StringContent(stringContent)); ++ } ++ ++ /** ++ * Generates an HTML anchor tag. ++ * ++ * @param ref reference url for the anchor tag ++ * @param body content for the anchor tag ++ * @return an HtmlTree object ++ */ ++ public static HtmlTree A(String ref, Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.A, nullCheck(body)); ++ htmltree.addAttr(HtmlAttr.HREF, nullCheck(ref)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates an HTML anchor tag with name attribute and content. ++ * ++ * @param name name for the anchor tag ++ * @param body content for the anchor tag ++ * @return an HtmlTree object ++ */ ++ public static HtmlTree A_NAME(String name, Content body) { ++ HtmlTree htmltree = HtmlTree.A_NAME(name); ++ htmltree.addContent(nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates an HTML anchor tag with name attribute. ++ * ++ * @param name name for the anchor tag ++ * @return an HtmlTree object ++ */ ++ public static HtmlTree A_NAME(String name) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.A); ++ htmltree.addAttr(HtmlAttr.NAME, nullCheck(name)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a CAPTION tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the CAPTION tag ++ */ ++ public static HtmlTree CAPTION(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.CAPTION, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a CODE tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the CODE tag ++ */ ++ public static HtmlTree CODE(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.CODE, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a DD tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the DD tag ++ */ ++ public static HtmlTree DD(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.DD, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a DL tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the DL tag ++ */ ++ public static HtmlTree DL(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.DL, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a DIV tag with the style class attributes. It also encloses ++ * a content. ++ * ++ * @param styleClass stylesheet class for the tag ++ * @param body content for the tag ++ * @return an HtmlTree object for the DIV tag ++ */ ++ public static HtmlTree DIV(HtmlStyle styleClass, Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.DIV, nullCheck(body)); ++ if (styleClass != null) ++ htmltree.addStyle(styleClass); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a DIV tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the DIV tag ++ */ ++ public static HtmlTree DIV(Content body) { ++ return DIV(null, body); ++ } ++ ++ /** ++ * Generates a DT tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the DT tag ++ */ ++ public static HtmlTree DT(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.DT, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a EM tag with some content. ++ * ++ * @param body content to be added to the tag ++ * @return an HtmlTree object for the EM tag ++ */ ++ public static HtmlTree EM(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.EM, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a FRAME tag. ++ * ++ * @param src the url of the document to be shown in the frame ++ * @param name specifies the name of the frame ++ * @param title the title for the frame ++ * @param scrolling specifies whether to display scrollbars in the frame ++ * @return an HtmlTree object for the FRAME tag ++ */ ++ public static HtmlTree FRAME(String src, String name, String title, String scrolling) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.FRAME); ++ htmltree.addAttr(HtmlAttr.SRC, nullCheck(src)); ++ htmltree.addAttr(HtmlAttr.NAME, nullCheck(name)); ++ htmltree.addAttr(HtmlAttr.TITLE, nullCheck(title)); ++ if (scrolling != null) ++ htmltree.addAttr(HtmlAttr.SCROLLING, scrolling); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a Frame tag. ++ * ++ * @param src the url of the document to be shown in the frame ++ * @param name specifies the name of the frame ++ * @param title the title for the frame ++ * @return an HtmlTree object for the SPAN tag ++ */ ++ public static HtmlTree FRAME(String src, String name, String title) { ++ return FRAME(src, name, title, null); ++ } ++ ++ /** ++ * Generates a FRAMESET tag. ++ * ++ * @param cols the size of columns in the frameset ++ * @param rows the size of rows in the frameset ++ * @param title the title for the frameset ++ * @param onload the script to run when the document loads ++ * @return an HtmlTree object for the FRAMESET tag ++ */ ++ public static HtmlTree FRAMESET(String cols, String rows, String title, String onload) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.FRAMESET); ++ if (cols != null) ++ htmltree.addAttr(HtmlAttr.COLS, cols); ++ if (rows != null) ++ htmltree.addAttr(HtmlAttr.ROWS, rows); ++ htmltree.addAttr(HtmlAttr.TITLE, nullCheck(title)); ++ htmltree.addAttr(HtmlAttr.ONLOAD, nullCheck(onload)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a heading tag (h1 to h6) with the title and style class attributes. It also encloses ++ * a content. ++ * ++ * @param headingTag the heading tag to be generated ++ * @param printTitle true if title for the tag needs to be printed else false ++ * @param styleClass stylesheet class for the tag ++ * @param body content for the tag ++ * @return an HtmlTree object for the tag ++ */ ++ public static HtmlTree HEADING(HtmlTag headingTag, boolean printTitle, ++ HtmlStyle styleClass, Content body) { ++ HtmlTree htmltree = new HtmlTree(headingTag, nullCheck(body)); ++ if (printTitle) ++ htmltree.addAttr(HtmlAttr.TITLE, Util.stripHtml(body.toString())); ++ if (styleClass != null) ++ htmltree.addStyle(styleClass); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a heading tag (h1 to h6) with style class attribute. It also encloses ++ * a content. ++ * ++ * @param headingTag the heading tag to be generated ++ * @param styleClass stylesheet class for the tag ++ * @param body content for the tag ++ * @return an HtmlTree object for the tag ++ */ ++ public static HtmlTree HEADING(HtmlTag headingTag, HtmlStyle styleClass, Content body) { ++ return HEADING(headingTag, false, styleClass, body); ++ } ++ ++ /** ++ * Generates a heading tag (h1 to h6) with the title attribute. It also encloses ++ * a content. ++ * ++ * @param headingTag the heading tag to be generated ++ * @param printTitle true if the title for the tag needs to be printed else false ++ * @param body content for the tag ++ * @return an HtmlTree object for the tag ++ */ ++ public static HtmlTree HEADING(HtmlTag headingTag, boolean printTitle, Content body) { ++ return HEADING(headingTag, printTitle, null, body); ++ } ++ ++ /** ++ * Generates a heading tag (h1 to h6) with some content. ++ * ++ * @param headingTag the heading tag to be generated ++ * @param body content for the tag ++ * @return an HtmlTree object for the tag ++ */ ++ public static HtmlTree HEADING(HtmlTag headingTag, Content body) { ++ return HEADING(headingTag, false, null, body); ++ } ++ ++ /** ++ * Generates an HTML tag with lang attribute. It also adds head and body ++ * content to the HTML tree. ++ * ++ * @param lang language for the HTML document ++ * @param head head for the HTML tag ++ * @param body body for the HTML tag ++ * @return an HtmlTree object for the HTML tag ++ */ ++ public static HtmlTree HTML(String lang, Content head, Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.HTML, nullCheck(head), nullCheck(body)); ++ htmltree.addAttr(HtmlAttr.LANG, nullCheck(lang)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a I tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the I tag ++ */ ++ public static HtmlTree I(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.I, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a LI tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the LI tag ++ */ ++ public static HtmlTree LI(Content body) { ++ return LI(null, body); ++ } ++ ++ /** ++ * Generates a LI tag with some content. ++ * ++ * @param styleClass style for the tag ++ * @param body content for the tag ++ * @return an HtmlTree object for the LI tag ++ */ ++ public static HtmlTree LI(HtmlStyle styleClass, Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.LI, nullCheck(body)); ++ if (styleClass != null) ++ htmltree.addStyle(styleClass); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a LINK tag with the rel, type, href and title attributes. ++ * ++ * @param rel relevance of the link ++ * @param type type of link ++ * @param href the path for the link ++ * @param title title for the link ++ * @return an HtmlTree object for the LINK tag ++ */ ++ public static HtmlTree LINK(String rel, String type, String href, String title) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.LINK); ++ htmltree.addAttr(HtmlAttr.REL, nullCheck(rel)); ++ htmltree.addAttr(HtmlAttr.TYPE, nullCheck(type)); ++ htmltree.addAttr(HtmlAttr.HREF, nullCheck(href)); ++ htmltree.addAttr(HtmlAttr.TITLE, nullCheck(title)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a META tag with the http-equiv, content and charset attributes. ++ * ++ * @param http-equiv http equiv attribute for the META tag ++ * @param content type of content ++ * @param charset character set used ++ * @return an HtmlTree object for the META tag ++ */ ++ public static HtmlTree META(String httpEquiv, String content, String charSet) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.META); ++ htmltree.addAttr(HtmlAttr.HTTP_EQUIV, nullCheck(httpEquiv)); ++ htmltree.addAttr(HtmlAttr.CONTENT, nullCheck(content)); ++ htmltree.addAttr(HtmlAttr.CHARSET, nullCheck(charSet)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a META tag with the name and content attributes. ++ * ++ * @param name name attribute ++ * @param content type of content ++ * @return an HtmlTree object for the META tag ++ */ ++ public static HtmlTree META(String name, String content) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.META); ++ htmltree.addAttr(HtmlAttr.NAME, nullCheck(name)); ++ htmltree.addAttr(HtmlAttr.CONTENT, nullCheck(content)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a NOSCRIPT tag with some content. ++ * ++ * @param body content of the noscript tag ++ * @return an HtmlTree object for the NOSCRIPT tag ++ */ ++ public static HtmlTree NOSCRIPT(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.NOSCRIPT, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a P tag with some content. ++ * ++ * @param body content of the Paragraph tag ++ * @return an HtmlTree object for the P tag ++ */ ++ public static HtmlTree P(Content body) { ++ return P(null, body); ++ } ++ ++ /** ++ * Generates a P tag with some content. ++ * ++ * @param styleClass style of the Paragraph tag ++ * @param body content of the Paragraph tag ++ * @return an HtmlTree object for the P tag ++ */ ++ public static HtmlTree P(HtmlStyle styleClass, Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.P, nullCheck(body)); ++ if (styleClass != null) ++ htmltree.addStyle(styleClass); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a SMALL tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the SMALL tag ++ */ ++ public static HtmlTree SMALL(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.SMALL, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a STRONG tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the STRONG tag ++ */ ++ public static HtmlTree STRONG(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.STRONG, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a SPAN tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the SPAN tag ++ */ ++ public static HtmlTree SPAN(Content body) { ++ return SPAN(null, body); ++ } ++ ++ /** ++ * Generates a SPAN tag with style class attribute and some content. ++ * ++ * @param styleClass style class for the tag ++ * @param body content for the tag ++ * @return an HtmlTree object for the SPAN tag ++ */ ++ public static HtmlTree SPAN(HtmlStyle styleClass, Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.SPAN, nullCheck(body)); ++ if (styleClass != null) ++ htmltree.addStyle(styleClass); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a Table tag with border, width and summary attributes and ++ * some content. ++ * ++ * @param border border for the table ++ * @param width width of the table ++ * @param summary summary for the table ++ * @param body content for the table ++ * @return an HtmlTree object for the TABLE tag ++ */ ++ public static HtmlTree TABLE(int border, int width, String summary, ++ Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.TABLE, nullCheck(body)); ++ htmltree.addAttr(HtmlAttr.BORDER, Integer.toString(border)); ++ htmltree.addAttr(HtmlAttr.WIDTH, Integer.toString(width)); ++ htmltree.addAttr(HtmlAttr.SUMMARY, nullCheck(summary)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a Table tag with style class, border, cell padding, ++ * cellspacing and summary attributes and some content. ++ * ++ * @param styleClass style of the table ++ * @param border border for the table ++ * @param cellPadding cell padding for the table ++ * @param cellSpacing cell spacing for the table ++ * @param summary summary for the table ++ * @param body content for the table ++ * @return an HtmlTree object for the TABLE tag ++ */ ++ public static HtmlTree TABLE(HtmlStyle styleClass, int border, int cellPadding, ++ int cellSpacing, String summary, Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.TABLE, nullCheck(body)); ++ if (styleClass != null) ++ htmltree.addStyle(styleClass); ++ htmltree.addAttr(HtmlAttr.BORDER, Integer.toString(border)); ++ htmltree.addAttr(HtmlAttr.CELLPADDING, Integer.toString(cellPadding)); ++ htmltree.addAttr(HtmlAttr.CELLSPACING, Integer.toString(cellSpacing)); ++ htmltree.addAttr(HtmlAttr.SUMMARY, nullCheck(summary)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a Table tag with border, cell padding, ++ * cellspacing and summary attributes and some content. ++ * ++ * @param border border for the table ++ * @param cellPadding cell padding for the table ++ * @param cellSpacing cell spacing for the table ++ * @param summary summary for the table ++ * @param body content for the table ++ * @return an HtmlTree object for the TABLE tag ++ */ ++ public static HtmlTree TABLE(int border, int cellPadding, ++ int cellSpacing, String summary, Content body) { ++ return TABLE(null, border, cellPadding, cellSpacing, summary, body); ++ } ++ ++ /** ++ * Generates a TD tag with style class attribute and some content. ++ * ++ * @param styleClass style for the tag ++ * @param body content for the tag ++ * @return an HtmlTree object for the TD tag ++ */ ++ public static HtmlTree TD(HtmlStyle styleClass, Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.TD, nullCheck(body)); ++ if (styleClass != null) ++ htmltree.addStyle(styleClass); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a TD tag for an HTML table with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the TD tag ++ */ ++ public static HtmlTree TD(Content body) { ++ return TD(null, body); ++ } ++ ++ /** ++ * Generates a TH tag with style class and scope attributes and some content. ++ * ++ * @param styleClass style for the tag ++ * @param scope scope of the tag ++ * @param body content for the tag ++ * @return an HtmlTree object for the TH tag ++ */ ++ public static HtmlTree TH(HtmlStyle styleClass, String scope, Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.TH, nullCheck(body)); ++ if (styleClass != null) ++ htmltree.addStyle(styleClass); ++ htmltree.addAttr(HtmlAttr.SCOPE, nullCheck(scope)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a TH tag with scope attribute and some content. ++ * ++ * @param scope scope of the tag ++ * @param body content for the tag ++ * @return an HtmlTree object for the TH tag ++ */ ++ public static HtmlTree TH(String scope, Content body) { ++ return TH(null, scope, body); ++ } ++ ++ /** ++ * Generates a TITLE tag with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the TITLE tag ++ */ ++ public static HtmlTree TITLE(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.TITLE, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a TR tag for an HTML table with some content. ++ * ++ * @param body content for the tag ++ * @return an HtmlTree object for the TR tag ++ */ ++ public static HtmlTree TR(Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.TR, nullCheck(body)); ++ return htmltree; ++ } ++ ++ /** ++ * Generates a UL tag with the style class attribute and some content. ++ * ++ * @param styleClass style for the tag ++ * @param body content for the tag ++ * @return an HtmlTree object for the UL tag ++ */ ++ public static HtmlTree UL(HtmlStyle styleClass, Content body) { ++ HtmlTree htmltree = new HtmlTree(HtmlTag.UL, nullCheck(body)); ++ htmltree.addStyle(nullCheck(styleClass)); ++ return htmltree; ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public boolean isEmpty() { ++ return (!hasContent() && !hasAttrs()); ++ } ++ ++ /** ++ * Returns true if the HTML tree has content. ++ * ++ * @return true if the HTML tree has content else return false ++ */ ++ public boolean hasContent() { ++ return (!content.isEmpty()); ++ } ++ ++ /** ++ * Returns true if the HTML tree has attributes. ++ * ++ * @return true if the HTML tree has attributes else return false ++ */ ++ public boolean hasAttrs() { ++ return (!attrs.isEmpty()); ++ } ++ ++ /** ++ * Returns true if the HTML tree has a specific attribute. ++ * ++ * @param attrName name of the attribute to check within the HTML tree ++ * @return true if the HTML tree has the specified attribute else return false ++ */ ++ public boolean hasAttr(HtmlAttr attrName) { ++ return (attrs.containsKey(attrName)); ++ } ++ ++ /** ++ * Returns true if the HTML tree is valid. This check is more specific to ++ * standard doclet and not exactly similar to W3C specifications. But it ++ * ensures HTML validation. ++ * ++ * @return true if the HTML tree is valid ++ */ ++ public boolean isValid() { ++ switch (htmlTag) { ++ case A : ++ return (hasAttr(HtmlAttr.NAME) || (hasAttr(HtmlAttr.HREF) && hasContent())); ++ case BR : ++ return (!hasContent() && (!hasAttrs() || hasAttr(HtmlAttr.CLEAR))); ++ case FRAME : ++ return (hasAttr(HtmlAttr.SRC) && !hasContent()); ++ case HR : ++ return (!hasContent()); ++ case IMG : ++ return (hasAttr(HtmlAttr.SRC) && hasAttr(HtmlAttr.ALT) && !hasContent()); ++ case LINK : ++ return (hasAttr(HtmlAttr.HREF) && !hasContent()); ++ case META : ++ return (hasAttr(HtmlAttr.CONTENT) && !hasContent()); ++ default : ++ return hasContent(); ++ } ++ } ++ ++ /** ++ * Returns true if the element is an inline element. ++ * ++ * @return true if the HTML tag is an inline element ++ */ ++ public boolean isInline() { ++ return (htmlTag.blockType == HtmlTag.BlockType.INLINE); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void write(StringBuilder contentBuilder) { ++ if (!isInline() && !endsWithNewLine(contentBuilder)) ++ contentBuilder.append("\n"); ++ String tagString = htmlTag.toString(); ++ contentBuilder.append("<" + tagString); ++ Iterator<HtmlAttr> iterator = attrs.keySet().iterator(); ++ HtmlAttr key; ++ String value = ""; ++ while (iterator.hasNext()) { ++ key = iterator.next(); ++ value = attrs.get(key); ++ contentBuilder.append(" " + key.toString()); ++ if (!value.isEmpty()) ++ contentBuilder.append("=\"" + value + "\""); ++ } ++ contentBuilder.append(">"); ++ for (Content c : content) ++ c.write(contentBuilder); ++ if (htmlTag.endTagRequired()) ++ contentBuilder.append("</" + tagString + ">"); ++ if (!isInline()) ++ contentBuilder.append("\n"); ++ } ++} +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.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/HtmlWriter.java +@@ -55,7 +55,7 @@ + * URL file separator string("/"). + */ + public static final String fileseparator = +- DirectoryManager.URL_FILE_SEPERATOR; ++ DirectoryManager.URL_FILE_SEPARATOR; + + /** + * The configuration +@@ -82,6 +82,72 @@ + */ + protected final String modifierTypeHeader; + ++ public final Content overviewLabel; ++ ++ public final Content defaultPackageLabel; ++ ++ public final Content packageLabel; ++ ++ public final Content useLabel; ++ ++ public final Content prevLabel; ++ ++ public final Content nextLabel; ++ ++ public final Content prevclassLabel; ++ ++ public final Content nextclassLabel; ++ ++ public final Content summaryLabel; ++ ++ public final Content detailLabel; ++ ++ public final Content framesLabel; ++ ++ public final Content noframesLabel; ++ ++ public final Content treeLabel; ++ ++ public final Content classLabel; ++ ++ public final Content deprecatedLabel; ++ ++ public final Content deprecatedPhrase; ++ ++ public final Content allclassesLabel; ++ ++ public final Content indexLabel; ++ ++ public final Content helpLabel; ++ ++ public final Content seeLabel; ++ ++ public final Content descriptionLabel; ++ ++ public final Content prevpackageLabel; ++ ++ public final Content nextpackageLabel; ++ ++ public final Content packagesLabel; ++ ++ public final Content methodDetailsLabel; ++ ++ public final Content annotationTypeDetailsLabel; ++ ++ public final Content fieldDetailsLabel; ++ ++ public final Content constructorDetailsLabel; ++ ++ public final Content enumConstantsDetailsLabel; ++ ++ public final Content specifiedByLabel; ++ ++ public final Content overridesLabel; ++ ++ public final Content descfrmClassLabel; ++ ++ public final Content descfrmInterfaceLabel; ++ + /** + * Constructor. + * +@@ -111,6 +177,73 @@ + modifierTypeHeader = configuration.getText("doclet.0_and_1", + configuration.getText("doclet.Modifier"), + configuration.getText("doclet.Type")); ++ overviewLabel = getResource("doclet.Overview"); ++ defaultPackageLabel = new RawHtml( ++ DocletConstants.DEFAULT_PACKAGE_NAME); ++ packageLabel = getResource("doclet.Package"); ++ useLabel = getResource("doclet.navClassUse"); ++ prevLabel = getResource("doclet.Prev"); ++ nextLabel = getResource("doclet.Next"); ++ prevclassLabel = getResource("doclet.Prev_Class"); ++ nextclassLabel = getResource("doclet.Next_Class"); ++ summaryLabel = getResource("doclet.Summary"); ++ detailLabel = getResource("doclet.Detail"); ++ framesLabel = getResource("doclet.FRAMES"); ++ noframesLabel = getResource("doclet.NO_FRAMES"); ++ treeLabel = getResource("doclet.Tree"); ++ classLabel = getResource("doclet.Class"); ++ deprecatedLabel = getResource("doclet.navDeprecated"); ++ deprecatedPhrase = getResource("doclet.Deprecated"); ++ allclassesLabel = getResource("doclet.All_Classes"); ++ indexLabel = getResource("doclet.Index"); ++ helpLabel = getResource("doclet.Help"); ++ seeLabel = getResource("doclet.See"); ++ descriptionLabel = getResource("doclet.Description"); ++ prevpackageLabel = getResource("doclet.Prev_Package"); ++ nextpackageLabel = getResource("doclet.Next_Package"); ++ packagesLabel = getResource("doclet.Packages"); ++ methodDetailsLabel = getResource("doclet.Method_Detail"); ++ annotationTypeDetailsLabel = getResource("doclet.Annotation_Type_Member_Detail"); ++ fieldDetailsLabel = getResource("doclet.Field_Detail"); ++ constructorDetailsLabel = getResource("doclet.Constructor_Detail"); ++ enumConstantsDetailsLabel = getResource("doclet.Enum_Constant_Detail"); ++ specifiedByLabel = getResource("doclet.Specified_By"); ++ overridesLabel = getResource("doclet.Overrides"); ++ descfrmClassLabel = getResource("doclet.Description_From_Class"); ++ descfrmInterfaceLabel = getResource("doclet.Description_From_Interface"); ++ } ++ ++ /** ++ * Get the configuration string as a content. ++ * ++ * @param key the key to look for in the configuration file ++ * @return a content tree for the text ++ */ ++ public Content getResource(String key) { ++ return new StringContent(configuration.getText(key)); ++ } ++ ++ /** ++ * Get the configuration string as a content. ++ * ++ * @param key the key to look for in the configuration file ++ * @param a1 string argument added to configuration text ++ * @return a content tree for the text ++ */ ++ public Content getResource(String key, String a1) { ++ return new RawHtml(configuration.getText(key, a1)); ++ } ++ ++ /** ++ * Get the configuration string as a content. ++ * ++ * @param key the key to look for in the configuration file ++ * @param a1 string argument added to configuration text ++ * @param a2 string argument added to configuration text ++ * @return a content tree for the text ++ */ ++ public Content getResource(String key, String a1, String a2) { ++ return new RawHtml(configuration.getText(key, a1, a2)); + } + + /** +@@ -146,6 +279,48 @@ + } + + /** ++ * Returns an HtmlTree for the SCRIPT tag. ++ * ++ * @return an HtmlTree for the SCRIPT tag ++ */ ++ protected HtmlTree getWinTitleScript(){ ++ HtmlTree script = new HtmlTree(HtmlTag.SCRIPT); ++ if(winTitle != null && winTitle.length() > 0) { ++ script.addAttr(HtmlAttr.TYPE, "text/javascript"); ++ String scriptCode = "<!--\n" + ++ " if (location.href.indexOf('is-external=true') == -1) {\n" + ++ " parent.document.title=\"" + winTitle + "\";\n" + ++ " }\n" + ++ "//-->\n"; ++ RawHtml scriptContent = new RawHtml(scriptCode); ++ script.addContent(scriptContent); ++ } ++ return script; ++ } ++ ++ /** ++ * Returns a content tree for the SCRIPT tag for the main page(index.html). ++ * ++ * @return a content for the SCRIPT tag ++ */ ++ protected Content getFramesetJavaScript(){ ++ HtmlTree script = new HtmlTree(HtmlTag.SCRIPT); ++ script.addAttr(HtmlAttr.TYPE, "text/javascript"); ++ String scriptCode = "\n targetPage = \"\" + window.location.search;\n" + ++ " if (targetPage != \"\" && targetPage != \"undefined\")\n" + ++ " targetPage = targetPage.substring(1);\n" + ++ " if (targetPage.indexOf(\":\") != -1)\n" + ++ " targetPage = \"undefined\";\n" + ++ " function loadFrames() {\n" + ++ " if (targetPage != \"\" && targetPage != \"undefined\")\n" + ++ " top.classFrame.location = top.targetPage;\n" + ++ " }\n"; ++ RawHtml scriptContent = new RawHtml(scriptCode); ++ script.addContent(scriptContent); ++ return script; ++ } ++ ++ /** + * Print the Javascript <SCRIPT> start tag with its type + * attribute. + */ +@@ -204,6 +379,28 @@ + } + + /** ++ * Returns an HtmlTree for the BODY tag. ++ * ++ * @param includeScript set true if printing windowtitle script ++ * @param title title for the window ++ * @return an HtmlTree for the BODY tag ++ */ ++ public HtmlTree getBody(boolean includeScript, String title) { ++ HtmlTree body = new HtmlTree(HtmlTag.BODY); ++ // Set window title string which is later printed ++ this.winTitle = title; ++ // Don't print windowtitle script for overview-frame, allclasses-frame ++ // and package-frame ++ if (includeScript) { ++ body.addContent(getWinTitleScript()); ++ Content noScript = HtmlTree.NOSCRIPT( ++ HtmlTree.DIV(getResource("doclet.No_Script_Message"))); ++ body.addContent(noScript); ++ } ++ return body; ++ } ++ ++ /** + * Print </BODY> tag. Add a newline character at the end. + */ + public void bodyEnd() { +@@ -228,6 +425,15 @@ + title(); + } + ++ /** ++ * Returns an HtmlTree for the TITLE tag. ++ * ++ * @return an HtmlTree for the TITLE tag ++ */ ++ public HtmlTree getTitle() { ++ HtmlTree title = HtmlTree.TITLE(new StringContent(winTitle)); ++ return title; ++ } + + /** + * Print </TITLE> tag. Add a newline character at the end. +@@ -519,17 +725,17 @@ + } + + /** +- * Return, text passed, with Italics <I> and </I> tags, surrounding it. +- * So if the text passed is "Hi", then string returned will be "<I>Hi</I>". ++ * Return, text passed, with Italics <i> and </i> tags, surrounding it. ++ * So if the text passed is "Hi", then string returned will be "<i>Hi</i>". + * + * @param text String to be printed in between <I> and </I> tags. + */ + public String italicsText(String text) { +- return "<I>" + text + "</I>"; ++ return "<i>" + text + "</i>"; + } + + public String codeText(String text) { +- return "<CODE>" + text + "</CODE>"; ++ return "<code>" + text + "</code>"; + } + + /** +@@ -540,6 +746,13 @@ + } + + /** ++ * Return "&nbsp;", non-breaking space. ++ */ ++ public Content getSpace() { ++ return RawHtml.nbsp; ++ } ++ ++ /** + * Print <DL> tag. Add a newline character at the end. + */ + public void dl() { +@@ -1182,21 +1395,21 @@ + } + + /** +- * Get the "<CODE>" string. ++ * Get the "<code>" string. + * +- * @return String Return String "<CODE>"; ++ * @return String Return String "<code>"; + */ + public String getCode() { +- return "<CODE>"; ++ return "<code>"; + } + + /** +- * Get the "</CODE>" string. ++ * Get the "</code>" string. + * +- * @return String Return String "</CODE>"; ++ * @return String Return String "</code>"; + */ + public String getCodeEnd() { +- return "</CODE>"; ++ return "</code>"; + } + + /** +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java +@@ -0,0 +1,88 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.doclets.formats.html.markup; ++ ++import com.sun.tools.doclets.internal.toolkit.Content; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++ ++/** ++ * Class for generating raw HTML content to be added to HTML pages of javadoc output. ++ * ++ * @author Bhavesh Patel ++ */ ++public class RawHtml extends Content{ ++ ++ private String rawHtmlContent; ++ ++ public static final Content nbsp = new RawHtml(" "); ++ ++ /** ++ * Constructor to construct a RawHtml object. ++ * ++ * @param rawHtml raw HTML text to be added ++ */ ++ public RawHtml(String rawHtml) { ++ rawHtmlContent = nullCheck(rawHtml); ++ } ++ ++ /** ++ * This method is not supported by the class. ++ * ++ * @param content content that needs to be added ++ * @throws DocletAbortException this method will always throw a ++ * DocletAbortException because it ++ * is not supported. ++ */ ++ public void addContent(Content content) { ++ throw new DocletAbortException(); ++ } ++ ++ /** ++ * This method is not supported by the class. ++ * ++ * @param stringContent string content that needs to be added ++ * @throws DocletAbortException this method will always throw a ++ * DocletAbortException because it ++ * is not supported. ++ */ ++ public void addContent(String stringContent) { ++ throw new DocletAbortException(); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public boolean isEmpty() { ++ return rawHtmlContent.isEmpty(); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void write(StringBuilder contentBuilder) { ++ contentBuilder.append(rawHtmlContent); ++ } ++} +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java b/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java +@@ -0,0 +1,99 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.doclets.formats.html.markup; ++ ++import com.sun.tools.doclets.internal.toolkit.Content; ++import com.sun.tools.doclets.internal.toolkit.util.*; ++ ++/** ++ * Class for generating string content for HTML tags of javadoc output. ++ * ++ * @author Bhavesh Patel ++ */ ++public class StringContent extends Content{ ++ ++ private StringBuilder stringContent; ++ ++ /** ++ * Constructor to construct StringContent object. ++ */ ++ public StringContent() { ++ stringContent = new StringBuilder(); ++ } ++ ++ /** ++ * Constructor to construct StringContent object with some initial content. ++ * ++ * @param initialContent initial content for the object ++ */ ++ public StringContent(String initialContent) { ++ stringContent = new StringBuilder( ++ Util.escapeHtmlChars(nullCheck(initialContent))); ++ } ++ ++ /** ++ * This method is not supported by the class. ++ * ++ * @param content content that needs to be added ++ * @throws DocletAbortException this method will always throw a ++ * DocletAbortException because it ++ * is not supported. ++ */ ++ public void addContent(Content content) { ++ throw new DocletAbortException(); ++ } ++ ++ /** ++ * Adds content for the StringContent object. The method escapes ++ * HTML characters for the string content that is added. ++ * ++ * @param strContent string content to be added ++ */ ++ public void addContent(String strContent) { ++ stringContent.append(Util.escapeHtmlChars(nullCheck(strContent))); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public boolean isEmpty() { ++ return (stringContent.length() == 0); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String toString() { ++ return stringContent.toString(); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public void write(StringBuilder contentBuilder) { ++ contentBuilder.append(stringContent); ++ } ++} +diff --git a/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties b/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties +--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties ++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard.properties +@@ -43,6 +43,7 @@ + doclet.Window_Split_Index={0}-Index + doclet.Help=Help + doclet.Skip_navigation_links=Skip navigation links ++doclet.New_Page=NewPage + doclet.None=None + doclet.CLASSES=CLASSES + doclet.MEMBERS=MEMBERS +@@ -53,7 +54,7 @@ + doclet.Window_Deprecated_List=Deprecated List + doclet.Note_0_is_deprecated=Note: {0} is deprecated. + doclet.Overrides=Overrides: +-doclet.in_class={0} in class {1} ++doclet.in_class=in class + doclet.0_Fields_and_Methods="{0}" Fields and Methods + doclet.Index_of_Fields_and_Methods=Index of Fields and Methods + doclet.Static_variable_in=Static variable in {0} +@@ -102,7 +103,7 @@ + doclet.Package_Description=Package {0} Description + doclet.Description=Description + doclet.Specified_By=Specified by: +-doclet.in_interface={0} in interface {1} ++doclet.in_interface=in interface + doclet.Subclasses=Direct Known Subclasses: + doclet.Subinterfaces=All Known Subinterfaces: + doclet.Implementing_Classes=All Known Implementing Classes: +@@ -120,18 +121,20 @@ + doclet.Frame_Alert=Frame Alert + doclet.Overview-Member-Frame=Overview Member Frame + doclet.Frame_Warning_Message=This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. ++doclet.No_Script_Message=JavaScript is disabled on your browser. + doclet.Non_Frame_Version=Non-frame version. + doclet.Frame_Version=Frame version + doclet.Link_To=Link to + doclet.Following_From_Class=Following copied from class: {0} + doclet.Following_From_Interface=Following copied from interface: {0} +-doclet.Description_From_Interface=Description copied from interface: {0} +-doclet.Description_From_Class=Description copied from class: {0} ++doclet.Description_From_Interface=Description copied from interface: ++doclet.Description_From_Class=Description copied from class: + doclet.Standard_doclet_invoked=Standard doclet invoked... + doclet.No_Non_Deprecated_Classes_To_Document=No non-deprecated classes found to document. + doclet.Interfaces_Italic=Interfaces (italic) + doclet.Enclosing_Class=Enclosing class: + doclet.Enclosing_Interface=Enclosing interface: ++doclet.Window_Source_title=Source code + doclet.Help_title=API Help + doclet.Window_Help_title=API Help + doclet.Help_line_1=How This API Document Is Organized +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java +@@ -35,14 +35,18 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + + public interface AnnotationTypeOptionalMemberWriter extends +- AnnotationTypeRequiredMemberWriter { ++ AnnotationTypeRequiredMemberWriter { + + /** +- * Write the default value documentation. ++ * Add the the default value documentation. ++ * ++ * @param member the member being documented ++ * @param annotationDocTree content tree to which the default value will be added + */ +- public void writeDefaultValueInfo(MemberDoc member); ++ public void addDefaultValueInfo(MemberDoc member, Content annotationDocTree); + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java +@@ -36,67 +36,79 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + + public interface AnnotationTypeRequiredMemberWriter { + + /** +- * Write the header for the member documentation. ++ * Add the annotation type details tree header. + * +- * @param classDoc the annotation type that the members belong to. +- * @param header the header to write. ++ * @param classDoc the annotation type being documented ++ * @param memberDetailsTree the content tree representing member details + */ +- public void writeHeader(ClassDoc classDoc, String header); ++ public void addAnnotationDetailsTreeHeader(ClassDoc classDoc, ++ Content memberDetailsTree); + + /** +- * Write the member header for the given member. ++ * Get the annotation type documentation tree header. + * +- * @param member the member being documented. +- * @param isFirst the flag to indicate whether or not the member is +- * the first to be documented. ++ * @param member the annotation type being documented ++ * @param annotationDetailsTree the content tree representing annotation type details ++ * @return content tree for the annotation type documentation header + */ +- public void writeMemberHeader(MemberDoc member, boolean isFirst); ++ public Content getAnnotationDocTreeHeader(MemberDoc member, ++ Content annotationDetailsTree); + + /** +- * Write the signature for the given member. ++ * Get the annotation type details tree. + * +- * @param member the member being documented. ++ * @param annotationDetailsTree the content tree representing annotation type details ++ * @return content tree for the annotation type details + */ +- public void writeSignature(MemberDoc member); ++ public Content getAnnotationDetails(Content annotationDetailsTree); + + /** +- * Write the deprecated output for the given member. ++ * Get the annotation type documentation. + * +- * @param member the member being documented. ++ * @param annotationDocTree the content tree representing annotation type documentation ++ * @param isLastContent true if the content to be added is the last content ++ * @return content tree for the annotation type documentation + */ +- public void writeDeprecated(MemberDoc member); ++ public Content getAnnotationDoc(Content annotationDocTree, boolean isLastContent); + + /** +- * Write the comments for the given member. ++ * Get the signature for the given member. + * +- * @param member the member being documented. ++ * @param member the member being documented ++ * @return content tree for the annotation type signature + */ +- public void writeComments(MemberDoc member); ++ public Content getSignature(MemberDoc member); + + /** +- * Write the tag output for the given member. ++ * Add the deprecated output for the given member. + * +- * @param member the member being documented. ++ * @param member the member being documented ++ * @param annotationDocTree content tree to which the deprecated information will be added + */ +- public void writeTags(MemberDoc member); ++ public void addDeprecated(MemberDoc member, Content annotationDocTree); + + /** +- * Write the member footer. ++ * Add the comments for the given member. ++ * ++ * @param member the member being documented ++ * @param annotationDocTree the content tree to which the comments will be added + */ +- public void writeMemberFooter(); ++ public void addComments(MemberDoc member, Content annotationDocTree); + + /** +- * Write the footer for the member documentation. ++ * Add the tags for the given member. + * +- * @param classDoc the class that the member belong to. ++ * @param member the member being documented ++ * @param annotationDocTree the content tree to which the tags will be added + */ +- public void writeFooter(ClassDoc classDoc); ++ public void addTags(MemberDoc member, Content annotationDocTree); + + /** + * Close the writer. +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java +@@ -37,43 +37,122 @@ + * Do not use it as an API. + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + + public interface AnnotationTypeWriter { + + /** +- * Write the header of the page. +- * @param header the header to write. ++ * Get the header of the page. ++ * ++ * @param header the header string to write ++ * @return a content tree for the header documentation + */ +- public void writeHeader(String header); ++ public Content getHeader(String header); + + /** +- * Write the signature of the current annotation type. ++ * Get the annotation content header. + * +- * @param modifiers the modifiers for the signature. ++ * @return annotation content header that needs to be added to the documentation + */ +- public void writeAnnotationTypeSignature(String modifiers); ++ public Content getAnnotationContentHeader(); ++ ++ /** ++ * Get the annotation information tree header. ++ * ++ * @return annotation information tree header that needs to be added to the documentation ++ */ ++ public Content getAnnotationInfoTreeHeader(); ++ ++ /** ++ * Get the annotation information. ++ * ++ * @param annotationInfoTree content tree containing the annotation information ++ * @return a content tree for the annotation ++ */ ++ public Content getAnnotationInfo(Content annotationInfoTree); ++ ++ /** ++ * Add the signature of the current annotation type. ++ * ++ * @param modifiers the modifiers for the signature ++ * @param annotationInfoTree the annotation content tree to which the signature will be added ++ */ ++ public void addAnnotationTypeSignature(String modifiers, Content annotationInfoTree); + + /** + * Build the annotation type description. ++ * ++ * @param annotationInfoTree content tree to which the description will be added + */ +- public void writeAnnotationTypeDescription(); ++ public void addAnnotationTypeDescription(Content annotationInfoTree); + + /** +- * Write the tag information for the current annotation type. ++ * Add the tag information for the current annotation type. ++ * ++ * @param annotationInfoTree content tree to which the tag information will be added + */ +- public void writeAnnotationTypeTagInfo(); ++ public void addAnnotationTypeTagInfo(Content annotationInfoTree); + + /** +- * If this annotation type is deprecated, write the appropriate information. ++ * If this annotation is deprecated, add the appropriate information. ++ * ++ * @param annotationInfoTree content tree to which the deprecated information will be added + */ +- public void writeAnnotationTypeDeprecationInfo(); ++ public void addAnnotationTypeDeprecationInfo (Content annotationInfoTree); + + /** +- * Write the footer of the page. ++ * Add the annotation type details marker. ++ * ++ * @param memberDetails the content tree representing member details marker + */ +- public void writeFooter(); ++ public void addAnnotationDetailsMarker(Content memberDetails); ++ ++ /** ++ * Get the member tree header for the annotation type. ++ * ++ * @return a content tree for the member tree header ++ */ ++ public Content getMemberTreeHeader(); ++ ++ /** ++ * Get the member tree. ++ * ++ * @param memberTree the content tree that will be modified and returned ++ * @return a content tree for the member ++ */ ++ public Content getMemberTree(Content memberTree); ++ ++ /** ++ * Get the member summary tree. ++ * ++ * @param memberTree the content tree that will be used to build the summary tree ++ * @return a content tree for the member summary ++ */ ++ public Content getMemberSummaryTree(Content memberTree); ++ ++ /** ++ * Get the member details tree. ++ * ++ * @param memberTree the content tree that will be used to build the details tree ++ * @return a content tree for the member details ++ */ ++ public Content getMemberDetailsTree(Content memberTree); ++ ++ /** ++ * Add the footer of the page. ++ * ++ * @param contentTree content tree to which the footer will be added ++ */ ++ public void addFooter(Content contentTree); ++ ++ /** ++ * Print the document. ++ * ++ * @param contentTree content tree that will be printed as a document ++ */ ++ public void printDocument(Content contentTree); + + /** + * Close the writer. +@@ -86,10 +165,4 @@ + * @return the AnnotationTypeDoc being documented. + */ + public AnnotationTypeDoc getAnnotationTypeDoc(); +- +- /** +- * Perform any operations that are necessary when the member summary +- * finished building. +- */ +- public void completeMemberSummaryBuild(); + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java +@@ -37,85 +37,149 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + + public interface ClassWriter { + + /** +- * Write the header of the page. +- * @param header the header to write. ++ * Get the header of the page. ++ * ++ * @param header the header string to write ++ * @return header content that needs to be added to the documentation + */ +- public void writeHeader(String header); ++ public Content getHeader(String header); + + /** +- * Write the class tree documentation. ++ * Get the class content header. ++ * ++ * @return class content header that needs to be added to the documentation + */ +- public void writeClassTree(); ++ public Content getClassContentHeader(); + + /** +- * Write all implemented interfaces if this is a class. ++ * Add the class tree documentation. ++ * ++ * @param classContentTree class content tree to which the documentation will be added + */ +- public void writeImplementedInterfacesInfo(); ++ public void addClassTree(Content classContentTree); + + /** +- * Write all super interfaces if this is an interface. ++ * Get the class information tree header. ++ * ++ * @return class informaion tree header that needs to be added to the documentation + */ +- public void writeSuperInterfacesInfo(); ++ public Content getClassInfoTreeHeader(); + + /** +- * Write the type parameter information. ++ * Add the type parameter information. ++ * ++ * @param classInfoTree content tree to which the documentation will be added + */ +- public void writeTypeParamInfo(); ++ public void addTypeParamInfo(Content classInfoTree); + + /** +- * Write all the classes that extend this one. ++ * Add all super interfaces if this is an interface. ++ * ++ * @param classInfoTree content tree to which the documentation will be added + */ +- public void writeSubClassInfo(); ++ public void addSuperInterfacesInfo(Content classInfoTree); + + /** +- * Write all the interfaces that extend this one. ++ * Add all implemented interfaces if this is a class. ++ * ++ * @param classInfoTree content tree to which the documentation will be added + */ +- public void writeSubInterfacesInfo(); ++ public void addImplementedInterfacesInfo(Content classInfoTree); + + /** +- * If this is an interface, write all classes that implement this +- * interface. ++ * Add all the classes that extend this one. ++ * ++ * @param classInfoTree content tree to which the documentation will be added + */ +- public void writeInterfaceUsageInfo (); ++ public void addSubClassInfo(Content classInfoTree); + + /** +- * If this is an inner class or interface, write the enclosing class or +- * interface. ++ * Add all the interfaces that extend this one. ++ * ++ * @param classInfoTree content tree to which the documentation will be added + */ +- public void writeNestedClassInfo (); ++ public void addSubInterfacesInfo(Content classInfoTree); + + /** +- * If this class is deprecated, write the appropriate information. ++ * If this is an interface, add all classes that implement this ++ * interface. ++ * ++ * @param classInfoTree content tree to which the documentation will be added + */ +- public void writeClassDeprecationInfo (); ++ public void addInterfaceUsageInfo(Content classInfoTree); + + /** +- * Write the signature of the current class. ++ * If this is an inner class or interface, add the enclosing class or ++ * interface. + * +- * @param modifiers the modifiers for the signature. ++ * @param classInfoTree content tree to which the documentation will be added + */ +- public void writeClassSignature(String modifiers); ++ public void addNestedClassInfo (Content classInfoTree); ++ ++ /** ++ * Get the class information. ++ * ++ * @param classInfoTree content tree conatining the class information ++ * @return a content tree for the class ++ */ ++ public Content getClassInfo(Content classInfoTree); ++ ++ /** ++ * If this class is deprecated, add the appropriate information. ++ * ++ * @param classInfoTree content tree to which the documentation will be added ++ */ ++ public void addClassDeprecationInfo (Content classInfoTree); ++ ++ /** ++ * Add the signature of the current class content tree. ++ * ++ * @param modifiers the modifiers for the signature ++ * @param classInfoTree the class content tree to which the signature will be added ++ */ ++ public void addClassSignature(String modifiers, Content classInfoTree); + + /** + * Build the class description. ++ * ++ * @param classInfoTree content tree to which the documentation will be added + */ +- public void writeClassDescription(); ++ public void addClassDescription(Content classInfoTree); + + /** +- * Write the tag information for the current class. ++ * Add the tag information for the current class. ++ * ++ * @param classInfoTree content tree to which the tag information will be added + */ +- public void writeClassTagInfo(); ++ public void addClassTagInfo(Content classInfoTree); + + /** +- * Write the footer of the page. ++ * Get the member tree header for the class. ++ * ++ * @return a content tree for the member tree header + */ +- public void writeFooter(); ++ public Content getMemberTreeHeader(); ++ ++ /** ++ * Add the footer of the page. ++ * ++ * @param contentTree content tree to which the footer will be added ++ */ ++ public void addFooter(Content contentTree); ++ ++ /** ++ * Print the document. ++ * ++ * @param contentTree content tree that will be printed as a document ++ */ ++ public void printDocument(Content contentTree); + + /** + * Close the writer. +@@ -130,8 +194,18 @@ + public ClassDoc getClassDoc(); + + /** +- * Perform any operations that are necessary when the member summary +- * finished building. ++ * Get the member summary tree. ++ * ++ * @param memberTree the content tree used to build the summary tree ++ * @return a content tree for the member summary + */ +- public void completeMemberSummaryBuild(); ++ public Content getMemberSummaryTree(Content memberTree); ++ ++ /** ++ * Get the member details tree. ++ * ++ * @param memberTree the content tree used to build the details tree ++ * @return a content tree for the member details ++ */ ++ public Content getMemberDetailsTree(Content memberTree); + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java +@@ -25,9 +25,9 @@ + + package com.sun.tools.doclets.internal.toolkit; + +-import com.sun.javadoc.*; + import java.util.*; + import java.io.*; ++import com.sun.javadoc.*; + + /** + * The interface for writing constants summary output. +@@ -37,38 +37,34 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + + public interface ConstantsSummaryWriter { + + /** +- * Write the header for the summary. +- */ +- public abstract void writeHeader(); +- +- /** +- * Write the footer for the summary. +- */ +- public abstract void writeFooter(); +- +- /** + * Close the writer. + */ + public abstract void close() throws IOException; + + /** +- * Write the header for the index. ++ * Get the header for the constant summary documentation. ++ * ++ * @return header that needs to be added to the documentation + */ +- public abstract void writeContentsHeader(); ++ public abstract Content getHeader(); + + /** +- * Write the footer for the index. ++ * Get the header for the constant content list. ++ * ++ * @return content header that needs to be added to the documentation + */ +- public abstract void writeContentsFooter(); ++ public abstract Content getContentsHeader(); + + /** +- * Add the given package name to the index. ++ * Adds the given package name link to the constant content list tree. ++ * + * @param pkg the {@link PackageDoc} to index. + * @param parsedPackageName the parsed package name. We only Write the + * first 2 directory levels of the package +@@ -77,38 +73,70 @@ + * @param WriteedPackageHeaders the set of package headers that have already + * been indexed. We don't want to index + * something more than once. ++ * @param contentListTree the content tree to which the link will be added + */ +- public abstract void writeLinkToPackageContent(PackageDoc pkg, String parsedPackageName, +- Set WriteedPackageHeaders); ++ public abstract void addLinkToPackageContent(PackageDoc pkg, String parsedPackageName, ++ Set<String> WriteedPackageHeaders, Content contentListTree); + + /** +- * Write the given package name. +- * @param pkg the {@link PackageDoc} to index. +- * @param parsedPackageName the parsed package name. We only Write the +- * first 2 directory levels of the package +- * name. For example, java.lang.ref would be +- * indexed as java.lang.*. ++ * Get the content list to be added to the documentation tree. ++ * ++ * @param contentListTree the content that will be added to the list ++ * @return content list that will be added to the documentation tree + */ +- public abstract void writePackageName(PackageDoc pkg, +- String parsedPackageName); ++ public abstract Content getContentsList(Content contentListTree); + + /** +- * Write the heading for the current table of constants for a given class. +- * @param cd the class whose constants are being documented. ++ * Get the constant summaries for the document. ++ * ++ * @return constant summaries header to be added to the documentation tree + */ +- public abstract void writeConstantMembersHeader(ClassDoc cd); ++ public abstract Content getConstantSummaries(); + + /** +- * Document the given constants. ++ * Adds the given package name. ++ * ++ * @param pkg the {@link PackageDoc} to index. ++ * @param parsedPackageName the parsed package name. We only Write the ++ * first 2 directory levels of the package ++ * name. For example, java.lang.ref would be ++ * indexed as java.lang.*. ++ * @param summariesTree the documentation tree to which the package name will ++ * be written ++ */ ++ public abstract void addPackageName(PackageDoc pkg, ++ String parsedPackageName, Content summariesTree); ++ ++ /** ++ * Get the class summary header for the constants summary. ++ * ++ * @return the header content for the class constants summary ++ */ ++ public abstract Content getClassConstantHeader(); ++ ++ /** ++ * Adds the constant member table to the documentation tree. ++ * + * @param cd the class whose constants are being documented. + * @param fields the constants being documented. ++ * @param classConstantTree the documentation tree to which theconstant member ++ * table content will be added + */ +- public abstract void writeConstantMembers(ClassDoc cd, List fields); ++ public abstract void addConstantMembers(ClassDoc cd, List<FieldDoc> fields, ++ Content classConstantTree); + + /** +- * Document the given constants. +- * @param cd the class whose constants are being documented. ++ * Adds the footer for the summary documentation. ++ * ++ * @param contentTree content tree to which the footer will be added + */ +- public abstract void writeConstantMembersFooter(ClassDoc cd); ++ public abstract void addFooter(Content contentTree); ++ ++ /** ++ * Print the constants summary document. ++ * ++ * @param contentTree content tree which should be printed ++ */ ++ public abstract void printDocument(Content contentTree); + + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java +@@ -36,67 +36,80 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + + public interface ConstructorWriter { + + /** +- * Write the header for the constructor documentation. ++ * Get the constructor details tree header. + * +- * @param classDoc the class that the constructors belong to. +- * @param header the header to write. ++ * @param classDoc the class being documented ++ * @param memberDetailsTree the content tree representing member details ++ * @return content tree for the constructor details header + */ +- public void writeHeader(ClassDoc classDoc, String header); ++ public Content getConstructorDetailsTreeHeader(ClassDoc classDoc, ++ Content memberDetailsTree); + + /** +- * Write the constructor header for the given constructor. ++ * Get the constructor documentation tree header. + * +- * @param constructor the constructor being documented. +- * @param isFirst the flag to indicate whether or not the constructor is the +- * first to be documented. ++ * @param constructor the constructor being documented ++ * @param constructorDetailsTree the content tree representing constructor details ++ * @return content tree for the constructor documentation header + */ +- public void writeConstructorHeader(ConstructorDoc constructor, boolean isFirst); ++ public Content getConstructorDocTreeHeader(ConstructorDoc constructor, ++ Content constructorDetailsTree); + + /** +- * Write the signature for the given constructor. ++ * Get the signature for the given constructor. + * +- * @param constructor the constructor being documented. ++ * @param constructor the constructor being documented ++ * @return content tree for the constructor signature + */ +- public void writeSignature(ConstructorDoc constructor); ++ public Content getSignature(ConstructorDoc constructor); + + /** +- * Write the deprecated output for the given constructor. ++ * Add the deprecated output for the given constructor. + * +- * @param constructor the constructor being documented. ++ * @param constructor the constructor being documented ++ * @param constructorDocTree content tree to which the deprecated information will be added + */ +- public void writeDeprecated(ConstructorDoc constructor); ++ public void addDeprecated(ConstructorDoc constructor, Content constructorDocTree); + + /** +- * Write the comments for the given constructor. ++ * Add the comments for the given constructor. + * +- * @param constructor the constructor being documented. ++ * @param constructor the constructor being documented ++ * @param constructorDocTree the content tree to which the comments will be added + */ +- public void writeComments(ConstructorDoc constructor); ++ public void addComments(ConstructorDoc constructor, Content constructorDocTree); + + /** +- * Write the tag output for the given constructor. ++ * Add the tags for the given constructor. + * +- * @param constructor the constructor being documented. ++ * @param constructor the constructor being documented ++ * @param constructorDocTree the content tree to which the tags will be added + */ +- public void writeTags(ConstructorDoc constructor); ++ public void addTags(ConstructorDoc constructor, Content constructorDocTree); + + /** +- * Write the constructor footer. ++ * Get the constructor details tree. ++ * ++ * @param memberDetailsTree the content tree representing member details ++ * @return content tree for the constructor details + */ +- public void writeConstructorFooter(); ++ public Content getConstructorDetails(Content memberDetailsTree); + + /** +- * Write the footer for the constructor documentation. ++ * Get the constructor documentation. + * +- * @param classDoc the class that the constructors belong to. ++ * @param constructorDocTree the content tree representing constructor documentation ++ * @param isLastContent true if the content to be added is the last content ++ * @return content tree for the constructor documentation + */ +- public void writeFooter(ClassDoc classDoc); ++ public Content getConstructorDoc(Content constructorDocTree, boolean isLastContent); + + /** + * Let the writer know whether a non public constructor was found. +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java +@@ -0,0 +1,106 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++package com.sun.tools.doclets.internal.toolkit; ++ ++import com.sun.tools.doclets.internal.toolkit.util.*; ++ ++/** ++ * A class to create content for javadoc output pages. ++ * ++ * @author Bhavesh Patel ++ */ ++public abstract class Content { ++ ++ /** ++ * Returns a string representation of the content. ++ * ++ * @return string representation of the content ++ */ ++ public String toString() { ++ StringBuilder contentBuilder = new StringBuilder(); ++ write(contentBuilder); ++ return contentBuilder.toString(); ++ } ++ ++ /** ++ * Adds content to the existing content. ++ * ++ * @param content content that needs to be added ++ */ ++ public abstract void addContent(Content content); ++ ++ /** ++ * Adds a string content to the existing content. ++ * ++ * @param stringContent the string content to be added ++ */ ++ public abstract void addContent(String stringContent); ++ ++ /** ++ * Writes content to a StringBuilder. ++ * ++ */ ++ public abstract void write(StringBuilder contentBuilder); ++ ++ /** ++ * Returns true if the content is empty. ++ * ++ * @return true if no content to be displayed else return false ++ */ ++ public abstract boolean isEmpty(); ++ ++ /** ++ * Returns true if the content is valid. ++ * ++ * @return true if the content is valid else return false ++ */ ++ public boolean isValid() { ++ return !isEmpty(); ++ } ++ ++ /** ++ * Checks for null values. ++ * ++ * @param t reference type to check for null values ++ * @return the reference type if not null or else throws a null pointer exception ++ */ ++ protected static <T> T nullCheck(T t) { ++ t.getClass(); ++ return t; ++ } ++ ++ /** ++ * Returns true if the content ends with a newline character. Empty content ++ * is considered as ending with new line. ++ * ++ * @param contentBuilder content to test for newline character at the end ++ * @return true if the content ends with newline. ++ */ ++ public boolean endsWithNewLine(StringBuilder contentBuilder) { ++ return ((contentBuilder.length() == 0) || ++ (contentBuilder.substring(contentBuilder.length() - 1).equals("\n"))); ++ } ++} +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java +@@ -36,67 +36,80 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + + public interface EnumConstantWriter { + + /** +- * Write the header for the enum constant documentation. ++ * Get the enum constants details tree header. + * +- * @param classDoc the class that the enum constants belong to. +- * @param header the header to write. ++ * @param classDoc the class being documented ++ * @param memberDetailsTree the content tree representing member details ++ * @return content tree for the enum constants details header + */ +- public void writeHeader(ClassDoc classDoc, String header); ++ public Content getEnumConstantsDetailsTreeHeader(ClassDoc classDoc, ++ Content memberDetailsTree); + + /** +- * Write the enum constant header for the given enum constant. ++ * Get the enum constants documentation tree header. + * +- * @param enumConstant the enum constant being documented. +- * @param isFirst the flag to indicate whether or not the enum constant is +- * the first to be documented. ++ * @param enumConstant the enum constant being documented ++ * @param enumConstantDetailsTree the content tree representing enum constant details ++ * @return content tree for the enum constant documentation header + */ +- public void writeEnumConstantHeader(FieldDoc enumConstant, boolean isFirst); ++ public Content getEnumConstantsTreeHeader(FieldDoc enumConstant, ++ Content enumConstantsDetailsTree); + + /** +- * Write the signature for the given enum constant. ++ * Get the signature for the given enum constant. + * +- * @param enumConstant the enum constant being documented. ++ * @param enumConstant the enum constant being documented ++ * @return content tree for the enum constant signature + */ +- public void writeSignature(FieldDoc enumConstant); ++ public Content getSignature(FieldDoc enumConstant); + + /** +- * Write the deprecated output for the given enum constant. ++ * Add the deprecated output for the given enum constant. + * +- * @param enumConstant the enum constant being documented. ++ * @param enumConstant the enum constant being documented ++ * @param enumConstantsTree content tree to which the deprecated information will be added + */ +- public void writeDeprecated(FieldDoc enumConstant); ++ public void addDeprecated(FieldDoc enumConstant, Content enumConstantsTree); + + /** +- * Write the comments for the given enum constant. ++ * Add the comments for the given enum constant. + * +- * @param enumConstant the enum constant being documented. ++ * @param enumConstant the enum constant being documented ++ * @param enumConstantsTree the content tree to which the comments will be added + */ +- public void writeComments(FieldDoc enumConstant); ++ public void addComments(FieldDoc enumConstant, Content enumConstantsTree); + + /** +- * Write the tag output for the given enum constant. ++ * Add the tags for the given enum constant. + * +- * @param enumConstant the enum constant being documented. ++ * @param enumConstant the enum constant being documented ++ * @param enumConstantsTree the content tree to which the tags will be added + */ +- public void writeTags(FieldDoc enumConstant); ++ public void addTags(FieldDoc enumConstant, Content enumConstantsTree); + + /** +- * Write the enum constant footer. ++ * Get the enum constants details tree. ++ * ++ * @param memberDetailsTree the content tree representing member details ++ * @return content tree for the enum constant details + */ +- public void writeEnumConstantFooter(); ++ public Content getEnumConstantsDetails(Content memberDetailsTree); + + /** +- * Write the footer for the enum constant documentation. ++ * Get the enum constants documentation. + * +- * @param classDoc the class that the enum constant belong to. ++ * @param enumConstantsTree the content tree representing enum constants documentation ++ * @param isLastContent true if the content to be added is the last content ++ * @return content tree for the enum constants documentation + */ +- public void writeFooter(ClassDoc classDoc); ++ public Content getEnumConstants(Content enumConstantsTree, boolean isLastContent); + + /** + * Close the writer. +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java +@@ -36,67 +36,80 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + + public interface FieldWriter { + + /** +- * Write the header for the field documentation. ++ * Get the field details tree header. + * +- * @param classDoc the class that the fields belong to. +- * @param header the header to write. ++ * @param classDoc the class being documented ++ * @param memberDetailsTree the content tree representing member details ++ * @return content tree for the field details header + */ +- public void writeHeader(ClassDoc classDoc, String header); ++ public Content getFieldDetailsTreeHeader(ClassDoc classDoc, ++ Content memberDetailsTree); + + /** +- * Write the field header for the given field. ++ * Get the field documentation tree header. + * +- * @param field the field being documented. +- * @param isFirst the flag to indicate whether or not the field is the +- * first to be documented. ++ * @param field the constructor being documented ++ * @param fieldDetailsTree the content tree representing field details ++ * @return content tree for the field documentation header + */ +- public void writeFieldHeader(FieldDoc field, boolean isFirst); ++ public Content getFieldDocTreeHeader(FieldDoc field, ++ Content fieldDetailsTree); + + /** +- * Write the signature for the given field. ++ * Get the signature for the given field. + * +- * @param field the field being documented. ++ * @param field the field being documented ++ * @return content tree for the field signature + */ +- public void writeSignature(FieldDoc field); ++ public Content getSignature(FieldDoc field); + + /** +- * Write the deprecated output for the given field. ++ * Add the deprecated output for the given field. + * +- * @param field the field being documented. ++ * @param field the field being documented ++ * @param fieldDocTree content tree to which the deprecated information will be added + */ +- public void writeDeprecated(FieldDoc field); ++ public void addDeprecated(FieldDoc field, Content fieldDocTree); + + /** +- * Write the comments for the given field. ++ * Add the comments for the given field. + * +- * @param field the field being documented. ++ * @param field the field being documented ++ * @param fieldDocTree the content tree to which the comments will be added + */ +- public void writeComments(FieldDoc field); ++ public void addComments(FieldDoc field, Content fieldDocTree); + + /** +- * Write the tag output for the given field. ++ * Add the tags for the given field. + * +- * @param field the field being documented. ++ * @param field the field being documented ++ * @param fieldDocTree the content tree to which the tags will be added + */ +- public void writeTags(FieldDoc field); ++ public void addTags(FieldDoc field, Content fieldDocTree); + + /** +- * Write the field footer. ++ * Get the field details tree. ++ * ++ * @param memberDetailsTree the content tree representing member details ++ * @return content tree for the field details + */ +- public void writeFieldFooter(); ++ public Content getFieldDetails(Content memberDetailsTree); + + /** +- * Write the footer for the field documentation. ++ * Get the field documentation. + * +- * @param classDoc the class that the fields belong to. ++ * @param fieldDocTree the content tree representing field documentation ++ * @param isLastContent true if the content to be added is the last content ++ * @return content tree for the field documentation + */ +- public void writeFooter(ClassDoc classDoc); ++ public Content getFieldDoc(Content fieldDocTree, boolean isLastContent); + + /** + * Close the writer. +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java +@@ -26,6 +26,7 @@ + package com.sun.tools.doclets.internal.toolkit; + + import java.io.*; ++import java.util.*; + import com.sun.javadoc.*; + + /** +@@ -36,61 +37,77 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + + public interface MemberSummaryWriter { + + /** +- * Write the member summary header for the given class. ++ * Get the member summary header for the given class. + * +- * @param classDoc the class the summary belongs to. ++ * @param classDoc the class the summary belongs to ++ * @param memberSummaryTree the content tree to which the member summary will be added ++ * @return a content tree for the member summary header + */ +- public void writeMemberSummaryHeader(ClassDoc classDoc); ++ public Content getMemberSummaryHeader(ClassDoc classDoc, ++ Content memberSummaryTree); + + /** +- * Write the member summary for the given class and member. ++ * Get the summary table for the given class. + * +- * @param classDoc the class the summary belongs to. +- * @param member the member that I am summarizing. +- * @param firstSentenceTags the tags for the sentence being documented. +- * @param isFirst true if this is the first member in the list. +- * @param isLast true if this the last member being documented. ++ * @param classDoc the class the summary table belongs to ++ * @return a content tree for the member summary table + */ +- public void writeMemberSummary(ClassDoc classDoc, ProgramElementDoc member, +- Tag[] firstSentenceTags, boolean isFirst, boolean isLast); ++ public Content getSummaryTableTree(ClassDoc classDoc); + + /** +- * Write the member summary footer for the given class. ++ * Add the member summary for the given class and member. + * +- * @param classDoc the class the summary belongs to. ++ * @param classDoc the class the summary belongs to ++ * @param member the member that is documented ++ * @param firstSentenceTags the tags for the sentence being documented ++ * @param tableTree the content treeto which the information will be added ++ * @param counter the counter for determing style for the table row + */ +- public void writeMemberSummaryFooter(ClassDoc classDoc); ++ public void addMemberSummary(ClassDoc classDoc, ProgramElementDoc member, ++ Tag[] firstSentenceTags, Content tableTree, int counter); + + /** +- * Write the inherited member summary header for the given class. ++ * Get the inherited member summary header for the given class. + * +- * @param classDoc the class the summary belongs to. ++ * @param classDoc the class the summary belongs to ++ * @return a content tree containing the inherited summary header + */ +- public void writeInheritedMemberSummaryHeader(ClassDoc classDoc); ++ public Content getInheritedSummaryHeader(ClassDoc classDoc); + + /** +- * Write the inherited member summary for the given class and member. ++ * Add the inherited member summary for the given class and member. + * +- * @param classDoc the class the inherited member belongs to. +- * @param member the inherited member that I am summarizing. +- * @param isFirst true if this is the first member in the list. +- * @param isLast true if this is the last member in the list. ++ * @param classDoc the class the inherited member belongs to ++ * @param member the inherited member that is being documented ++ * @param isFirst true if this is the first member in the list ++ * @param isLast true if this is the last member in the list ++ * @param linksTree the content tree to which the links will be added + */ +- public void writeInheritedMemberSummary(ClassDoc classDoc, +- ProgramElementDoc member, boolean isFirst, boolean isLast); ++ public void addInheritedMemberSummary(ClassDoc classDoc, ++ ProgramElementDoc member, boolean isFirst, boolean isLast, ++ Content linksTree); + + /** +- * Write the inherited member summary footer for the given class. ++ * Get inherited summary links. + * +- * @param classDoc the class the summary belongs to. ++ * @return a content tree conatining the inherited summary links + */ +- public void writeInheritedMemberSummaryFooter(ClassDoc classDoc); ++ public Content getInheritedSummaryLinksTree(); ++ ++ /** ++ * Get the member tree. ++ * ++ * @param memberTree the content tree representating the member ++ * @return a content tree for the member ++ */ ++ public Content getMemberTree(Content memberTree); + + /** + * Close the writer. +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java +@@ -36,68 +36,81 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + + public interface MethodWriter { + + /** +- * Write the header for the method documentation. ++ * Get the method details tree header. + * +- * @param classDoc the class that the methods belong to. +- * @param header the header to write. ++ * @param classDoc the class being documented ++ * @param memberDetailsTree the content tree representing member details ++ * @return content tree for the method details header + */ +- public void writeHeader(ClassDoc classDoc, String header); ++ public Content getMethodDetailsTreeHeader(ClassDoc classDoc, ++ Content memberDetailsTree); + + /** +- * Write the method header for the given method. ++ * Get the method documentation tree header. + * +- * @param method the method being documented. +- * @param isFirst the flag to indicate whether or not the method is the +- * first to be documented. ++ * @param method the method being documented ++ * @param methodDetailsTree the content tree representing method details ++ * @return content tree for the method documentation header + */ +- public void writeMethodHeader(MethodDoc method, boolean isFirst); ++ public Content getMethodDocTreeHeader(MethodDoc method, ++ Content methodDetailsTree); + + /** +- * Write the signature for the given method. ++ * Get the signature for the given method. + * +- * @param method the method being documented. ++ * @param method the method being documented ++ * @return content tree for the method signature + */ +- public void writeSignature(MethodDoc method); ++ public Content getSignature(MethodDoc method); + + /** +- * Write the deprecated output for the given method. ++ * Add the deprecated output for the given method. + * +- * @param method the method being documented. ++ * @param method the method being documented ++ * @param methodDocTree content tree to which the deprecated information will be added + */ +- public void writeDeprecated(MethodDoc method); ++ public void addDeprecated(MethodDoc method, Content methodDocTree); + + /** +- * Write the comments for the given method. ++ * Add the comments for the given method. + * +- * @param holder the holder type (not erasure) of the method. +- * @param method the method being documented. ++ * @param holder the holder type (not erasure) of the method ++ * @param method the method being documented ++ * @param methodDocTree the content tree to which the comments will be added + */ +- public void writeComments(Type holder, MethodDoc method); ++ public void addComments(Type holder, MethodDoc method, Content methodDocTree); + + /** +- * Write the tag output for the given method. ++ * Add the tags for the given method. + * +- * @param method the method being documented. ++ * @param method the method being documented ++ * @param methodDocTree the content tree to which the tags will be added + */ +- public void writeTags(MethodDoc method); ++ public void addTags(MethodDoc method, Content methodDocTree); + + /** +- * Write the method footer. ++ * Get the method details tree. ++ * ++ * @param methodDetailsTree the content tree representing method details ++ * @return content tree for the method details + */ +- public void writeMethodFooter(); ++ public Content getMethodDetails(Content methodDetailsTree); + + /** +- * Write the footer for the method documentation. ++ * Get the method documentation. + * +- * @param classDoc the class that the methods belong to. ++ * @param methodDocTree the content tree representing method documentation ++ * @param isLastContent true if the content to be added is the last content ++ * @return content tree for the method documentation + */ +- public void writeFooter(ClassDoc classDoc); ++ public Content getMethodDoc(Content methodDocTree, boolean isLastContent); + + /** + * Close the writer. +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java +@@ -26,7 +26,6 @@ + package com.sun.tools.doclets.internal.toolkit; + + import java.io.*; +-import com.sun.javadoc.*; + + /** + * The interface for writing class output. +@@ -36,59 +35,13 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + + public interface NestedClassWriter { + + /** +- * Write the classes summary header for the given class. +- * +- * @param nestedClass the class the summary belongs to. +- */ +- public void writeNestedClassSummaryHeader(ClassDoc nestedClass); +- +- /** +- * Write the class summary for the given class and class. +- * +- * @param classDoc the class the summary belongs to. +- * @param nestedClass the nested class that I am summarizing. +- */ +- public void writeNestedClassSummary(ClassDoc classDoc, ClassDoc nestedClass); +- +- /** +- * Write the classes summary footer for the given class. +- * +- * @param nestedClass the class the summary belongs to. +- */ +- public void writeNestedClassSummaryFooter(ClassDoc nestedClass); +- +- /** +- * Write the inherited classes summary header for the given class. +- * +- * @param nestedClass the class the summary belongs to. +- */ +- public void writeInheritedNestedClassSummaryHeader(ClassDoc nestedClass); +- +- /** +- * Write the inherited nested class summary for the given class and nested +- * class. +- * +- * @param classDoc the class the inherited nested class belongs to. +- * @param nestedClass the inherited nested class that I am summarizing. +- * @param isFirst true if this is the first member in the list. +- */ +- public void writeInheritedNestedClassSummary(ClassDoc classDoc, +- ClassDoc nestedClass, boolean isFirst); +- +- /** +- * Write the inherited classes summary footer for the given class. +- * +- * @param nestedClass the class the summary belongs to. +- */ +- public void writeInheritedNestedClassSummaryFooter(ClassDoc nestedClass); +- +- /** + * Close the writer. + */ + public void close() throws IOException; +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java +@@ -36,6 +36,7 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + +@@ -49,45 +50,70 @@ + public abstract String getOutputFileName(); + + /** +- * Write the header for the package summary. ++ * Get the header for the summary. ++ * ++ * @param heading Package name. ++ * @return the header to be added to the content tree + */ +- public abstract void writeSummaryHeader(); ++ public abstract Content getPackageHeader(String heading); + + /** +- * Write the footer for the package summary. ++ * Get the header for the package content. ++ * ++ * @return a content tree for the package content header + */ +- public abstract void writeSummaryFooter(); ++ public abstract Content getContentHeader(); + + /** +- * Write the table of classes in this package. ++ * Get the header for the package summary. ++ * ++ * @return a content tree with the package summary header ++ */ ++ public abstract Content getSummaryHeader(); ++ ++ /** ++ * Adds the table of classes to the documentation tree. + * + * @param classes the array of classes to document. + * @param label the label for this table. ++ * @param tableSummary the summary string for the table ++ * @param tableHeader array of table headers ++ * @param summaryContentTree the content tree to which the summaries will be added + */ +- public abstract void writeClassesSummary(ClassDoc[] classes, String label, String tableSummary, String[] tableHeader); ++ public abstract void addClassesSummary(ClassDoc[] classes, String label, ++ String tableSummary, String[] tableHeader, Content summaryContentTree); + + /** +- * Write the header for the summary. ++ * Adds the package description from the "packages.html" file to the documentation ++ * tree. + * +- * @param heading Package name. ++ * @param packageContentTree the content tree to which the package description ++ * will be added + */ +- public abstract void writePackageHeader(String heading); ++ public abstract void addPackageDescription(Content packageContentTree); + + /** +- * Print the package description from the "packages.html" file. ++ * Adds the tag information from the "packages.html" file to the documentation ++ * tree. ++ * ++ * @param packageContentTree the content tree to which the package tags will ++ * be added + */ +- public abstract void writePackageDescription(); ++ public abstract void addPackageTags(Content packageContentTree); + + /** +- * Print the tag information from the "packages.html" file. ++ * Adds the footer to the documentation tree. ++ * ++ * @param contentTree the tree to which the footer will be added + */ +- public abstract void writePackageTags(); ++ public abstract void addPackageFooter(Content contentTree); + + /** +- * Write the footer for the summary. ++ * Print the package summary document. + * ++ * @param contentTree the content tree that will be printed + */ +- public abstract void writePackageFooter(); ++ public abstract void printDocument(Content contentTree); + + /** + * Close the writer. +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java +@@ -43,33 +43,73 @@ + public interface SerializedFormWriter { + + /** +- * Write the given header. ++ * Get the header. + * + * @param header the header to write. ++ * @return the header content tree + */ +- public void writeHeader(String header); ++ public Content getHeader(String header); + + /** +- * Write the given package header. ++ * Get the serialized form summaries header. + * +- * @param packageName the package header to write. ++ * @return the serialized form summary header tree + */ +- public void writePackageHeader(String packageName); ++ public Content getSerializedSummariesHeader(); + + /** +- * Write the heading for the serializable class. ++ * Get the package serialized form header. + * +- * @param classDoc the class being processed. ++ * @return the package serialized form header tree + */ +- public void writeClassHeader(ClassDoc classDoc); ++ public Content getPackageSerializedHeader(); + + /** +- * Write the serial UID info. ++ * Get the given package header. ++ * ++ * @param packageName the package header to write ++ * @return a content tree for the package header ++ */ ++ public Content getPackageHeader(String packageName); ++ ++ /** ++ * Get the serialized class header. ++ * ++ * @return a content tree for the serialized class header ++ */ ++ public Content getClassSerializedHeader(); ++ ++ /** ++ * Get the heading for the serializable class. ++ * ++ * @param classDoc the class being processed ++ * @return a content tree for the class heading ++ */ ++ public Content getClassHeader(ClassDoc classDoc); ++ ++ /** ++ * Get the serial UID info header. ++ * ++ * @return a content tree for the serial uid info header ++ */ ++ public Content getSerialUIDInfoHeader(); ++ ++ /** ++ * Adds the serial UID info. + * + * @param header the header that will show up before the UID. + * @param serialUID the serial UID to print. ++ * @param serialUidTree the serial UID tree to which the content will be added. + */ +- public void writeSerialUIDInfo(String header, String serialUID); ++ public void addSerialUIDInfo(String header, String serialUID, ++ Content serialUidTree); ++ ++ /** ++ * Get the class serialize content header. ++ * ++ * @return a content tree for the class serialize content header ++ */ ++ public Content getClassContentHeader(); + + /** + * Return an instance of a SerialFieldWriter. +@@ -91,9 +131,26 @@ + public abstract void close() throws IOException; + + /** +- * Write the footer. ++ * Get the serialized content. ++ * ++ * @param serializedTreeContent content for serialized data ++ * @return a content tree for serialized information + */ +- public void writeFooter(); ++ public Content getSerializedContent(Content serializedTreeContent); ++ ++ /** ++ * Add the footer. ++ * ++ * @param serializedTree the serialized tree to be added ++ */ ++ public void addFooter(Content serializedTree); ++ ++ /** ++ * Print the serialized form document. ++ * ++ * @param serializedTree the content tree that will be printed ++ */ ++ public abstract void printDocument(Content serializedTree); + + /** + * Write the serialized form for a given field. +@@ -101,56 +158,73 @@ + public interface SerialFieldWriter { + + /** +- * Write the given heading. ++ * Get the serializable field header. ++ * ++ * @return serialized fields header content tree ++ */ ++ public Content getSerializableFieldsHeader(); ++ ++ /** ++ * Get the field content header. ++ * ++ * @param isLastContent true if this is the last content to be documented ++ * @return fields header content tree ++ */ ++ public Content getFieldsContentHeader(boolean isLastContent); ++ ++ /** ++ * Get the fields content. + * + * @param heading the heading to write. ++ * @param contentTree content tree to which the heading will be added ++ * @return serializable fields content tree + */ +- public void writeHeader(String heading); ++ public Content getSerializableFields(String heading, Content contentTree); + + /** +- * Write the deprecated information for this member. ++ * Adds the deprecated information for this member. + * + * @param field the field to document. ++ * @param contentTree content tree to which the deprecated information will be added + */ +- public void writeMemberDeprecatedInfo(FieldDoc field); ++ public void addMemberDeprecatedInfo(FieldDoc field, Content contentTree); + + /** +- * Write the description text for this member. ++ * Adds the description text for this member. + * + * @param field the field to document. ++ * @param contentTree content tree to which the member description will be added + */ +- public void writeMemberDescription(FieldDoc field); ++ public void addMemberDescription(FieldDoc field, Content contentTree); + + /** +- * Write the description text for this member represented by the tag. ++ * Adds the description text for this member represented by the tag. + * + * @param serialFieldTag the field to document (represented by tag). ++ * @param contentTree content tree to which the member description will be added + */ +- public void writeMemberDescription(SerialFieldTag serialFieldTag); ++ public void addMemberDescription(SerialFieldTag serialFieldTag, Content contentTree); + + /** +- * Write the tag information for this member. ++ * Adds the tag information for this member. + * + * @param field the field to document. ++ * @param contentTree content tree to which the member tags will be added + */ +- public void writeMemberTags(FieldDoc field); ++ public void addMemberTags(FieldDoc field, Content contentTree); + + /** +- * Write the member header. ++ * Adds the member header. + * + * @param fieldType the type of the field. + * @param fieldTypeStr the type of the field in string format. We will + * print this out if we can't link to the type. + * @param fieldDimensions the dimensions of the field. + * @param fieldName the name of the field. ++ * @param contentTree content tree to which the member header will be added + */ +- public void writeMemberHeader(ClassDoc fieldType, String fieldTypeStr, +- String fieldDimensions, String fieldName); +- +- /** +- * Write the member footer. +- */ +- public void writeMemberFooter(); ++ public void addMemberHeader(ClassDoc fieldType, String fieldTypeStr, ++ String fieldDimensions, String fieldName, Content contentTree); + + /** + * Check to see if overview details should be printed. If +@@ -162,13 +236,6 @@ + * @return true if overview details need to be printed + */ + public boolean shouldPrintOverview(FieldDoc field); +- +- /** +- * Write the footer. +- * +- * @param heading the heading that was written. +- */ +- public void writeFooter (String heading); + } + + /** +@@ -177,44 +244,70 @@ + public interface SerialMethodWriter { + + /** ++ * Get the serializable method header. ++ * ++ * @return serializable methods content tree ++ */ ++ public Content getSerializableMethodsHeader(); ++ ++ /** ++ * Get the method content header. ++ * ++ * @param isLastContent true if this is the last content to be documented ++ * @return methods content tree ++ */ ++ public Content getMethodsContentHeader(boolean isLastContent); ++ ++ /** + * Write the given heading. + * +- * @param heading the heading to write. ++ * @param heading the heading to write ++ * @param serializableMethodTree content tree which will be added ++ * @return serializable methods content tree + */ +- public void writeHeader(String heading); ++ public Content getSerializableMethods(String heading, Content serializableMethodTree); + + /** + * Write a warning that no serializable methods exist. + * +- * @param msg the warning to print. ++ * @param msg the warning to print ++ * @return no customization message tree + */ +- public void writeNoCustomizationMsg(String msg); ++ public Content getNoCustomizationMsg(String msg); + + /** +- * Write the header. ++ * Adds the header. + * +- * @param member the member to write the header for. ++ * @param member the member to write the header for ++ * @param methodsContentTree content tree to which the header will be added + */ +- public void writeMemberHeader(MethodDoc member); ++ public void addMemberHeader(MethodDoc member, Content methodsContentTree); + + /** +- * Write the footer. ++ * Adds the deprecated information for this member. ++ * ++ * @param member the member to write the deprecated information for ++ * @param methodsContentTree content tree to which the deprecated ++ * information will be added + */ +- public void writeMemberFooter(); ++ public void addDeprecatedMemberInfo(MethodDoc member, Content methodsContentTree); + + /** +- * Write the deprecated information for this member. ++ * Adds the description for this member. ++ * ++ * @param member the member to write the information for ++ * @param methodsContentTree content tree to which the member ++ * information will be added + */ +- public void writeDeprecatedMemberInfo(MethodDoc member); ++ public void addMemberDescription(MethodDoc member, Content methodsContentTree); + + /** +- * Write the description for this member. ++ * Adds the tag information for this member. ++ * ++ * @param member the member to write the tags information for ++ * @param methodsContentTree content tree to which the tags ++ * information will be added + */ +- public void writeMemberDescription(MethodDoc member); +- +- /** +- * Write the tag information for this member. +- */ +- public void writeMemberTags(MethodDoc member); ++ public void addMemberTags(MethodDoc member, Content methodsContentTree); + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java +@@ -95,13 +95,14 @@ + * Build the documentation, as specified by the given XML element. + * + * @param node the XML element that specifies which component to document. ++ * @param contentTree content tree to which the documentation will be added + */ + protected void build(XMLNode node) { + String component = node.name; + try { + invokeMethod("build" + component, +- new Class<?>[] { XMLNode.class }, +- new Object[] { node }); ++ new Class<?>[]{XMLNode.class, Content.class}, ++ new Object[]{node, contentTree}); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + configuration.root.printError("Unknown element: " + component); +@@ -111,8 +112,8 @@ + } catch (Exception e) { + e.printStackTrace(); + configuration.root.printError("Exception " + +- e.getClass().getName() + +- " thrown while processing element: " + component); ++ e.getClass().getName() + ++ " thrown while processing element: " + component); + throw new DocletAbortException(); + } + } +@@ -121,10 +122,11 @@ + * Build the documentation, as specified by the children of the given XML element. + * + * @param node the XML element that specifies which components to document. ++ * @param contentTree content tree to which the documentation will be added + */ +- protected void buildChildren(XMLNode node) { +- for (XMLNode child: node.children) +- build(child); ++ protected void buildChildren(XMLNode node, Content contentTree) { ++ for (XMLNode child : node.children) ++ build(child, contentTree); + } + + /** +@@ -140,8 +142,7 @@ + Object[] params) + throws Exception { + if (DEBUG) { +- configuration.root.printError("DEBUG: " + this.getClass().getName() +- + "." + methodName); ++ configuration.root.printError("DEBUG: " + this.getClass().getName() + "." + methodName); + } + Method method = this.getClass().getMethod(methodName, paramClasses); + method.invoke(this, params); +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java +@@ -27,6 +27,7 @@ + + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.internal.toolkit.util.*; ++import java.util.*; + + /** + * The superclass for all member builders. Member builders are only executed +@@ -66,12 +67,13 @@ + /** + * Build the sub component if there is anything to document. + * +- * @param elements {@inheritDoc} ++ * @param node the XML element that specifies which components to document. ++ * @param contentTree content tree to which the documentation will be added + */ + @Override +- public void build(XMLNode node) { ++ public void build(XMLNode node, Content contentTree) { + if (hasMembersToDocument()) { +- super.build(node); ++ super.build(node, contentTree); + } + } + +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -25,11 +25,11 @@ + + package com.sun.tools.doclets.internal.toolkit.builders; + ++import java.io.*; ++import java.util.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +-import java.io.*; +-import java.util.*; + + /** + * Builds the summary for a given annotation type. +@@ -39,6 +39,7 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + public class AnnotationTypeBuilder extends AbstractBuilder { +@@ -59,6 +60,11 @@ + private AnnotationTypeWriter writer; + + /** ++ * The content tree for the annotation documentation. ++ */ ++ private Content contentTree; ++ ++ /** + * Construct a new ClassBuilder. + * + * @param configuration the current configuration of the +@@ -83,7 +89,7 @@ + builder.annotationTypeDoc = annotationTypeDoc; + builder.writer = writer; + if(containingPackagesSeen == null) { +- containingPackagesSeen = new HashSet(); ++ containingPackagesSeen = new HashSet<String>(); + } + return builder; + } +@@ -92,7 +98,7 @@ + * {@inheritDoc} + */ + public void build() throws IOException { +- build(LayoutParser.getInstance(configuration).parseXML(ROOT)); ++ build(LayoutParser.getInstance(configuration).parseXML(ROOT), contentTree); + } + + /** +@@ -102,18 +108,24 @@ + return ROOT; + } + +- /** +- * Handles the <AnnotationTypeDoc> tag. ++ /** ++ * Build the annotation type documentation. + * +- * @param elements the XML elements that specify how to document a class. ++ * @param node the XML element that specifies which components to document ++ * @param contentTree the content tree to which the documentation will be added + */ +- public void buildAnnotationTypeDoc(XMLNode node) throws Exception { +- buildChildren(node); +- writer.close(); +- copyDocFiles(); ++ public void buildAnnotationTypeDoc(XMLNode node, Content contentTree) throws Exception { ++ contentTree = writer.getHeader(configuration.getText("doclet.AnnotationType") + ++ " " + annotationTypeDoc.name()); ++ Content annotationContentTree = writer.getAnnotationContentHeader(); ++ buildChildren(node, annotationContentTree); ++ contentTree.addContent(annotationContentTree); ++ writer.addFooter(contentTree); ++ writer.printDocument(contentTree); ++ writer.close(); ++ copyDocFiles(); + } + +- + /** + * Copy the doc files for the current ClassDoc if necessary. + */ +@@ -137,86 +149,112 @@ + } + + /** +- * Build the header of the page. ++ * Build the annotation information tree documentation. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param annotationContentTree the content tree to which the documentation will be added + */ +- public void buildAnnotationTypeHeader(XMLNode node) { +- writer.writeHeader(configuration.getText("doclet.AnnotationType") + +- " " + annotationTypeDoc.name()); ++ public void buildAnnotationTypeInfo(XMLNode node, Content annotationContentTree) { ++ Content annotationInfoTree = writer.getAnnotationInfoTreeHeader(); ++ buildChildren(node, annotationInfoTree); ++ annotationContentTree.addContent(writer.getAnnotationInfo(annotationInfoTree)); + } + + /** +- * If this class is deprecated, print the appropriate information. ++ * If this annotation is deprecated, build the appropriate information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param annotationInfoTree the content tree to which the documentation will be added + */ +- public void buildDeprecationInfo (XMLNode node) { +- writer.writeAnnotationTypeDeprecationInfo(); ++ public void buildDeprecationInfo (XMLNode node, Content annotationInfoTree) { ++ writer.addAnnotationTypeDeprecationInfo(annotationInfoTree); + } + + /** + * Build the signature of the current annotation type. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param annotationInfoTree the content tree to which the documentation will be added + */ +- public void buildAnnotationTypeSignature(XMLNode node) { ++ public void buildAnnotationTypeSignature(XMLNode node, Content annotationInfoTree) { + StringBuffer modifiers = new StringBuffer( +- annotationTypeDoc.modifiers() + " "); +- writer.writeAnnotationTypeSignature( +- Util.replaceText( +- modifiers.toString(), "interface", "@interface")); ++ annotationTypeDoc.modifiers() + " "); ++ writer.addAnnotationTypeSignature(Util.replaceText( ++ modifiers.toString(), "interface", "@interface"), annotationInfoTree); + } + + /** +- * Build the class description. ++ * Build the annotation type description. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param annotationInfoTree the content tree to which the documentation will be added + */ +- public void buildAnnotationTypeDescription(XMLNode node) { +- writer.writeAnnotationTypeDescription(); ++ public void buildAnnotationTypeDescription(XMLNode node, Content annotationInfoTree) { ++ writer.addAnnotationTypeDescription(annotationInfoTree); + } + + /** +- * Build the tag information for the current class. ++ * Build the tag information for the current annotation type. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param annotationInfoTree the content tree to which the documentation will be added + */ +- public void buildAnnotationTypeTagInfo(XMLNode node) { +- writer.writeAnnotationTypeTagInfo(); ++ public void buildAnnotationTypeTagInfo(XMLNode node, Content annotationInfoTree) { ++ writer.addAnnotationTypeTagInfo(annotationInfoTree); + } + + /** +- * Build the contents of the page. ++ * Build the member summary contents of the page. + * +- * @param elements the XML elements that specify how a member summary is +- * documented. ++ * @param node the XML element that specifies which components to document ++ * @param annotationContentTree the content tree to which the documentation will be added + */ +- public void buildMemberSummary(XMLNode node) throws Exception { ++ public void buildMemberSummary(XMLNode node, Content annotationContentTree) ++ throws Exception { ++ Content memberSummaryTree = writer.getMemberTreeHeader(); + configuration.getBuilderFactory(). +- getMemberSummaryBuilder(writer).buildChildren(node); +- writer.completeMemberSummaryBuild(); ++ getMemberSummaryBuilder(writer).buildChildren(node, memberSummaryTree); ++ annotationContentTree.addContent(writer.getMemberSummaryTree(memberSummaryTree)); ++ } ++ ++ /** ++ * Build the member details contents of the page. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param annotationContentTree the content tree to which the documentation will be added ++ */ ++ public void buildAnnotationTypeMemberDetails(XMLNode node, Content annotationContentTree) { ++ Content memberDetailsTree = writer.getMemberTreeHeader(); ++ buildChildren(node, memberDetailsTree); ++ if (memberDetailsTree.isValid()) { ++ Content memberDetails = writer.getMemberTreeHeader(); ++ writer.addAnnotationDetailsMarker(memberDetails); ++ memberDetails.addContent(writer.getMemberTree(memberDetailsTree)); ++ annotationContentTree.addContent(writer.getMemberDetailsTree(memberDetails)); ++ } + } + + /** + * Build the annotation type optional member documentation. + * +- * @param elements the XML elements that specify how a annotation type +- * members are documented. ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added + */ +- public void buildAnnotationTypeOptionalMemberDetails(XMLNode node) +- throws Exception { ++ public void buildAnnotationTypeOptionalMemberDetails(XMLNode node, Content memberDetailsTree) ++ throws Exception { + configuration.getBuilderFactory(). +- getAnnotationTypeOptionalMemberBuilder(writer).buildChildren(node); ++ getAnnotationTypeOptionalMemberBuilder(writer).buildChildren(node, memberDetailsTree); + } + + /** + * Build the annotation type required member documentation. + * +- * @param elements the XML elements that specify how a annotation type +- * members are documented. ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added + */ +- public void buildAnnotationTypeRequiredMemberDetails(XMLNode node) +- throws Exception { ++ public void buildAnnotationTypeRequiredMemberDetails(XMLNode node, Content memberDetailsTree) ++ throws Exception { + configuration.getBuilderFactory(). +- getAnnotationTypeRequiredMemberBuilder(writer).buildChildren(node); +- } +- +- +- /** +- * Build the footer of the page. +- */ +- public void buildAnnotationTypeFooter(XMLNode node) { +- writer.writeFooter(); ++ getAnnotationTypeRequiredMemberBuilder(writer).buildChildren(node, memberDetailsTree); + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java +@@ -25,11 +25,10 @@ + + package com.sun.tools.doclets.internal.toolkit.builders; + +- ++import java.util.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +-import java.util.*; + + /** + * Builds documentation for optional annotation type members. +@@ -39,6 +38,7 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + public class AnnotationTypeOptionalMemberBuilder extends +@@ -90,27 +90,25 @@ + } + + /** +- * Build the member documentation. ++ * Build the annotation type optional member documentation. + * +- * @param elements the XML elements that specify how to construct this +- * documentation. ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added + */ +- public void buildAnnotationTypeOptionalMember(XMLNode node) { +- if (writer == null) { +- return; +- } +- for (currentMemberIndex = 0; currentMemberIndex < members.size(); +- currentMemberIndex++) { +- buildChildren(node); +- } ++ public void buildAnnotationTypeOptionalMember(XMLNode node, Content memberDetailsTree) { ++ buildAnnotationTypeMember(node, memberDetailsTree); + } + + /** +- * Document the default value for this optional member. ++ * Build the default value for this optional member. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param annotationDocTree the content tree to which the documentation will be added + */ +- public void buildDefaultValueInfo(XMLNode node) { +- ((AnnotationTypeOptionalMemberWriter) writer).writeDefaultValueInfo( +- (MemberDoc) members.get(currentMemberIndex)); ++ public void buildDefaultValueInfo(XMLNode node, Content annotationDocTree) { ++ ((AnnotationTypeOptionalMemberWriter) writer).addDefaultValueInfo( ++ (MemberDoc) members.get(currentMemberIndex), ++ annotationDocTree); + } + + /** +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java +@@ -25,11 +25,10 @@ + + package com.sun.tools.doclets.internal.toolkit.builders; + +- ++import java.util.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +-import java.util.*; + + /** + * Builds documentation for required annotation type members. +@@ -39,6 +38,7 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + public class AnnotationTypeRequiredMemberBuilder extends AbstractMemberBuilder { +@@ -141,81 +141,86 @@ + } + + /** ++ * Build the annotation type required member documentation. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added ++ */ ++ public void buildAnnotationTypeRequiredMember(XMLNode node, Content memberDetailsTree) { ++ buildAnnotationTypeMember(node, memberDetailsTree); ++ } ++ ++ /** + * Build the member documentation. + * +- * @param elements the XML elements that specify how to construct this +- * documentation. ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added + */ +- public void buildAnnotationTypeRequiredMember(XMLNode node) { ++ public void buildAnnotationTypeMember(XMLNode node, Content memberDetailsTree) { + if (writer == null) { + return; + } +- for (currentMemberIndex = 0; currentMemberIndex < members.size(); ++ int size = members.size(); ++ if (size > 0) { ++ writer.addAnnotationDetailsTreeHeader( ++ classDoc, memberDetailsTree); ++ for (currentMemberIndex = 0; currentMemberIndex < size; + currentMemberIndex++) { +- buildChildren(node); +- } +- } +- +- /** +- * Build the overall header. +- */ +- public void buildHeader(XMLNode node) { +- writer.writeHeader(classDoc, +- configuration.getText("doclet.Annotation_Type_Member_Detail")); +- } +- +- /** +- * Build the header for the individual members. +- */ +- public void buildMemberHeader(XMLNode node) { +- writer.writeMemberHeader((MemberDoc) members.get( +- currentMemberIndex), +- currentMemberIndex == 0); ++ Content annotationDocTree = writer.getAnnotationDocTreeHeader( ++ (MemberDoc) members.get(currentMemberIndex), ++ memberDetailsTree); ++ buildChildren(node, annotationDocTree); ++ memberDetailsTree.addContent(writer.getAnnotationDoc( ++ annotationDocTree, (currentMemberIndex == size - 1))); ++ } ++ } + } + + /** + * Build the signature. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param annotationDocTree the content tree to which the documentation will be added + */ +- public void buildSignature(XMLNode node) { +- writer.writeSignature((MemberDoc) members.get(currentMemberIndex)); ++ public void buildSignature(XMLNode node, Content annotationDocTree) { ++ annotationDocTree.addContent( ++ writer.getSignature((MemberDoc) members.get(currentMemberIndex))); + } + + /** + * Build the deprecation information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param annotationDocTree the content tree to which the documentation will be added + */ +- public void buildDeprecationInfo(XMLNode node) { +- writer.writeDeprecated((MemberDoc) members.get(currentMemberIndex)); ++ public void buildDeprecationInfo(XMLNode node, Content annotationDocTree) { ++ writer.addDeprecated((MemberDoc) members.get(currentMemberIndex), ++ annotationDocTree); + } + + /** + * Build the comments for the member. Do nothing if + * {@link Configuration#nocomment} is set to true. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param annotationDocTree the content tree to which the documentation will be added + */ +- public void buildMemberComments(XMLNode node) { ++ public void buildMemberComments(XMLNode node, Content annotationDocTree) { + if(! configuration.nocomment){ +- writer.writeComments((MemberDoc) members.get(currentMemberIndex)); ++ writer.addComments((MemberDoc) members.get(currentMemberIndex), ++ annotationDocTree); + } + } + + /** + * Build the tag information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param annotationDocTree the content tree to which the documentation will be added + */ +- public void buildTagInfo(XMLNode node) { +- writer.writeTags((MemberDoc) members.get(currentMemberIndex)); +- } +- +- /** +- * Build the footer for the individual member. +- */ +- public void buildMemberFooter(XMLNode node) { +- writer.writeMemberFooter(); +- } +- +- /** +- * Build the overall footer. +- */ +- public void buildFooter(XMLNode node) { +- writer.writeFooter(classDoc); ++ public void buildTagInfo(XMLNode node, Content annotationDocTree) { ++ writer.addTags((MemberDoc) members.get(currentMemberIndex), ++ annotationDocTree); + } + + /** +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java +@@ -25,11 +25,11 @@ + + package com.sun.tools.doclets.internal.toolkit.builders; + ++import java.io.*; ++import java.util.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +-import java.io.*; +-import java.util.*; + + /** + * Builds the summary for a given class. +@@ -39,6 +39,7 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + public class ClassBuilder extends AbstractBuilder { +@@ -69,6 +70,11 @@ + private boolean isEnum = false; + + /** ++ * The content tree for the class documentation. ++ */ ++ private Content contentTree; ++ ++ /** + * Construct a new ClassBuilder. + * + * @param configuration the current configuration of the +@@ -108,7 +114,7 @@ + * {@inheritDoc} + */ + public void build() throws IOException { +- build(LayoutParser.getInstance(configuration).parseXML(ROOT)); ++ build(LayoutParser.getInstance(configuration).parseXML(ROOT), contentTree); + } + + /** +@@ -121,121 +127,159 @@ + /** + * Handles the <ClassDoc> tag. + * +- * @param elements the XML elements that specify how to document a class. ++ * @param node the XML element that specifies which components to document ++ * @param contentTree the content tree to which the documentation will be added + */ +- public void buildClassDoc(XMLNode node) throws Exception { +- buildChildren(node); +- writer.close(); +- copyDocFiles(); ++ public void buildClassDoc(XMLNode node, Content contentTree) throws Exception { ++ String key; ++ if (isInterface) { ++ key = "doclet.Interface"; ++ } else if (isEnum) { ++ key = "doclet.Enum"; ++ } else { ++ key = "doclet.Class"; ++ } ++ contentTree = writer.getHeader(configuration.getText(key) + " " + ++ classDoc.name()); ++ Content classContentTree = writer.getClassContentHeader(); ++ buildChildren(node, classContentTree); ++ contentTree.addContent(classContentTree); ++ writer.addFooter(contentTree); ++ writer.printDocument(contentTree); ++ writer.close(); ++ copyDocFiles(); + } + ++ /** ++ * Build the class tree documentation. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classContentTree the content tree to which the documentation will be added ++ */ ++ public void buildClassTree(XMLNode node, Content classContentTree) { ++ writer.addClassTree(classContentTree); ++ } + +- /** +- * Copy the doc files for the current ClassDoc if necessary. +- */ ++ /** ++ * Build the class information tree documentation. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classContentTree the content tree to which the documentation will be added ++ */ ++ public void buildClassInfo(XMLNode node, Content classContentTree) { ++ Content classInfoTree = writer.getClassInfoTreeHeader(); ++ buildChildren(node, classInfoTree); ++ classContentTree.addContent(writer.getClassInfo(classInfoTree)); ++ } ++ ++ /** ++ * Build the typeparameters of this class. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classInfoTree the content tree to which the documentation will be added ++ */ ++ public void buildTypeParamInfo(XMLNode node, Content classInfoTree) { ++ writer.addTypeParamInfo(classInfoTree); ++ } ++ ++ /** ++ * If this is an interface, list all super interfaces. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classInfoTree the content tree to which the documentation will be added ++ */ ++ public void buildSuperInterfacesInfo(XMLNode node, Content classInfoTree) { ++ writer.addSuperInterfacesInfo(classInfoTree); ++ } ++ ++ /** ++ * If this is a class, list all interfaces implemented by this class. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classInfoTree the content tree to which the documentation will be added ++ */ ++ public void buildImplementedInterfacesInfo(XMLNode node, Content classInfoTree) { ++ writer.addImplementedInterfacesInfo(classInfoTree); ++ } ++ ++ /** ++ * List all the classes extend this one. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classInfoTree the content tree to which the documentation will be added ++ */ ++ public void buildSubClassInfo(XMLNode node, Content classInfoTree) { ++ writer.addSubClassInfo(classInfoTree); ++ } ++ ++ /** ++ * List all the interfaces that extend this one. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classInfoTree the content tree to which the documentation will be added ++ */ ++ public void buildSubInterfacesInfo(XMLNode node, Content classInfoTree) { ++ writer.addSubInterfacesInfo(classInfoTree); ++ } ++ ++ /** ++ * If this is an interface, list all classes that implement this interface. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classInfoTree the content tree to which the documentation will be added ++ */ ++ public void buildInterfaceUsageInfo(XMLNode node, Content classInfoTree) { ++ writer.addInterfaceUsageInfo(classInfoTree); ++ } ++ ++ /** ++ * If this class is deprecated, build the appropriate information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classInfoTree the content tree to which the documentation will be added ++ */ ++ public void buildDeprecationInfo (XMLNode node, Content classInfoTree) { ++ writer.addClassDeprecationInfo(classInfoTree); ++ } ++ ++ /** ++ * If this is an inner class or interface, list the enclosing class or interface. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classInfoTree the content tree to which the documentation will be added ++ */ ++ public void buildNestedClassInfo (XMLNode node, Content classInfoTree) { ++ writer.addNestedClassInfo(classInfoTree); ++ } ++ ++ /** ++ * Copy the doc files for the current ClassDoc if necessary. ++ */ + private void copyDocFiles() { + PackageDoc containingPackage = classDoc.containingPackage(); + if((configuration.packages == null || + Arrays.binarySearch(configuration.packages, +- containingPackage) < 0) && +- ! containingPackagesSeen.contains(containingPackage.name())){ ++ containingPackage) < 0) && ++ ! containingPackagesSeen.contains(containingPackage.name())){ + //Only copy doc files dir if the containing package is not + //documented AND if we have not documented a class from the same + //package already. Otherwise, we are making duplicate copies. + Util.copyDocFiles(configuration, +- Util.getPackageSourcePath(configuration, ++ Util.getPackageSourcePath(configuration, + classDoc.containingPackage()) + +- DirectoryManager.getDirectoryPath(classDoc.containingPackage()) ++ DirectoryManager.getDirectoryPath(classDoc.containingPackage()) + + File.separator, DocletConstants.DOC_FILES_DIR_NAME, true); + containingPackagesSeen.add(containingPackage.name()); + } + } + + /** +- * Build the header of the page. ++ * Build the signature of the current class. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classInfoTree the content tree to which the documentation will be added + */ +- public void buildClassHeader(XMLNode node) { +- String key; +- if (isInterface) { +- key = "doclet.Interface"; +- } else if (isEnum) { +- key = "doclet.Enum"; +- } else { +- key = "doclet.Class"; +- } +- +- writer.writeHeader(configuration.getText(key) + " " + classDoc.name()); +- } +- +- /** +- * Build the class tree documentation. +- */ +- public void buildClassTree(XMLNode node) { +- writer.writeClassTree(); +- } +- +- /** +- * If this is a class, list all interfaces +- * implemented by this class. +- */ +- public void buildImplementedInterfacesInfo(XMLNode node) { +- writer.writeImplementedInterfacesInfo(); +- } +- +- /** +- * If this is an interface, list all super interfaces. +- */ +- public void buildSuperInterfacesInfo(XMLNode node) { +- writer.writeSuperInterfacesInfo(); +- } +- +- /** +- * List the parameters of this class. +- */ +- public void buildTypeParamInfo(XMLNode node) { +- writer.writeTypeParamInfo(); +- } +- +- /** +- * List all the classes extend this one. +- */ +- public void buildSubClassInfo(XMLNode node) { +- writer.writeSubClassInfo(); +- } +- +- /** +- * List all the interfaces that extend this one. +- */ +- public void buildSubInterfacesInfo(XMLNode node) { +- writer.writeSubInterfacesInfo(); +- } +- +- /** +- * If this is an interface, list all classes that implement this interface. +- */ +- public void buildInterfaceUsageInfo (XMLNode node) { +- writer.writeInterfaceUsageInfo(); +- } +- +- /** +- * If this is an inner class or interface, list the enclosing class or +- * interface. +- */ +- public void buildNestedClassInfo (XMLNode node) { +- writer.writeNestedClassInfo(); +- } +- +- /** +- * If this class is deprecated, print the appropriate information. +- */ +- public void buildDeprecationInfo (XMLNode node) { +- writer.writeClassDeprecationInfo(); +- } +- +- /** +- * Build the signature of the current class. +- */ +- public void buildClassSignature(XMLNode node) { ++ public void buildClassSignature(XMLNode node, Content classInfoTree) { + StringBuffer modifiers = new StringBuffer(classDoc.modifiers() + " "); + if (isEnum) { + modifiers.append("enum "); +@@ -243,93 +287,111 @@ + if ((index = modifiers.indexOf("abstract")) >= 0) { + modifiers.delete(index, index + (new String("abstract")).length()); + modifiers = new StringBuffer( +- Util.replaceText(modifiers.toString(), " ", " ")); ++ Util.replaceText(modifiers.toString(), " ", " ")); + } + if ((index = modifiers.indexOf("final")) >= 0) { + modifiers.delete(index, index + (new String("final")).length()); + modifiers = new StringBuffer( +- Util.replaceText(modifiers.toString(), " ", " ")); ++ Util.replaceText(modifiers.toString(), " ", " ")); + } + //} else if (classDoc.isAnnotationType()) { + //modifiers.append("@interface "); + } else if (! isInterface) { + modifiers.append("class "); + } +- writer.writeClassSignature(modifiers.toString()); ++ writer.addClassSignature(modifiers.toString(), classInfoTree); + } + + /** + * Build the class description. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classInfoTree the content tree to which the documentation will be added + */ +- public void buildClassDescription(XMLNode node) { +- writer.writeClassDescription(); ++ public void buildClassDescription(XMLNode node, Content classInfoTree) { ++ writer.addClassDescription(classInfoTree); + } + + /** + * Build the tag information for the current class. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classInfoTree the content tree to which the documentation will be added + */ +- public void buildClassTagInfo(XMLNode node) { +- writer.writeClassTagInfo(); ++ public void buildClassTagInfo(XMLNode node, Content classInfoTree) { ++ writer.addClassTagInfo(classInfoTree); + } + + /** +- * Build the contents of the page. ++ * Build the member summary contents of the page. + * +- * @param elements the XML elements that specify how a member summary is +- * documented. ++ * @param node the XML element that specifies which components to document ++ * @param classContentTree the content tree to which the documentation will be added + */ +- public void buildMemberSummary(List elements) throws Exception { ++ public void buildMemberSummary(XMLNode node, Content classContentTree) throws Exception { ++ Content memberSummaryTree = writer.getMemberTreeHeader(); + configuration.getBuilderFactory(). +- getMemberSummaryBuilder(writer).buildChildren(node); +- writer.completeMemberSummaryBuild(); ++ getMemberSummaryBuilder(writer).buildChildren(node, memberSummaryTree); ++ classContentTree.addContent(writer.getMemberSummaryTree(memberSummaryTree)); ++ } ++ ++ /** ++ * Build the member details contents of the page. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classContentTree the content tree to which the documentation will be added ++ */ ++ public void buildMemberDetails(XMLNode node, Content classContentTree) { ++ Content memberDetailsTree = writer.getMemberTreeHeader(); ++ buildChildren(node, memberDetailsTree); ++ classContentTree.addContent(writer.getMemberDetailsTree(memberDetailsTree)); + } + + /** + * Build the enum constants documentation. + * +- * @param elements the XML elements that specify how a enum constants are +- * documented. ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added + */ +- public void buildEnumConstantsDetails(XMLNode node) throws Exception { ++ public void buildEnumConstantsDetails(XMLNode node, ++ Content memberDetailsTree) throws Exception { + configuration.getBuilderFactory(). +- getEnumConstantsBuilder(writer).buildChildren(node); ++ getEnumConstantsBuilder(writer).buildChildren(node, memberDetailsTree); + } + + /** + * Build the field documentation. + * +- * @param elements the XML elements that specify how a field is documented. ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added + */ +- public void buildFieldDetails(XMLNode node) throws Exception { ++ public void buildFieldDetails(XMLNode node, ++ Content memberDetailsTree) throws Exception { + configuration.getBuilderFactory(). +- getFieldBuilder(writer).buildChildren(node); ++ getFieldBuilder(writer).buildChildren(node, memberDetailsTree); + } + + /** + * Build the constructor documentation. + * +- * @param elements the XML elements that specify how to document a +- * constructor. ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added + */ +- public void buildConstructorDetails(XMLNode node) throws Exception { ++ public void buildConstructorDetails(XMLNode node, ++ Content memberDetailsTree) throws Exception { + configuration.getBuilderFactory(). +- getConstructorBuilder(writer).buildChildren(node); ++ getConstructorBuilder(writer).buildChildren(node, memberDetailsTree); + } + + /** + * Build the method documentation. + * +- * @param elements the XML elements that specify how a method is documented. ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added + */ +- public void buildMethodDetails(XMLNode node) throws Exception { ++ public void buildMethodDetails(XMLNode node, ++ Content memberDetailsTree) throws Exception { + configuration.getBuilderFactory(). +- getMethodBuilder(writer).buildChildren(node); +- } +- +- /** +- * Build the footer of the page. +- */ +- public void buildClassFooter(XMLNode node) { +- writer.writeFooter(); ++ getMethodBuilder(writer).buildChildren(node, memberDetailsTree); + } + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java +@@ -25,11 +25,11 @@ + + package com.sun.tools.doclets.internal.toolkit.builders; + ++import java.io.*; ++import java.util.*; ++import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; +-import com.sun.javadoc.*; +-import java.io.*; +-import java.util.*; + + /** + * Builds the Constants Summary Page. +@@ -39,6 +39,7 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + public class ConstantsSummaryBuilder extends AbstractBuilder { +@@ -80,6 +81,11 @@ + private ClassDoc currentClass; + + /** ++ * The content tree for the constant summary documentation. ++ */ ++ private Content contentTree; ++ ++ /** + * Construct a new ConstantsSummaryBuilder. + * + * @param configuration the current configuration of the +@@ -113,7 +119,7 @@ + //Doclet does not support this output. + return; + } +- build(LayoutParser.getInstance(configuration).parseXML(ROOT)); ++ build(LayoutParser.getInstance(configuration).parseXML(ROOT), contentTree); + } + + /** +@@ -126,85 +132,85 @@ + /** + * Build the constant summary. + * +- * @param elements the list of elements describing constant summary +- * documentation. ++ * @param node the XML element that specifies which components to document ++ * @param contentTree the content tree to which the documentation will be added + */ +- public void buildConstantSummary(XMLNode node) throws Exception { +- buildChildren(node); ++ public void buildConstantSummary(XMLNode node, Content contentTree) throws Exception { ++ contentTree = writer.getHeader(); ++ buildChildren(node, contentTree); ++ writer.addFooter(contentTree); ++ writer.printDocument(contentTree); + writer.close(); + } + + /** +- * Build the header. ++ * Build the list of packages. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param contentTree the content tree to which the content list will be added + */ +- public void buildHeader(XMLNode node) { +- writer.writeHeader(); +- } +- +- /** +- * Build the footer. +- */ +- public void buildFooter(XMLNode node) { +- writer.writeFooter(); +- } +- +- /** +- * Build the table of contents. +- */ +- public void buildContents(XMLNode node) { +- writer.writeContentsHeader(); ++ public void buildContents(XMLNode node, Content contentTree) { ++ Content contentListTree = writer.getContentsHeader(); + PackageDoc[] packages = configuration.packages; + printedPackageHeaders = new HashSet(); + for (int i = 0; i < packages.length; i++) { + if (hasConstantField(packages[i]) && ! hasPrintedPackageIndex(packages[i].name())) { +- writer.writeLinkToPackageContent(packages[i], ++ writer.addLinkToPackageContent(packages[i], + parsePackageName(packages[i].name()), +- printedPackageHeaders); ++ printedPackageHeaders, contentListTree); + } + } +- writer.writeContentsFooter(); ++ contentTree.addContent(writer.getContentsList(contentListTree)); + } + + /** + * Build the summary for each documented package. + * +- * @param elements the XML elements that represent the components +- * of documentation for each package. ++ * @param node the XML element that specifies which components to document ++ * @param contentTree the tree to which the summaries will be added + */ +- public void buildConstantSummaries(XMLNode node) { ++ public void buildConstantSummaries(XMLNode node, Content contentTree) { + PackageDoc[] packages = configuration.packages; + printedPackageHeaders = new HashSet(); ++ Content summariesTree = writer.getConstantSummaries(); + for (int i = 0; i < packages.length; i++) { + if (hasConstantField(packages[i])) { + currentPackage = packages[i]; + //Build the documentation for the current package. +- buildChildren(node); ++ buildChildren(node, summariesTree); + } + } ++ contentTree.addContent(summariesTree); + } + + /** +- * Build the summary for the current package. ++ * Build the header for the given package. + * +- * @param elements the list of XML elements that make up package +- * documentation. ++ * @param node the XML element that specifies which components to document ++ * @param summariesTree the tree to which the package header will be added + */ +- public void buildPackageConstantSummary(XMLNode node) { +- buildChildren(node); ++ public void buildPackageHeader(XMLNode node, Content summariesTree) { ++ String parsedPackageName = parsePackageName(currentPackage.name()); ++ if (! printedPackageHeaders.contains(parsedPackageName)) { ++ writer.addPackageName(currentPackage, ++ parsePackageName(currentPackage.name()), summariesTree); ++ printedPackageHeaders.add(parsedPackageName); ++ } + } + + /** + * Build the summary for the current class. + * +- * @param elements the list of XML elements that make up the class +- * constant summary. ++ * @param node the XML element that specifies which components to document ++ * @param summariesTree the tree to which the class constant summary will be added + */ +- public void buildClassConstantSummary(XMLNode node) { ++ public void buildClassConstantSummary(XMLNode node, Content summariesTree) { + ClassDoc[] classes = currentPackage.name().length() > 0 ? + currentPackage.allClasses() : + configuration.classDocCatalog.allClasses( + DocletConstants.DEFAULT_PACKAGE_NAME); + Arrays.sort(classes); ++ Content classConstantTree = writer.getClassConstantHeader(); + for (int i = 0; i < classes.length; i++) { + if (! classDocsWithConstFields.contains(classes[i]) || + ! classes[i].isIncluded()) { +@@ -212,42 +218,20 @@ + } + currentClass = classes[i]; + //Build the documentation for the current class. +- buildChildren(node); ++ buildChildren(node, classConstantTree); + } ++ summariesTree.addContent(classConstantTree); + } + + /** +- * Build the header for the given class. ++ * Build the summary of constant members in the class. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classConstantTree the tree to which the constant members table ++ * will be added + */ +- public void buildPackageHeader(XMLNode node) { +- String parsedPackageName = parsePackageName(currentPackage.name()); +- if (! printedPackageHeaders.contains(parsedPackageName)) { +- writer.writePackageName(currentPackage, +- parsePackageName(currentPackage.name())); +- printedPackageHeaders.add(parsedPackageName); +- } +- } +- +- /** +- * Build the header for the given class. +- */ +- public void buildClassHeader(XMLNode node) { +- writer.writeConstantMembersHeader(currentClass); +- } +- +- /** +- * Print summary of constant members in the +- * class. +- */ +- public void buildConstantMembers(XMLNode node) { +- new ConstantFieldBuilder(currentClass).buildMembersSummary(node); +- } +- +- /** +- * Build the footer for the given class. +- */ +- public void buildClassFooter(XMLNode node) { +- writer.writeConstantMembersFooter(currentClass); ++ public void buildConstantMembers(XMLNode node, Content classConstantTree) { ++ new ConstantFieldBuilder(currentClass).buildMembersSummary(node, classConstantTree); + } + + /** +@@ -346,12 +330,16 @@ + + /** + * Builds the table of constants for a given class. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classConstantTree the tree to which the class constants table ++ * will be added + */ +- protected void buildMembersSummary(XMLNode node) { ++ protected void buildMembersSummary(XMLNode node, Content classConstantTree) { + List members = new ArrayList(members()); + if (members.size() > 0) { + Collections.sort(members); +- writer.writeConstantMembers(classdoc, members); ++ writer.addConstantMembers(classdoc, members, classConstantTree); + } + } + +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java +@@ -25,10 +25,10 @@ + + package com.sun.tools.doclets.internal.toolkit.builders; + ++import java.util.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +-import java.util.*; + + /** + * Builds documentation for a constructor. +@@ -38,202 +38,195 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + public class ConstructorBuilder extends AbstractMemberBuilder { + +- /** +- * The name of this builder. +- */ +- public static final String NAME = "ConstructorDetails"; ++ /** ++ * The name of this builder. ++ */ ++ public static final String NAME = "ConstructorDetails"; + +- /** +- * The index of the current field that is being documented at this point +- * in time. +- */ +- private int currentMethodIndex; ++ /** ++ * The index of the current field that is being documented at this point ++ * in time. ++ */ ++ private int currentConstructorIndex; + +- /** +- * The class whose constructors are being documented. +- */ +- private ClassDoc classDoc; ++ /** ++ * The class whose constructors are being documented. ++ */ ++ private ClassDoc classDoc; + +- /** +- * The visible constructors for the given class. +- */ +- private VisibleMemberMap visibleMemberMap; ++ /** ++ * The visible constructors for the given class. ++ */ ++ private VisibleMemberMap visibleMemberMap; + +- /** +- * The writer to output the constructor documentation. +- */ +- private ConstructorWriter writer; ++ /** ++ * The writer to output the constructor documentation. ++ */ ++ private ConstructorWriter writer; + +- /** +- * The constructors being documented. +- */ +- private List constructors; ++ /** ++ * The constructors being documented. ++ */ ++ private List<ProgramElementDoc> constructors; + +- /** +- * Construct a new ConstructorBuilder. +- * +- * @param configuration the current configuration of the +- * doclet. +- */ +- private ConstructorBuilder(Configuration configuration) { +- super(configuration); ++ /** ++ * Construct a new ConstructorBuilder. ++ * ++ * @param configuration the current configuration of the ++ * doclet. ++ */ ++ private ConstructorBuilder(Configuration configuration) { ++ super(configuration); ++ } ++ ++ /** ++ * Construct a new ConstructorBuilder. ++ * ++ * @param configuration the current configuration of the doclet. ++ * @param classDoc the class whoses members are being documented. ++ * @param writer the doclet specific writer. ++ */ ++ public static ConstructorBuilder getInstance( ++ Configuration configuration, ++ ClassDoc classDoc, ++ ConstructorWriter writer) { ++ ConstructorBuilder builder = new ConstructorBuilder(configuration); ++ builder.classDoc = classDoc; ++ builder.writer = writer; ++ builder.visibleMemberMap = ++ new VisibleMemberMap( ++ classDoc, ++ VisibleMemberMap.CONSTRUCTORS, ++ configuration.nodeprecated); ++ builder.constructors = ++ new ArrayList<ProgramElementDoc>(builder.visibleMemberMap.getMembersFor(classDoc)); ++ for (int i = 0; i < builder.constructors.size(); i++) { ++ if (builder.constructors.get(i).isProtected() ++ || builder.constructors.get(i).isPrivate()) { ++ writer.setFoundNonPubConstructor(true); ++ } ++ } ++ if (configuration.getMemberComparator() != null) { ++ Collections.sort( ++ builder.constructors, ++ configuration.getMemberComparator()); + } ++ return builder; ++ } + +- /** +- * Construct a new ConstructorBuilder. +- * +- * @param configuration the current configuration of the doclet. +- * @param classDoc the class whoses members are being documented. +- * @param writer the doclet specific writer. +- */ +- public static ConstructorBuilder getInstance( +- Configuration configuration, +- ClassDoc classDoc, +- ConstructorWriter writer) { +- ConstructorBuilder builder = new ConstructorBuilder(configuration); +- builder.classDoc = classDoc; +- builder.writer = writer; +- builder.visibleMemberMap = +- new VisibleMemberMap( +- classDoc, +- VisibleMemberMap.CONSTRUCTORS, +- configuration.nodeprecated); +- builder.constructors = +- new ArrayList(builder.visibleMemberMap.getMembersFor(classDoc)); +- for (int i = 0; i < builder.constructors.size(); i++) { +- if (((ProgramElementDoc) (builder.constructors.get(i))) +- .isProtected() +- || ((ProgramElementDoc) (builder.constructors.get(i))) +- .isPrivate()) { +- writer.setFoundNonPubConstructor(true); +- } +- } +- if (configuration.getMemberComparator() != null) { +- Collections.sort( +- builder.constructors, +- configuration.getMemberComparator()); +- } +- return builder; ++ /** ++ * {@inheritDoc} ++ */ ++ public String getName() { ++ return NAME; ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public boolean hasMembersToDocument() { ++ return constructors.size() > 0; ++ } ++ ++ /** ++ * Returns a list of constructors that will be documented for the given class. ++ * This information can be used for doclet specific documentation ++ * generation. ++ * ++ * @return a list of constructors that will be documented. ++ */ ++ public List<ProgramElementDoc> members(ClassDoc classDoc) { ++ return visibleMemberMap.getMembersFor(classDoc); ++ } ++ ++ /** ++ * Return the constructor writer for this builder. ++ * ++ * @return the constructor writer for this builder. ++ */ ++ public ConstructorWriter getWriter() { ++ return writer; ++ } ++ ++ /** ++ * Build the constructor documentation. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added ++ */ ++ public void buildConstructorDoc(XMLNode node, Content memberDetailsTree) { ++ if (writer == null) { ++ return; + } ++ int size = constructors.size(); ++ if (size > 0) { ++ Content constructorDetailsTree = writer.getConstructorDetailsTreeHeader( ++ classDoc, memberDetailsTree); ++ for (currentConstructorIndex = 0; currentConstructorIndex < size; ++ currentConstructorIndex++) { ++ Content constructorDocTree = writer.getConstructorDocTreeHeader( ++ (ConstructorDoc) constructors.get(currentConstructorIndex), ++ constructorDetailsTree); ++ buildChildren(node, constructorDocTree); ++ constructorDetailsTree.addContent(writer.getConstructorDoc( ++ constructorDocTree, (currentConstructorIndex == size - 1))); ++ } ++ memberDetailsTree.addContent( ++ writer.getConstructorDetails(constructorDetailsTree)); ++ } ++ } + +- /** +- * {@inheritDoc} +- */ +- public String getName() { +- return NAME; ++ /** ++ * Build the signature. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param constructorDocTree the content tree to which the documentation will be added ++ */ ++ public void buildSignature(XMLNode node, Content constructorDocTree) { ++ constructorDocTree.addContent( ++ writer.getSignature( ++ (ConstructorDoc) constructors.get(currentConstructorIndex))); ++ } ++ ++ /** ++ * Build the deprecation information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param constructorDocTree the content tree to which the documentation will be added ++ */ ++ public void buildDeprecationInfo(XMLNode node, Content constructorDocTree) { ++ writer.addDeprecated( ++ (ConstructorDoc) constructors.get(currentConstructorIndex), constructorDocTree); ++ } ++ ++ /** ++ * Build the comments for the constructor. Do nothing if ++ * {@link Configuration#nocomment} is set to true. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param constructorDocTree the content tree to which the documentation will be added ++ */ ++ public void buildConstructorComments(XMLNode node, Content constructorDocTree) { ++ if (!configuration.nocomment) { ++ writer.addComments( ++ (ConstructorDoc) constructors.get(currentConstructorIndex), ++ constructorDocTree); + } ++ } + +- /** +- * {@inheritDoc} +- */ +- public boolean hasMembersToDocument() { +- return constructors.size() > 0; +- } +- +- /** +- * Returns a list of constructors that will be documented for the given class. +- * This information can be used for doclet specific documentation +- * generation. +- * +- * @return a list of constructors that will be documented. +- */ +- public List members(ClassDoc classDoc) { +- return visibleMemberMap.getMembersFor(classDoc); +- } +- +- /** +- * Return the constructor writer for this builder. +- * +- * @return the constructor writer for this builder. +- */ +- public ConstructorWriter getWriter() { +- return writer; +- } +- +- /** +- * Build the constructor documentation. +- * +- * @param elements the XML elements that specify how to construct this +- * documentation. +- */ +- public void buildConstructorDoc(XMLNode node) { +- if (writer == null) { +- return; +- } +- for (currentMethodIndex = 0; +- currentMethodIndex < constructors.size(); +- currentMethodIndex++) { +- buildChildren(node); +- } +- } +- +- /** +- * Build the overall header. +- */ +- public void buildHeader(XMLNode node) { +- writer.writeHeader( +- classDoc, +- configuration.getText("doclet.Constructor_Detail")); +- } +- +- /** +- * Build the header for the individual constructor. +- */ +- public void buildConstructorHeader(XMLNode node) { +- writer.writeConstructorHeader( +- (ConstructorDoc) constructors.get(currentMethodIndex), +- currentMethodIndex == 0); +- } +- +- /** +- * Build the signature. +- */ +- public void buildSignature(XMLNode node) { +- writer.writeSignature( +- (ConstructorDoc) constructors.get(currentMethodIndex)); +- } +- +- /** +- * Build the deprecation information. +- */ +- public void buildDeprecationInfo(XMLNode node) { +- writer.writeDeprecated( +- (ConstructorDoc) constructors.get(currentMethodIndex)); +- } +- +- /** +- * Build the comments for the constructor. Do nothing if +- * {@link Configuration#nocomment} is set to true. +- */ +- public void buildConstructorComments(XMLNode node) { +- if (!configuration.nocomment) { +- writer.writeComments( +- (ConstructorDoc) constructors.get(currentMethodIndex)); +- } +- } +- +- /** +- * Build the tag information. +- */ +- public void buildTagInfo(XMLNode node) { +- writer.writeTags((ConstructorDoc) constructors.get(currentMethodIndex)); +- } +- +- /** +- * Build the footer for the individual constructor. +- */ +- public void buildConstructorFooter(XMLNode node) { +- writer.writeConstructorFooter(); +- } +- +- /** +- * Build the overall footer. +- */ +- public void buildFooter(XMLNode node) { +- writer.writeFooter(classDoc); +- } ++ /** ++ * Build the tag information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param constructorDocTree the content tree to which the documentation will be added ++ */ ++ public void buildTagInfo(XMLNode node, Content constructorDocTree) { ++ writer.addTags((ConstructorDoc) constructors.get(currentConstructorIndex), ++ constructorDocTree); ++ } + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java +@@ -25,10 +25,10 @@ + + package com.sun.tools.doclets.internal.toolkit.builders; + ++import java.util.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +-import java.util.*; + + /** + * Builds documentation for a enum constants. +@@ -38,200 +38,195 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + public class EnumConstantBuilder extends AbstractMemberBuilder { + +- /** +- * The class whose enum constants are being documented. +- */ +- private ClassDoc classDoc; ++ /** ++ * The class whose enum constants are being documented. ++ */ ++ private ClassDoc classDoc; + +- /** +- * The visible enum constantss for the given class. +- */ +- private VisibleMemberMap visibleMemberMap; ++ /** ++ * The visible enum constantss for the given class. ++ */ ++ private VisibleMemberMap visibleMemberMap; + +- /** +- * The writer to output the enum constants documentation. +- */ +- private EnumConstantWriter writer; ++ /** ++ * The writer to output the enum constants documentation. ++ */ ++ private EnumConstantWriter writer; + +- /** +- * The list of enum constants being documented. +- */ +- private List enumConstants; ++ /** ++ * The list of enum constants being documented. ++ */ ++ private List<ProgramElementDoc> enumConstants; + +- /** +- * The index of the current enum constant that is being documented at this point +- * in time. +- */ +- private int currentEnumConstantsIndex; ++ /** ++ * The index of the current enum constant that is being documented at this point ++ * in time. ++ */ ++ private int currentEnumConstantsIndex; + +- /** +- * Construct a new EnumConstantsBuilder. +- * +- * @param configuration the current configuration of the +- * doclet. +- */ +- private EnumConstantBuilder(Configuration configuration) { +- super(configuration); ++ /** ++ * Construct a new EnumConstantsBuilder. ++ * ++ * @param configuration the current configuration of the ++ * doclet. ++ */ ++ private EnumConstantBuilder(Configuration configuration) { ++ super(configuration); ++ } ++ ++ /** ++ * Construct a new EnumConstantsBuilder. ++ * ++ * @param configuration the current configuration of the doclet. ++ * @param classDoc the class whoses members are being documented. ++ * @param writer the doclet specific writer. ++ */ ++ public static EnumConstantBuilder getInstance( ++ Configuration configuration, ++ ClassDoc classDoc, ++ EnumConstantWriter writer) { ++ EnumConstantBuilder builder = new EnumConstantBuilder(configuration); ++ builder.classDoc = classDoc; ++ builder.writer = writer; ++ builder.visibleMemberMap = ++ new VisibleMemberMap( ++ classDoc, ++ VisibleMemberMap.ENUM_CONSTANTS, ++ configuration.nodeprecated); ++ builder.enumConstants = ++ new ArrayList<ProgramElementDoc>(builder.visibleMemberMap.getMembersFor(classDoc)); ++ if (configuration.getMemberComparator() != null) { ++ Collections.sort( ++ builder.enumConstants, ++ configuration.getMemberComparator()); ++ } ++ return builder; ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String getName() { ++ return "EnumConstantDetails"; ++ } ++ ++ /** ++ * Returns a list of enum constants that will be documented for the given class. ++ * This information can be used for doclet specific documentation ++ * generation. ++ * ++ * @param classDoc the {@link ClassDoc} we want to check. ++ * @return a list of enum constants that will be documented. ++ */ ++ public List<ProgramElementDoc> members(ClassDoc classDoc) { ++ return visibleMemberMap.getMembersFor(classDoc); ++ } ++ ++ /** ++ * Returns the visible member map for the enum constants of this class. ++ * ++ * @return the visible member map for the enum constants of this class. ++ */ ++ public VisibleMemberMap getVisibleMemberMap() { ++ return visibleMemberMap; ++ } ++ ++ /** ++ * summaryOrder.size() ++ */ ++ public boolean hasMembersToDocument() { ++ return enumConstants.size() > 0; ++ } ++ ++ /** ++ * Build the enum constant documentation. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added ++ */ ++ public void buildEnumConstant(XMLNode node, Content memberDetailsTree) { ++ if (writer == null) { ++ return; + } ++ int size = enumConstants.size(); ++ if (size > 0) { ++ Content enumConstantsDetailsTree = writer.getEnumConstantsDetailsTreeHeader( ++ classDoc, memberDetailsTree); ++ for (currentEnumConstantsIndex = 0; currentEnumConstantsIndex < size; ++ currentEnumConstantsIndex++) { ++ Content enumConstantsTree = writer.getEnumConstantsTreeHeader( ++ (FieldDoc) enumConstants.get(currentEnumConstantsIndex), ++ enumConstantsDetailsTree); ++ buildChildren(node, enumConstantsTree); ++ enumConstantsDetailsTree.addContent(writer.getEnumConstants( ++ enumConstantsTree, (currentEnumConstantsIndex == size - 1))); ++ } ++ memberDetailsTree.addContent( ++ writer.getEnumConstantsDetails(enumConstantsDetailsTree)); ++ } ++ } + +- /** +- * Construct a new EnumConstantsBuilder. +- * +- * @param configuration the current configuration of the doclet. +- * @param classDoc the class whoses members are being documented. +- * @param writer the doclet specific writer. +- */ +- public static EnumConstantBuilder getInstance( +- Configuration configuration, +- ClassDoc classDoc, +- EnumConstantWriter writer) { +- EnumConstantBuilder builder = new EnumConstantBuilder(configuration); +- builder.classDoc = classDoc; +- builder.writer = writer; +- builder.visibleMemberMap = +- new VisibleMemberMap( +- classDoc, +- VisibleMemberMap.ENUM_CONSTANTS, +- configuration.nodeprecated); +- builder.enumConstants = +- new ArrayList(builder.visibleMemberMap.getMembersFor(classDoc)); +- if (configuration.getMemberComparator() != null) { +- Collections.sort( +- builder.enumConstants, +- configuration.getMemberComparator()); +- } +- return builder; ++ /** ++ * Build the signature. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param enumConstantsTree the content tree to which the documentation will be added ++ */ ++ public void buildSignature(XMLNode node, Content enumConstantsTree) { ++ enumConstantsTree.addContent(writer.getSignature( ++ (FieldDoc) enumConstants.get(currentEnumConstantsIndex))); ++ } ++ ++ /** ++ * Build the deprecation information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param enumConstantsTree the content tree to which the documentation will be added ++ */ ++ public void buildDeprecationInfo(XMLNode node, Content enumConstantsTree) { ++ writer.addDeprecated( ++ (FieldDoc) enumConstants.get(currentEnumConstantsIndex), ++ enumConstantsTree); ++ } ++ ++ /** ++ * Build the comments for the enum constant. Do nothing if ++ * {@link Configuration#nocomment} is set to true. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param enumConstantsTree the content tree to which the documentation will be added ++ */ ++ public void buildEnumConstantComments(XMLNode node, Content enumConstantsTree) { ++ if (!configuration.nocomment) { ++ writer.addComments( ++ (FieldDoc) enumConstants.get(currentEnumConstantsIndex), ++ enumConstantsTree); + } ++ } + +- /** +- * {@inheritDoc} +- */ +- public String getName() { +- return "EnumConstantDetails"; +- } ++ /** ++ * Build the tag information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param enumConstantsTree the content tree to which the documentation will be added ++ */ ++ public void buildTagInfo(XMLNode node, Content enumConstantsTree) { ++ writer.addTags( ++ (FieldDoc) enumConstants.get(currentEnumConstantsIndex), ++ enumConstantsTree); ++ } + +- /** +- * Returns a list of enum constants that will be documented for the given class. +- * This information can be used for doclet specific documentation +- * generation. +- * +- * @param classDoc the {@link ClassDoc} we want to check. +- * @return a list of enum constants that will be documented. +- */ +- public List members(ClassDoc classDoc) { +- return visibleMemberMap.getMembersFor(classDoc); +- } +- +- /** +- * Returns the visible member map for the enum constants of this class. +- * +- * @return the visible member map for the enum constants of this class. +- */ +- public VisibleMemberMap getVisibleMemberMap() { +- return visibleMemberMap; +- } +- +- /** +- * summaryOrder.size() +- */ +- public boolean hasMembersToDocument() { +- return enumConstants.size() > 0; +- } +- +- /** +- * Build the enum constant documentation. +- * +- * @param elements the XML elements that specify how to construct this +- * documentation. +- */ +- public void buildEnumConstant(XMLNode node) { +- if (writer == null) { +- return; +- } +- for (currentEnumConstantsIndex = 0; +- currentEnumConstantsIndex < enumConstants.size(); +- currentEnumConstantsIndex++) { +- buildChildren(node); +- } +- } +- +- /** +- * Build the overall header. +- */ +- public void buildHeader(XMLNode node) { +- writer.writeHeader( +- classDoc, +- configuration.getText("doclet.Enum_Constant_Detail")); +- } +- +- /** +- * Build the header for the individual enum constants. +- */ +- public void buildEnumConstantHeader(XMLNode node) { +- writer.writeEnumConstantHeader( +- (FieldDoc) enumConstants.get(currentEnumConstantsIndex), +- currentEnumConstantsIndex == 0); +- } +- +- /** +- * Build the signature. +- */ +- public void buildSignature(XMLNode node) { +- writer.writeSignature( +- (FieldDoc) enumConstants.get(currentEnumConstantsIndex)); +- } +- +- /** +- * Build the deprecation information. +- */ +- public void buildDeprecationInfo(XMLNode node) { +- writer.writeDeprecated( +- (FieldDoc) enumConstants.get(currentEnumConstantsIndex)); +- } +- +- /** +- * Build the comments for the enum constant. Do nothing if +- * {@link Configuration#nocomment} is set to true. +- */ +- public void buildEnumConstantComments(XMLNode node) { +- if (!configuration.nocomment) { +- writer.writeComments( +- (FieldDoc) enumConstants.get(currentEnumConstantsIndex)); +- } +- } +- +- /** +- * Build the tag information. +- */ +- public void buildTagInfo(XMLNode node) { +- writer.writeTags( +- (FieldDoc) enumConstants.get(currentEnumConstantsIndex)); +- } +- +- /** +- * Build the footer for the individual enum constants. +- */ +- public void buildEnumConstantFooter(XMLNode node) { +- writer.writeEnumConstantFooter(); +- } +- +- /** +- * Build the overall footer. +- */ +- public void buildFooter(XMLNode node) { +- writer.writeFooter(classDoc); +- } +- +- /** +- * Return the enum constant writer for this builder. +- * +- * @return the enum constant writer for this builder. +- */ +- public EnumConstantWriter getWriter() { +- return writer; +- } ++ /** ++ * Return the enum constant writer for this builder. ++ * ++ * @return the enum constant writer for this builder. ++ */ ++ public EnumConstantWriter getWriter() { ++ return writer; ++ } + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java +@@ -25,10 +25,10 @@ + + package com.sun.tools.doclets.internal.toolkit.builders; + ++import java.util.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +-import java.util.*; + + /** + * Builds documentation for a field. +@@ -38,197 +38,191 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + public class FieldBuilder extends AbstractMemberBuilder { + +- /** +- * The class whose fields are being documented. +- */ +- private ClassDoc classDoc; ++ /** ++ * The class whose fields are being documented. ++ */ ++ private ClassDoc classDoc; + +- /** +- * The visible fields for the given class. +- */ +- private VisibleMemberMap visibleMemberMap; ++ /** ++ * The visible fields for the given class. ++ */ ++ private VisibleMemberMap visibleMemberMap; + +- /** +- * The writer to output the field documentation. +- */ +- private FieldWriter writer; ++ /** ++ * The writer to output the field documentation. ++ */ ++ private FieldWriter writer; + +- /** +- * The list of fields being documented. +- */ +- private List fields; ++ /** ++ * The list of fields being documented. ++ */ ++ private List<ProgramElementDoc> fields; + +- /** +- * The index of the current field that is being documented at this point +- * in time. +- */ +- private int currentFieldIndex; ++ /** ++ * The index of the current field that is being documented at this point ++ * in time. ++ */ ++ private int currentFieldIndex; + +- /** +- * Construct a new FieldBuilder. +- * +- * @param configuration the current configuration of the +- * doclet. +- */ +- private FieldBuilder(Configuration configuration) { +- super(configuration); ++ /** ++ * Construct a new FieldBuilder. ++ * ++ * @param configuration the current configuration of the ++ * doclet. ++ */ ++ private FieldBuilder(Configuration configuration) { ++ super(configuration); ++ } ++ ++ /** ++ * Construct a new FieldBuilder. ++ * ++ * @param configuration the current configuration of the doclet. ++ * @param classDoc the class whoses members are being documented. ++ * @param writer the doclet specific writer. ++ */ ++ public static FieldBuilder getInstance( ++ Configuration configuration, ++ ClassDoc classDoc, ++ FieldWriter writer) { ++ FieldBuilder builder = new FieldBuilder(configuration); ++ builder.classDoc = classDoc; ++ builder.writer = writer; ++ builder.visibleMemberMap = ++ new VisibleMemberMap( ++ classDoc, ++ VisibleMemberMap.FIELDS, ++ configuration.nodeprecated); ++ builder.fields = ++ new ArrayList<ProgramElementDoc>(builder.visibleMemberMap.getLeafClassMembers( ++ configuration)); ++ if (configuration.getMemberComparator() != null) { ++ Collections.sort( ++ builder.fields, ++ configuration.getMemberComparator()); + } ++ return builder; ++ } + +- /** +- * Construct a new FieldBuilder. +- * +- * @param configuration the current configuration of the doclet. +- * @param classDoc the class whoses members are being documented. +- * @param writer the doclet specific writer. +- */ +- public static FieldBuilder getInstance( +- Configuration configuration, +- ClassDoc classDoc, +- FieldWriter writer) { +- FieldBuilder builder = new FieldBuilder(configuration); +- builder.classDoc = classDoc; +- builder.writer = writer; +- builder.visibleMemberMap = +- new VisibleMemberMap( +- classDoc, +- VisibleMemberMap.FIELDS, +- configuration.nodeprecated); +- builder.fields = +- new ArrayList(builder.visibleMemberMap.getLeafClassMembers( +- configuration)); +- if (configuration.getMemberComparator() != null) { +- Collections.sort( +- builder.fields, +- configuration.getMemberComparator()); +- } +- return builder; ++ /** ++ * {@inheritDoc} ++ */ ++ public String getName() { ++ return "FieldDetails"; ++ } ++ ++ /** ++ * Returns a list of fields that will be documented for the given class. ++ * This information can be used for doclet specific documentation ++ * generation. ++ * ++ * @param classDoc the {@link ClassDoc} we want to check. ++ * @return a list of fields that will be documented. ++ */ ++ public List<ProgramElementDoc> members(ClassDoc classDoc) { ++ return visibleMemberMap.getMembersFor(classDoc); ++ } ++ ++ /** ++ * Returns the visible member map for the fields of this class. ++ * ++ * @return the visible member map for the fields of this class. ++ */ ++ public VisibleMemberMap getVisibleMemberMap() { ++ return visibleMemberMap; ++ } ++ ++ /** ++ * summaryOrder.size() ++ */ ++ public boolean hasMembersToDocument() { ++ return fields.size() > 0; ++ } ++ ++ /** ++ * Build the field documentation. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added ++ */ ++ public void buildFieldDoc(XMLNode node, Content memberDetailsTree) { ++ if (writer == null) { ++ return; ++ } ++ int size = fields.size(); ++ if (size > 0) { ++ Content fieldDetailsTree = writer.getFieldDetailsTreeHeader( ++ classDoc, memberDetailsTree); ++ for (currentFieldIndex = 0; currentFieldIndex < size; ++ currentFieldIndex++) { ++ Content fieldDocTree = writer.getFieldDocTreeHeader( ++ (FieldDoc) fields.get(currentFieldIndex), ++ fieldDetailsTree); ++ buildChildren(node, fieldDocTree); ++ fieldDetailsTree.addContent(writer.getFieldDoc( ++ fieldDocTree, (currentFieldIndex == size - 1))); ++ } ++ memberDetailsTree.addContent( ++ writer.getFieldDetails(fieldDetailsTree)); + } ++ } + +- /** +- * {@inheritDoc} +- */ +- public String getName() { +- return "FieldDetails"; ++ /** ++ * Build the signature. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param fieldDocTree the content tree to which the documentation will be added ++ */ ++ public void buildSignature(XMLNode node, Content fieldDocTree) { ++ fieldDocTree.addContent( ++ writer.getSignature((FieldDoc) fields.get(currentFieldIndex))); ++ } ++ ++ /** ++ * Build the deprecation information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param fieldDocTree the content tree to which the documentation will be added ++ */ ++ public void buildDeprecationInfo(XMLNode node, Content fieldDocTree) { ++ writer.addDeprecated( ++ (FieldDoc) fields.get(currentFieldIndex), fieldDocTree); ++ } ++ ++ /** ++ * Build the comments for the field. Do nothing if ++ * {@link Configuration#nocomment} is set to true. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param fieldDocTree the content tree to which the documentation will be added ++ */ ++ public void buildFieldComments(XMLNode node, Content fieldDocTree) { ++ if (!configuration.nocomment) { ++ writer.addComments((FieldDoc) fields.get(currentFieldIndex), fieldDocTree); + } ++ } + +- /** +- * Returns a list of fields that will be documented for the given class. +- * This information can be used for doclet specific documentation +- * generation. +- * +- * @param classDoc the {@link ClassDoc} we want to check. +- * @return a list of fields that will be documented. +- */ +- public List members(ClassDoc classDoc) { +- return visibleMemberMap.getMembersFor(classDoc); +- } ++ /** ++ * Build the tag information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param fieldDocTree the content tree to which the documentation will be added ++ */ ++ public void buildTagInfo(XMLNode node, Content fieldDocTree) { ++ writer.addTags((FieldDoc) fields.get(currentFieldIndex), fieldDocTree); ++ } + +- /** +- * Returns the visible member map for the fields of this class. +- * +- * @return the visible member map for the fields of this class. +- */ +- public VisibleMemberMap getVisibleMemberMap() { +- return visibleMemberMap; +- } +- +- /** +- * summaryOrder.size() +- */ +- public boolean hasMembersToDocument() { +- return fields.size() > 0; +- } +- +- /** +- * Build the field documentation. +- * +- * @param elements the XML elements that specify how to construct this +- * documentation. +- */ +- public void buildFieldDoc(XMLNode node) { +- if (writer == null) { +- return; +- } +- for (currentFieldIndex = 0; +- currentFieldIndex < fields.size(); +- currentFieldIndex++) { +- buildChildren(node); +- } +- } +- +- /** +- * Build the overall header. +- */ +- public void buildHeader(XMLNode node) { +- writer.writeHeader( +- classDoc, +- configuration.getText("doclet.Field_Detail")); +- } +- +- /** +- * Build the header for the individual field. +- */ +- public void buildFieldHeader(XMLNode node) { +- writer.writeFieldHeader( +- (FieldDoc) fields.get(currentFieldIndex), +- currentFieldIndex == 0); +- } +- +- /** +- * Build the signature. +- */ +- public void buildSignature(XMLNode node) { +- writer.writeSignature((FieldDoc) fields.get(currentFieldIndex)); +- } +- +- /** +- * Build the deprecation information. +- */ +- public void buildDeprecationInfo(XMLNode node) { +- writer.writeDeprecated((FieldDoc) fields.get(currentFieldIndex)); +- } +- +- /** +- * Build the comments for the field. Do nothing if +- * {@link Configuration#nocomment} is set to true. +- */ +- public void buildFieldComments(XMLNode node) { +- if (!configuration.nocomment) { +- writer.writeComments((FieldDoc) fields.get(currentFieldIndex)); +- } +- } +- +- /** +- * Build the tag information. +- */ +- public void buildTagInfo(XMLNode node) { +- writer.writeTags((FieldDoc) fields.get(currentFieldIndex)); +- } +- +- /** +- * Build the footer for the individual field. +- */ +- public void buildFieldFooter(XMLNode node) { +- writer.writeFieldFooter(); +- } +- +- /** +- * Build the overall footer. +- */ +- public void buildFooter(XMLNode node) { +- writer.writeFooter(classDoc); +- } +- +- /** +- * Return the field writer for this builder. +- * +- * @return the field writer for this builder. +- */ +- public FieldWriter getWriter() { +- return writer; +- } ++ /** ++ * Return the field writer for this builder. ++ * ++ * @return the field writer for this builder. ++ */ ++ public FieldWriter getWriter() { ++ return writer; ++ } + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java +@@ -76,7 +76,7 @@ + /** + * Parse the XML specifying the layout of the documentation. + * +- * @return List the list of XML elements parsed. ++ * @return the list of XML elements parsed. + */ + public XMLNode parseXML(String root) { + if (xmlElementsMap.containsKey(root)) { +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java +@@ -25,10 +25,10 @@ + + package com.sun.tools.doclets.internal.toolkit.builders; + ++import java.util.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +-import java.util.*; + + /** + * Builds the member summary. +@@ -38,49 +38,50 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + public class MemberSummaryBuilder extends AbstractMemberBuilder { + +- /** +- * The XML root for this builder. +- */ +- public static final String NAME = "MemberSummary"; ++ /** ++ * The XML root for this builder. ++ */ ++ public static final String NAME = "MemberSummary"; + +- /** +- * The visible members for the given class. +- */ +- private VisibleMemberMap[] visibleMemberMaps; ++ /** ++ * The visible members for the given class. ++ */ ++ private VisibleMemberMap[] visibleMemberMaps; + +- /** +- * The member summary writers for the given class. +- */ +- private MemberSummaryWriter[] memberSummaryWriters; ++ /** ++ * The member summary writers for the given class. ++ */ ++ private MemberSummaryWriter[] memberSummaryWriters; + +- /** +- * The type being documented. +- */ +- private ClassDoc classDoc; ++ /** ++ * The type being documented. ++ */ ++ private ClassDoc classDoc; + +- private MemberSummaryBuilder(Configuration configuration) { +- super(configuration); +- } ++ private MemberSummaryBuilder(Configuration configuration) { ++ super(configuration); ++ } + +- /** +- * Construct a new MemberSummaryBuilder. +- * +- * @param classWriter the writer for the class whose members are being +- * summarized. +- * @param configuration the current configuration of the doclet. +- */ +- public static MemberSummaryBuilder getInstance( +- ClassWriter classWriter, Configuration configuration) +- throws Exception { +- MemberSummaryBuilder builder = new MemberSummaryBuilder(configuration); +- builder.classDoc = classWriter.getClassDoc(); +- builder.init(classWriter); +- return builder; +- } ++ /** ++ * Construct a new MemberSummaryBuilder. ++ * ++ * @param classWriter the writer for the class whose members are being ++ * summarized. ++ * @param configuration the current configuration of the doclet. ++ */ ++ public static MemberSummaryBuilder getInstance( ++ ClassWriter classWriter, Configuration configuration) ++ throws Exception { ++ MemberSummaryBuilder builder = new MemberSummaryBuilder(configuration); ++ builder.classDoc = classWriter.getClassDoc(); ++ builder.init(classWriter); ++ return builder; ++ } + + /** + * Construct a new MemberSummaryBuilder. +@@ -90,8 +91,8 @@ + * @param configuration the current configuration of the doclet. + */ + public static MemberSummaryBuilder getInstance( +- AnnotationTypeWriter annotationTypeWriter, Configuration configuration) +- throws Exception { ++ AnnotationTypeWriter annotationTypeWriter, Configuration configuration) ++ throws Exception { + MemberSummaryBuilder builder = new MemberSummaryBuilder(configuration); + builder.classDoc = annotationTypeWriter.getAnnotationTypeDoc(); + builder.init(annotationTypeWriter); +@@ -100,200 +101,210 @@ + + private void init(Object writer) throws Exception { + visibleMemberMaps = +- new VisibleMemberMap[VisibleMemberMap.NUM_MEMBER_TYPES]; ++ new VisibleMemberMap[VisibleMemberMap.NUM_MEMBER_TYPES]; + for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) { + visibleMemberMaps[i] = +- new VisibleMemberMap( ++ new VisibleMemberMap( + classDoc, + i, + configuration.nodeprecated); + } + memberSummaryWriters = +- new MemberSummaryWriter[VisibleMemberMap.NUM_MEMBER_TYPES]; ++ new MemberSummaryWriter[VisibleMemberMap.NUM_MEMBER_TYPES]; + for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) { + if (classDoc.isAnnotationType()) { + memberSummaryWriters[i] = + visibleMemberMaps[i].noVisibleMembers()? + null : + configuration.getWriterFactory().getMemberSummaryWriter( +- (AnnotationTypeWriter) writer, i); ++ (AnnotationTypeWriter) writer, i); + } else { + memberSummaryWriters[i] = + visibleMemberMaps[i].noVisibleMembers()? + null : + configuration.getWriterFactory().getMemberSummaryWriter( +- (ClassWriter) writer, i); ++ (ClassWriter) writer, i); + } + } + + } + +- /** +- * {@inheritDoc} +- */ +- public String getName() { +- return NAME; +- } ++ /** ++ * {@inheritDoc} ++ */ ++ public String getName() { ++ return NAME; ++ } + +- /** +- * Return the specified visible member map. +- * +- * @param type the type of visible member map to return. +- * @return the specified visible member map. +- * @throws ArrayIndexOutOfBoundsException when the type is invalid. +- * @see VisibleMemberMap +- */ +- public VisibleMemberMap getVisibleMemberMap(int type) { +- return visibleMemberMaps[type]; +- } ++ /** ++ * Return the specified visible member map. ++ * ++ * @param type the type of visible member map to return. ++ * @return the specified visible member map. ++ * @throws ArrayIndexOutOfBoundsException when the type is invalid. ++ * @see VisibleMemberMap ++ */ ++ public VisibleMemberMap getVisibleMemberMap(int type) { ++ return visibleMemberMaps[type]; ++ } + +- /** +- * Return the specified member summary writer. +- * +- * @param type the type of member summary writer to return. +- * @return the specified member summary writer. +- * @throws ArrayIndexOutOfBoundsException when the type is invalid. +- * @see VisibleMemberMap +- */ +- public MemberSummaryWriter getMemberSummaryWriter(int type) { +- return memberSummaryWriters[type]; +- } ++ /** ++ * Return the specified member summary writer. ++ * ++ * @param type the type of member summary writer to return. ++ * @return the specified member summary writer. ++ * @throws ArrayIndexOutOfBoundsException when the type is invalid. ++ * @see VisibleMemberMap ++ */ ++ public MemberSummaryWriter getMemberSummaryWriter(int type) { ++ return memberSummaryWriters[type]; ++ } + +- /** +- * Returns a list of methods that will be documented for the given class. +- * This information can be used for doclet specific documentation +- * generation. +- * +- * @param classDoc the {@link ClassDoc} we want to check. +- * @param type the type of members to return. +- * @return a list of methods that will be documented. +- * @see VisibleMemberMap +- */ +- public List members(int type) { +- return visibleMemberMaps[type].getLeafClassMembers(configuration); +- } ++ /** ++ * Returns a list of methods that will be documented for the given class. ++ * This information can be used for doclet specific documentation ++ * generation. ++ * ++ * @param classDoc the {@link ClassDoc} we want to check. ++ * @param type the type of members to return. ++ * @return a list of methods that will be documented. ++ * @see VisibleMemberMap ++ */ ++ public List<ProgramElementDoc> members(int type) { ++ return visibleMemberMaps[type].getLeafClassMembers(configuration); ++ } + +- /** +- * Return true it there are any members to summarize. +- * +- * @return true if there are any members to summarize. +- */ +- public boolean hasMembersToDocument() { ++ /** ++ * Return true it there are any members to summarize. ++ * ++ * @return true if there are any members to summarize. ++ */ ++ public boolean hasMembersToDocument() { + if (classDoc instanceof AnnotationTypeDoc) { + return ((AnnotationTypeDoc) classDoc).elements().length > 0; + } +- for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) { +- VisibleMemberMap members = visibleMemberMaps[i]; +- if (!members.noVisibleMembers()) { +- return true; +- } +- } +- return false; ++ for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) { ++ VisibleMemberMap members = visibleMemberMaps[i]; ++ if (!members.noVisibleMembers()) { ++ return true; ++ } + } + +- /** +- * Build the summary for the enum constants. +- */ +- public void buildEnumConstantsSummary(XMLNode node) { +- buildSummary( +- memberSummaryWriters[VisibleMemberMap.ENUM_CONSTANTS], +- visibleMemberMaps[VisibleMemberMap.ENUM_CONSTANTS]); +- } ++ return false; ++ } + + /** +- * Build the summary for the optional members. ++ * Build the summary for the enum constants. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberSummaryTree the content tree to which the documentation will be added + */ +- public void buildAnnotationTypeOptionalMemberSummary(XMLNode node) { +- buildSummary( +- memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL], +- visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL]); ++ public void buildEnumConstantsSummary(XMLNode node, Content memberSummaryTree) { ++ MemberSummaryWriter writer = ++ memberSummaryWriters[VisibleMemberMap.ENUM_CONSTANTS]; ++ VisibleMemberMap visibleMemberMap = ++ visibleMemberMaps[VisibleMemberMap.ENUM_CONSTANTS]; ++ addSummary(writer, visibleMemberMap, false, memberSummaryTree); + } + + /** + * Build the summary for the optional members. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberSummaryTree the content tree to which the documentation will be added + */ +- public void buildAnnotationTypeRequiredMemberSummary(XMLNode node) { +- buildSummary( +- memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED], +- visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED]); ++ public void buildAnnotationTypeOptionalMemberSummary(XMLNode node, Content memberSummaryTree) { ++ MemberSummaryWriter writer = ++ memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL]; ++ VisibleMemberMap visibleMemberMap = ++ visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL]; ++ addSummary(writer, visibleMemberMap, false, memberSummaryTree); + } + +- /** +- * Build the summary for the fields. +- */ +- public void buildFieldsSummary(XMLNode node) { +- buildSummary( +- memberSummaryWriters[VisibleMemberMap.FIELDS], +- visibleMemberMaps[VisibleMemberMap.FIELDS]); +- } ++ /** ++ * Build the summary for the optional members. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberSummaryTree the content tree to which the documentation will be added ++ */ ++ public void buildAnnotationTypeRequiredMemberSummary(XMLNode node, Content memberSummaryTree) { ++ MemberSummaryWriter writer = ++ memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED]; ++ VisibleMemberMap visibleMemberMap = ++ visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED]; ++ addSummary(writer, visibleMemberMap, false, memberSummaryTree); ++ } + +- /** +- * Build the inherited summary for the fields. +- */ +- public void buildFieldsInheritedSummary(XMLNode node) { +- buildInheritedSummary( +- memberSummaryWriters[VisibleMemberMap.FIELDS], +- visibleMemberMaps[VisibleMemberMap.FIELDS]); +- } ++ /** ++ * Build the summary for the fields. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberSummaryTree the content tree to which the documentation will be added ++ */ ++ public void buildFieldsSummary(XMLNode node, Content memberSummaryTree) { ++ MemberSummaryWriter writer = ++ memberSummaryWriters[VisibleMemberMap.FIELDS]; ++ VisibleMemberMap visibleMemberMap = ++ visibleMemberMaps[VisibleMemberMap.FIELDS]; ++ addSummary(writer, visibleMemberMap, true, memberSummaryTree); ++ } + +- /** +- * Build the summary for the nested classes. +- */ +- public void buildNestedClassesSummary(XMLNode node) { +- buildSummary( +- memberSummaryWriters[VisibleMemberMap.INNERCLASSES], +- visibleMemberMaps[VisibleMemberMap.INNERCLASSES]); +- } ++ /** ++ * Build the summary for the nested classes. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberSummaryTree the content tree to which the documentation will be added ++ */ ++ public void buildNestedClassesSummary(XMLNode node, Content memberSummaryTree) { ++ MemberSummaryWriter writer = ++ memberSummaryWriters[VisibleMemberMap.INNERCLASSES]; ++ VisibleMemberMap visibleMemberMap = ++ visibleMemberMaps[VisibleMemberMap.INNERCLASSES]; ++ addSummary(writer, visibleMemberMap, true, memberSummaryTree); ++ } + +- /** +- * Build the inherited summary for the nested classes. +- */ +- public void buildNestedClassesInheritedSummary(XMLNode node) { +- buildInheritedSummary( +- memberSummaryWriters[VisibleMemberMap.INNERCLASSES], +- visibleMemberMaps[VisibleMemberMap.INNERCLASSES]); +- } ++ /** ++ * Build the method summary. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberSummaryTree the content tree to which the documentation will be added ++ */ ++ public void buildMethodsSummary(XMLNode node, Content memberSummaryTree) { ++ MemberSummaryWriter writer = ++ memberSummaryWriters[VisibleMemberMap.METHODS]; ++ VisibleMemberMap visibleMemberMap = ++ visibleMemberMaps[VisibleMemberMap.METHODS]; ++ addSummary(writer, visibleMemberMap, true, memberSummaryTree); ++ } + +- /** +- * Build the method summary. +- */ +- public void buildMethodsSummary(XMLNode node) { +- buildSummary( +- memberSummaryWriters[VisibleMemberMap.METHODS], +- visibleMemberMaps[VisibleMemberMap.METHODS]); +- } ++ /** ++ * Build the constructor summary. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberSummaryTree the content tree to which the documentation will be added ++ */ ++ public void buildConstructorsSummary(XMLNode node, Content memberSummaryTree) { ++ MemberSummaryWriter writer = ++ memberSummaryWriters[VisibleMemberMap.CONSTRUCTORS]; ++ VisibleMemberMap visibleMemberMap = ++ visibleMemberMaps[VisibleMemberMap.CONSTRUCTORS]; ++ addSummary(writer, visibleMemberMap, false, memberSummaryTree); ++ } + +- /** +- * Build the inherited method summary. +- */ +- public void buildMethodsInheritedSummary(XMLNode node) { +- buildInheritedSummary( +- memberSummaryWriters[VisibleMemberMap.METHODS], +- visibleMemberMaps[VisibleMemberMap.METHODS]); +- } +- +- /** +- * Build the constructor summary. +- */ +- public void buildConstructorsSummary(XMLNode node) { +- buildSummary( +- memberSummaryWriters[VisibleMemberMap.CONSTRUCTORS], +- visibleMemberMaps[VisibleMemberMap.CONSTRUCTORS]); +- } +- +- /** +- * Build the member summary for the given members. +- * +- * @param writer the summary writer to write the output. +- * @param visibleMemberMap the given members to summarize. +- */ +- private void buildSummary(MemberSummaryWriter writer, +- VisibleMemberMap visibleMemberMap) { +- List members = new ArrayList(visibleMemberMap.getLeafClassMembers( +- configuration)); ++ /** ++ * Build the member summary for the given members. ++ * ++ * @param writer the summary writer to write the output. ++ * @param visibleMemberMap the given members to summarize. ++ * @param summaryTreeList list of content trees to which the documentation will be added ++ */ ++ private void buildSummary(MemberSummaryWriter writer, ++ VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) { ++ List<ProgramElementDoc> members = new ArrayList(visibleMemberMap.getLeafClassMembers( ++ configuration)); + if (members.size() > 0) { + Collections.sort(members); +- writer.writeMemberSummaryHeader(classDoc); ++ Content tableTree = writer.getSummaryTableTree(classDoc); + for (int i = 0; i < members.size(); i++) { + ProgramElementDoc member = (ProgramElementDoc) members.get(i); + Tag[] firstSentenceTags = member.firstSentenceTags(); +@@ -301,32 +312,32 @@ + //Inherit comments from overriden or implemented method if + //necessary. + DocFinder.Output inheritedDoc = +- DocFinder.search(new DocFinder.Input((MethodDoc) member)); ++ DocFinder.search(new DocFinder.Input((MethodDoc) member)); + if (inheritedDoc.holder != null && + inheritedDoc.holder.firstSentenceTags().length > 0) { + firstSentenceTags = inheritedDoc.holder.firstSentenceTags(); + } + } +- writer.writeMemberSummary(classDoc, member, firstSentenceTags, +- i == 0, i == members.size() - 1); ++ writer.addMemberSummary(classDoc, member, firstSentenceTags, tableTree, i); + } +- writer.writeMemberSummaryFooter(classDoc); ++ summaryTreeList.add(tableTree); + } +- } ++ } + + /** + * Build the inherited member summary for the given methods. + * +- * @param writer the writer for this member summary. ++ * @param writer the writer for this member summary. + * @param visibleMemberMap the map for the members to document. ++ * @param summaryTreeList list of content trees to which the documentation will be added + */ +- private void buildInheritedSummary(MemberSummaryWriter writer, +- VisibleMemberMap visibleMemberMap) { ++ private void buildInheritedSummary(MemberSummaryWriter writer, ++ VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) { + for (Iterator iter = visibleMemberMap.getVisibleClassesList().iterator(); + iter.hasNext();) { + ClassDoc inhclass = (ClassDoc) (iter.next()); + if (! (inhclass.isPublic() || +- Util.isLinkable(inhclass, configuration))) { ++ Util.isLinkable(inhclass, configuration))) { + continue; + } + if (inhclass == classDoc) { +@@ -335,18 +346,45 @@ + List inhmembers = visibleMemberMap.getMembersFor(inhclass); + if (inhmembers.size() > 0) { + Collections.sort(inhmembers); +- writer.writeInheritedMemberSummaryHeader(inhclass); ++ Content inheritedTree = writer.getInheritedSummaryHeader(inhclass); ++ Content linksTree = writer.getInheritedSummaryLinksTree(); + for (int j = 0; j < inhmembers.size(); ++j) { +- writer.writeInheritedMemberSummary( +- inhclass.isPackagePrivate() && ++ writer.addInheritedMemberSummary( ++ inhclass.isPackagePrivate() && + ! Util.isLinkable(inhclass, configuration) ? + classDoc : inhclass, +- (ProgramElementDoc) inhmembers.get(j), +- j == 0, +- j == inhmembers.size() - 1); ++ (ProgramElementDoc) inhmembers.get(j), ++ j == 0, ++ j == inhmembers.size() - 1, linksTree); + } +- writer.writeInheritedMemberSummaryFooter(inhclass); ++ inheritedTree.addContent(linksTree); ++ summaryTreeList.add(writer.getMemberTree(inheritedTree)); + } + } + } ++ ++ /** ++ * Add the summary for the documentation. ++ * ++ * @param writer the writer for this member summary. ++ * @param visibleMemberMap the map for the members to document. ++ * @param showInheritedSummary true if inherited summary should be documented ++ * @param memberSummaryTree the content tree to which the documentation will be added ++ */ ++ private void addSummary(MemberSummaryWriter writer, ++ VisibleMemberMap visibleMemberMap, boolean showInheritedSummary, ++ Content memberSummaryTree) { ++ LinkedList<Content> summaryTreeList = new LinkedList<Content>(); ++ buildSummary(writer, visibleMemberMap, summaryTreeList); ++ if (showInheritedSummary) ++ buildInheritedSummary(writer, visibleMemberMap, summaryTreeList); ++ if (!summaryTreeList.isEmpty()) { ++ Content memberTree = writer.getMemberSummaryHeader( ++ classDoc, memberSummaryTree); ++ for (int i = 0; i < summaryTreeList.size(); i++) { ++ memberTree.addContent(summaryTreeList.get(i)); ++ } ++ memberSummaryTree.addContent(writer.getMemberTree(memberTree)); ++ } ++ } + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java +@@ -25,10 +25,10 @@ + + package com.sun.tools.doclets.internal.toolkit.builders; + ++import java.util.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +-import java.util.*; + + /** + * Builds documentation for a method. +@@ -38,164 +38,170 @@ + * Do not use it as an API + * + * @author Jamie Ho ++ * @author Bhavesh Patel (Modified) + * @since 1.5 + */ + public class MethodBuilder extends AbstractMemberBuilder { + +- /** +- * The index of the current field that is being documented at this point +- * in time. +- */ +- private int currentMethodIndex; ++ /** ++ * The index of the current field that is being documented at this point ++ * in time. ++ */ ++ private int currentMethodIndex; + +- /** +- * The class whose methods are being documented. +- */ +- private ClassDoc classDoc; ++ /** ++ * The class whose methods are being documented. ++ */ ++ private ClassDoc classDoc; + +- /** +- * The visible methods for the given class. +- */ +- private VisibleMemberMap visibleMemberMap; ++ /** ++ * The visible methods for the given class. ++ */ ++ private VisibleMemberMap visibleMemberMap; + +- /** +- * The writer to output the method documentation. +- */ +- private MethodWriter writer; ++ /** ++ * The writer to output the method documentation. ++ */ ++ private MethodWriter writer; + +- /** +- * The methods being documented. +- */ +- private List methods; ++ /** ++ * The methods being documented. ++ */ ++ private List<ProgramElementDoc> methods; + +- private MethodBuilder(Configuration configuration) { +- super(configuration); ++ private MethodBuilder(Configuration configuration) { ++ super(configuration); ++ } ++ ++ /** ++ * Construct a new MethodBuilder. ++ * ++ * @param configuration the current configuration of the doclet. ++ * @param classDoc the class whoses members are being documented. ++ * @param writer the doclet specific writer. ++ * ++ * @return an instance of a MethodBuilder. ++ */ ++ public static MethodBuilder getInstance( ++ Configuration configuration, ++ ClassDoc classDoc, ++ MethodWriter writer) { ++ MethodBuilder builder = new MethodBuilder(configuration); ++ builder.classDoc = classDoc; ++ builder.writer = writer; ++ builder.visibleMemberMap = ++ new VisibleMemberMap( ++ classDoc, ++ VisibleMemberMap.METHODS, ++ configuration.nodeprecated); ++ builder.methods = ++ new ArrayList<ProgramElementDoc>(builder.visibleMemberMap.getLeafClassMembers( ++ configuration)); ++ if (configuration.getMemberComparator() != null) { ++ Collections.sort( ++ builder.methods, ++ configuration.getMemberComparator()); + } + +- /** +- * Construct a new MethodBuilder. +- * +- * @param configuration the current configuration of the doclet. +- * @param classDoc the class whoses members are being documented. +- * @param writer the doclet specific writer. +- * +- * @return an instance of a MethodBuilder. +- */ +- public static MethodBuilder getInstance( +- Configuration configuration, +- ClassDoc classDoc, +- MethodWriter writer) { +- MethodBuilder builder = new MethodBuilder(configuration); +- builder.classDoc = classDoc; +- builder.writer = writer; +- builder.visibleMemberMap = +- new VisibleMemberMap( +- classDoc, +- VisibleMemberMap.METHODS, +- configuration.nodeprecated); +- builder.methods = +- new ArrayList(builder.visibleMemberMap.getLeafClassMembers( +- configuration)); +- if (configuration.getMemberComparator() != null) { +- Collections.sort( +- builder.methods, +- configuration.getMemberComparator()); +- } +- return builder; ++ /** ++ * {@inheritDoc} ++ */ ++ public String getName() { ++ return "MethodDetails"; ++ } ++ ++ /** ++ * Returns a list of methods that will be documented for the given class. ++ * This information can be used for doclet specific documentation ++ * generation. ++ * ++ * @param classDoc the {@link ClassDoc} we want to check. ++ * @return a list of methods that will be documented. ++ */ ++ public List<ProgramElementDoc> members(ClassDoc classDoc) { ++ return visibleMemberMap.getMembersFor(classDoc); ++ } ++ ++ /** ++ * Returns the visible member map for the methods of this class. ++ * ++ * @return the visible member map for the methods of this class. ++ */ ++ public VisibleMemberMap getVisibleMemberMap() { ++ return visibleMemberMap; ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public boolean hasMembersToDocument() { ++ return methods.size() > 0; ++ } ++ ++ /** ++ * Build the method documentation. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param memberDetailsTree the content tree to which the documentation will be added ++ */ ++ public void buildMethodDoc(XMLNode node, Content memberDetailsTree) { ++ if (writer == null) { ++ return; + } ++ int size = methods.size(); ++ if (size > 0) { ++ Content methodDetailsTree = writer.getMethodDetailsTreeHeader( ++ classDoc, memberDetailsTree); ++ for (currentMethodIndex = 0; currentMethodIndex < size; ++ currentMethodIndex++) { ++ Content methodDocTree = writer.getMethodDocTreeHeader( ++ (MethodDoc) methods.get(currentMethodIndex), ++ methodDetailsTree); ++ buildChildren(node, methodDocTree); ++ methodDetailsTree.addContent(writer.getMethodDoc( ++ methodDocTree, (currentMethodIndex == size - 1))); ++ } ++ memberDetailsTree.addContent( ++ writer.getMethodDetails(methodDetailsTree)); ++ } ++ } + +- /** +- * {@inheritDoc} +- */ +- public String getName() { +- return "MethodDetails"; +- } ++ /** ++ * Build the signature. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param methodDocTree the content tree to which the documentation will be added ++ */ ++ public void buildSignature(XMLNode node, Content methodDocTree) { ++ methodDocTree.addContent( ++ writer.getSignature((MethodDoc) methods.get(currentMethodIndex))); ++ } + +- /** +- * Returns a list of methods that will be documented for the given class. +- * This information can be used for doclet specific documentation +- * generation. +- * +- * @param classDoc the {@link ClassDoc} we want to check. +- * @return a list of methods that will be documented. +- */ +- public List members(ClassDoc classDoc) { +- return visibleMemberMap.getMembersFor(classDoc); +- } ++ /** ++ * Build the deprecation information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param methodDocTree the content tree to which the documentation will be added ++ */ ++ public void buildDeprecationInfo(XMLNode node, Content methodDocTree) { ++ writer.addDeprecated( ++ (MethodDoc) methods.get(currentMethodIndex), methodDocTree); ++ } + +- /** +- * Returns the visible member map for the methods of this class. +- * +- * @return the visible member map for the methods of this class. +- */ +- public VisibleMemberMap getVisibleMemberMap() { +- return visibleMemberMap; +- } +- +- /** +- * {@inheritDoc} +- */ +- public boolean hasMembersToDocument() { +- return methods.size() > 0; +- } +- +- /** +- * Build the method documentation. +- */ +- public void buildMethodDoc(XMLNode node) { +- if (writer == null) { +- return; +- } +- for (currentMethodIndex = 0; +- currentMethodIndex < methods.size(); +- currentMethodIndex++) { +- buildChildren(node); +- } +- } +- +- /** +- * Build the overall header. +- */ +- public void buildHeader(XMLNode node) { +- writer.writeHeader( +- classDoc, +- configuration.getText("doclet.Method_Detail")); +- } +- +- /** +- * Build the header for the individual method. +- */ +- public void buildMethodHeader(XMLNode node) { +- writer.writeMethodHeader( +- (MethodDoc) methods.get(currentMethodIndex), +- currentMethodIndex == 0); +- } +- +- /** +- * Build the signature. +- */ +- public void buildSignature(XMLNode node) { +- writer.writeSignature((MethodDoc) methods.get(currentMethodIndex)); +- } +- +- /** +- * Build the deprecation information. +- */ +- public void buildDeprecationInfo(XMLNode node) { +- writer.writeDeprecated((MethodDoc) methods.get(currentMethodIndex)); +- } +- +- /** +- * Build the comments for the method. Do nothing if +- * {@link Configuration#nocomment} is set to true. If this method +- */ +- public void buildMethodComments(XMLNode node) { +- if (!configuration.nocomment) { ++ /** ++ * Build the comments for the method. Do nothing if ++ * {@link Configuration#nocomment} is set to true. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param methodDocTree the content tree to which the documentation will be added ++ */ ++ public void buildMethodComments(XMLNode node, Content methodDocTree) { ++ if (!configuration.nocomment) { + MethodDoc method = (MethodDoc) methods.get(currentMethodIndex); + + if (method.inlineTags().length == 0) { + DocFinder.Output docs = DocFinder.search( +- new DocFinder.Input(method)); ++ new DocFinder.Input(method)); + method = docs.inlineTags != null && docs.inlineTags.length > 0 ? + (MethodDoc) docs.holder : method; + +@@ -203,39 +209,27 @@ + //NOTE: When we fix the bug where ClassDoc.interfaceTypes() does + // not pass all implemented interfaces, holder will be the + // interface type. For now, it is really the erasure. +- writer.writeComments(method.containingClass(), method); +- } ++ writer.addComments(method.containingClass(), method, methodDocTree); + } ++ } + ++ /** ++ * Build the tag information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param methodDocTree the content tree to which the documentation will be added ++ */ ++ public void buildTagInfo(XMLNode node, Content methodDocTree) { ++ writer.addTags((MethodDoc) methods.get(currentMethodIndex), ++ methodDocTree); ++ } + +- +- /** +- * Build the tag information. +- */ +- public void buildTagInfo(XMLNode node) { +- writer.writeTags((MethodDoc) methods.get(currentMethodIndex)); +- } +- +- /** +- * Build the footer of the method. +- */ +- public void buildMethodFooter(XMLNode node) { +- writer.writeMethodFooter(); +- } +- +- /** +- * Build the overall footer. +- */ +- public void buildFooter(XMLNode node) { +- writer.writeFooter(classDoc); +- } +- +- /** +- * Return the method writer for this builder. +- * +- * @return the method writer for this builder. +- */ +- public MethodWriter getWriter() { +- return writer; +- } ++ /** ++ * Return the method writer for this builder. ++ * ++ * @return the method writer for this builder. ++ */ ++ public MethodWriter getWriter() { ++ return writer; ++ } + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java +@@ -25,10 +25,10 @@ + + package com.sun.tools.doclets.internal.toolkit.builders; + ++import java.io.*; ++import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; +-import com.sun.javadoc.*; +-import java.io.*; + + /** + * Builds the summary for a given package. +@@ -42,281 +42,315 @@ + * @since 1.5 + */ + public class PackageSummaryBuilder extends AbstractBuilder { ++ /** ++ * The root element of the package summary XML is {@value}. ++ */ ++ public static final String ROOT = "PackageDoc"; + +- /** +- * The root element of the package summary XML is {@value}. +- */ +- public static final String ROOT = "PackageDoc"; ++ /** ++ * The package being documented. ++ */ ++ private PackageDoc packageDoc; + +- /** +- * The package being documented. +- */ +- private PackageDoc packageDoc; ++ /** ++ * The doclet specific writer that will output the result. ++ */ ++ private PackageSummaryWriter packageWriter; + +- /** +- * The doclet specific writer that will output the result. +- */ +- private PackageSummaryWriter packageWriter; ++ /** ++ * The content that will be added to the package summary documentation tree. ++ */ ++ private Content contentTree; + +- private PackageSummaryBuilder(Configuration configuration) { +- super(configuration); ++ private PackageSummaryBuilder(Configuration configuration) { ++ super(configuration); ++ } ++ ++ /** ++ * Construct a new PackageSummaryBuilder. ++ * @param configuration the current configuration of the doclet. ++ * @param pkg the package being documented. ++ * @param packageWriter the doclet specific writer that will output the ++ * result. ++ * ++ * @return an instance of a PackageSummaryBuilder. ++ */ ++ public static PackageSummaryBuilder getInstance( ++ Configuration configuration, ++ PackageDoc pkg, ++ PackageSummaryWriter packageWriter) { ++ PackageSummaryBuilder builder = ++ new PackageSummaryBuilder(configuration); ++ builder.packageDoc = pkg; ++ builder.packageWriter = packageWriter; ++ return builder; ++ } ++ ++ /** ++ * Build the package summary. ++ */ ++ public void build() throws IOException { ++ if (packageWriter == null) { ++ //Doclet does not support this output. ++ return; ++ } ++ build(LayoutParser.getInstance(configuration).parseXML(ROOT), contentTree); ++ } ++ ++ /** ++ * {@inheritDoc} ++ */ ++ public String getName() { ++ return ROOT; ++ } ++ ++ /** ++ * Build the package documentation. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param contentTree the content tree to which the documentation will be added ++ */ ++ public void buildPackageDoc(XMLNode node, Content contentTree) throws Exception { ++ contentTree = packageWriter.getPackageHeader( ++ Util.getPackageName(packageDoc)); ++ buildChildren(node, contentTree); ++ packageWriter.addPackageFooter(contentTree); ++ packageWriter.printDocument(contentTree); ++ packageWriter.close(); ++ Util.copyDocFiles( ++ configuration, ++ Util.getPackageSourcePath(configuration, packageDoc), ++ DirectoryManager.getDirectoryPath(packageDoc) ++ + File.separator ++ + DocletConstants.DOC_FILES_DIR_NAME, ++ true); ++ } ++ ++ /** ++ * Build the content for the package doc. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param contentTree the content tree to which the package contents ++ * will be added ++ */ ++ public void buildContent(XMLNode node, Content contentTree) { ++ Content packageContentTree = packageWriter.getContentHeader(); ++ buildChildren(node, packageContentTree); ++ contentTree.addContent(packageContentTree); ++ } ++ ++ /** ++ * Build the package summary. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param packageContentTree the package content tree to which the summaries will ++ * be added ++ */ ++ public void buildSummary(XMLNode node, Content packageContentTree) { ++ Content summaryContentTree = packageWriter.getSummaryHeader(); ++ buildChildren(node, summaryContentTree); ++ packageContentTree.addContent(summaryContentTree); ++ } ++ ++ /** ++ * Build the summary for the interfaces in this package. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param summaryContentTree the summary tree to which the interface summary ++ * will be added ++ */ ++ public void buildInterfaceSummary(XMLNode node, Content summaryContentTree) { ++ String interfaceTableSummary = ++ configuration.getText("doclet.Member_Table_Summary", ++ configuration.getText("doclet.Interface_Summary"), ++ configuration.getText("doclet.interfaces")); ++ String[] interfaceTableHeader = new String[] { ++ configuration.getText("doclet.Interface"), ++ configuration.getText("doclet.Description") ++ }; ++ ClassDoc[] interfaces = ++ packageDoc.isIncluded() ++ ? packageDoc.interfaces() ++ : configuration.classDocCatalog.interfaces( ++ Util.getPackageName(packageDoc)); ++ if (interfaces.length > 0) { ++ packageWriter.addClassesSummary( ++ interfaces, ++ configuration.getText("doclet.Interface_Summary"), ++ interfaceTableSummary, interfaceTableHeader, summaryContentTree); + } + +- /** +- * Construct a new PackageSummaryBuilder. +- * @param configuration the current configuration of the doclet. +- * @param pkg the package being documented. +- * @param packageWriter the doclet specific writer that will output the +- * result. +- * +- * @return an instance of a PackageSummaryBuilder. +- */ +- public static PackageSummaryBuilder getInstance( +- Configuration configuration, +- PackageDoc pkg, +- PackageSummaryWriter packageWriter) { +- PackageSummaryBuilder builder = +- new PackageSummaryBuilder(configuration); +- builder.packageDoc = pkg; +- builder.packageWriter = packageWriter; +- return builder; ++ /** ++ * Build the summary for the classes in this package. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param summaryContentTree the summary tree to which the class summary will ++ * be added ++ */ ++ public void buildClassSummary(XMLNode node, Content summaryContentTree) { ++ String classTableSummary = ++ configuration.getText("doclet.Member_Table_Summary", ++ configuration.getText("doclet.Class_Summary"), ++ configuration.getText("doclet.classes")); ++ String[] classTableHeader = new String[] { ++ configuration.getText("doclet.Class"), ++ configuration.getText("doclet.Description") ++ }; ++ ClassDoc[] classes = ++ packageDoc.isIncluded() ++ ? packageDoc.ordinaryClasses() ++ : configuration.classDocCatalog.ordinaryClasses( ++ Util.getPackageName(packageDoc)); ++ if (classes.length > 0) { ++ packageWriter.addClassesSummary( ++ classes, ++ configuration.getText("doclet.Class_Summary"), ++ classTableSummary, classTableHeader, summaryContentTree); ++ } ++ } ++ ++ /** ++ * Build the summary for the enums in this package. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param summaryContentTree the summary tree to which the enum summary will ++ * be added ++ */ ++ public void buildEnumSummary(XMLNode node, Content summaryContentTree) { ++ String enumTableSummary = ++ configuration.getText("doclet.Member_Table_Summary", ++ configuration.getText("doclet.Enum_Summary"), ++ configuration.getText("doclet.enums")); ++ String[] enumTableHeader = new String[] { ++ configuration.getText("doclet.Enum"), ++ configuration.getText("doclet.Description") ++ }; ++ ClassDoc[] enums = ++ packageDoc.isIncluded() ++ ? packageDoc.enums() ++ : configuration.classDocCatalog.enums( ++ Util.getPackageName(packageDoc)); ++ if (enums.length > 0) { ++ packageWriter.addClassesSummary( ++ enums, ++ configuration.getText("doclet.Enum_Summary"), ++ enumTableSummary, enumTableHeader, summaryContentTree); ++ } ++ } ++ ++ /** ++ * Build the summary for the exceptions in this package. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param summaryContentTree the summary tree to which the exception summary will ++ * be added ++ */ ++ public void buildExceptionSummary(XMLNode node, Content summaryContentTree) { ++ String exceptionTableSummary = ++ configuration.getText("doclet.Member_Table_Summary", ++ configuration.getText("doclet.Exception_Summary"), ++ configuration.getText("doclet.exceptions")); ++ String[] exceptionTableHeader = new String[] { ++ configuration.getText("doclet.Exception"), ++ configuration.getText("doclet.Description") ++ }; ++ ClassDoc[] exceptions = ++ packageDoc.isIncluded() ++ ? packageDoc.exceptions() ++ : configuration.classDocCatalog.exceptions( ++ Util.getPackageName(packageDoc)); ++ if (exceptions.length > 0) { ++ packageWriter.addClassesSummary( ++ exceptions, ++ configuration.getText("doclet.Exception_Summary"), ++ exceptionTableSummary, exceptionTableHeader, summaryContentTree); ++ } ++ } ++ ++ /** ++ * Build the summary for the errors in this package. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param summaryContentTree the summary tree to which the error summary will ++ * be added ++ */ ++ public void buildErrorSummary(XMLNode node, Content summaryContentTree) { ++ String errorTableSummary = ++ configuration.getText("doclet.Member_Table_Summary", ++ configuration.getText("doclet.Error_Summary"), ++ configuration.getText("doclet.errors")); ++ String[] errorTableHeader = new String[] { ++ configuration.getText("doclet.Error"), ++ configuration.getText("doclet.Description") ++ }; ++ ClassDoc[] errors = ++ packageDoc.isIncluded() ++ ? packageDoc.errors() ++ : configuration.classDocCatalog.errors( ++ Util.getPackageName(packageDoc)); ++ if (errors.length > 0) { ++ packageWriter.addClassesSummary( ++ errors, ++ configuration.getText("doclet.Error_Summary"), ++ errorTableSummary, errorTableHeader, summaryContentTree); ++ } ++ } ++ ++ /** ++ * Build the summary for the annotation type in this package. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param summaryContentTree the summary tree to which the annotation type ++ * summary will be added ++ */ ++ public void buildAnnotationTypeSummary(XMLNode node, Content summaryContentTree) { ++ String annotationtypeTableSummary = ++ configuration.getText("doclet.Member_Table_Summary", ++ configuration.getText("doclet.Annotation_Types_Summary"), ++ configuration.getText("doclet.annotationtypes")); ++ String[] annotationtypeTableHeader = new String[] { ++ configuration.getText("doclet.AnnotationType"), ++ configuration.getText("doclet.Description") ++ }; ++ ClassDoc[] annotationTypes = ++ packageDoc.isIncluded() ++ ? packageDoc.annotationTypes() ++ : configuration.classDocCatalog.annotationTypes( ++ Util.getPackageName(packageDoc)); ++ if (annotationTypes.length > 0) { ++ packageWriter.addClassesSummary( ++ annotationTypes, ++ configuration.getText("doclet.Annotation_Types_Summary"), ++ annotationtypeTableSummary, annotationtypeTableHeader, ++ summaryContentTree); ++ } ++ } ++ ++ /** ++ * Build the description of the summary. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param packageContentTree the tree to which the package description will ++ * be added ++ */ ++ public void buildPackageDescription(XMLNode node, Content packageContentTree) { ++ if (configuration.nocomment) { ++ return; ++ } ++ packageWriter.addPackageDescription(packageContentTree); ++ } ++ ++ /** ++ * Build the tags of the summary. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param packageContentTree the tree to which the package tags will be added ++ */ ++ public void buildPackageTags(XMLNode node, Content packageContentTree) { ++ if (configuration.nocomment) { ++ return; + } + +- /** +- * Build the package summary. +- */ +- public void build() throws IOException { +- if (packageWriter == null) { +- //Doclet does not support this output. +- return; +- } +- build(LayoutParser.getInstance(configuration).parseXML(ROOT)); +- } +- +- /** +- * {@inheritDoc} +- */ +- public String getName() { +- return ROOT; +- } +- +- /** +- * Build the package documentation. +- */ +- public void buildPackageDoc(XMLNode node) throws Exception { +- buildChildren(node); +- packageWriter.close(); +- Util.copyDocFiles( +- configuration, +- Util.getPackageSourcePath(configuration, packageDoc), +- DirectoryManager.getDirectoryPath(packageDoc) +- + File.separator +- + DocletConstants.DOC_FILES_DIR_NAME, +- true); +- } +- +- /** +- * Build the header of the summary. +- */ +- public void buildPackageHeader(XMLNode node) { +- packageWriter.writePackageHeader(Util.getPackageName(packageDoc)); +- } +- +- /** +- * Build the description of the summary. +- */ +- public void buildPackageDescription(XMLNode node) { +- if (configuration.nocomment) { +- return; +- } +- packageWriter.writePackageDescription(); +- } +- +- /** +- * Build the tags of the summary. +- */ +- public void buildPackageTags(XMLNode node) { +- if (configuration.nocomment) { +- return; +- } +- packageWriter.writePackageTags(); +- } +- +- /** +- * Build the package summary. +- */ +- public void buildSummary(XMLNode node) { +- buildChildren(node); +- } +- +- /** +- * Build the overall header. +- */ +- public void buildSummaryHeader(XMLNode node) { +- packageWriter.writeSummaryHeader(); +- } +- +- /** +- * Build the overall footer. +- */ +- public void buildSummaryFooter(XMLNode node) { +- packageWriter.writeSummaryFooter(); +- } +- +- /** +- * Build the summary for the classes in this package. +- */ +- public void buildClassSummary(XMLNode node) { +- String classTableSummary = +- configuration.getText("doclet.Member_Table_Summary", +- configuration.getText("doclet.Class_Summary"), +- configuration.getText("doclet.classes")); +- String[] classTableHeader = new String[] { +- configuration.getText("doclet.Class"), +- configuration.getText("doclet.Description") +- }; +- ClassDoc[] classes = +- packageDoc.isIncluded() +- ? packageDoc.ordinaryClasses() +- : configuration.classDocCatalog.ordinaryClasses( +- Util.getPackageName(packageDoc)); +- if (classes.length > 0) { +- packageWriter.writeClassesSummary( +- classes, +- configuration.getText("doclet.Class_Summary"), +- classTableSummary, classTableHeader); +- } +- } +- +- /** +- * Build the summary for the interfaces in this package. +- */ +- public void buildInterfaceSummary(XMLNode node) { +- String interfaceTableSummary = +- configuration.getText("doclet.Member_Table_Summary", +- configuration.getText("doclet.Interface_Summary"), +- configuration.getText("doclet.interfaces")); +- String[] interfaceTableHeader = new String[] { +- configuration.getText("doclet.Interface"), +- configuration.getText("doclet.Description") +- }; +- ClassDoc[] interfaces = +- packageDoc.isIncluded() +- ? packageDoc.interfaces() +- : configuration.classDocCatalog.interfaces( +- Util.getPackageName(packageDoc)); +- if (interfaces.length > 0) { +- packageWriter.writeClassesSummary( +- interfaces, +- configuration.getText("doclet.Interface_Summary"), +- interfaceTableSummary, interfaceTableHeader); +- } +- } +- +- /** +- * Build the summary for the enums in this package. +- */ +- public void buildAnnotationTypeSummary(XMLNode node) { +- String annotationtypeTableSummary = +- configuration.getText("doclet.Member_Table_Summary", +- configuration.getText("doclet.Annotation_Types_Summary"), +- configuration.getText("doclet.annotationtypes")); +- String[] annotationtypeTableHeader = new String[] { +- configuration.getText("doclet.AnnotationType"), +- configuration.getText("doclet.Description") +- }; +- ClassDoc[] annotationTypes = +- packageDoc.isIncluded() +- ? packageDoc.annotationTypes() +- : configuration.classDocCatalog.annotationTypes( +- Util.getPackageName(packageDoc)); +- if (annotationTypes.length > 0) { +- packageWriter.writeClassesSummary( +- annotationTypes, +- configuration.getText("doclet.Annotation_Types_Summary"), +- annotationtypeTableSummary, annotationtypeTableHeader); +- } +- } +- +- /** +- * Build the summary for the enums in this package. +- */ +- public void buildEnumSummary(XMLNode node) { +- String enumTableSummary = +- configuration.getText("doclet.Member_Table_Summary", +- configuration.getText("doclet.Enum_Summary"), +- configuration.getText("doclet.enums")); +- String[] enumTableHeader = new String[] { +- configuration.getText("doclet.Enum"), +- configuration.getText("doclet.Description") +- }; +- ClassDoc[] enums = +- packageDoc.isIncluded() +- ? packageDoc.enums() +- : configuration.classDocCatalog.enums( +- Util.getPackageName(packageDoc)); +- if (enums.length > 0) { +- packageWriter.writeClassesSummary( +- enums, +- configuration.getText("doclet.Enum_Summary"), +- enumTableSummary, enumTableHeader); +- } +- } +- +- /** +- * Build the summary for the exceptions in this package. +- */ +- public void buildExceptionSummary(XMLNode node) { +- String exceptionTableSummary = +- configuration.getText("doclet.Member_Table_Summary", +- configuration.getText("doclet.Exception_Summary"), +- configuration.getText("doclet.exceptions")); +- String[] exceptionTableHeader = new String[] { +- configuration.getText("doclet.Exception"), +- configuration.getText("doclet.Description") +- }; +- ClassDoc[] exceptions = +- packageDoc.isIncluded() +- ? packageDoc.exceptions() +- : configuration.classDocCatalog.exceptions( +- Util.getPackageName(packageDoc)); +- if (exceptions.length > 0) { +- packageWriter.writeClassesSummary( +- exceptions, +- configuration.getText("doclet.Exception_Summary"), +- exceptionTableSummary, exceptionTableHeader); +- } +- } +- +- /** +- * Build the summary for the errors in this package. +- */ +- public void buildErrorSummary(XMLNode node) { +- String errorTableSummary = +- configuration.getText("doclet.Member_Table_Summary", +- configuration.getText("doclet.Error_Summary"), +- configuration.getText("doclet.errors")); +- String[] errorTableHeader = new String[] { +- configuration.getText("doclet.Error"), +- configuration.getText("doclet.Description") +- }; +- ClassDoc[] errors = +- packageDoc.isIncluded() +- ? packageDoc.errors() +- : configuration.classDocCatalog.errors( +- Util.getPackageName(packageDoc)); +- if (errors.length > 0) { +- packageWriter.writeClassesSummary( +- errors, +- configuration.getText("doclet.Error_Summary"), +- errorTableSummary, errorTableHeader); +- } +- } +- +- /** +- * Build the footer of the summary. +- */ +- public void buildPackageFooter(XMLNode node) { +- packageWriter.writePackageFooter(); +- } ++ packageWriter.addPackageTags(packageContentTree); ++ } + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java +@@ -27,7 +27,6 @@ + + import java.io.*; + import java.util.*; +- + import com.sun.javadoc.*; + import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.internal.toolkit.*; +@@ -87,6 +86,11 @@ + */ + protected MemberDoc currentMember; + ++ /** ++ * The content that will be added to the serialized form documentation tree. ++ */ ++ private Content contentTree; ++ + private SerializedFormBuilder(Configuration configuration) { + super(configuration); + } +@@ -117,7 +121,7 @@ + } catch (Exception e) { + throw new DocletAbortException(); + } +- build(LayoutParser.getInstance(configuration).parseXML(NAME)); ++ build(LayoutParser.getInstance(configuration).parseXML(NAME), contentTree); + writer.close(); + } + +@@ -130,34 +134,44 @@ + + /** + * Build the serialized form. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param serializedTree content tree to which the documentation will be added + */ +- public void buildSerializedForm(XMLNode node) throws Exception { +- buildChildren(node); ++ public void buildSerializedForm(XMLNode node, Content serializedTree) throws Exception { ++ serializedTree = writer.getHeader(configuration.getText( ++ "doclet.Serialized_Form")); ++ buildChildren(node, serializedTree); ++ writer.addFooter(serializedTree); ++ writer.printDocument(serializedTree); + writer.close(); + } + + /** +- * Build the header. ++ * Build the serialized form summaries. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param serializedTree content tree to which the documentation will be added + */ +- public void buildHeader(XMLNode node) { +- writer.writeHeader(configuration.getText("doclet.Serialized_Form")); ++ public void buildSerializedFormSummaries(XMLNode node, Content serializedTree) { ++ Content serializedSummariesTree = writer.getSerializedSummariesHeader(); ++ PackageDoc[] packages = configuration.packages; ++ for (int i = 0; i < packages.length; i++) { ++ currentPackage = packages[i]; ++ buildChildren(node, serializedSummariesTree); ++ } ++ serializedTree.addContent(writer.getSerializedContent( ++ serializedSummariesTree)); + } + + /** +- * Build the contents. ++ * Build the package serialized form for the current package being processed. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param serializedSummariesTree content tree to which the documentation will be added + */ +- public void buildSerializedFormSummaries(XMLNode node) { +- PackageDoc[] packages = configuration.packages; +- for (int i = 0; i < packages.length; i++) { +- currentPackage = packages[i]; +- buildChildren(node); +- } +- } +- +- /** +- * Build the package serialized for for the current package being processed. +- */ +- public void buildPackageSerializedForm(XMLNode node) { ++ public void buildPackageSerializedForm(XMLNode node, Content serializedSummariesTree) { ++ Content packageSerializedTree = writer.getPackageSerializedHeader(); + String foo = currentPackage.name(); + ClassDoc[] classes = currentPackage.allClasses(false); + if (classes == null || classes.length == 0) { +@@ -169,14 +183,29 @@ + if (!serialClassFoundToDocument(classes)) { + return; + } +- buildChildren(node); ++ buildChildren(node, packageSerializedTree); ++ serializedSummariesTree.addContent(packageSerializedTree); + } + +- public void buildPackageHeader(XMLNode node) { +- writer.writePackageHeader(Util.getPackageName(currentPackage)); ++ /** ++ * Build the package header. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param packageSerializedTree content tree to which the documentation will be added ++ */ ++ public void buildPackageHeader(XMLNode node, Content packageSerializedTree) { ++ packageSerializedTree.addContent(writer.getPackageHeader( ++ Util.getPackageName(currentPackage))); + } + +- public void buildClassSerializedForm(XMLNode node) { ++ /** ++ * Build the class serialized form. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param packageSerializedTree content tree to which the documentation will be added ++ */ ++ public void buildClassSerializedForm(XMLNode node, Content packageSerializedTree) { ++ Content classSerializedTree = writer.getClassSerializedHeader(); + ClassDoc[] classes = currentPackage.allClasses(false); + Arrays.sort(classes); + for (int j = 0; j < classes.length; j++) { +@@ -187,35 +216,293 @@ + if(!serialClassInclude(currentClass)) { + continue; + } +- buildChildren(node); ++ Content classTree = writer.getClassHeader(currentClass); ++ buildChildren(node, classTree); ++ classSerializedTree.addContent(classTree); + } + } +- } +- +- public void buildClassHeader(XMLNode node) { +- writer.writeClassHeader(currentClass); ++ packageSerializedTree.addContent(classSerializedTree); + } + + /** + * Build the serial UID information for the given class. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classTree content tree to which the serial UID information will be added + */ +- public void buildSerialUIDInfo(XMLNode node) { ++ public void buildSerialUIDInfo(XMLNode node, Content classTree) { ++ Content serialUidTree = writer.getSerialUIDInfoHeader(); + FieldDoc[] fields = currentClass.fields(false); + for (int i = 0; i < fields.length; i++) { + if (fields[i].name().equals("serialVersionUID") && + fields[i].constantValueExpression() != null) { +- writer.writeSerialUIDInfo(SERIAL_VERSION_UID_HEADER, +- fields[i].constantValueExpression()); +- return; ++ writer.addSerialUIDInfo(SERIAL_VERSION_UID_HEADER, ++ fields[i].constantValueExpression(), serialUidTree); ++ break; ++ } ++ } ++ classTree.addContent(serialUidTree); ++ } ++ ++ /** ++ * Build the summaries for the methods and fields. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classTree content tree to which the documentation will be added ++ */ ++ public void buildClassContent(XMLNode node, Content classTree) { ++ Content classContentTree = writer.getClassContentHeader(); ++ buildChildren(node, classContentTree); ++ classTree.addContent(classContentTree); ++ } ++ ++ /** ++ * Build the summaries for the methods that belong to the given ++ * class. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classContentTree content tree to which the documentation will be added ++ */ ++ public void buildSerializableMethods(XMLNode node, Content classContentTree) { ++ Content serializableMethodTree = methodWriter.getSerializableMethodsHeader(); ++ MemberDoc[] members = currentClass.serializationMethods(); ++ int membersLength = members.length; ++ if (membersLength > 0) { ++ for (int i = 0; i < membersLength; i++) { ++ currentMember = members[i]; ++ Content methodsContentTree = methodWriter.getMethodsContentHeader( ++ (i == membersLength - 1)); ++ buildChildren(node, methodsContentTree); ++ serializableMethodTree.addContent(methodsContentTree); ++ } ++ } ++ if (currentClass.serializationMethods().length > 0) { ++ classContentTree.addContent(methodWriter.getSerializableMethods( ++ configuration.getText("doclet.Serialized_Form_methods"), ++ serializableMethodTree)); ++ if (currentClass.isSerializable() && !currentClass.isExternalizable()) { ++ if (currentClass.serializationMethods().length == 0) { ++ Content noCustomizationMsg = methodWriter.getNoCustomizationMsg( ++ configuration.getText( ++ "doclet.Serializable_no_customization")); ++ classContentTree.addContent(methodWriter.getSerializableMethods( ++ configuration.getText("doclet.Serialized_Form_methods"), ++ noCustomizationMsg)); ++ } + } + } + } + + /** +- * Build the footer. ++ * Build the method sub header. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param methodsContentTree content tree to which the documentation will be added + */ +- public void buildFooter(XMLNode node) { +- writer.writeFooter(); ++ public void buildMethodSubHeader(XMLNode node, Content methodsContentTree) { ++ methodWriter.addMemberHeader((MethodDoc)currentMember, methodsContentTree); ++ } ++ ++ /** ++ * Build the deprecated method description. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param methodsContentTree content tree to which the documentation will be added ++ */ ++ public void buildDeprecatedMethodInfo(XMLNode node, Content methodsContentTree) { ++ methodWriter.addDeprecatedMemberInfo((MethodDoc) currentMember, methodsContentTree); ++ } ++ ++ /** ++ * Build the information for the method. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param methodsContentTree content tree to which the documentation will be added ++ */ ++ public void buildMethodInfo(XMLNode node, Content methodsContentTree) { ++ if(configuration.nocomment){ ++ return; ++ } ++ buildChildren(node, methodsContentTree); ++ } ++ ++ /** ++ * Build method description. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param methodsContentTree content tree to which the documentation will be added ++ */ ++ public void buildMethodDescription(XMLNode node, Content methodsContentTree) { ++ methodWriter.addMemberDescription((MethodDoc) currentMember, methodsContentTree); ++ } ++ ++ /** ++ * Build the method tags. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param methodsContentTree content tree to which the documentation will be added ++ */ ++ public void buildMethodTags(XMLNode node, Content methodsContentTree) { ++ methodWriter.addMemberTags((MethodDoc) currentMember, methodsContentTree); ++ MethodDoc method = (MethodDoc)currentMember; ++ if (method.name().compareTo("writeExternal") == 0 ++ && method.tags("serialData").length == 0) { ++ if (configuration.serialwarn) { ++ configuration.getDocletSpecificMsg().warning( ++ currentMember.position(), "doclet.MissingSerialDataTag", ++ method.containingClass().qualifiedName(), method.name()); ++ } ++ } ++ } ++ ++ /** ++ * Build the field header. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classContentTree content tree to which the documentation will be added ++ */ ++ public void buildFieldHeader(XMLNode node, Content classContentTree) { ++ if (currentClass.serializableFields().length > 0) { ++ buildFieldSerializationOverview(currentClass, classContentTree); ++ } ++ } ++ ++ /** ++ * Build the serialization overview for the given class. ++ * ++ * @param classDoc the class to print the overview for. ++ * @param classContentTree content tree to which the documentation will be added ++ */ ++ public void buildFieldSerializationOverview(ClassDoc classDoc, Content classContentTree) { ++ if (classDoc.definesSerializableFields()) { ++ FieldDoc serialPersistentField = ++ Util.asList(classDoc.serializableFields()).get(0); ++ // Check to see if there are inline comments, tags or deprecation ++ // information to be printed. ++ if (fieldWriter.shouldPrintOverview(serialPersistentField)) { ++ Content serializableFieldsTree = fieldWriter.getSerializableFieldsHeader(); ++ Content fieldsOverviewContentTree = fieldWriter.getFieldsContentHeader(true); ++ fieldWriter.addMemberDeprecatedInfo(serialPersistentField, ++ fieldsOverviewContentTree); ++ if (!configuration.nocomment) { ++ fieldWriter.addMemberDescription(serialPersistentField, ++ fieldsOverviewContentTree); ++ fieldWriter.addMemberTags(serialPersistentField, ++ fieldsOverviewContentTree); ++ } ++ serializableFieldsTree.addContent(fieldsOverviewContentTree); ++ classContentTree.addContent(fieldWriter.getSerializableFields( ++ configuration.getText("doclet.Serialized_Form_class"), ++ serializableFieldsTree)); ++ } ++ } ++ } ++ ++ /** ++ * Build the summaries for the fields that belong to the given class. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param classContentTree content tree to which the documentation will be added ++ */ ++ public void buildSerializableFields(XMLNode node, Content classContentTree) { ++ MemberDoc[] members = currentClass.serializableFields(); ++ int membersLength = members.length; ++ if (membersLength > 0) { ++ Content serializableFieldsTree = fieldWriter.getSerializableFieldsHeader(); ++ for (int i = 0; i < membersLength; i++) { ++ currentMember = members[i]; ++ if (!currentClass.definesSerializableFields()) { ++ Content fieldsContentTree = fieldWriter.getFieldsContentHeader( ++ (i == membersLength - 1)); ++ buildChildren(node, fieldsContentTree); ++ serializableFieldsTree.addContent(fieldsContentTree); ++ } ++ else { ++ buildSerialFieldTagsInfo(serializableFieldsTree); ++ } ++ } ++ classContentTree.addContent(fieldWriter.getSerializableFields( ++ configuration.getText("doclet.Serialized_Form_fields"), ++ serializableFieldsTree)); ++ } ++ } ++ ++ /** ++ * Build the field sub header. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param fieldsContentTree content tree to which the documentation will be added ++ */ ++ public void buildFieldSubHeader(XMLNode node, Content fieldsContentTree) { ++ if (!currentClass.definesSerializableFields()) { ++ FieldDoc field = (FieldDoc) currentMember; ++ fieldWriter.addMemberHeader(field.type().asClassDoc(), ++ field.type().typeName(), field.type().dimension(), field.name(), ++ fieldsContentTree); ++ } ++ } ++ ++ /** ++ * Build the field deprecation information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param fieldsContentTree content tree to which the documentation will be added ++ */ ++ public void buildFieldDeprecationInfo(XMLNode node, Content fieldsContentTree) { ++ if (!currentClass.definesSerializableFields()) { ++ FieldDoc field = (FieldDoc)currentMember; ++ fieldWriter.addMemberDeprecatedInfo(field, fieldsContentTree); ++ } ++ } ++ ++ /** ++ * Build the serial field tags information. ++ * ++ * @param serializableFieldsTree content tree to which the documentation will be added ++ */ ++ public void buildSerialFieldTagsInfo(Content serializableFieldsTree) { ++ if(configuration.nocomment){ ++ return; ++ } ++ FieldDoc field = (FieldDoc)currentMember; ++ // Process Serializable Fields specified as array of ++ // ObjectStreamFields. Print a member for each serialField tag. ++ // (There should be one serialField tag per ObjectStreamField ++ // element.) ++ SerialFieldTag[] tags = field.serialFieldTags(); ++ Arrays.sort(tags); ++ int tagsLength = tags.length; ++ for (int i = 0; i < tagsLength; i++) { ++ Content fieldsContentTree = fieldWriter.getFieldsContentHeader( ++ (i == tagsLength - 1)); ++ fieldWriter.addMemberHeader(tags[i].fieldTypeDoc(), ++ tags[i].fieldType(), "", tags[i].fieldName(), fieldsContentTree); ++ fieldWriter.addMemberDescription(tags[i], fieldsContentTree); ++ serializableFieldsTree.addContent(fieldsContentTree); ++ } ++ } ++ ++ /** ++ * Build the field information. ++ * ++ * @param node the XML element that specifies which components to document ++ * @param fieldsContentTree content tree to which the documentation will be added ++ */ ++ public void buildFieldInfo(XMLNode node, Content fieldsContentTree) { ++ if(configuration.nocomment){ ++ return; ++ } ++ FieldDoc field = (FieldDoc)currentMember; ++ ClassDoc cd = field.containingClass(); ++ // Process default Serializable field. ++ if ((field.tags("serial").length == 0) && ! field.isSynthetic() ++ && configuration.serialwarn) { ++ configuration.message.warning(field.position(), ++ "doclet.MissingSerialTag", cd.qualifiedName(), ++ field.name()); ++ } ++ fieldWriter.addMemberDescription(field, fieldsContentTree); ++ fieldWriter.addMemberTags(field, fieldsContentTree); + } + + /** +@@ -298,208 +585,4 @@ + return false; + } + +- /** +- * Build the method header. +- */ +- public void buildMethodHeader(XMLNode node) { +- if (currentClass.serializationMethods().length > 0) { +- methodWriter.writeHeader( +- configuration.getText("doclet.Serialized_Form_methods")); +- if (currentClass.isSerializable() && !currentClass.isExternalizable()) { +- if (currentClass.serializationMethods().length == 0) { +- methodWriter.writeNoCustomizationMsg( +- configuration.getText( +- "doclet.Serializable_no_customization")); +- } +- } +- } +- } +- +- /** +- * Build the method sub header. +- */ +- public void buildMethodSubHeader(XMLNode node) { +- methodWriter.writeMemberHeader((MethodDoc) currentMember); +- } +- +- /** +- * Build the deprecated method description. +- */ +- public void buildDeprecatedMethodInfo(XMLNode node) { +- methodWriter.writeDeprecatedMemberInfo((MethodDoc) currentMember); +- } +- +- /** +- * Build method tags. +- */ +- public void buildMethodDescription(XMLNode node) { +- methodWriter.writeMemberDescription((MethodDoc) currentMember); +- } +- +- /** +- * Build the method tags. +- */ +- public void buildMethodTags(XMLNode node) { +- methodWriter.writeMemberTags((MethodDoc) currentMember); +- MethodDoc method = (MethodDoc)currentMember; +- if (method.name().compareTo("writeExternal") == 0 +- && method.tags("serialData").length == 0) { +- if (configuration.serialwarn) { +- configuration.getDocletSpecificMsg().warning( +- currentMember.position(), "doclet.MissingSerialDataTag", +- method.containingClass().qualifiedName(), method.name()); +- } +- } +- } +- +- /** +- * build the information for the method. +- */ +- public void buildMethodInfo(XMLNode node) { +- if(configuration.nocomment){ +- return; +- } +- buildChildren(node); +- } +- +- /** +- * Build the method footer. +- */ +- public void buildMethodFooter(XMLNode node) { +- methodWriter.writeMemberFooter(); +- } +- +- /** +- * Build the field header. +- */ +- public void buildFieldHeader(XMLNode node) { +- if (currentClass.serializableFields().length > 0) { +- buildFieldSerializationOverview(currentClass); +- fieldWriter.writeHeader(configuration.getText( +- "doclet.Serialized_Form_fields")); +- } +- } +- +- /** +- * If possible, build the serialization overview for the given +- * class. +- * +- * @param classDoc the class to print the overview for. +- */ +- public void buildFieldSerializationOverview(ClassDoc classDoc) { +- if (classDoc.definesSerializableFields()) { +- FieldDoc serialPersistentField = +- (FieldDoc)((Util.asList(classDoc.serializableFields()).get(0))); +- // Check to see if there are inline comments, tags or deprecation +- // information to be printed. +- if (fieldWriter.shouldPrintMemberDetails(serialPersistentField)) { +- fieldWriter.writeHeader( +- configuration.getText("doclet.Serialized_Form_class")); +- fieldWriter.writeMemberDeprecatedInfo(serialPersistentField); +- if (!configuration.nocomment) { +- fieldWriter.writeMemberDescription(serialPersistentField); +- fieldWriter.writeMemberTags(serialPersistentField); +- } +- fieldWriter.writeMemberFooter(serialPersistentField); +- // Footer required to close the definition list tag +- // for serialization overview. +- fieldWriter.writeFooter( +- configuration.getText("doclet.Serialized_Form_class")); +- } +- } +- } +- +- /** +- * Build the field sub header. +- */ +- public void buildFieldSubHeader(XMLNode node) { +- if (! currentClass.definesSerializableFields() ){ +- FieldDoc field = (FieldDoc) currentMember; +- fieldWriter.writeMemberHeader(field.type().asClassDoc(), +- field.type().typeName(), field.type().dimension(), field.name()); +- } +- } +- +- /** +- * Build the field deprecation information. +- */ +- public void buildFieldDeprecationInfo(XMLNode node) { +- if (!currentClass.definesSerializableFields()) { +- FieldDoc field = (FieldDoc)currentMember; +- fieldWriter.writeMemberDeprecatedInfo(field); +- } +- } +- +- /** +- * Build the field information. +- */ +- public void buildFieldInfo(XMLNode node) { +- if(configuration.nocomment){ +- return; +- } +- FieldDoc field = (FieldDoc)currentMember; +- ClassDoc cd = field.containingClass(); +- if (cd.definesSerializableFields()) { +- // Process Serializable Fields specified as array of +- // ObjectStreamFields. Print a member for each serialField tag. +- // (There should be one serialField tag per ObjectStreamField +- // element.) +- SerialFieldTag[] tags = field.serialFieldTags(); +- Arrays.sort(tags); +- for (int i = 0; i < tags.length; i++) { +- fieldWriter.writeMemberHeader(tags[i].fieldTypeDoc(), +- tags[i].fieldType(), "", tags[i].fieldName()); +- fieldWriter.writeMemberDescription(tags[i]); +- +- } +- } else { +- +- // Process default Serializable field. +- if ((field.tags("serial").length == 0) && ! field.isSynthetic() +- && configuration.serialwarn) { +- configuration.message.warning(field.position(), +- "doclet.MissingSerialTag", cd.qualifiedName(), +- field.name()); +- } +- fieldWriter.writeMemberDescription(field); +- fieldWriter.writeMemberTags(field); +- } +- } +- +- /** +- * Build the field sub footer. +- */ +- public void buildFieldSubFooter(XMLNode node) { +- if (! currentClass.definesSerializableFields()) { +- fieldWriter.writeMemberFooter(); +- } +- } +- +- /** +- * Build the summaries for the methods that belong to the given +- * class. +- */ +- public void buildSerializableMethods(XMLNode node) { +- MemberDoc[] members = currentClass.serializationMethods(); +- if (members.length > 0) { +- for (int i = 0; i < members.length; i++) { +- currentMember = members[i]; +- buildChildren(node); +- } +- } +- } +- +- /** +- * Build the summaries for the fields that belong to the given +- * class. +- */ +- public void buildSerializableFields(XMLNode node) { +- MemberDoc[] members = currentClass.serializableFields(); +- if (members.length > 0) { +- for (int i = 0; i < members.length; i++) { +- currentMember = members[i]; +- buildChildren(node); +- } +- } +- } + } +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml b/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml +@@ -29,177 +29,145 @@ + <Doclet> + + <PackageDoc> +- <PackageHeader/> +- <Summary> +- <SummaryHeader/> +- <InterfaceSummary/> +- <ClassSummary/> +- <EnumSummary/> +- <ExceptionSummary/> +- <ErrorSummary/> +- <AnnotationTypeSummary/> +- <SummaryFooter/> +- </Summary> +- <PackageDescription/> +- <PackageTags/> +- <PackageFooter/> ++ <Content> ++ <Summary> ++ <InterfaceSummary/> ++ <ClassSummary/> ++ <EnumSummary/> ++ <ExceptionSummary/> ++ <ErrorSummary/> ++ <AnnotationTypeSummary/> ++ </Summary> ++ <PackageDescription/> ++ <PackageTags/> ++ </Content> + </PackageDoc> + + <AnnotationTypeDoc> +- <AnnotationTypeHeader/> +- <DeprecationInfo/> +- <AnnotationTypeSignature/> +- <AnnotationTypeDescription/> +- <AnnotationTypeTagInfo/> ++ <AnnotationTypeInfo> ++ <DeprecationInfo/> ++ <AnnotationTypeSignature/> ++ <AnnotationTypeDescription/> ++ <AnnotationTypeTagInfo/> ++ </AnnotationTypeInfo> + <MemberSummary> +- <AnnotationTypeRequiredMemberSummary/> ++ <AnnotationTypeRequiredMemberSummary/> + <AnnotationTypeOptionalMemberSummary/> + </MemberSummary> +- <AnnotationTypeRequiredMemberDetails> +- <Header/> +- <AnnotationTypeRequiredMember> +- <MemberHeader/> +- <Signature/> +- <DeprecationInfo/> +- <MemberComments/> +- <TagInfo/> +- <MemberFooter/> +- </AnnotationTypeRequiredMember> +- </AnnotationTypeRequiredMemberDetails> +- <AnnotationTypeOptionalMemberDetails> +- <AnnotationTypeOptionalMember> +- <MemberHeader/> +- <Signature/> +- <DeprecationInfo/> +- <MemberComments/> +- <TagInfo/> +- <DefaultValueInfo/> +- <MemberFooter/> +- </AnnotationTypeOptionalMember> +- <Footer/> +- </AnnotationTypeOptionalMemberDetails> +- <AnnotationTypeFooter/> ++ <AnnotationTypeMemberDetails> ++ <AnnotationTypeRequiredMemberDetails> ++ <AnnotationTypeRequiredMember> ++ <Signature/> ++ <DeprecationInfo/> ++ <MemberComments/> ++ <TagInfo/> ++ </AnnotationTypeRequiredMember> ++ </AnnotationTypeRequiredMemberDetails> ++ <AnnotationTypeOptionalMemberDetails> ++ <AnnotationTypeOptionalMember> ++ <Signature/> ++ <DeprecationInfo/> ++ <MemberComments/> ++ <TagInfo/> ++ <DefaultValueInfo/> ++ </AnnotationTypeOptionalMember> ++ </AnnotationTypeOptionalMemberDetails> ++ </AnnotationTypeMemberDetails> + </AnnotationTypeDoc> + + <ClassDoc> +- <ClassHeader/> + <ClassTree/> +- <TypeParamInfo/> +- <SuperInterfacesInfo/> +- <ImplementedInterfacesInfo/> +- <SubClassInfo/> +- <SubInterfacesInfo/> +- <InterfaceUsageInfo/> +- <NestedClassInfo/> +- <DeprecationInfo/> +- <ClassSignature/> +- <ClassDescription/> +- <ClassTagInfo/> ++ <ClassInfo> ++ <TypeParamInfo/> ++ <SuperInterfacesInfo/> ++ <ImplementedInterfacesInfo/> ++ <SubClassInfo/> ++ <SubInterfacesInfo/> ++ <InterfaceUsageInfo/> ++ <NestedClassInfo/> ++ <DeprecationInfo/> ++ <ClassSignature/> ++ <ClassDescription/> ++ <ClassTagInfo/> ++ </ClassInfo> + <MemberSummary> + <NestedClassesSummary/> +- <NestedClassesInheritedSummary/> + <EnumConstantsSummary/> + <FieldsSummary/> +- <FieldsInheritedSummary/> + <ConstructorsSummary/> + <MethodsSummary/> +- <MethodsInheritedSummary/> + </MemberSummary> +- <EnumConstantsDetails> +- <Header/> +- <EnumConstant> +- <EnumConstantHeader/> +- <Signature/> +- <DeprecationInfo/> +- <EnumConstantComments/> +- <TagInfo/> +- <EnumConstantFooter/> +- </EnumConstant> +- <Footer/> +- </EnumConstantsDetails> +- <FieldDetails> +- <Header/> +- <FieldDoc> +- <FieldHeader/> +- <Signature/> +- <DeprecationInfo/> +- <FieldComments/> +- <TagInfo/> +- <FieldFooter/> +- </FieldDoc> +- <Footer/> +- </FieldDetails> +- <ConstructorDetails> +- <Header/> +- <ConstructorDoc> +- <ConstructorHeader/> +- <Signature/> +- <DeprecationInfo/> +- <ConstructorComments/> +- <TagInfo/> +- <ConstructorFooter/> +- </ConstructorDoc> +- <Footer/> +- </ConstructorDetails> +- <MethodDetails> +- <Header/> +- <MethodDoc> +- <MethodHeader/> +- <Signature/> +- <DeprecationInfo/> +- <MethodComments/> +- <TagInfo/> +- <MethodFooter/> +- </MethodDoc> +- <Footer/> +- </MethodDetails> +- <ClassFooter/> ++ <MemberDetails> ++ <EnumConstantsDetails> ++ <EnumConstant> ++ <Signature/> ++ <DeprecationInfo/> ++ <EnumConstantComments/> ++ <TagInfo/> ++ </EnumConstant> ++ </EnumConstantsDetails> ++ <FieldDetails> ++ <FieldDoc> ++ <Signature/> ++ <DeprecationInfo/> ++ <FieldComments/> ++ <TagInfo/> ++ </FieldDoc> ++ </FieldDetails> ++ <ConstructorDetails> ++ <ConstructorDoc> ++ <Signature/> ++ <DeprecationInfo/> ++ <ConstructorComments/> ++ <TagInfo/> ++ </ConstructorDoc> ++ </ConstructorDetails> ++ <MethodDetails> ++ <MethodDoc> ++ <Signature/> ++ <DeprecationInfo/> ++ <MethodComments/> ++ <TagInfo/> ++ </MethodDoc> ++ </MethodDetails> ++ </MemberDetails> + </ClassDoc> + + <ConstantSummary> +- <Header/> + <Contents/> + <ConstantSummaries> +- <PackageConstantSummary> +- <PackageHeader/> +- <ClassConstantSummary> +- <ClassHeader/> +- <ConstantMembers/> +- <ClassFooter/> +- </ClassConstantSummary> +- </PackageConstantSummary> ++ <PackageHeader/> ++ <ClassConstantSummary> ++ <ConstantMembers/> ++ </ClassConstantSummary> + </ConstantSummaries> + <Footer/> + </ConstantSummary> + + <SerializedForm> +- <Header/> + <SerializedFormSummaries> + <PackageSerializedForm> + <PackageHeader/> + <ClassSerializedForm> +- <ClassHeader/> + <SerialUIDInfo/> +- <MethodHeader/> +- <SerializableMethods> +- <MethodSubHeader/> +- <DeprecatedMethodInfo/> +- <MethodInfo> +- <MethodDescription/> +- <MethodTags/> +- </MethodInfo> +- <MethodFooter/> +- </SerializableMethods> +- <FieldHeader/> +- <SerializableFields> +- <FieldSubHeader/> +- <FieldDeprecationInfo/> +- <FieldInfo/> +- <FieldSubFooter/> +- </SerializableFields> ++ <ClassContent> ++ <SerializableMethods> ++ <MethodSubHeader/> ++ <DeprecatedMethodInfo/> ++ <MethodInfo> ++ <MethodDescription/> ++ <MethodTags/> ++ </MethodInfo> ++ </SerializableMethods> ++ <FieldHeader/> ++ <SerializableFields> ++ <FieldSubHeader/> ++ <FieldDeprecationInfo/> ++ <FieldInfo/> ++ </SerializableFields> ++ </ClassContent> + </ClassSerializedForm> + </PackageSerializedForm> + </SerializedFormSummaries> +- <Footer/> + </SerializedForm> + </Doclet> +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties b/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties +@@ -111,12 +111,12 @@ + doclet.extends=extends + doclet.Package_private=(package private) + doclet.implements=implementsdoclet.Same_package_name_used=Package name format used twice: {0} +-doclet.Nested_Classes_Interfaces_Inherited_From_Class=Nested classes/interfaces inherited from class {0} +-doclet.Nested_Classes_Interface_Inherited_From_Interface=Nested classes/interfaces inherited from interface {0} +-doclet.Methods_Inherited_From_Class=Methods inherited from class {0} +-doclet.Methods_Inherited_From_Interface=Methods inherited from interface {0} +-doclet.Fields_Inherited_From_Class=Fields inherited from class {0} +-doclet.Fields_Inherited_From_Interface=Fields inherited from interface {0} ++doclet.Nested_Classes_Interfaces_Inherited_From_Class=Nested classes/interfaces inherited from class ++doclet.Nested_Classes_Interface_Inherited_From_Interface=Nested classes/interfaces inherited from interface ++doclet.Methods_Inherited_From_Class=Methods inherited from class ++doclet.Methods_Inherited_From_Interface=Methods inherited from interface ++doclet.Fields_Inherited_From_Class=Fields inherited from class ++doclet.Fields_Inherited_From_Interface=Fields inherited from interface + doclet.Serializable=Serializable + doclet.Externalizable=Externalizable + doclet.Annotation_Type_Member_Detail=Element Detail +@@ -136,12 +136,19 @@ + doclet.Constants_Table_Summary={0} table, listing constant fields, and values + doclet.Member_Table_Summary={0} table, listing {1}, and an explanation + doclet.fields=fields ++doclet.Fields=Fields + doclet.constructors=constructors ++doclet.Constructors=Constructors + doclet.methods=methods ++doclet.Methods=Methods + doclet.annotation_type_optional_members=optional elements ++doclet.Annotation_Type_Optional_Members=Optional Elements + doclet.annotation_type_required_members=required elements ++doclet.Annotation_Type_Required_Members=Required Elements + doclet.enum_constants=enum constants ++doclet.Enum_Constants=Enum Constants + doclet.nested_classes=nested classes ++doclet.Nested_Classes=Nested Classes + doclet.subclasses=subclasses + doclet.subinterfaces=subinterfaces + doclet.Modifier=Modifier +@@ -173,7 +180,7 @@ + + doclet.enum_valueof_doc=\n\ + Returns the enum constant of this type with the specified name.\n\ +- The string must match <I>exactly</I> an identifier used to declare an\n\ ++ The string must match <i>exactly</i> an identifier used to declare an\n\ + enum constant in this type. (Extraneous whitespace characters are \n\ + not permitted.)\n\ + \n\ +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/stylesheet.css b/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/stylesheet.css +new file mode 100644 +--- /dev/null ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/stylesheet.css +@@ -0,0 +1,439 @@ ++/* Javadoc style sheet */ ++/* ++Overall document style ++*/ ++* { ++ margin:0; ++ padding:0; ++} ++body { ++ font-family:Helvetica, Arial, sans-serif; ++ color:#000000; ++} ++p { ++ margin:20px 0; ++} ++pre { ++ font-size:1.0em; ++} ++h1 { ++ font-size:1.4em; ++} ++h2 { ++ font-size:1.35em; ++} ++h3 { ++ font-size:1.3em; ++} ++h4 { ++ font-size:1.25em; ++} ++ul { ++ margin:10px 0 10px 20px; ++} ++li { ++ list-style:disc; ++} ++dl dt { ++ font-size:0.95em; ++ font-weight:bold; ++ margin:10px 0 0 0; ++} ++dl dd { ++ margin:10px 0 10px 20px; ++} ++dl dd ul { ++ margin-left:0; ++} ++dl dd ul li { ++ list-style:none; ++ margin:10px 0 10px 0; ++} ++caption { ++ background: #CCCCFF; ++ color:#000000; ++ text-align: left; ++ font-size: 150%; ++ font-weight: bold; ++ border-left: 2px ridge; ++ border-right: 2px ridge; ++ border-top: 2px ridge; ++ padding-left: 5px; ++ width:auto; ++} ++/* ++Document title and Copyright styles ++*/ ++.aboutLanguage { ++ float:right; ++ font-size:0.9em; ++ color:#000000; ++} ++.legalCopy { ++ margin:7px; ++} ++.bar { ++ font-size:1em; ++ margin:10px 0 0 10px; ++} ++.bar a { ++ font-weight:normal; ++} ++/* ++Navigation bar styles ++*/ ++.topNav { ++ border-top:2px solid #C0C0C0; ++ margin:7px; ++ padding:7px 0; ++ height:2.8em; ++ width:99%; ++ min-width:600px; ++} ++.bottomNav { ++ border-top:2px solid #C0C0C0; ++ margin:7px; ++ padding:7px 0; ++ height:2.8em; ++ width:99%; ++} ++.subNav { ++ border-bottom:2px solid #C0C0C0; ++ float:left; ++ width:99%; ++ margin:7px; ++ min-width:600px; ++} ++.subNav div { ++ clear:left; ++ float:left; ++ padding:0 0 5px 2px; ++ width:100%; ++} ++.topNav a:link,.topNav a:active, .topNav a:visited, .topNav a:hover, ++.bottomNav a:link,.bottomNav a:active, .bottomNav a:visited, .bottomNav a:hover { ++ color:#000000; ++ font-weight:bold; ++ text-decoration:underline; ++ font-size:1em; ++} ++/* Navigation bar list styles */ ++.topNav ul.navList, .bottomNav ul.navList { ++ background-color:#EEEEFF; ++ padding:7px 5px; ++ margin:0; ++ float:left; ++ width:80%; ++} ++ul.navList li{ ++ list-style:none; ++ float:left; ++ padding:3px 4px; ++ color:#000000; ++ font-size:0.98em; ++} ++ul.navList li.navBarCell1Rev { ++ background-color:#00008B; ++ color:#FFFFFF; ++ font-weight:bold; ++ font-size:0.97em; ++} ++/* Sub-navigation bar list styles */ ++.subNav ul.navList { ++ float:left; ++ margin:0; ++ font-size:0.7em; ++ width:350px; ++} ++ul.subNavList { ++ float:left; ++ margin:0; ++ font-size:0.7em; ++ width:350px; ++} ++ul.subNavList li{ ++ list-style:none; ++ float:left; ++ font-size:90%; ++} ++/* ++Page header and footer styles ++*/ ++.header, .footer { ++ clear:both; ++ margin:0 7px; ++} ++.indexHeader { ++ font-size:0.9em; ++ margin:10px 0 7px 10px; ++} ++.header ul { ++ padding-left:20px; ++} ++/* Header and footer title styles */ ++.header h1.title { ++ font-size:1.4em; ++ text-align:center; ++ margin:0; ++} ++.header h2.title { ++ font-size:1.35em; ++ margin:0; ++} ++.subTitle { ++ margin:0; ++ padding-top:10px; ++ font-size:0.75em; ++ font-weight:bold; ++} ++/* ++Page layout container styles ++*/ ++.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, ++.constantValuesContainer { ++ clear:both; ++ padding:10px 10px; ++ position:relative; ++} ++.indexContainer { ++ padding:0 0 10px 10px; ++ font-size:0.9em; ++} ++/* ++Class inheritance information styles ++*/ ++ul.inheritance { ++ margin:0; ++ padding:0; ++} ++ul.inheritance li { ++ display:inline; ++ list-style:none; ++} ++ul.inheritance li ul.inheritance { ++ margin-left:15px; ++ background-image:url(resources/inherit.gif); ++ background-repeat:no-repeat; ++ padding-left:15px; ++ padding-top:1px; ++} ++/* ++Heading styles ++*/ ++.indexContainer h2 { ++ font-weight:normal; ++ font-size:1.0em; ++ padding:10px 0 0 0; ++} ++.contentContainer h2 { ++ margin:10px 0; ++} ++.constantValuesContainer h2 { ++ background:#CCCCFF; ++ border:2px ridge; ++ padding:3px; ++ margin:0 0 10px 0; ++} ++.serializedFormContainer ul.blockList li.blockList h2 { ++ background:#EEEEFF; ++ border:2px ridge; ++ padding:3px; ++ margin:0 0 15px 0; ++ text-align:center; ++} ++.classUseContainer ul li ul li h3 { ++ margin-bottom:30px; ++ padding:3px; ++} ++.serializedFormContainer ul.blockList li.blockList ul.blockList li.blockList h3 { ++ background:#EEEEFF; ++ margin:0 0 15px 0; ++ padding:3px; ++} ++.serializedFormContainer ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockList h3 { ++ background:#CCCCFF; ++ margin:0 0 15px 0; ++ padding:3px; ++ border:2px ridge; ++} ++ul.blockList ul.blockList li.blockList h3, ul.blockList ul.blockList li.blockList h3 { ++ background:#CCCCFF; ++ border:2px ridge; ++ padding-left:5px; ++} ++div.summary ul.blockList ul.blockList li.blockList h3 { ++ background:#CCCCFF; ++ border:0; ++ border:2px ridge; ++ padding-left:5px; ++} ++div.summary ul.blockList ul.blockList ul.blockList li.blockList h3 { ++ background:#EEEEFF; ++ border:0; ++ border-bottom:2px ridge; ++} ++div.details ul.blockList ul.blockList ul.blockList li.blockList h4, ++div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { ++ font-size:1.15em; ++ font-weight:bold; ++ padding:0 0 10px 0; ++} ++/* ++Table styles ++*/ ++.contentContainer table { ++ border-collapse: collapse ; ++ width:100%; ++} ++.contentContainer table td, .contentContainer table th { ++ border:2px ridge; ++ padding:3px; ++} ++/* Constant values page table styles */ ++.constantValuesContainer table { ++ border-collapse: collapse ; ++ margin:0 0 10px 0; ++} ++.constantValuesContainer table caption{ ++ font-size:0.95em; ++ padding:3px; ++ background:#EEEEFF; ++} ++.constantValuesContainer table td, .constantValuesContainer table th { ++ border:2px ridge; ++ padding:3px; ++} ++/* Class-use/Package-use page table styles */ ++.classUseContainer table { ++ border-collapse: collapse ; ++ width:100%; ++ margin:0 0 15px 0; ++} ++.classUseContainer ul li ul li table { ++ margin-bottom:30px; ++} ++.classUseContainer ul li ul li table caption{ ++ font-size:0.95em; ++ padding:3px; ++ background:#EEEEFF; ++} ++.classUseContainer table td, .classUseContainer table th { ++ border:2px ridge; ++ padding:3px; ++} ++/* Summary table styles */ ++ul.blockList li.blockList table.overviewSummary { ++ margin:0; ++ margin-bottom:15px; ++} ++ul.blockList li.blockList table caption { ++ padding:3px; ++} ++ul.blockList li.blockList table.overviewSummary td.colFirst{ ++ text-align:right; ++} ++table.packageSummary td.colFirst, table.overviewSummary th.colFirst { ++ width:15%; ++} ++div.summary ul.blockList ul.blockList li.blockList caption { ++ display:none; ++} ++div.summary ul.blockList li.blockList ul.blockList li.blockList table.overviewSummary th { ++ border-top:0; ++} ++/* Table column block styles */ ++ul.blockList li.blockList table.overviewSummary td.colLast div.block{ ++ padding:0; ++ padding-left:40px; ++} ++ul.blockList li.blockList table.overviewSummary td.colOne div.block{ ++ padding:0; ++ padding-left:40px; ++} ++.contentContainer ul.blockList li.blockList table .colOne div.block{ ++ padding-left:40px; ++} ++.classUseContainer ul li ul li table .colLast div.block, ++.classUseContainer ul li ul li table .colOne div.block{ ++ padding-left:40px; ++} ++/* ++List styles ++*/ ++ul.horizontal li { ++ display:inline; ++ font-size:0.9em; ++} ++/* Container specific list styles */ ++.indexContainer ul { ++ margin:0; ++} ++.indexContainer ul li { ++ list-style:none; ++} ++.serializedFormContainer ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockList { ++ border:0; ++} ++.serializedFormContainer ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockList { ++ list-style:none; ++ border:0; ++ border-bottom:2px ridge; ++} ++.serializedFormContainer ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockListLast { ++ list-style:none; ++} ++/* General list styles */ ++ul.blockList, ul.blockListLast { ++ margin-left:0; ++ padding-left:0; ++} ++ul.blockList li.blockList, ul.blockListLast li.blockList { ++ list-style:none; ++ margin-bottom:25px; ++} ++ul.blockList ul.blockList ul.blockList li.blockList { ++ border:2px ridge; ++} ++div.details ul.blockList ul.blockList ul.blockList li.blockList { ++ border:0; ++ border-bottom:2px ridge; ++} ++/* Definition list styles */ ++ul.blockList li.blockList dl{ ++ margin-bottom:15px; ++} ++ul.blockList li.blockList dl dd{ ++ margin:0 0 0 30px; ++} ++ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockList dl, ++ul.blockList li.blockList ul.blockList li.blockList ul.blockListLast li.blockList dl{ ++ padding:0 0 10px 35px; ++} ++dl.nameValue dt, dl.nameValue dd{ ++ display:inline; ++} ++ul.blockList li.blockList pre{ ++ margin:0 0 15px 0; ++} ++/* List content styles */ ++ul.blockList li.blockList ul.blockList li.blockList pre{ ++ margin:10px 0 15px 0; ++} ++ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockList pre, ++ul.blockList li.blockList ul.blockList li.blockList ul.blockListLast li.blockList pre{ ++ padding:0 0 10px 0; ++} ++ul.blockList li.blockList ul.blockList li.blockList ul.blockList li.blockList div.block, ++ul.blockList li.blockList ul.blockList li.blockList ul.blockListLast li.blockList div.block{ ++ padding:0 0 10px 35px; ++} ++/* ++Formatting effect styles ++*/ ++.strong { ++ font-weight:bold; ++} ++.sourceLineNo { ++ color:green; ++ padding:0 30px 0 0; ++} +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java +@@ -46,7 +46,7 @@ + /** + * The file separator string, "/", used in the formation of the URL path. + */ +- public static final String URL_FILE_SEPERATOR = "/"; ++ public static final String URL_FILE_SEPARATOR = "/"; + + /** + * Never instaniated. +@@ -123,13 +123,13 @@ + for (int i = 0; i < packageName.length(); i++) { + char ch = packageName.charAt(i); + if (ch == '.') { +- pathstr.append(URL_FILE_SEPERATOR); ++ pathstr.append(URL_FILE_SEPARATOR); + } else { + pathstr.append(ch); + } + } +- if (pathstr.length() > 0 && ! pathstr.toString().endsWith(URL_FILE_SEPERATOR)) { +- pathstr.append(URL_FILE_SEPERATOR); ++ if (pathstr.length() > 0 && ! pathstr.toString().endsWith(URL_FILE_SEPARATOR)) { ++ pathstr.append(URL_FILE_SEPARATOR); + } + return pathstr.toString(); + } +@@ -155,7 +155,7 @@ + for (int i = 0; i < name.length(); i++) { + char ch = name.charAt(i); + if (ch == '.') { +- pathstr.append(URL_FILE_SEPERATOR); ++ pathstr.append(URL_FILE_SEPARATOR); + } else { + pathstr.append(ch); + } +@@ -184,7 +184,7 @@ + StringBuffer pathstr = new StringBuffer(); + pathstr.append(getRelativePath(from)); + pathstr.append(getPath(to)); +- pathstr.append(URL_FILE_SEPERATOR); ++ pathstr.append(URL_FILE_SEPARATOR); + return pathstr.toString(); + } + +@@ -226,10 +226,10 @@ + for (int i = 0; i < from.length(); i++) { + char ch = from.charAt(i); + if (ch == '.') { +- pathstr.append(".." + URL_FILE_SEPERATOR); ++ pathstr.append(".." + URL_FILE_SEPARATOR); + } + } +- pathstr.append(".." + URL_FILE_SEPERATOR); ++ pathstr.append(".." + URL_FILE_SEPARATOR); + return pathstr.toString(); + } + +@@ -297,7 +297,7 @@ + String pathstr = createPathString(pd); + if (pathstr.length() > 0) { + buf.append(pathstr); +- buf.append(URL_FILE_SEPERATOR); ++ buf.append(URL_FILE_SEPARATOR); + } + buf.append(filename); + return buf.toString(); +diff --git a/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java b/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java +--- langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java ++++ langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java +@@ -51,6 +51,11 @@ + {{"&", "&"}, {"<", "<"}, {">", ">"}}; + + /** ++ * Name of the resource directory. ++ */ ++ public static final String RESOURCESDIR = "resources"; ++ ++ /** + * Return array of class members whose documentation is to be generated. + * If the member is deprecated do not include such a member in the + * returned array. +@@ -236,8 +241,8 @@ + String destname = configuration.docFileDestDirName; + File srcdir = new File(path + dir); + if (destname.length() > 0 && !destname.endsWith( +- DirectoryManager.URL_FILE_SEPERATOR)) { +- destname += DirectoryManager.URL_FILE_SEPERATOR; ++ DirectoryManager.URL_FILE_SEPARATOR)) { ++ destname += DirectoryManager.URL_FILE_SEPARATOR; + } + String dest = destname + dir; + try { +@@ -263,7 +268,7 @@ + && ! configuration.shouldExcludeDocFileDir( + srcfile.getName())){ + copyDocFiles(configuration, path, dir + +- DirectoryManager.URL_FILE_SEPERATOR + srcfile.getName(), ++ DirectoryManager.URL_FILE_SEPARATOR + srcfile.getName(), + overwrite); + } + } +@@ -322,25 +327,38 @@ + * it already exists. + */ + public static void copyResourceFile(Configuration configuration, +- String resourcefile, +- boolean overwrite) { +- String destdir = configuration.destDirName; +- String destresourcesdir = destdir + "resources"; +- DirectoryManager.createDirectory(configuration, destresourcesdir); +- File destfile = new File(destresourcesdir, resourcefile); ++ String resourcefile, boolean overwrite) { ++ String destresourcesdir = configuration.destDirName + RESOURCESDIR; ++ copyFile(configuration, resourcefile, RESOURCESDIR, destresourcesdir, ++ overwrite); ++ } ++ ++ /** ++ * Copy a file from a source directory to a destination directory ++ * (if it is not there already). If <code>overwrite</code> is true and ++ * the destination file already exists, overwrite it. ++ * ++ * @param configuration Holds the error message ++ * @param file The name of the file to copy ++ * @param source The source directory ++ * @param destination The destination directory where the file needs to be copied ++ * @param overwrite A flag to indicate whether the file in the ++ * destination directory will be overwritten if ++ * it already exists. ++ */ ++ public static void copyFile(Configuration configuration, String file, String source, ++ String destination, boolean overwrite) { ++ DirectoryManager.createDirectory(configuration, destination); ++ File destfile = new File(destination, file); + if(destfile.exists() && (! overwrite)) return; + try { +- + InputStream in = Configuration.class.getResourceAsStream( +- "resources/" + resourcefile); +- ++ source + DirectoryManager.URL_FILE_SEPARATOR + file); + if(in==null) return; +- + OutputStream out = new FileOutputStream(destfile); + byte[] buf = new byte[2048]; + int n; + while((n = in.read(buf))>0) out.write(buf,0,n); +- + in.close(); + out.close(); + } catch(Throwable t) {} +@@ -357,12 +375,12 @@ + try{ + String pkgPath = DirectoryManager.getDirectoryPath(pkgDoc); + String completePath = new SourcePath(configuration.sourcepath). +- getDirectory(pkgPath) + DirectoryManager.URL_FILE_SEPERATOR; ++ getDirectory(pkgPath) + DirectoryManager.URL_FILE_SEPARATOR; + //Make sure that both paths are using the same seperators. + completePath = Util.replaceText(completePath, File.separator, +- DirectoryManager.URL_FILE_SEPERATOR); ++ DirectoryManager.URL_FILE_SEPARATOR); + pkgPath = Util.replaceText(pkgPath, File.separator, +- DirectoryManager.URL_FILE_SEPERATOR); ++ DirectoryManager.URL_FILE_SEPARATOR); + return completePath.substring(0, completePath.indexOf(pkgPath)); + } catch (Exception e){ + return ""; +@@ -572,6 +590,24 @@ + } + + /** ++ * Given a string, strips all html characters and ++ * return the result. ++ * ++ * @param rawString The string to check. ++ * @return the original string with all of the HTML characters ++ * stripped. ++ * ++ */ ++ public static String stripHtml(String rawString) { ++ // remove HTML tags ++ rawString = rawString.replaceAll("\\<.*?>", " "); ++ // consolidate multiple spaces between a word to a single space ++ rawString = rawString.replaceAll("\\b\\s{2,}\\b", " "); ++ // remove extra whitespaces ++ return rawString.trim(); ++ } ++ ++ /** + * Create the directory path for the file to be generated, construct + * FileOutputStream and OutputStreamWriter depending upon docencoding. + * +diff --git a/test/com/sun/javadoc/AccessAsciiArt/AccessAsciiArt.java b/test/com/sun/javadoc/AccessAsciiArt/AccessAsciiArt.java +--- langtools/test/com/sun/javadoc/AccessAsciiArt/AccessAsciiArt.java ++++ langtools/test/com/sun/javadoc/AccessAsciiArt/AccessAsciiArt.java +@@ -84,17 +84,17 @@ + + // Test the top line of the class tree + { +-" <IMG SRC=\"../../resources/inherit.gif\" ALT=\"extended by \"><A HREF=\"../../p1/C.html\" title=\"class in p1\">p1.C</A>", ++"<li><a href=\"../../p1/C.html\" title=\"class in p1\">p1.C</a></li>", + TMPDEST_DIR1 + "p1" + FS + "subpkg" + FS + "SSC.html" }, + + // Test the second line of the class tree + { +-" <IMG SRC=\"../../resources/inherit.gif\" ALT=\"extended by \"><A HREF=\"../../p1/SC.html\" title=\"class in p1\">p1.SC</A>", ++"<li><a href=\"../../p1/SC.html\" title=\"class in p1\">p1.SC</a></li>", + TMPDEST_DIR1 + "p1" + FS + "subpkg" + FS + "SSC.html" }, + + // Test the third line of the class tree + { +-" <IMG SRC=\"../../resources/inherit.gif\" ALT=\"extended by \"><STRONG>p1.subpkg.SSC</STRONG>", ++"<li>p1.subpkg.SSC</li>", + TMPDEST_DIR1 + "p1" + FS + "subpkg" + FS +"SSC.html" }, + + }; +diff --git a/test/com/sun/javadoc/AccessH1/AccessH1.java b/test/com/sun/javadoc/AccessH1/AccessH1.java +--- langtools/test/com/sun/javadoc/AccessH1/AccessH1.java ++++ langtools/test/com/sun/javadoc/AccessH1/AccessH1.java +@@ -83,18 +83,19 @@ + * NOTE: The standard doclet uses the same separator "\n" for all OS's + */ + private static final String[][] testArray = { +- +- // Test the style sheet +- { +- "h1 { font-size: 145% }", +- TMPDEST_DIR1 + "stylesheet.css" }, +- +- // Test the doc title in the overview page +- { +- "<H1>" + LS + "Document Title" + LS + "</H1>", +- TMPDEST_DIR1 + "overview-summary.html" } +- +- }; ++ // Test the style sheet ++ { ++ ".header h1.title {" + LS + " font-size:1.4em;" + LS + ++ " text-align:center;" + LS + " margin:0;" + LS + ++ "}", ++ TMPDEST_DIR1 + "stylesheet.css" ++ }, ++ // Test the doc title in the overview page ++ { ++ "<h1 class=\"title\">Document Title</h1>", ++ TMPDEST_DIR1 + "overview-summary.html" ++ } ++ }; + + public static void runTestsOnHTML(String[][] testArray) { + +diff --git a/test/com/sun/javadoc/AccessSkipNav/AccessSkipNav.java b/test/com/sun/javadoc/AccessSkipNav/AccessSkipNav.java +--- langtools/test/com/sun/javadoc/AccessSkipNav/AccessSkipNav.java ++++ langtools/test/com/sun/javadoc/AccessSkipNav/AccessSkipNav.java +@@ -46,6 +46,7 @@ + private static final String BUGNAME = "AccessSkipNav"; + private static final String FS = System.getProperty("file.separator"); + private static final String PS = System.getProperty("path.separator"); ++ private static final String LS = System.getProperty("line.separator"); + private static final String TMPDEST_DIR1 = "." + FS + "docs1" + FS; + private static final String TMPDEST_DIR2 = "." + FS + "docs2" + FS; + +@@ -84,20 +85,22 @@ + + // Testing only for the presence of the <a href> and <a name> + +- // Top navbar <A HREF> +- { "<A HREF=\"#skip-navbar_top\" title=\"Skip navigation links\"></A>", ++ // Top navbar <a href> ++ { "<a href=\"#skip-navbar_top\" title=\"Skip navigation links\"></a>", + TMPDEST_DIR1 + "p1" + FS + "C1.html" }, + +- // Top navbar <A NAME> +- { "<A NAME=\"skip-navbar_top\"></A>", ++ // Top navbar <a name> ++ { "<a name=\"skip-navbar_top\">" + LS + ++ "<!-- -->" + LS + "</a>", + TMPDEST_DIR1 + "p1" + FS + "C1.html" }, + +- // Bottom navbar <A HREF> +- { "<A HREF=\"#skip-navbar_bottom\" title=\"Skip navigation links\"></A>", ++ // Bottom navbar <a href> ++ { "<a href=\"#skip-navbar_bottom\" title=\"Skip navigation links\"></a>", + TMPDEST_DIR1 + "p1" + FS + "C1.html" }, + +- // Bottom navbar <A NAME> +- { "<A NAME=\"skip-navbar_bottom\"></A>", ++ // Bottom navbar <a name> ++ { "<a name=\"skip-navbar_bottom\">" + LS + ++ "<!-- -->" + LS + "</a>", + TMPDEST_DIR1 + "p1" + FS + "C1.html" } + }; + +diff --git a/test/com/sun/javadoc/AccessSummary/AccessSummary.java b/test/com/sun/javadoc/AccessSummary/AccessSummary.java +--- langtools/test/com/sun/javadoc/AccessSummary/AccessSummary.java ++++ langtools/test/com/sun/javadoc/AccessSummary/AccessSummary.java +@@ -24,7 +24,7 @@ + /* + * @test @(#)AccessSummary.java + * @bug 4637604 4775148 +- * @summary Test the tables for summary="" ++ * @summary Test the tables for summary attribute + * @author dkramer + * @library ../lib/ + * @build JavadocTester +@@ -44,15 +44,15 @@ + + // Test that the summary attribute appears + { OUTPUT_DIR1 + "overview-summary.html", +- "SUMMARY=\"\"" }, ++ "summary=\"Packages table, listing packages, and an explanation\"" }, + + // Test that the summary attribute appears + { OUTPUT_DIR1 + "p1" + FS + "C1.html", +- "SUMMARY=\"\"" }, ++ "summary=\"Constructor Summary table, listing constructors, and an explanation\"" }, + + // Test that the summary attribute appears + { OUTPUT_DIR1 + "constant-values.html", +- "SUMMARY=\"\"" } ++ "summary=\"Constant Field Values table, listing constant fields, and values\"" } + }; + + // First test with -header only +diff --git a/test/com/sun/javadoc/AuthorDD/AuthorDD.java b/test/com/sun/javadoc/AuthorDD/AuthorDD.java +--- langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java ++++ langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java +@@ -86,12 +86,12 @@ + + // Test single @since tag: + +- { "<DT><STRONG>Since:</STRONG></DT>"+NL+" <DD>JDK 1.0</DD>", ++ { "<dt><span class=\"strong\">Since:</span></dt>"+NL+" <dd>JDK 1.0</dd>", + BUGID + FS + "p1" + FS + "C1.html" }, + + // Test multiple @author tags: + +- { "<DT><STRONG>Author:</STRONG></DT>"+NL+" <DD>Doug Kramer, Jamie, Neal</DD>", ++ { "<dt><span class=\"strong\">Author:</span></dt>"+NL+" <dd>Doug Kramer, Jamie, Neal</dd>", + BUGID + FS + "p1" + FS + "C1.html" }, + + }; +diff --git a/test/com/sun/javadoc/JavascriptWinTitle/JavascriptWinTitle.java b/test/com/sun/javadoc/JavascriptWinTitle/JavascriptWinTitle.java +--- langtools/test/com/sun/javadoc/JavascriptWinTitle/JavascriptWinTitle.java ++++ langtools/test/com/sun/javadoc/JavascriptWinTitle/JavascriptWinTitle.java +@@ -90,44 +90,34 @@ + private static final String[][] testArray = { + + // Test the javascript "type" attribute is present: +- { "<SCRIPT type=\"text/javascript\">", ++ { "<script type=\"text/javascript\">", ++ TMPDEST_DIR1 + "overview-summary.html" }, ++ ++ // Test onload is absent: ++ { "<body>", + TMPDEST_DIR1 + "overview-summary.html" }, + + // Test onload is present: +- { "onload=\"windowTitle();\"", +- TMPDEST_DIR1 + "overview-summary.html" }, +- +- // Test onload is present: +- { "onload=\"windowTitle();\"", ++ { "<body>", + TMPDEST_DIR1 + FS + "p1" + FS + "package-summary.html" }, + +- // Test onload is present: +- { "onload=\"windowTitle();\"", +- TMPDEST_DIR1 + FS + "p1" + FS + "C.html" }, +- + // Test that "onload" is not present in BODY tag: +- { "<BODY BGCOLOR=\"white\">", ++ { "<body>", + TMPDEST_DIR1 + "overview-frame.html" }, + + // Test that "onload" is not present in BODY tag: +- { "<BODY BGCOLOR=\"white\">", ++ { "<body>", + TMPDEST_DIR1 + "allclasses-frame.html" }, + + // Test that "onload" is not present in BODY tag: +- { "<BODY BGCOLOR=\"white\">", ++ { "<body>", + TMPDEST_DIR1 + FS + "p1" + FS + "package-frame.html" }, + + // Test that win title javascript is followed by NOSCRIPT code. +- {"<SCRIPT type=\"text/javascript\">" + LS + +- "function windowTitle()" + LS + +- "{" + LS + +- " if (location.href.indexOf('is-external=true') == -1) {" + LS + +- " parent.document.title=\"C (Window Title)\";" + LS + +- " }" + LS + +- "}" + LS + +- "</SCRIPT>" + LS + +- "<NOSCRIPT>" + LS + +- "</NOSCRIPT>", ++ {"<script type=\"text/javascript\"><!--" + LS + ++ " if (location.href.indexOf('is-external=true') == -1) {" + LS + ++ " parent.document.title=\"C (Window Title)\";" + LS + ++ " }" + LS + "//-->" + LS + "</script>", + TMPDEST_DIR1 + FS + "p1" + FS + "C.html" + } + +diff --git a/test/com/sun/javadoc/MetaTag/MetaTag.java b/test/com/sun/javadoc/MetaTag/MetaTag.java +--- langtools/test/com/sun/javadoc/MetaTag/MetaTag.java ++++ langtools/test/com/sun/javadoc/MetaTag/MetaTag.java +@@ -67,31 +67,31 @@ + private static final String[][] TEST = { + + { OUTPUT_DIR + FS + "p1" + FS + "C1.html", +- "<META NAME=\"keywords\" CONTENT=\"p1.C1 class\">" }, ++ "<meta name=\"keywords\" content=\"p1.C1 class\">" }, + + { OUTPUT_DIR + FS + "p1" + FS + "C1.html", +- "<META NAME=\"keywords\" CONTENT=\"field1\">" }, ++ "<meta name=\"keywords\" content=\"field1\">" }, + + { OUTPUT_DIR + FS + "p1" + FS + "C1.html", +- "<META NAME=\"keywords\" CONTENT=\"field2\">" }, ++ "<meta name=\"keywords\" content=\"field2\">" }, + + { OUTPUT_DIR + FS + "p1" + FS + "C1.html", +- "<META NAME=\"keywords\" CONTENT=\"method1()\">" }, ++ "<meta name=\"keywords\" content=\"method1()\">" }, + + { OUTPUT_DIR + FS + "p1" + FS + "C1.html", +- "<META NAME=\"keywords\" CONTENT=\"method2()\">" }, ++ "<meta name=\"keywords\" content=\"method2()\">" }, + + { OUTPUT_DIR + FS + "p1" + FS + "package-summary.html", +- "<META NAME=\"keywords\" CONTENT=\"p1 package\">" }, ++ "<meta name=\"keywords\" content=\"p1 package\">" }, + + { OUTPUT_DIR + FS + "overview-summary.html", +- "<META NAME=\"keywords\" CONTENT=\"Overview, Sample Packages\">" }, ++ "<meta name=\"keywords\" content=\"Overview, Sample Packages\">" }, + + //NOTE: Hopefully, this regression test is not run at midnight. If the output + //was generated yesterday and this test is run today, the test will fail. + {OUTPUT_DIR + FS + "overview-summary.html", +- "<META NAME=\"date\" " +- + "CONTENT=\"" + m_dateFormat.format(new Date()) + "\">"}, ++ "<meta name=\"date\" " ++ + "content=\"" + m_dateFormat.format(new Date()) + "\">"}, + }; + + private static final String[][] NEGATED_TEST = NO_TEST; +diff --git a/test/com/sun/javadoc/ValidHtml/ValidHtml.java b/test/com/sun/javadoc/ValidHtml/ValidHtml.java +--- langtools/test/com/sun/javadoc/ValidHtml/ValidHtml.java ++++ langtools/test/com/sun/javadoc/ValidHtml/ValidHtml.java +@@ -33,12 +33,10 @@ + * @run main ValidHtml + */ + +- + import com.sun.javadoc.*; + import java.util.*; + import java.io.*; + +- + /** + * Runs javadoc and runs regression tests on the resulting HTML. + * It reads each file, complete with newlines, into a string to easily +@@ -66,13 +64,14 @@ + String srcdir = System.getProperty("test.src", "."); + + // Test for all cases except the split index page +- runJavadoc(new String[] {"-d", TMPDEST_DIR1, +- "-doctitle", "Document Title", +- "-windowtitle", "Window Title", +- "-use", +- "-overview", (srcdir + FS + "overview.html"), +- "-sourcepath", srcdir, +- "p1", "p2"}); ++ runJavadoc(new String[]{"-d", TMPDEST_DIR1, ++ "-doctitle", "Document Title", ++ "-windowtitle", "Window Title", ++ "-use", ++ "-overview", (srcdir + FS + "overview.html"), ++ "-sourcepath", srcdir, ++ "p1", "p2" ++ }); + runTestsOnHTML(testArray); + + printSummary(); +@@ -90,53 +89,52 @@ + * NOTE: The standard doclet uses the same separator "\n" for all OS's + */ + private static final String[][] testArray = { +- +- // Test the proper DOCTYPE element is present: +- { +-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">", +- TMPDEST_DIR1 + "index.html" }, +- +- // Test the proper DOCTYPE element is present: +- { +-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", +- TMPDEST_DIR1 + "overview-summary.html" }, +- +- // Test the proper DOCTYPE element is present: +- { +-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", +- TMPDEST_DIR1 + "p1" + FS + "package-summary.html" }, +- +- // Test the proper DOCTYPE element is present: +- { +-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", +- TMPDEST_DIR1 + "p1" + FS + "C.html" }, +- +- // Test the proper DOCTYPE element is present: +- { +-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", +- TMPDEST_DIR1 + "overview-frame.html" }, +- +- // Test the proper DOCTYPE element is present: +- { +-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", +- TMPDEST_DIR1 + "allclasses-frame.html" }, +- +- // Test the proper DOCTYPE element is present: +- { +-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", +- TMPDEST_DIR1 + "p1" + FS + "package-frame.html" }, +- +- // Test that <NOFRAMES> is inside <FRAMESET> element: +- { +-"</NOFRAMES>" + LS + "</FRAMESET>", +- TMPDEST_DIR1 + "index.html" }, +- +- // Test the table elements are in the correct order: +- { +-"</FONT></TD>" + LS + "</TR>", +- TMPDEST_DIR1 + FS + "p1" + FS + "package-use.html" } +- +- }; ++ // Test the proper DOCTYPE element is present: ++ { ++ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">", ++ TMPDEST_DIR1 + "index.html" ++ }, ++ // Test the proper DOCTYPE element is present: ++ { ++ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", ++ TMPDEST_DIR1 + "overview-summary.html" ++ }, ++ // Test the proper DOCTYPE element is present: ++ { ++ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", ++ TMPDEST_DIR1 + "p1" + FS + "package-summary.html" ++ }, ++ // Test the proper DOCTYPE element is present: ++ { ++ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", ++ TMPDEST_DIR1 + "p1" + FS + "C.html" ++ }, ++ // Test the proper DOCTYPE element is present: ++ { ++ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", ++ TMPDEST_DIR1 + "overview-frame.html" ++ }, ++ // Test the proper DOCTYPE element is present: ++ { ++ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", ++ TMPDEST_DIR1 + "allclasses-frame.html" ++ }, ++ // Test the proper DOCTYPE element is present: ++ { ++ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", ++ TMPDEST_DIR1 + "p1" + FS + "package-frame.html" ++ }, ++ // Test that <NOFRAMES> is inside <FRAMESET> element: ++ { ++ "</noframes>" + LS + "</frameset>", ++ TMPDEST_DIR1 + "index.html" ++ }, ++ // Test the table elements are in the correct order: ++ { ++ "</td>" + LS + "</tr>", ++ TMPDEST_DIR1 + FS + "p1" + FS + "package-use.html" ++ } ++ }; + + public static void runTestsOnHTML(String[][] testArray) { + +@@ -152,10 +150,7 @@ + + // Find string in file's contents + if (findString(fileString, stringToFind) == -1) { +- System.out.println("\nSub-test " + (subtestNum) +- + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" +- + "when searching for:\n" +- + stringToFind); ++ System.out.println("\nSub-test " + (subtestNum) + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" + "when searching for:\n" + stringToFind); + } else { + numSubtestsPassed += 1; + System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); +@@ -164,11 +159,10 @@ + } + + public static void printSummary() { +- if ( numSubtestsPassed == subtestNum ) { ++ if (numSubtestsPassed == subtestNum) { + System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); + } else { +- throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) +- + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); ++ throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); + } + } + +@@ -176,16 +170,16 @@ + public static String readFileToString(String filename) { + try { + File file = new File(filename); +- if ( !file.exists() ) { ++ if (!file.exists()) { + System.out.println("\nFILE DOES NOT EXIST: " + filename); + } + BufferedReader in = new BufferedReader(new FileReader(file)); + + // Create an array of characters the size of the file +- char[] allChars = new char[(int)file.length()]; ++ char[] allChars = new char[(int) file.length()]; + + // Read the characters into the allChars array +- in.read(allChars, 0, (int)file.length()); ++ in.read(allChars, 0, (int) file.length()); + in.close(); + + // Convert to a string +diff --git a/test/com/sun/javadoc/VersionNumber/VersionNumber.java b/test/com/sun/javadoc/VersionNumber/VersionNumber.java +--- langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java ++++ langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java +@@ -84,7 +84,7 @@ + + // Test the proper DOCTYPE element is present: + { +- "<!-- Generated by javadoc (build", ++ "<!-- Generated by javadoc (version", + TMPDEST_DIR1 + "p1" + FS + "C.html" }, + + }; +diff --git a/test/com/sun/javadoc/WindowTitles/WindowTitles.java b/test/com/sun/javadoc/WindowTitles/WindowTitles.java +--- langtools/test/com/sun/javadoc/WindowTitles/WindowTitles.java ++++ langtools/test/com/sun/javadoc/WindowTitles/WindowTitles.java +@@ -94,52 +94,52 @@ + */ + private static final String[][] testArray = { + +- { "<TITLE>" + LS + "Overview" + LS + "</TITLE>", ++ { "<title>Overview</title>", + TMPDIR_STRING1 + "overview-summary.html" }, + +- { "<TITLE>" + LS + "Class Hierarchy" + LS + "</TITLE>", ++ { "<title>Class Hierarchy</title>", + TMPDIR_STRING1 + "overview-tree.html" }, + +- { "<TITLE>" + LS + "Overview List" + LS + "</TITLE>", ++ { "<title>Overview List</title>", + TMPDIR_STRING1 + "overview-frame.html" }, + +- { "<TITLE>" + LS + "p1" + LS + "</TITLE>", ++ { "<title>p1</title>", + TMPDIR_STRING1 + "p1" + FS + "package-summary.html" }, + +- { "<TITLE>" + LS + "p1" + LS + "</TITLE>", ++ { "<title>p1</title>", + TMPDIR_STRING1 + "p1" + FS + "package-frame.html" }, + +- { "<TITLE>" + LS + "p1 Class Hierarchy" + LS + "</TITLE>", ++ { "<title>p1 Class Hierarchy</title>", + TMPDIR_STRING1 + "p1" + FS + "package-tree.html" }, + +- { "<TITLE>" + LS + "Uses of Package p1" + LS + "</TITLE>", ++ { "<title>Uses of Package p1</title>", + TMPDIR_STRING1 + "p1" + FS + "package-use.html" }, + +- { "<TITLE>" + LS + "C1" + LS + "</TITLE>", ++ { "<title>C1</title>", + TMPDIR_STRING1 + "p1" + FS + "C1.html" }, + +- { "<TITLE>" + LS + "All Classes" + LS + "</TITLE>", ++ { "<title>All Classes</title>", + TMPDIR_STRING1 + "allclasses-frame.html" }, + +- { "<TITLE>" + LS + "All Classes" + LS + "</TITLE>", ++ { "<title>All Classes</title>", + TMPDIR_STRING1 + "allclasses-noframe.html" }, + +- { "<TITLE>" + LS + "Constant Field Values" + LS + "</TITLE>", ++ { "<title>Constant Field Values</title>", + TMPDIR_STRING1 + "constant-values.html" }, + +- { "<TITLE>" + LS + "Deprecated List" + LS + "</TITLE>", ++ { "<title>Deprecated List</title>", + TMPDIR_STRING1 + "deprecated-list.html" }, + +- { "<TITLE>" + LS + "Serialized Form" + LS + "</TITLE>", ++ { "<title>Serialized Form</title>", + TMPDIR_STRING1 + "serialized-form.html" }, + +- { "<TITLE>" + LS + "API Help" + LS + "</TITLE>", ++ { "<title>API Help</title>", + TMPDIR_STRING1 + "help-doc.html" }, + +- { "<TITLE>" + LS + "Index" + LS + "</TITLE>", ++ { "<title>Index</title>", + TMPDIR_STRING1 + "index-all.html" }, + +- { "<TITLE>" + LS + "Uses of Class p1.C1" + LS + "</TITLE>", ++ { "<title>Uses of Class p1.C1</title>", + TMPDIR_STRING1 + "p1" + FS + "class-use" + FS + "C1.html" }, + }; + +@@ -147,7 +147,7 @@ + * Assign value for [ stringToFind, filename ] for split index page + */ + private static final String[][] testSplitIndexArray = { +- { "<TITLE>" + LS + "C-Index" + LS + "</TITLE>", ++ { "<title>C-Index</title>", + TMPDIR_STRING2 + "index-files" + FS + "index-1.html" }, + }; + +diff --git a/test/com/sun/javadoc/constantValues/TestConstantValuesDriver.java b/test/com/sun/javadoc/constantValues/TestConstantValuesDriver.java +--- langtools/test/com/sun/javadoc/constantValues/TestConstantValuesDriver.java ++++ langtools/test/com/sun/javadoc/constantValues/TestConstantValuesDriver.java +@@ -51,7 +51,7 @@ + tests[i][1] = "TEST"+(i+1)+"PASSES"; + } + tests[tests.length-1][0] = BUG_ID + FS + "constant-values.html"; +- tests[tests.length-1][1] = "<CODE>\"<Hello World>\"</CODE>"; ++ tests[tests.length-1][1] = "<code>\"<Hello World>\"</code>"; + TestConstantValuesDriver tester = new TestConstantValuesDriver(); + run(tester, ARGS, tests, NO_TEST); + tester.printSummary(); +diff --git a/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java b/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java +--- langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java ++++ langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java +@@ -37,18 +37,20 @@ + private static final String BUG_ID = "4652655-4857717"; + private static final String[][] TEST = { + {BUG_ID + FS + "C.html", +- "<A HREF=\"http://java.sun.com/j2se/1.4/docs/api/java/math/package-summary.html?is-external=true\"><CODE>Link to math package</CODE></A>"}, ++ "<a href=\"http://java.sun.com/j2se/1.4/docs/api/java/math/package-summary.html?is-external=true\"><code>Link to math package</code></a>"}, + {BUG_ID + FS + "C.html", +- "<A HREF=\"http://java.sun.com/j2se/1.4/docs/api/javax/swing/text/AbstractDocument.AttributeContext.html?is-external=true\" " + +- "title=\"class or interface in javax.swing.text\"><CODE>Link to AttributeContext innerclass</CODE></A>"}, ++ "<a href=\"http://java.sun.com/j2se/1.4/docs/api/javax/swing/text/AbstractDocument.AttributeContext.html?is-external=true\" " + ++ "title=\"class or interface in javax.swing.text\"><code>Link to AttributeContext innerclass</code></a>"}, + {BUG_ID + FS + "C.html", +- "<A HREF=\"http://java.sun.com/j2se/1.4/docs/api/java/math/BigDecimal.html?is-external=true\" " + +- "title=\"class or interface in java.math\"><CODE>Link to external class BigDecimal</CODE></A>"}, ++ "<a href=\"http://java.sun.com/j2se/1.4/docs/api/java/math/BigDecimal.html?is-external=true\" " + ++ "title=\"class or interface in java.math\"><code>Link to external class BigDecimal</code></a>"}, + {BUG_ID + FS + "C.html", +- "<A HREF=\"http://java.sun.com/j2se/1.4/docs/api/java/math/BigInteger.html?is-external=true#gcd(java.math.BigInteger)\" " + +- "title=\"class or interface in java.math\"><CODE>Link to external member gcd</CODE></A>"}, ++ "<a href=\"http://java.sun.com/j2se/1.4/docs/api/java/math/BigInteger.html?is-external=true#gcd(java.math.BigInteger)\" " + ++ "title=\"class or interface in java.math\"><code>Link to external member gcd</code></a>"}, + {BUG_ID + FS + "C.html", +- "<STRONG>Overrides:</STRONG></DT><DD><CODE>toString</CODE> in class <CODE>java.lang.Object</CODE>"} ++ "<dl>" + NL + "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code>toString</code> in class <code>java.lang.Object</code></dd>" + NL + ++ "</dl>"} + }; + private static final String[][] NEGATED_TEST = NO_TEST; + private static final String[] ARGS = +diff --git a/test/com/sun/javadoc/testClassTree/TestClassTree.java b/test/com/sun/javadoc/testClassTree/TestClassTree.java +--- langtools/test/com/sun/javadoc/testClassTree/TestClassTree.java ++++ langtools/test/com/sun/javadoc/testClassTree/TestClassTree.java +@@ -48,32 +48,29 @@ + //Input for string search tests. + private static final String[][] TEST = { + {BUG_ID + FS + "pkg" + FS + "package-tree.html", +- "<LI TYPE=\"circle\">pkg.<A HREF=\"../pkg/ParentClass.html\" " + +- "title=\"class in pkg\"><STRONG>ParentClass</STRONG></A><UL>"}, ++ "<ul>" + NL + "<li type=\"circle\">pkg.<a href=\"../pkg/ParentClass.html\" " + ++ "title=\"class in pkg\"><span class=\"strong\">ParentClass</span></a>"}, + + {BUG_ID + FS + "pkg" + FS + "package-tree.html", +- "Annotation Type Hierarchy" + NL + "</H2>" + NL + "<UL>" + NL + +- "<LI TYPE=\"circle\">pkg.<A HREF=\"../pkg/AnnotationType.html\" " + +- "title=\"annotation in pkg\"><STRONG>AnnotationType</STRONG></A> " + +- "(implements java.lang.annotation.Annotation)" + NL + "</UL>"}, ++ "<h2 title=\"Annotation Type Hierarchy\">Annotation Type Hierarchy</h2>" + NL + ++ "<ul>" + NL + "<li type=\"circle\">pkg.<a href=\"../pkg/AnnotationType.html\" " + ++ "title=\"annotation in pkg\"><span class=\"strong\">AnnotationType</span></a> " + ++ "(implements java.lang.annotation.Annotation)</li>" + NL + "</ul>"}, + + {BUG_ID + FS + "pkg" + FS + "package-tree.html", +- "<H2>" + NL + +- "Enum Hierarchy" + NL + +- "</H2>" + NL + +- "<UL>" + NL + +- "<LI TYPE=\"circle\">java.lang.Object<UL>" + NL + +- "<LI TYPE=\"circle\">java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable)" + NL + +- "<UL>" + NL + +- "<LI TYPE=\"circle\">pkg.<A HREF=\"../pkg/Coin.html\" title=\"enum in pkg\"><STRONG>Coin</STRONG></A></UL>" + NL + +- "</UL>" + NL + +- "</UL>" ++ "<h2 title=\"Enum Hierarchy\">Enum Hierarchy</h2>" + NL + "<ul>" + NL + ++ "<li type=\"circle\">java.lang.Object" + NL + "<ul>" + NL + ++ "<li type=\"circle\">java.lang.Enum<E> (implements java.lang." + ++ "Comparable<T>, java.io.Serializable)" + NL + "<ul>" + NL + ++ "<li type=\"circle\">pkg.<a href=\"../pkg/Coin.html\" " + ++ "title=\"enum in pkg\"><span class=\"strong\">Coin</span></a></li>" + NL + ++ "</ul>" + NL + "</li>" + NL + "</ul>" + NL + "</li>" + NL + "</ul>" + }, + }; + private static final String[][] NEGATED_TEST = { + {BUG_ID + FS + "pkg" + FS + "package-tree.html", +- "<LI TYPE=\"circle\">class pkg.<A HREF=\"../pkg/ParentClass.html\" " + +- "title=\"class in pkg\"><STRONG>ParentClass</STRONG></A><UL>"} ++ "<li type=\"circle\">class pkg.<a href=\"../pkg/ParentClass.html\" " + ++ "title=\"class in pkg\"><span class=\"strong\">ParentClass</span></a></li>"} + }; + + /** +diff --git a/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java b/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java +--- langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java ++++ langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java +@@ -45,10 +45,10 @@ + + //Input for string search tests. + private static final String[][] TEST = { +- {BUG_ID + FS + "C.html", "<DL>" + NL + "<DD>This is just a simple constructor." + NL + +- "<P>" + NL + "</DD>" + NL + "<DD><DL>" + NL + "<DT><STRONG>Parameters:</STRONG>" + +- "</DT><DD><CODE>i</CODE> - a param.</DD></DL>" + NL + +- "</DD>" + NL + "</DL>" ++ {BUG_ID + FS + "C.html", "<div class=\"block\">" + ++ "This is just a simple constructor.</div>" + NL + ++ "<dl><dt><span class=\"strong\">Parameters:</span></dt><dd>" + ++ "<code>i</code> - a param.</dd></dl>" + } + }; + private static final String[][] NEGATED_TEST = NO_TEST; +diff --git a/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java b/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java +--- langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java ++++ langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java +@@ -76,24 +76,21 @@ + {TARGET_FILE, "pkg.DeprecatedClassByAnnotation.method()"}, + {TARGET_FILE, "pkg.DeprecatedClassByAnnotation.field"}, + +- {TARGET_FILE2, "<STRONG>Deprecated.</STRONG>" + NL + +- "<P>" + NL + +- "<PRE><FONT SIZE=\"-1\">@Deprecated" + NL + +- "</FONT>public class <STRONG>DeprecatedClassByAnnotation</STRONG>"}, ++ {TARGET_FILE2, "<pre>@Deprecated" + NL + ++ "public class <strong>DeprecatedClassByAnnotation</strong>" + NL + ++ "extends java.lang.Object</pre>"}, + +- {TARGET_FILE2, "public int <STRONG>field</STRONG></PRE>" + NL + +- "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> </DD></DL>"}, ++ {TARGET_FILE2, "<pre>@Deprecated" + NL + ++ "public int field</pre>" + NL + ++ "<div class=\"block\"><span class=\"strong\">Deprecated.</span> </div>"}, + +- {TARGET_FILE2, "<FONT SIZE=\"-1\">@Deprecated" + NL + +- "</FONT>public <STRONG>DeprecatedClassByAnnotation</STRONG>()</PRE>" + NL + +- "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG>"}, ++ {TARGET_FILE2, "<pre>@Deprecated" + NL + ++ "public DeprecatedClassByAnnotation()</pre>" + NL + ++ "<div class=\"block\"><span class=\"strong\">Deprecated.</span> </div>"}, + +- {TARGET_FILE2, "<FONT SIZE=\"-1\">@Deprecated" + NL + +- "</FONT>public void <STRONG>method</STRONG>()</PRE>" + NL + +- "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG>"}, ++ {TARGET_FILE2, "<pre>@Deprecated" + NL + ++ "public void method()</pre>" + NL + ++ "<div class=\"block\"><span class=\"strong\">Deprecated.</span> </div>"}, + }; + + private static final String[][] NEGATED_TEST = NO_TEST; +diff --git a/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java b/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java +--- langtools/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java ++++ langtools/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java +@@ -39,13 +39,13 @@ + private static final String BUG_ID = "4369014-4851991"; + private static final String[][] TEST = { + {BUG_ID + FS + "TestDocRootTag.html", +- "<A HREF=\"http://www.java.sun.com/j2se/1.4/docs/api/java/io/File.html?is-external=true\" " + +- "title=\"class or interface in java.io\"><CODE>File</CODE></A>"}, ++ "<a href=\"http://www.java.sun.com/j2se/1.4/docs/api/java/io/File.html?is-external=true\" " + ++ "title=\"class or interface in java.io\"><code>File</code></a>"}, + {BUG_ID + FS + "TestDocRootTag.html", + "<a href=\"./glossary.html\">glossary</a>"}, + {BUG_ID + FS + "TestDocRootTag.html", +- "<A HREF=\"http://www.java.sun.com/j2se/1.4/docs/api/java/io/File.html?is-external=true\" " + +- "title=\"class or interface in java.io\"><CODE>Second File Link</CODE></A>"}, ++ "<a href=\"http://www.java.sun.com/j2se/1.4/docs/api/java/io/File.html?is-external=true\" " + ++ "title=\"class or interface in java.io\"><code>Second File Link</code></a>"}, + {BUG_ID + FS + "TestDocRootTag.html", "The value of @docRoot is \"./\""}, + {BUG_ID + FS + "index-all.html", "My package page is " + + "<a href=\"./pkg/package-summary.html\">here</a>"} +diff --git a/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java b/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java +--- langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java ++++ langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java +@@ -39,17 +39,17 @@ + private static final String BUG_ID = "4857717"; + private static final String[][] TEST = { + {BUG_ID + FS + "pkg" + FS + "XReader.html", +- "<STRONG>Overrides:</STRONG></DT><DD><CODE><A HREF=\"" + +- "http://java.sun.com/j2se/1.4.1/docs/api/java/io/FilterReader.html?is-external=true#read()\"" + +- " title=\"class or interface in java.io\">read</A></CODE> in class " + +- "<CODE><A HREF=\"http://java.sun.com/j2se/1.4.1/docs/api/java/io/FilterReader.html?is-external=true\"" + +- " title=\"class or interface in java.io\">FilterReader</A>"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"http://java.sun.com/j2se/1.4.1/docs/api/java/io/FilterReader.html?is-external=true#read()\" " + ++ "title=\"class or interface in java.io\">read</a></code> in class <code>" + ++ "<a href=\"http://java.sun.com/j2se/1.4.1/docs/api/java/io/FilterReader.html?is-external=true\" " + ++ "title=\"class or interface in java.io\">FilterReader</a></code></dd>"}, + {BUG_ID + FS + "pkg" + FS + "XReader.html", +- "<STRONG>Specified by:</STRONG></DT><DD><CODE><A HREF=\"" + +- "http://java.sun.com/j2se/1.4.1/docs/api/java/io/DataInput.html?is-external=true#readInt()\"" + +- " title=\"class or interface in java.io\">readInt</A></CODE> in interface " + +- "<CODE><A HREF=\"http://java.sun.com/j2se/1.4.1/docs/api/java/io/DataInput.html?is-external=true\"" + +- " title=\"class or interface in java.io\">DataInput</A>"}}; ++ "<dt><strong>Specified by:</strong></dt>" + NL + ++ "<dd><code><a href=\"http://java.sun.com/j2se/1.4.1/docs/api/java/io/DataInput.html?is-external=true#readInt()\" " + ++ "title=\"class or interface in java.io\">readInt</a></code> in interface <code>" + ++ "<a href=\"http://java.sun.com/j2se/1.4.1/docs/api/java/io/DataInput.html?is-external=true\" " + ++ "title=\"class or interface in java.io\">DataInput</a></code></dd>"}}; + + + +diff --git a/test/com/sun/javadoc/testHeadings/TestHeadings.java b/test/com/sun/javadoc/testHeadings/TestHeadings.java +--- langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java ++++ langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java +@@ -47,80 +47,65 @@ + private static final String[][] TEST = { + //Package summary + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Class</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">" + ++ "Class</th>" + NL + "<th class=\"colLast\" scope=\"col\"" + ++ ">Description</th>" + }, + + // Class documentation + {BUG_ID + FS + "pkg1" + FS + "C1.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Field and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Field and Description</th>" + }, + {BUG_ID + FS + "pkg1" + FS + "C1.html", +- "<TH ALIGN=\"left\"><STRONG>Methods inherited from class " + "java.lang.Object</STRONG></TH>" ++ "<h3>Methods inherited from class java.lang.Object</h3>" + }, + + // Class use documentation + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Package</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Package</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Description</th>" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", +- "<TH ALIGN=\"left\" COLSPAN=\"2\"><FONT SIZE=\"+2\">" + NL + +- "Uses of <A HREF=\"../../pkg1/C1.html\" " + "title=\"class in pkg1\">C1</A> in " + "<A HREF=\"../../pkg2/package-summary.html\">pkg2</A></FONT></TH>" +- }, +- {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Field and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Field and Description</th>" + }, + + // Deprecated + {BUG_ID + FS + "deprecated-list.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Method and Description</TH>" ++ "<th class=\"colOne\" scope=\"col\">Method and Description</th>" + }, + + // Constant values + {BUG_ID + FS + "constant-values.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Constant Field</TH>" + NL + +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>Value</TH>" ++ "<th class=\"colFirst\" scope=\"col\">" + ++ "Modifier and Type</th>" + NL + "<th scope=\"col\">Constant Field</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Value</th>" + }, + + // Serialized Form + {BUG_ID + FS + "serialized-form.html", +- "<TH ALIGN=\"center\"><FONT SIZE=\"+2\">" + NL + +- "<STRONG>Package</STRONG> <STRONG>pkg1</STRONG></FONT></TH>" ++ "<h2 title=\"Package\">Package pkg1</h2>" + }, + {BUG_ID + FS + "serialized-form.html", +- "<TH ALIGN=\"left\" COLSPAN=\"2\"><FONT SIZE=\"+2\">" + NL + +- "<STRONG>Class <A HREF=\"pkg1/C1.html\" " + "title=\"class in pkg1\">pkg1.C1</A> extends java.lang.Object " + "implements Serializable</STRONG></FONT></TH>" ++ "<h3>Class <a href=\"pkg1/C1.html\" title=\"class in pkg1\">" + ++ "pkg1.C1</a> extends java.lang.Object implements Serializable</h3>" + }, + {BUG_ID + FS + "serialized-form.html", +- "<TH ALIGN=\"left\" COLSPAN=\"1\"><FONT SIZE=\"+2\">" + NL + +- "<STRONG>Serialized Fields</STRONG></FONT></TH>" ++ "<h3>Serialized Fields</h3>" + }, + + // Overview Frame + {BUG_ID + FS + "overview-frame.html", +- "<TH ALIGN=\"left\" NOWRAP><FONT size=\"+1\" " + "CLASS=\"FrameTitleFont\">" + NL + "<STRONG>Test Files</STRONG></FONT></TH>" ++ "<h1 title=\"Test Files\" class=\"bar\">Test Files</h1>" + }, + {BUG_ID + FS + "overview-frame.html", +- "<TITLE>" + NL + +- "Overview List" + NL + +- "</TITLE>" ++ "<title>Overview List</title>" + }, + + // Overview Summary + {BUG_ID + FS + "overview-summary.html", +- "<TITLE>" + NL + +- "Overview" + NL + +- "</TITLE>" ++ "<title>Overview</title>" + }, + + }; +diff --git a/test/com/sun/javadoc/testHelpOption/TestHelpOption.java b/test/com/sun/javadoc/testHelpOption/TestHelpOption.java +--- langtools/test/com/sun/javadoc/testHelpOption/TestHelpOption.java ++++ langtools/test/com/sun/javadoc/testHelpOption/TestHelpOption.java +@@ -91,8 +91,7 @@ + + private static final String[][] TEST2 = { + {BUG_ID + FS + "TestHelpOption.html", +- "<A HREF=\"help-doc.html\"><FONT CLASS=\"NavBarFont1\">" + +- "<STRONG>Help</STRONG></FONT></A>" ++ "<li><a href=\"help-doc.html\">Help</a></li>" + }, + }; + private static final String[][] NEGATED_TEST2 = NO_TEST; +diff --git a/test/com/sun/javadoc/testHref/TestHref.java b/test/com/sun/javadoc/testHref/TestHref.java +--- langtools/test/com/sun/javadoc/testHref/TestHref.java ++++ langtools/test/com/sun/javadoc/testHref/TestHref.java +@@ -47,37 +47,41 @@ + private static final String[][] TEST = { + //External link. + {BUG_ID + FS + "pkg" + FS + "C1.html", +- "HREF=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true#wait(long, int)\"" ++ "href=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true#wait(long, int)\"" + }, + //Member summary table link. + {BUG_ID + FS + "pkg" + FS + "C1.html", +- "HREF=\"../pkg/C1.html#method(int, int, java.util.ArrayList)\"" ++ "href=\"../pkg/C1.html#method(int, int, java.util.ArrayList)\"" + }, + //Anchor test. + {BUG_ID + FS + "pkg" + FS + "C1.html", +- "<A NAME=\"method(int, int, java.util.ArrayList)\"><!-- --></A>" ++ "<a name=\"method(int, int, java.util.ArrayList)\">" + NL + ++ "<!-- -->" + NL + ++ "</a>" + }, + //Backward compatibility anchor test. + {BUG_ID + FS + "pkg" + FS + "C1.html", +- "<A NAME=\"method(int, int, java.util.ArrayList)\"><!-- --></A>" ++ "<a name=\"method(int, int, java.util.ArrayList)\">" + NL + ++ "<!-- -->" + NL + ++ "</a>" + }, + //{@link} test. + {BUG_ID + FS + "pkg" + FS + "C2.html", +- "Link: <A HREF=\"../pkg/C1.html#method(int, int, java.util.ArrayList)\">" ++ "Link: <a href=\"../pkg/C1.html#method(int, int, java.util.ArrayList)\">" + }, + //@see test. + {BUG_ID + FS + "pkg" + FS + "C2.html", +- "See Also:</STRONG></DT><DD><A HREF=\"../pkg/C1.html#method(int, int, java.util.ArrayList)\">" ++ "See Also:</span></dt><dd><a href=\"../pkg/C1.html#method(int, int, java.util.ArrayList)\">" + }, + + //Header does not link to the page itself. + {BUG_ID + FS + "pkg" + FS + "C4.html", +- "Class C4<E extends C4<E>></H2>" ++ "Class C4<E extends C4<E>></h2>" + }, + + //Signature does not link to the page itself. + {BUG_ID + FS + "pkg" + FS + "C4.html", +- "public abstract class <STRONG>C4<E extends C4<E>></STRONG>" ++ "public abstract class <strong>C4<E extends C4<E>></strong>" + }, + }; + private static final String[][] NEGATED_TEST = +diff --git a/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java b/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java +--- langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java ++++ langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java +@@ -43,149 +43,77 @@ + // Optional Element should print properly nested definition list tags + // for default value. + private static final String[][] TEST_ALL = { +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<PRE>public class " + +- "<STRONG>C1</STRONG>" + NL + "extends " + +- "java.lang.Object" + NL + "implements " + +- "java.io.Serializable</PRE>"}, +- {BUG_ID + FS + "pkg1" + FS + "C4.html", "<DL>" + NL + "<DD><DL>" + NL + +- "<DT><STRONG>Default:</STRONG></DT><DD>true</DD>" + NL + +- "</DL>" + NL + "</DD>" + NL + "</DL>"}}; ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<pre>public class <strong>C1</strong>" + NL + ++ "extends java.lang.Object" + NL + "implements java.io.Serializable</pre>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C4.html", "<dl>" + NL + ++ "<dt>Default:</dt>" + NL + "<dd>true</dd>" + NL + ++ "</dl>"}}; + + // Test for normal run of javadoc in which various ClassDocs and + // serialized form should have properly nested definition list tags + // enclosing comments, tags and deprecated information. + private static final String[][] TEST_CMNT_DEPR = { +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL>" + NL + +- "<DT><STRONG>Since:</STRONG></DT>" + NL + +- " <DD>JDK1.0</DD>" + NL + "<DT><STRONG>See Also:</STRONG></DT><DD>" + +- "<A HREF=\"../pkg1/C2.html\" title=\"class in pkg1\">" + +- "<CODE>C2</CODE></A>, " + NL + +- "<A HREF=\"../serialized-form.html#pkg1.C1\">" + +- "Serialized Form</A></DD></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> <I>As of JDK version" + +- " 1.5, replaced by" + NL + +- " <A HREF=\"../pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I></DD>" + +- "<DD>This field indicates whether the C1 is undecorated." + NL + +- "<P>" + NL + "</DD>" + NL + "<DD><DL>" + NL + "<DT><STRONG>" + +- "Since:</STRONG></DT>" + NL + " <DD>1.4</DD>" + NL + "<DT>" + +- "<STRONG>See Also:</STRONG></DT><DD>" + +- "<A HREF=\"../pkg1/C1.html#setUndecorated(boolean)\"><CODE>" + +- "setUndecorated(boolean)</CODE></A></DD></DL>" + NL +"</DD>" + NL + +- "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL>" + NL + +- "<DD>Constructor." + NL + "<P>" + NL + "</DD>" + NL + +- "<DD><DL>" + NL + "<DT><STRONG>Parameters:</STRONG></DT><DD>" + +- "<CODE>title</CODE> - the title</DD><DD><CODE>test</CODE>" + +- " - boolean value</DD>" + NL + "<DT><STRONG>Throws:</STRONG></DT>" + NL + +- "<DD><CODE>java.lang.IllegalArgumentException</CODE>" + +- " - if the <code>owner</code>'s" + NL + " <code>GraphicsConfiguration" + +- "</code> is not from a screen device</DD>" + NL +"<DD><CODE>" + +- "HeadlessException</CODE></DD></DL>" + NL + "</DD>" + NL + +- "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL>" + NL + +- "<DD>Method comments." + NL + "<P>" + NL + +- "</DD>" + NL + "<DD><DL>" + NL + "<DT><STRONG>Parameters:" + +- "</STRONG></DT><DD><CODE>undecorated</CODE> - <code>true</code>" + +- " if no decorations are" + NL + " to be enabled;" + NL + +- " <code>false</code> if decorations are to be enabled." + +- "</DD><DT><STRONG>Since:</STRONG></DT>" + NL + +- " <DD>1.4</DD>" + NL + "<DT><STRONG>See Also:</STRONG></DT>" + +- "<DD><A HREF=\"../pkg1/C1.html#readObject()\"><CODE>" + +- "readObject()</CODE></A></DD></DL>" + NL + "</DD>" + NL + +- "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL>" + NL + "<DD><DL>" + NL + +- "<DT><STRONG>Throws:</STRONG></DT>" + NL + "<DD><CODE>" + +- "java.io.IOException</CODE></DD><DT><STRONG>See Also:" + +- "</STRONG></DT><DD>" + +- "<A HREF=\"../pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A></DD></DL>" + NL + +- "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "<DL>" + NL + +- "<DD>No modal exclusion." + NL + "<P>" + NL +"</DD>" + NL + +- "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C2.html", "<DL>" + NL + "<DD>Constructor." + NL + +- "<P>" + NL +"</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C2.html", "<DL>" + NL + "<DD><STRONG>" + +- "Deprecated.</STRONG> <I>As of JDK version 1.5, replaced " + +- "by" + NL + " <A HREF=\"../pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I>" + NL + "<P>" + NL + +- "</DD><DD>Set visible." + NL + "<P>" + NL + "</DD>" +NL + +- "<DD><DL>" + NL + "<DT><STRONG>Parameters:</STRONG></DT><DD>" + +- "<CODE>set</CODE> - boolean</DD><DT><STRONG>Since:</STRONG></DT>" + NL + +- " <DD>1.4</DD></DL>" + NL + "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C3.html", "<DL>" + NL + "<DD>Comment." + NL + +- "<P>" + NL + "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + "<DD><DL>" + NL + +- "<DT><STRONG>Throws:</STRONG></DT>" + NL + "<DD><CODE>" + +- "java.io.IOException</CODE></DD><DT><STRONG>See Also:</STRONG>" + +- "</DT><DD><A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>C1.setUndecorated(boolean)</CODE></A></DD></DL>" + NL + +- "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> <I>As of JDK version " + +- "1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I></DD>" + +- "<DD>This field indicates whether the C1 is undecorated." + NL + +- "<P>" + NL + "</DD>" + NL + "<DD> </DD>" + NL + +- "<DD><DL>" + NL + "<DT><STRONG>Since:</STRONG></DT>" + NL + +- " <DD>1.4</DD>" + NL + "<DT><STRONG>See Also:</STRONG>" + +- "</DT><DD><A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>C1.setUndecorated(boolean)</CODE></A></DD></DL>" + NL + +- "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> <I>As of JDK version" + +- " 1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I>" + NL + "<P>" + NL + +- "</DD><DD>Reads the object stream." + NL + "<P>" + NL + +- "</DD>" + NL + "<DD><DL>" + NL + "<DT><STRONG>Throws:" + +- "</STRONG></DT>" + NL + "<DD><CODE><code>" + +- "IOException</code></CODE></DD>" + NL + +- "<DD><CODE>java.io.IOException</CODE></DD></DL>" + NL + +- "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> </DD><DD>" + +- "The name for this class." + NL + "<P>" + NL + "</DD>" + NL + +- "<DD> </DD>" + NL + "</DL>"}}; +- +- // Test with -nocomment option. The ClassDocs and serialized form should +- // have properly nested definition list tags enclosing deprecated +- // information and should not display definition lists for comments +- // and tags. +- private static final String[][] TEST_NOCMNT = { +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL>" + NL + "<DD><STRONG>" + +- "Deprecated.</STRONG> <I>As of JDK version 1.5, replaced by" + NL + +- " <A HREF=\"../pkg1/C1.html#setUndecorated(boolean)\"><CODE>" + +- "setUndecorated(boolean)</CODE></A>.</I></DD></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C2.html", "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> <I>As of JDK version" + +- " 1.5, replaced by" + NL + +- " <A HREF=\"../pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I>" + NL + "<P>" + NL + +- "</DD></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C5.html", "<PRE>" + NL + +- "protected <STRONG>C5</STRONG>()</PRE>" + NL + "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> </DD></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C5.html", "<PRE>" + NL + +- "public void <STRONG>printInfo</STRONG>()</PRE>" + NL + "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> </DD></DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<PRE>" + NL + "boolean <STRONG>" + +- "undecorated</STRONG></PRE>" + NL + "<DL>" + NL + "<DD><STRONG>" + +- "Deprecated.</STRONG> <I>As of JDK version 1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\"><CODE>" + +- "setUndecorated(boolean)</CODE></A>.</I></DD></DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + "<DD><STRONG>" + +- "Deprecated.</STRONG> <I>As of JDK version" + +- " 1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I>" + NL + "<P>" + NL + +- "</DD></DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<PRE>" + NL + "int <STRONG>" + +- "publicKey</STRONG></PRE>" + NL + "<DL>" + NL + "<DD><STRONG>" + +- "Deprecated.</STRONG> </DD></DL>"}}; ++ {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "<dl>" + ++ "<dt><span class=\"strong\">Since:</span></dt>" + NL + ++ " <dd>JDK1.0</dd></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<dl><dt><span class=\"strong\">Since:</span></dt>" + NL + ++ " <dd>JDK1.0</dd>" + NL + "<dt><span class=\"strong\">See Also:</span></dt>" + ++ "<dd><a href=\"../pkg1/C2.html\" title=\"class in pkg1\"><code>" + ++ "C2</code></a>, " + NL + "<a href=\"../serialized-form.html#pkg1.C1\">" + ++ "Serialized Form</a></dd></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<dl><dt><span class=\"strong\">Since:</span></dt>" + NL + ++ " <dd>1.4</dd>" + NL + ++ "<dt><span class=\"strong\">See Also:</span></dt><dd>" + ++ "<a href=\"../pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>setUndecorated(boolean)</code></a></dd></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<dl><dt><span class=\"strong\">Parameters:</span></dt><dd><code>title" + ++ "</code> - the title</dd><dd><code>test</code> - boolean value" + ++ "</dd>" + NL + "<dt><span class=\"strong\">Throws:</span></dt>" + NL + ++ "<dd><code>java.lang.IllegalArgumentException</code> - if the " + ++ "<code>owner</code>'s" + NL + ++ " <code>GraphicsConfiguration</code> is not from a screen " + ++ "device</dd>" + NL + "<dd><code>HeadlessException</code></dd></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<dl><dt><span class=\"strong\">Parameters:</span></dt><dd><code>undecorated" + ++ "</code> - <code>true</code> if no decorations are" + NL + ++ " to be enabled;" + NL + " <code>false</code> " + ++ "if decorations are to be enabled.</dd><dt><span class=\"strong\">Since:" + ++ "</span></dt>" + NL + " <dd>1.4</dd>" + NL + ++ "<dt><span class=\"strong\">See Also:</span></dt><dd>" + ++ "<a href=\"../pkg1/C1.html#readObject()\"><code>readObject()" + ++ "</code></a></dd></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<dl><dt><span class=\"strong\">Throws:</span></dt>" + NL + ++ "<dd><code>java.io.IOException</code></dd><dt><span class=\"strong\">See Also:" + ++ "</span></dt><dd><a href=\"../pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>setUndecorated(boolean)</code></a></dd></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C2.html", "<dl><dt><span class=\"strong\">Parameters:" + ++ "</span></dt><dd><code>set</code> - boolean</dd><dt><span class=\"strong\">" + ++ "Since:</span></dt>" + NL + " <dd>1.4</dd></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<dl><dt><span class=\"strong\">Throws:</span>" + ++ "</dt>" + NL + "<dd><code>" + ++ "java.io.IOException</code></dd><dt><span class=\"strong\">See Also:</span>" + ++ "</dt><dd><a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>C1.setUndecorated(boolean)</code></a></dd></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<span class=\"strong\">Deprecated.</span>" + ++ " <i>As of JDK version 1.5, replaced by" + NL + ++ " <a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>setUndecorated(boolean)</code></a>.</i></div>" + NL + ++ "<div class=\"block\">This field indicates whether the C1 is " + ++ "undecorated.</div>" + NL + " " + NL + "<dl><dt><span class=\"strong\">Since:</span></dt>" + NL + ++ " <dd>1.4</dd>" + NL + "<dt><span class=\"strong\">See Also:</span>" + ++ "</dt><dd><a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>C1.setUndecorated(boolean)</code></a></dd></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<span class=\"strong\">Deprecated.</span>" + ++ " <i>As of JDK version 1.5, replaced by" + NL + ++ " <a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>setUndecorated(boolean)</code></a>.</i></div>" + NL + ++ "<div class=\"block\">Reads the object stream.</div>" + NL + ++ "<dl><dt><span class=\"strong\">Throws:" + ++ "</span></dt>" + NL + "<dd><code><code>" + ++ "IOException</code></code></dd>" + NL + ++ "<dd><code>java.io.IOException</code></dd></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<span class=\"strong\">Deprecated.</span>" + ++ " </div>" + NL + ++ "<div class=\"block\">The name for this class.</div>"}}; + + // Test with -nodeprecated option. The ClassDocs should have properly nested + // definition list tags enclosing comments and tags. The ClassDocs should not +@@ -193,133 +121,104 @@ + // should display properly nested definition list tags for comments, tags + // and deprecated information. + private static final String[][] TEST_NODEPR = { +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL>" + NL + +- "<DT><STRONG>Since:</STRONG></DT>" + NL + +- " <DD>JDK1.0</DD>" + NL + "<DT><STRONG>See Also:</STRONG></DT><DD>" + +- "<A HREF=\"../pkg1/C2.html\" title=\"class in pkg1\">" + +- "<CODE>C2</CODE></A>, " + NL + +- "<A HREF=\"../serialized-form.html#pkg1.C1\">" + +- "Serialized Form</A></DD></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL>" + NL + +- "<DD>Constructor." + NL + "<P>" + NL + "</DD>" + NL + +- "<DD><DL>" + NL + "<DT><STRONG>Parameters:</STRONG></DT><DD>" + +- "<CODE>title</CODE> - the title</DD><DD><CODE>test</CODE>" + +- " - boolean value</DD>" + NL + "<DT><STRONG>Throws:</STRONG></DT>" + NL + +- "<DD><CODE>java.lang.IllegalArgumentException</CODE>" + +- " - if the <code>owner</code>'s" + NL + " <code>GraphicsConfiguration" + +- "</code> is not from a screen device</DD>" + NL +"<DD><CODE>" + +- "HeadlessException</CODE></DD></DL>" + NL + "</DD>" + NL + +- "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL>" + NL + +- "<DD>Method comments." + NL + "<P>" + NL + +- "</DD>" + NL + "<DD><DL>" + NL + "<DT><STRONG>Parameters:" + +- "</STRONG></DT><DD><CODE>undecorated</CODE> - <code>true</code>" + ++ {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "<dl>" + ++ "<dt><span class=\"strong\">Since:</span></dt>" + NL + ++ " <dd>JDK1.0</dd></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<dl><dt><span class=\"strong\">Since:</span>" + ++ "</dt>" + NL + " <dd>JDK1.0</dd>" + NL + "<dt><span class=\"strong\">See Also:" + ++ "</span></dt><dd><a href=\"../pkg1/C2.html\" title=\"class in pkg1\">" + ++ "<code>C2</code></a>, " + NL + "<a href=\"../serialized-form.html#pkg1.C1\">" + ++ "Serialized Form</a></dd></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<dl><dt><span class=\"strong\">Parameters:" + ++ "</span></dt><dd><code>title</code> - the title</dd><dd><code>" + ++ "test</code> - boolean value</dd>" + NL + "<dt><span class=\"strong\">Throws:" + ++ "</span></dt>" + NL + "<dd><code>java.lang.IllegalArgumentException" + ++ "</code> - if the <code>owner</code>'s" + NL + " <code>GraphicsConfiguration" + ++ "</code> is not from a screen device</dd>" + NL + "<dd><code>" + ++ "HeadlessException</code></dd></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<dl><dt><span class=\"strong\">Parameters:" + ++ "</span></dt><dd><code>undecorated</code> - <code>true</code>" + + " if no decorations are" + NL + " to be enabled;" + NL + + " <code>false</code> if decorations are to be enabled." + +- "</DD><DT><STRONG>Since:</STRONG></DT>" + NL + +- " <DD>1.4</DD>" + NL + "<DT><STRONG>See Also:</STRONG></DT>" + +- "<DD><A HREF=\"../pkg1/C1.html#readObject()\"><CODE>" + +- "readObject()</CODE></A></DD></DL>" + NL + "</DD>" + NL + +- "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL>" + NL + "<DD><DL>" + NL + +- "<DT><STRONG>Throws:</STRONG></DT>" + NL + "<DD><CODE>" + +- "java.io.IOException</CODE></DD><DT><STRONG>See Also:" + +- "</STRONG></DT><DD>" + +- "<A HREF=\"../pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A></DD></DL>" + NL + +- "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "<DL>" + NL + +- "<DD>No modal exclusion." + NL + "<P>" + NL +"</DD>" + NL + +- "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C2.html", "<DL>" + NL + "<DD>Constructor." + NL + +- "<P>" + NL +"</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C3.html", "<DL>" + NL + "<DD>Comment." + NL + +- "<P>" + NL + "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + "<DD><DL>" + NL + +- "<DT><STRONG>Throws:</STRONG></DT>" + NL + "<DD><CODE>" + +- "java.io.IOException</CODE></DD><DT><STRONG>See Also:</STRONG>" + +- "</DT><DD><A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>C1.setUndecorated(boolean)</CODE></A></DD></DL>" + NL + +- "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> <I>As of JDK version " + +- "1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I></DD>" + +- "<DD>This field indicates whether the C1 is undecorated." + NL + +- "<P>" + NL + "</DD>" + NL + "<DD> </DD>" + NL + +- "<DD><DL>" + NL + "<DT><STRONG>Since:</STRONG></DT>" + NL + +- " <DD>1.4</DD>" + NL + "<DT><STRONG>See Also:</STRONG>" + +- "</DT><DD><A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>C1.setUndecorated(boolean)</CODE></A></DD></DL>" + NL + +- "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> <I>As of JDK version" + +- " 1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I>" + NL + "<P>" + NL + +- "</DD><DD>Reads the object stream." + NL + "<P>" + NL + +- "</DD>" + NL + "<DD><DL>" + NL + "<DT><STRONG>Throws:" + +- "</STRONG></DT>" + NL + "<DD><CODE><code>" + +- "IOException</code></CODE></DD>" + NL + +- "<DD><CODE>java.io.IOException</CODE></DD></DL>" + NL + +- "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> </DD><DD>" + +- "The name for this class." + NL + "<P>" + NL + "</DD>" + NL + +- "<DD> </DD>" + NL + "</DL>"}}; ++ "</dd><dt><span class=\"strong\">Since:</span></dt>" + NL + " <dd>1.4</dd>" + NL + ++ "<dt><span class=\"strong\">See Also:</span></dt><dd><a href=\"../pkg1/C1.html#readObject()\">" + ++ "<code>readObject()</code></a></dd></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<dl><dt><span class=\"strong\">Throws:</span>" + ++ "</dt>" + NL + "<dd><code>java.io.IOException</code></dd><dt>" + ++ "<span class=\"strong\">See Also:</span></dt><dd><a href=\"../pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>setUndecorated(boolean)</code></a></dd></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<dl><dt><span class=\"strong\">Throws:</span>" + ++ "</dt>" + NL + "<dd><code>" + ++ "java.io.IOException</code></dd><dt><span class=\"strong\">See Also:</span>" + ++ "</dt><dd><a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>C1.setUndecorated(boolean)</code></a></dd></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<span class=\"strong\">Deprecated.</span>" + ++ " <i>As of JDK version 1.5, replaced by" + NL + ++ " <a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>setUndecorated(boolean)</code></a>.</i></div>" + NL + ++ "<div class=\"block\">This field indicates whether the C1 is " + ++ "undecorated.</div>" + NL + " " + NL + "<dl><dt><span class=\"strong\">Since:</span></dt>" + NL + ++ " <dd>1.4</dd>" + NL + "<dt><span class=\"strong\">See Also:</span>" + ++ "</dt><dd><a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>C1.setUndecorated(boolean)</code></a></dd></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<span class=\"strong\">Deprecated.</span>" + ++ " <i>As of JDK version 1.5, replaced by" + NL + ++ " <a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>setUndecorated(boolean)</code></a>.</i></div>" + NL + ++ "<div class=\"block\">Reads the object stream.</div>" + NL + ++ "<dl><dt><span class=\"strong\">Throws:" + ++ "</span></dt>" + NL + "<dd><code><code>" + ++ "IOException</code></code></dd>" + NL + ++ "<dd><code>java.io.IOException</code></dd></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<span class=\"strong\">Deprecated.</span>" + ++ " </div>" + NL + "<div class=\"block\">" + ++ "The name for this class.</div>"}}; + + // Test with -nocomment and -nodeprecated options. The ClassDocs whould +- // not display definition lists for any member details. The serialized +- // form should display properly nested definition list tags for +- // deprecated information only. ++ // not display definition lists for any member details. + private static final String[][] TEST_NOCMNT_NODEPR = { +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<PRE>" + NL + "public void " + +- "<STRONG>readObject</STRONG>()" + NL + " throws" + +- " java.io.IOException</PRE>" + NL + "<HR>"}, +- {BUG_ID + FS + "pkg1" + FS + "C2.html", "<PRE>" +NL + "public <STRONG>" + +- "C2</STRONG>()</PRE>" + NL + "<HR>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "<PRE>" + NL + +- "public static final " + +- "<A HREF=\"../pkg1/C1.ModalExclusionType.html\" " + +- "title=\"enum in pkg1\">C1.ModalExclusionType</A> <STRONG>" + +- "APPLICATION_EXCLUDE</STRONG></PRE>" + NL + "<HR>"}, +- {BUG_ID + FS + "serialized-form.html", "<PRE>" + NL + "boolean <STRONG>" + +- "undecorated</STRONG></PRE>" + NL + "<DL>" + NL + "<DD><STRONG>" + +- "Deprecated.</STRONG> <I>As of JDK version 1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\"><CODE>" + +- "setUndecorated(boolean)</CODE></A>.</I></DD></DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + "<DD><STRONG>" + +- "Deprecated.</STRONG> <I>As of JDK version" + ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<pre>public void readObject()" + NL + ++ " throws java.io.IOException</pre>" + NL + "</li>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C2.html", "<pre>public C2()</pre>" + NL + ++ "</li>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "<pre>public " + ++ "static final <a href=\"../pkg1/C1.ModalExclusionType.html\" " + ++ "title=\"enum in pkg1\">C1.ModalExclusionType</a> " + ++ "APPLICATION_EXCLUDE</pre>" + NL + "</li>"}, ++ {BUG_ID + FS + "serialized-form.html", "<pre>boolean " + ++ "undecorated</pre>" + NL + "<div class=\"block\"><span class=\"strong\">" + ++ "Deprecated.</span> <i>As of JDK version 1.5, replaced by" + NL + ++ " <a href=\"pkg1/C1.html#setUndecorated(boolean)\"><code>" + ++ "setUndecorated(boolean)</code></a>.</i></div>" + NL + "</li>"}, ++ {BUG_ID + FS + "serialized-form.html", "<span class=\"strong\">" + ++ "Deprecated.</span> <i>As of JDK version" + + " 1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I>" + NL + "<P>" + NL + +- "</DD></DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<PRE>" + NL + "int <STRONG>" + +- "publicKey</STRONG></PRE>" + NL + "<DL>" + NL + "<DD><STRONG>" + +- "Deprecated.</STRONG> </DD></DL>"}}; ++ " <a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>setUndecorated(boolean)</code></a>.</i></div>" + NL + "</li>"}}; + + // Test for valid HTML generation which should not comprise of empty + // definition list tags. + private static final String[][] NEGATED_TEST = { +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<DL>" + NL + "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "<DL></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "<DL>" + NL + "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C2.html", "<DL></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C2.html", "<DL>" + NL + "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C2.ModalType.html", "<DL></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C2.ModalType.html", "<DL>" + NL + "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C3.html", "<DL></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C3.html", "<DL>" + NL + "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C4.html", "<DL></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C4.html", "<DL>" + NL + "</DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C5.html", "<DL></DL>"}, +- {BUG_ID + FS + "pkg1" + FS + "C5.html", "<DL>" + NL + "</DL>"}, +- {BUG_ID + FS + "overview-tree.html", "<DL></DL>"}, +- {BUG_ID + FS + "overview-tree.html", "<DL>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL></DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + "</DL>"}}; ++ {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "<dl></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "<dl>" + NL + "</dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<dl></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<dl>" + NL + "</dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "<dl></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C1.ModalExclusionType.html", "<dl>" + NL + "</dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C2.html", "<dl></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C2.html", "<dl>" + NL + "</dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C2.ModalType.html", "<dl></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C2.ModalType.html", "<dl>" + NL + "</dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C3.html", "<dl></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C3.html", "<dl>" + NL + "</dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C4.html", "<dl></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C4.html", "<dl>" + NL + "</dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C5.html", "<dl></dl>"}, ++ {BUG_ID + FS + "pkg1" + FS + "C5.html", "<dl>" + NL + "</dl>"}, ++ {BUG_ID + FS + "overview-tree.html", "<dl></dl>"}, ++ {BUG_ID + FS + "overview-tree.html", "<dl>" + NL + "</dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<dl></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<dl>" + NL + "</dl>"}}; + + private static final String[] ARGS1 = + new String[] { +@@ -346,7 +245,7 @@ + run(tester, ARGS1, TEST_ALL, NEGATED_TEST); + run(tester, ARGS1, TEST_CMNT_DEPR, NEGATED_TEST); + run(tester, ARGS2, TEST_ALL, NEGATED_TEST); +- run(tester, ARGS2, TEST_NOCMNT, TEST_CMNT_DEPR); ++ run(tester, ARGS2, NO_TEST, TEST_CMNT_DEPR); + run(tester, ARGS3, TEST_ALL, NEGATED_TEST); + run(tester, ARGS3, TEST_NODEPR, TEST_NOCMNT_NODEPR); + run(tester, ARGS4, TEST_ALL, NEGATED_TEST); +diff --git a/test/com/sun/javadoc/testHtmlDocument/TestHtmlDocument.java b/test/com/sun/javadoc/testHtmlDocument/TestHtmlDocument.java +new file mode 100644 +--- /dev/null ++++ langtools/test/com/sun/javadoc/testHtmlDocument/TestHtmlDocument.java +@@ -0,0 +1,155 @@ ++/* ++ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++/* ++ * @test ++ * @bug 6851834 ++ * @summary This test verifies the HTML document generation for javadoc output. ++ * @author Bhavesh Patel ++ * @build TestHtmlDocument ++ * @run main TestHtmlDocument ++ */ ++ ++import java.io.*; ++import com.sun.tools.doclets.formats.html.markup.*; ++ ++/** ++ * The class reads each file, complete with newlines, into a string to easily ++ * compare the existing markup with the generated markup. ++ */ ++public class TestHtmlDocument { ++ ++ private static final String BUGID = "6851834"; ++ private static final String BUGNAME = "TestHtmlDocument"; ++ private static final String FS = System.getProperty("file.separator"); ++ private static String srcdir = System.getProperty("test.src", "."); ++ ++ // Entry point ++ public static void main(String[] args) throws IOException { ++ // Check whether the generated markup is same as the existing markup. ++ if (generateHtmlTree().equals(readFileToString(srcdir + FS + "testMarkup.html"))) { ++ System.out.println("\nTest passed for bug " + BUGID + " (" + BUGNAME + ")\n"); ++ } else { ++ throw new Error("\nTest failed for bug " + BUGID + " (" + BUGNAME + ")\n"); ++ } ++ } ++ ++ // Generate the HTML output using the HTML document generation within doclet. ++ public static String generateHtmlTree() { ++ // Document type for the HTML document ++ DocType htmlDocType = DocType.Transitional(); ++ HtmlTree html = new HtmlTree(HtmlTag.HTML); ++ HtmlTree head = new HtmlTree(HtmlTag.HEAD); ++ HtmlTree title = new HtmlTree(HtmlTag.TITLE); ++ // String content within the document ++ StringContent titleContent = new StringContent("Markup test"); ++ title.addContent(titleContent); ++ head.addContent(title); ++ // Test META tag ++ HtmlTree meta = new HtmlTree(HtmlTag.META); ++ meta.addAttr(HtmlAttr.NAME, "keywords"); ++ meta.addAttr(HtmlAttr.CONTENT, "testContent"); ++ head.addContent(meta); ++ // Test invalid META tag ++ HtmlTree invmeta = new HtmlTree(HtmlTag.META); ++ head.addContent(invmeta); ++ // Test LINK tag ++ HtmlTree link = new HtmlTree(HtmlTag.LINK); ++ link.addAttr(HtmlAttr.REL, "testRel"); ++ link.addAttr(HtmlAttr.HREF, "testLink.html"); ++ head.addContent(link); ++ // Test invalid LINK tag ++ HtmlTree invlink = new HtmlTree(HtmlTag.LINK); ++ head.addContent(invlink); ++ html.addContent(head); ++ // Comment within the document ++ Comment bodyMarker = new Comment("======== START OF BODY ========"); ++ html.addContent(bodyMarker); ++ HtmlTree body = new HtmlTree(HtmlTag.BODY); ++ Comment pMarker = new Comment("======== START OF PARAGRAPH ========"); ++ body.addContent(pMarker); ++ HtmlTree p = new HtmlTree(HtmlTag.P); ++ StringContent bodyContent = new StringContent( ++ "This document is generated from sample source code and HTML " + ++ "files with examples of a wide variety of Java language constructs: packages, " + ++ "subclasses, subinterfaces, nested classes, nested interfaces," + ++ "inheriting from other packages, constructors, fields," + ++ "methods, and so forth. "); ++ p.addContent(bodyContent); ++ StringContent anchorContent = new StringContent("Click Here"); ++ p.addContent(HtmlTree.A("testLink.html", anchorContent)); ++ StringContent pContent = new StringContent(" to <test> out a link."); ++ p.addContent(pContent); ++ body.addContent(p); ++ HtmlTree p1 = new HtmlTree(HtmlTag.P); ++ // Test another version of A tag. ++ HtmlTree anchor = new HtmlTree(HtmlTag.A); ++ anchor.addAttr(HtmlAttr.HREF, "testLink.html"); ++ anchor.addAttr(HtmlAttr.NAME, "Another version of a tag"); ++ p1.addContent(anchor); ++ body.addContent(p1); ++ // Test for empty tags. ++ HtmlTree dl = new HtmlTree(HtmlTag.DL); ++ html.addContent(dl); ++ // Test for empty nested tags. ++ HtmlTree dlTree = new HtmlTree(HtmlTag.DL); ++ dlTree.addContent(new HtmlTree(HtmlTag.DT)); ++ dlTree.addContent(new HtmlTree (HtmlTag.DD)); ++ html.addContent(dlTree); ++ HtmlTree dlDisplay = new HtmlTree(HtmlTag.DL); ++ dlDisplay.addContent(new HtmlTree(HtmlTag.DT)); ++ HtmlTree dd = new HtmlTree (HtmlTag.DD); ++ StringContent ddContent = new StringContent("Test DD"); ++ dd.addContent(ddContent); ++ dlDisplay.addContent(dd); ++ body.addContent(dlDisplay); ++ StringContent emptyString = new StringContent(""); ++ body.addContent(emptyString); ++ Comment emptyComment = new Comment(""); ++ body.addContent(emptyComment); ++ HtmlTree hr = new HtmlTree(HtmlTag.HR); ++ body.addContent(hr); ++ html.addContent(body); ++ HtmlDocument htmlDoc = new HtmlDocument(htmlDocType, html); ++ return htmlDoc.toString(); ++ } ++ ++ // Read the file into a String ++ public static String readFileToString(String filename) throws IOException { ++ File file = new File(filename); ++ if ( !file.exists() ) { ++ System.out.println("\nFILE DOES NOT EXIST: " + filename); ++ } ++ BufferedReader in = new BufferedReader(new FileReader(file)); ++ // Create an array of characters the size of the file ++ char[] allChars = new char[(int)file.length()]; ++ // Read the characters into the allChars array ++ in.read(allChars, 0, (int)file.length()); ++ in.close(); ++ // Convert to a string ++ String allCharsString = new String(allChars); ++ return allCharsString; ++ } ++} +diff --git a/test/com/sun/javadoc/testHtmlDocument/testLink.html b/test/com/sun/javadoc/testHtmlDocument/testLink.html +new file mode 100644 +--- /dev/null ++++ langtools/test/com/sun/javadoc/testHtmlDocument/testLink.html +@@ -0,0 +1,9 @@ ++<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> ++<html> ++<head> ++<title>Markup test</title> ++</head> ++<body> ++This is a test for link. ++</body> ++</html> +diff --git a/test/com/sun/javadoc/testHtmlDocument/testMarkup.html b/test/com/sun/javadoc/testHtmlDocument/testMarkup.html +new file mode 100644 +--- /dev/null ++++ langtools/test/com/sun/javadoc/testHtmlDocument/testMarkup.html +@@ -0,0 +1,18 @@ ++<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> ++<html> ++<head> ++<title>Markup test</title> ++<meta name="keywords" content="testContent"> ++<link rel="testRel" href="testLink.html"> ++</head> ++<!-- ======== START OF BODY ======== --> ++<body> ++<!-- ======== START OF PARAGRAPH ======== --> ++<p>This document is generated from sample source code and HTML files with examples of a wide variety of Java language constructs: packages, subclasses, subinterfaces, nested classes, nested interfaces,inheriting from other packages, constructors, fields,methods, and so forth. <a href="testLink.html">Click Here</a> to <test> out a link.</p> ++<p><a href="testLink.html" name="Another version of a tag"></a></p> ++<dl> ++<dd>Test DD</dd> ++</dl> ++<hr> ++</body> ++</html> +diff --git a/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java b/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java +--- langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java ++++ langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java +@@ -38,7 +38,7 @@ + + private static final String BUG_ID = "6786028"; + private static final String[][] TEST1 = { +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<STRONG>See Also:</STRONG>"}}; ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<span class=\"strong\">See Also:</span>"}}; + private static final String[][] NEGATED_TEST1 = { + {BUG_ID + FS + "pkg1" + FS + "C1.html", "<STRONG>Method Summary</STRONG>"}, + {BUG_ID + FS + "pkg1" + FS + "C1.html", "<B>"}, +diff --git a/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java b/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java +--- langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java ++++ langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java +@@ -50,139 +50,128 @@ + + //Package summary + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Class Summary table, " + ++ "<table class=\"packageSummary\" border=\"0\" cellpadding=\"3\"" + ++ " cellspacing=\"0\" summary=\"Class Summary table, " + + "listing classes, and an explanation\">" + }, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Interface Summary table, " + ++ "<table class=\"packageSummary\" border=\"0\" cellpadding=\"3\"" + ++ " cellspacing=\"0\" summary=\"Interface Summary table, " + + "listing interfaces, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Enum Summary table, " + ++ "<table class=\"packageSummary\" border=\"0\" cellpadding=\"3\"" + ++ " cellspacing=\"0\" summary=\"Enum Summary table, " + + "listing enums, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Annotation Types Summary table, " + ++ "<table class=\"packageSummary\" border=\"0\" cellpadding=\"3\"" + ++ " cellspacing=\"0\" summary=\"Annotation Types Summary table, " + + "listing annotation types, and an explanation\">" + }, + // Class documentation + {BUG_ID + FS + "pkg1" + FS + "C1.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Field Summary table, " + +- "listing fields, and an explanation\">" ++ "<table class=\"overviewSummary\" border=\"0\" cellpadding=\"3\" " + ++ "cellspacing=\"0\" summary=\"Field Summary table, listing fields, " + ++ "and an explanation\">" + }, + {BUG_ID + FS + "pkg1" + FS + "C1.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Method Summary table, " + +- "listing methods, and an explanation\">" ++ "<table class=\"overviewSummary\" border=\"0\" cellpadding=\"3\" " + ++ "cellspacing=\"0\" summary=\"Method Summary table, listing methods, " + ++ "and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Nested Class Summary table, " + +- "listing nested classes, and an explanation\">" ++ "<table class=\"overviewSummary\" border=\"0\" cellpadding=\"3\" " + ++ "cellspacing=\"0\" summary=\"Nested Class Summary table, listing " + ++ "nested classes, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Constructor Summary table, " + +- "listing constructors, and an explanation\">" ++ "<table class=\"overviewSummary\" border=\"0\" cellpadding=\"3\" " + ++ "cellspacing=\"0\" summary=\"Constructor Summary table, listing " + ++ "constructors, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.ModalExclusionType.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Enum Constant Summary table, " + +- "listing enum constants, and an explanation\">" ++ "<table class=\"overviewSummary\" border=\"0\" cellpadding=\"3\" " + ++ "cellspacing=\"0\" summary=\"Enum Constant Summary table, listing " + ++ "enum constants, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "C3.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Required Element Summary table, " + ++ "<table class=\"overviewSummary\" border=\"0\" cellpadding=\"3\" " + ++ "cellspacing=\"0\" summary=\"Required Element Summary table, " + + "listing required elements, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "C4.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Optional Element Summary table, " + ++ "<table class=\"overviewSummary\" border=\"0\" cellpadding=\"3\" " + ++ "cellspacing=\"0\" summary=\"Optional Element Summary table, " + + "listing optional elements, and an explanation\">" + }, + // Class use documentation + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "I1.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Use table, " + +- "listing packages, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " + ++ "table, listing packages, and an explanation\">" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Use table, " + +- "listing fields, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " + ++ "table, listing fields, and an explanation\">" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Use table, " + +- "listing methods, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " + ++ "table, listing methods, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Use table, " + +- "listing fields, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " + ++ "table, listing fields, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Use table, " + +- "listing methods, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " + ++ "table, listing methods, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.ModalExclusionType.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Use table, " + +- "listing packages, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " + ++ "table, listing packages, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.ModalExclusionType.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Use table, " + +- "listing methods, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " + ++ "table, listing methods, and an explanation\">" + }, + // Package use documentation + {BUG_ID + FS + "pkg1" + FS + "package-use.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Use table, " + +- "listing packages, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " + ++ "table, listing packages, and an explanation\">" + }, + {BUG_ID + FS + "pkg1" + FS + "package-use.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Use table, " + +- "listing classes, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " + ++ "table, listing classes, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Use table, " + +- "listing packages, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " + ++ "table, listing packages, and an explanation\">" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Use table, " + +- "listing classes, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" summary=\"Use " + ++ "table, listing classes, and an explanation\">" + }, + // Deprecated + {BUG_ID + FS + "deprecated-list.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Deprecated Fields table, " + +- "listing deprecated fields, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" " + ++ "summary=\"Deprecated Fields table, listing deprecated fields, " + ++ "and an explanation\">" + }, + {BUG_ID + FS + "deprecated-list.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Deprecated Methods table, " + +- "listing deprecated methods, and an explanation\">" ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" " + ++ "summary=\"Deprecated Methods table, listing deprecated methods, " + ++ "and an explanation\">" + }, + // Constant values + {BUG_ID + FS + "constant-values.html", +- "<TABLE BORDER=\"1\" CELLPADDING=\"3\" CELLSPACING=\"0\" " + +- "SUMMARY=\"Constant Field Values table, listing " + ++ "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" " + ++ "summary=\"Constant Field Values table, listing " + + "constant fields, and values\">" + }, + // Overview Summary + {BUG_ID + FS + "overview-summary.html", +- "<TABLE BORDER=\"1\" WIDTH=\"100%\" CELLPADDING=\"3\" " + +- "CELLSPACING=\"0\" SUMMARY=\"Packages table, " + ++ "<table class=\"overviewSummary\" border=\"0\" cellpadding=\"3\" " + ++ "cellspacing=\"0\" summary=\"Packages table, " + + "listing packages, and an explanation\">" + }, + +@@ -192,125 +181,117 @@ + + //Package summary + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Class Summary</CAPTION>" ++ "<caption><span>Class Summary</span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Interface Summary</CAPTION>" ++ "<caption><span>Interface Summary</span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Enum Summary</CAPTION>" ++ "<caption><span>Enum Summary</span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Annotation Types Summary</CAPTION>" ++ "<caption><span>Annotation Types Summary</span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + // Class documentation + {BUG_ID + FS + "pkg1" + FS + "C1.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Field Summary</CAPTION>" ++ "<caption><span>Fields</span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg1" + FS + "C1.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Method Summary</CAPTION>" ++ "<caption><span>Methods</span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Nested Class Summary</CAPTION>" ++ "<caption><span>Nested Classes</span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Constructor Summary</CAPTION>" ++ "<caption><span>Constructors</span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.ModalExclusionType.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Enum Constant Summary</CAPTION>" ++ "<caption><span>Enum Constants</span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "C3.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Required Element Summary</CAPTION>" ++ "<caption><span>Required Elements</span><span class=\"tabEnd\"> " + ++ "</span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "C4.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Optional Element Summary</CAPTION>" ++ "<caption><span>Optional Elements</span><span class=\"tabEnd\"> " + ++ "</span></caption>" + }, + // Class use documentation + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "I1.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Packages that use <A HREF=\"../../pkg1/I1.html\" " + +- "title=\"interface in pkg1\">I1</A></CAPTION>" ++ "<caption><span>Packages that use <a href=\"../../pkg1/I1.html\" " + ++ "title=\"interface in pkg1\">I1</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Fields in <A HREF=\"../../pkg2/package-summary.html\">pkg2</A> " + +- "declared as <A HREF=\"../../pkg1/C1.html\" title=\"class in pkg1\">" + +- "C1</A></CAPTION>" ++ "<caption><span>Fields in <a href=\"../../pkg2/package-summary.html\">" + ++ "pkg2</a> declared as <a href=\"../../pkg1/C1.html\" " + ++ "title=\"class in pkg1\">C1</a></span><span class=\"tabEnd\"> " + ++ "</span></caption>" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2</A> " + +- "with parameters of type <A HREF=\"../../pkg1/C1.html\" " + +- "title=\"class in pkg1\">C1</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg2/package-summary.html\">" + ++ "pkg2</a> that return <a href=\"../../pkg1/C1.html\" " + ++ "title=\"class in pkg1\">C1</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Fields in <A HREF=\"../../pkg1/package-summary.html\">pkg1</A> " + +- "declared as <A HREF=\"../../pkg2/C2.html\" title=\"class in pkg2\">" + +- "C2</A></CAPTION>" ++ "<caption><span>Fields in <a href=\"../../pkg1/package-summary.html\">" + ++ "pkg1</a> declared as <a href=\"../../pkg2/C2.html\" " + ++ "title=\"class in pkg2\">C2</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg1/package-summary.html\">pkg1</A> " + +- "with parameters of type <A HREF=\"../../pkg2/C2.html\" " + +- "title=\"class in pkg2\">C2</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg1/package-summary.html\">" + ++ "pkg1</a> that return <a href=\"../../pkg2/C2.html\" " + ++ "title=\"class in pkg2\">C2</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.ModalExclusionType.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2</A> " + +- "that return <A HREF=\"../../pkg2/C2.ModalExclusionType.html\" " + +- "title=\"enum in pkg2\">C2.ModalExclusionType</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg2/package-summary.html\">" + ++ "pkg2</a> that return <a href=\"../../pkg2/C2.ModalExclusionType.html\" " + ++ "title=\"enum in pkg2\">C2.ModalExclusionType</a></span>" + ++ "<span class=\"tabEnd\"> </span></caption>" + }, + // Package use documentation + {BUG_ID + FS + "pkg1" + FS + "package-use.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Packages that use <A HREF=\"../pkg1/package-summary.html\">" + +- "pkg1</A></CAPTION>" ++ "<caption><span>Packages that use <a href=\"../pkg1/package-summary.html\">" + ++ "pkg1</a></span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg1" + FS + "package-use.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Classes in <A HREF=\"../pkg1/package-summary.html\">pkg1</A> " + +- "used by <A HREF=\"../pkg1/package-summary.html\">pkg1</A></CAPTION>" ++ "<caption><span>Classes in <a href=\"../pkg1/package-summary.html\">" + ++ "pkg1</a> used by <a href=\"../pkg1/package-summary.html\">pkg1</a>" + ++ "</span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Packages that use <A HREF=\"../pkg2/package-summary.html\">" + +- "pkg2</A></CAPTION>" ++ "<caption><span>Packages that use <a href=\"../pkg2/package-summary.html\">" + ++ "pkg2</a></span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Classes in <A HREF=\"../pkg2/package-summary.html\">pkg2</A> " + +- "used by <A HREF=\"../pkg1/package-summary.html\">pkg1</A></CAPTION>" ++ "<caption><span>Classes in <a href=\"../pkg2/package-summary.html\">" + ++ "pkg2</a> used by <a href=\"../pkg1/package-summary.html\">pkg1</a>" + ++ "</span><span class=\"tabEnd\"> </span></caption>" + }, + // Deprecated + {BUG_ID + FS + "deprecated-list.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Deprecated Fields</CAPTION>" ++ "<caption><span>Deprecated Fields</span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "deprecated-list.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Deprecated Methods</CAPTION>" ++ "<caption><span>Deprecated Methods</span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + // Constant values + {BUG_ID + FS + "constant-values.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "pkg1.<A HREF=\"pkg1/C1.html\" title=\"class in pkg1\">C1</A></CAPTION>" ++ "<caption><span>pkg1.<a href=\"pkg1/C1.html\" title=\"class in pkg1\">" + ++ "C1</a></span><span class=\"tabEnd\"> </span></caption>" + }, + // Overview Summary + {BUG_ID + FS + "overview-summary.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Packages</CAPTION>" ++ "<caption><span>Packages</span><span class=\"tabEnd\"> </span></caption>" + }, + + /* +@@ -319,135 +300,115 @@ + + //Package summary + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Class</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">" + ++ "Class</th>" + NL + "<th class=\"colLast\" scope=\"col\"" + ++ ">Description</th>" + }, + {BUG_ID + FS + "pkg1" + FS + "package-summary.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Interface</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">" + ++ "Interface</th>" + NL + "<th class=\"colLast\" scope=\"col\"" + ++ ">Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Enum</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">" + ++ "Enum</th>" + NL + "<th class=\"colLast\" scope=\"col\"" + ++ ">Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Annotation Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">" + ++ "Annotation Type</th>" + NL + "<th class=\"colLast\"" + ++ " scope=\"col\">Description</th>" + }, + // Class documentation + {BUG_ID + FS + "pkg1" + FS + "C1.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Field and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Field and Description</th>" + }, + {BUG_ID + FS + "pkg1" + FS + "C1.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Method and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Method and Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Class and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Class and Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Constructor and Description</TH>" ++ "<th class=\"colOne\" scope=\"col\">Constructor and Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "C2.ModalExclusionType.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Enum Constant and Description</TH>" ++ "<th class=\"colOne\" scope=\"col\">Enum Constant and Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "C3.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Required Element and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Required Element and Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "C4.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Optional Element and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Optional Element and Description</th>" + }, + // Class use documentation + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "I1.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Package</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Package</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Description</th>" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Field and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Field and Description</th>" + }, + {BUG_ID + FS + "pkg1" + FS + "class-use" + FS + "C1.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Method and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Method and Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Field and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Field and Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Method and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Method and Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.ModalExclusionType.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Package</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Package</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "C2.ModalExclusionType.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Method and Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Method and Description</th>" + }, + // Package use documentation + {BUG_ID + FS + "pkg1" + FS + "package-use.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Package</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Package</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Description</th>" + }, + {BUG_ID + FS + "pkg1" + FS + "package-use.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Class and Description</TH>" ++ "<th class=\"colOne\" scope=\"col\">Class and Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Package</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">Package</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Description</th>" + }, + {BUG_ID + FS + "pkg2" + FS + "package-use.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Class and Description</TH>" ++ "<th class=\"colOne\" scope=\"col\">Class and Description</th>" + }, + // Deprecated + {BUG_ID + FS + "deprecated-list.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Field and Description</TH>" ++ "<th class=\"colOne\" scope=\"col\">Field and Description</th>" + }, + {BUG_ID + FS + "deprecated-list.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Method and Description</TH>" ++ "<th class=\"colOne\" scope=\"col\">Method and Description</th>" + }, + // Constant values + {BUG_ID + FS + "constant-values.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Modifier and Type</TH>" + NL + "<TH CLASS=\"TableHeader\"" + +- " SCOPE=\"col\" NOWRAP>Constant Field</TH>" + NL + +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>Value</TH>" ++ "<th class=\"colFirst\" scope=\"col\">" + ++ "Modifier and Type</th>" + NL + "<th" + ++ " scope=\"col\">Constant Field</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Value</th>" + }, + // Overview Summary + {BUG_ID + FS + "overview-summary.html", +- "<TH CLASS=\"TableHeader\" SCOPE=\"col\" NOWRAP>" + +- "Package</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Description</TH>" ++ "<th class=\"colFirst\" scope=\"col\">" + ++ "Package</th>" + NL + "<th class=\"colLast\" scope=\"col\"" + ++ ">Description</th>" + } + }; + private static final String[][] NEGATED_TEST = NO_TEST; +diff --git a/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java b/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java +--- langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java ++++ langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java +@@ -40,20 +40,20 @@ + + private static final String BUG_ID = "6786682"; + private static final String[][] TEST1 = { +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<HTML lang=\"" + Locale.getDefault().getLanguage() + "\">"}, +- {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "<HTML lang=\"" + Locale.getDefault().getLanguage() + "\">"}}; ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<html lang=\"" + Locale.getDefault().getLanguage() + "\">"}, ++ {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "<html lang=\"" + Locale.getDefault().getLanguage() + "\">"}}; + private static final String[][] NEGATED_TEST1 = { +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<HTML>"}}; ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<html>"}}; + private static final String[][] TEST2 = { +- {BUG_ID + FS + "pkg2" + FS + "C2.html", "<HTML lang=\"ja\">"}, +- {BUG_ID + FS + "pkg2" + FS + "package-summary.html", "<HTML lang=\"ja\">"}}; ++ {BUG_ID + FS + "pkg2" + FS + "C2.html", "<html lang=\"ja\">"}, ++ {BUG_ID + FS + "pkg2" + FS + "package-summary.html", "<html lang=\"ja\">"}}; + private static final String[][] NEGATED_TEST2 = { +- {BUG_ID + FS + "pkg2" + FS + "C2.html", "<HTML>"}}; ++ {BUG_ID + FS + "pkg2" + FS + "C2.html", "<html>"}}; + private static final String[][] TEST3 = { +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<HTML lang=\"en\">"}, +- {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "<HTML lang=\"en\">"}}; ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<html lang=\"en\">"}, ++ {BUG_ID + FS + "pkg1" + FS + "package-summary.html", "<html lang=\"en\">"}}; + private static final String[][] NEGATED_TEST3 = { +- {BUG_ID + FS + "pkg1" + FS + "C1.html", "<HTML>"}}; ++ {BUG_ID + FS + "pkg1" + FS + "C1.html", "<html>"}}; + + private static final String[] ARGS1 = + new String[] { +diff --git a/test/com/sun/javadoc/testIndex/TestIndex.java b/test/com/sun/javadoc/testIndex/TestIndex.java +--- langtools/test/com/sun/javadoc/testIndex/TestIndex.java ++++ langtools/test/com/sun/javadoc/testIndex/TestIndex.java +@@ -48,35 +48,34 @@ + private static final String[][] TEST = { + //Make sure the horizontal scroll bar does not appear in class frame. + {BUG_ID + FS + "index.html", +- "<FRAME src=\"overview-summary.html\" name=\"classFrame\" " + +- "title=\"Package, class and interface descriptions\" " + +- "scrolling=\"yes\">"}, ++ "<frame src=\"overview-summary.html\" name=\"classFrame\" title=\"" + ++ "Package, class and interface descriptions\" scrolling=\"yes\">"}, + + //Test index-all.html + {BUG_ID + FS + "index-all.html", +- "<A HREF=\"./pkg/C.html\" title=\"class in pkg\"><STRONG>C</STRONG></A>" + +- " - Class in <A HREF=\"./pkg/package-summary.html\">pkg</A>"}, ++ "<a href=\"./pkg/C.html\" title=\"class in pkg\"><span class=\"strong\">C</span></a>" + ++ " - Class in <a href=\"./pkg/package-summary.html\">pkg</a>"}, + {BUG_ID + FS + "index-all.html", +- "<A HREF=\"./pkg/Interface.html\" title=\"interface in pkg\">" + +- "<STRONG>Interface</STRONG></A> - Interface in " + +- "<A HREF=\"./pkg/package-summary.html\">pkg</A>"}, ++ "<a href=\"./pkg/Interface.html\" title=\"interface in pkg\">" + ++ "<span class=\"strong\">Interface</span></a> - Interface in " + ++ "<a href=\"./pkg/package-summary.html\">pkg</a>"}, + {BUG_ID + FS + "index-all.html", +- "<A HREF=\"./pkg/AnnotationType.html\" title=\"annotation in pkg\">" + +- "<STRONG>AnnotationType</STRONG></A> - Annotation Type in " + +- "<A HREF=\"./pkg/package-summary.html\">pkg</A>"}, ++ "<a href=\"./pkg/AnnotationType.html\" title=\"annotation in pkg\">" + ++ "<span class=\"strong\">AnnotationType</span></a> - Annotation Type in " + ++ "<a href=\"./pkg/package-summary.html\">pkg</a>"}, + {BUG_ID + FS + "index-all.html", +- "<A HREF=\"./pkg/Coin.html\" title=\"enum in pkg\">" + +- "<STRONG>Coin</STRONG></A> - Enum in " + +- "<A HREF=\"./pkg/package-summary.html\">pkg</A>"}, ++ "<a href=\"./pkg/Coin.html\" title=\"enum in pkg\">" + ++ "<span class=\"strong\">Coin</span></a> - Enum in " + ++ "<a href=\"./pkg/package-summary.html\">pkg</a>"}, + {BUG_ID + FS + "index-all.html", +- "Class in <A HREF=\"./package-summary.html\"><Unnamed></A>"}, ++ "Class in <a href=\"./package-summary.html\"><Unnamed></a>"}, + {BUG_ID + FS + "index-all.html", +- "<DT><A HREF=\"./pkg/C.html#Java\"><STRONG>Java</STRONG></A> - " + NL + +- "Static variable in class pkg.<A HREF=\"./pkg/C.html\" title=\"class in pkg\">C</A>" + NL + +- "</DT><DD> </DD>" + NL + NL + +- "<DT><A HREF=\"./pkg/C.html#JDK\"><STRONG>JDK</STRONG></A> - " + NL + +- "Static variable in class pkg.<A HREF=\"./pkg/C.html\" title=\"class in pkg\">C</A>" + NL + +- "</DT><DD> </DD>"}, ++ "<dl>" + NL + "<dt><span class=\"strong\"><a href=\"./pkg/C.html#Java\">" + ++ "Java</a></span> - Static variable in class pkg.<a href=\"./pkg/C.html\" " + ++ "title=\"class in pkg\">C</a></dt>" + NL + "<dd> </dd>" + NL + ++ "<dt><span class=\"strong\"><a href=\"./pkg/C.html#JDK\">JDK</a></span> " + ++ "- Static variable in class pkg.<a href=\"./pkg/C.html\" title=\"class in pkg\">" + ++ "C</a></dt>" + NL + "<dd> </dd>" + NL + "</dl>"}, + }; + private static final String[][] NEGATED_TEST = NO_TEST; + +diff --git a/test/com/sun/javadoc/testInlineLinkLabel/TestInlineLinkLabel.java b/test/com/sun/javadoc/testInlineLinkLabel/TestInlineLinkLabel.java +--- langtools/test/com/sun/javadoc/testInlineLinkLabel/TestInlineLinkLabel.java ++++ langtools/test/com/sun/javadoc/testInlineLinkLabel/TestInlineLinkLabel.java +@@ -37,10 +37,10 @@ + private static final String BUG_ID = "4524136"; + private static final String[][] TEST = { + //Search for the label to the package link. +- {BUG_ID + FS + "pkg" + FS + "C1.html" , "<A HREF=\"../pkg/package-summary.html\"><CODE>Here is a link to a package</CODE></A>"}, ++ {BUG_ID + FS + "pkg" + FS + "C1.html" , "<a href=\"../pkg/package-summary.html\"><code>Here is a link to a package</code></a>"}, + + //Search for the label to the class link +- {BUG_ID + FS + "pkg" + FS + "C1.html" , "<A HREF=\"../pkg/C2.html\" title=\"class in pkg\"><CODE>Here is a link to a class</CODE></A>"} ++ {BUG_ID + FS + "pkg" + FS + "C1.html" , "<a href=\"../pkg/C2.html\" title=\"class in pkg\"><code>Here is a link to a class</code></a>"} + }; + private static final String[][] NEGATED_TEST = NO_TEST; + private static final String[] ARGS = +diff --git a/test/com/sun/javadoc/testInterface/TestInterface.java b/test/com/sun/javadoc/testInterface/TestInterface.java +--- langtools/test/com/sun/javadoc/testInterface/TestInterface.java ++++ langtools/test/com/sun/javadoc/testInterface/TestInterface.java +@@ -48,51 +48,62 @@ + //Input for string search tests. + private static final String[][] TEST = { + {BUG_ID + FS + "pkg" + FS + "Interface.html", +- "int <STRONG>method</STRONG>()"}, ++ "<pre>int method()</pre>"}, + {BUG_ID + FS + "pkg" + FS + "Interface.html", +- "static final int <STRONG>field</STRONG>"}, ++ "<pre>static final int field</pre>"}, + + + // Make sure known implementing class list is correct and omits type parameters. + {BUG_ID + FS + "pkg" + FS + "Interface.html", +- "<DT><STRONG>All Known Implementing Classes:</STRONG></DT> " + +- "<DD><A HREF=\"../pkg/Child.html\" " + +- "title=\"class in pkg\">Child</A>, " + +- "<A HREF=\"../pkg/Parent.html\" title=\"class in pkg\">" + +- "Parent</A></DD>"}, ++ "<dl>" + NL + "<dt>All Known Implementing Classes:</dt>" + NL + ++ "<dd><a href=\"../pkg/Child.html\" title=\"class in pkg\">Child" + ++ "</a>, <a href=\"../pkg/Parent.html\" title=\"class in pkg\">Parent" + ++ "</a></dd>" + NL + "</dl>"}, + + // Make sure "All Implemented Interfaces": has substituted type parameters + {BUG_ID + FS + "pkg" + FS + "Child.html", +- "<STRONG>All Implemented Interfaces:</STRONG></DT> <DD>" + +- "<A HREF=\"../pkg/Interface.html\" title=\"interface in pkg\">" + +- "Interface</A><T>" ++ "<dl>" + NL + "<dt>All Implemented Interfaces:</dt>" + NL + ++ "<dd><a href=\"../pkg/Interface.html\" title=\"interface in pkg\">" + ++ "Interface</a><T></dd>" + NL + "</dl>" + }, + //Make sure Class Tree has substituted type parameters. + {BUG_ID + FS + "pkg" + FS + "Child.html", +- "<PRE>" + NL + +- "java.lang.Object" + NL + +- " <IMG SRC=\"../resources/inherit.gif\" ALT=\"extended by \"><A HREF=\"../pkg/Parent.html\" title=\"class in pkg\">pkg.Parent</A><T>" + NL + +- " <IMG SRC=\"../resources/inherit.gif\" ALT=\"extended by \"><STRONG>pkg.Child<T></STRONG>" + NL + +- "</PRE>" ++ "<ul class=\"inheritance\">" + NL + "<li>java.lang.Object</li>" + NL + ++ "<li>" + NL + "<ul class=\"inheritance\">" + NL + ++ "<li><a href=\"../pkg/Parent.html\" title=\"class in pkg\">" + ++ "pkg.Parent</a><T></li>" + NL + "<li>" + NL + ++ "<ul class=\"inheritance\">" + NL + "<li>pkg.Child<T></li>" + NL + ++ "</ul>" + NL + "</li>" + NL + "</ul>" + NL + "</li>" + NL + "</ul>" + }, + //Make sure "Direct Know Subclasses" omits type parameters + {BUG_ID + FS + "pkg" + FS + "Parent.html", +- "<STRONG>Direct Known Subclasses:</STRONG></DT> <DD><A HREF=\"../pkg/Child.html\" title=\"class in pkg\">Child</A>" ++ "<dl>" + NL + "<dt>Direct Known Subclasses:</dt>" + NL + ++ "<dd><a href=\"../pkg/Child.html\" title=\"class in pkg\">Child" + ++ "</a></dd>" + NL + "</dl>" + }, + //Make sure "Specified By" has substituted type parameters. + {BUG_ID + FS + "pkg" + FS + "Child.html", +- "<STRONG>Specified by:</STRONG></DT><DD><CODE><A HREF=\"../pkg/Interface.html#method()\">method</A></CODE> in interface <CODE><A HREF=\"../pkg/Interface.html\" title=\"interface in pkg\">Interface</A><<A HREF=\"../pkg/Child.html\" title=\"type parameter in Child\">T</A>></CODE>" ++ "<dt><strong>Specified by:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg/Interface.html#method()\">method</a>" + ++ "</code> in interface <code>" + ++ "<a href=\"../pkg/Interface.html\" title=\"interface in pkg\">" + ++ "Interface</a><<a href=\"../pkg/Child.html\" title=\"type parameter in Child\">" + ++ "T</a>></code></dd>" + }, + //Make sure "Overrides" has substituted type parameters. + {BUG_ID + FS + "pkg" + FS + "Child.html", +- "<STRONG>Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg/Parent.html#method()\">method</A></CODE> in class <CODE><A HREF=\"../pkg/Parent.html\" title=\"class in pkg\">Parent</A><<A HREF=\"../pkg/Child.html\" title=\"type parameter in Child\">T</A>></CODE>" ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg/Parent.html#method()\">method</a>" + ++ "</code> in class <code><a href=\"../pkg/Parent.html\" " + ++ "title=\"class in pkg\">Parent</a><<a href=\"../pkg/Child.html\" " + ++ "title=\"type parameter in Child\">T</a>></code></dd>" + }, + }; + private static final String[][] NEGATED_TEST = { + {BUG_ID + FS + "pkg" + FS + "Interface.html", +- "public int <STRONG>method</STRONG>()"}, ++ "public int method()"}, + {BUG_ID + FS + "pkg" + FS + "Interface.html", +- "public static final int <STRONG>field</STRONG>"}, ++ "public static final int field"}, + }; + + /** +diff --git a/test/com/sun/javadoc/testJavascript/TestJavascript.java b/test/com/sun/javadoc/testJavascript/TestJavascript.java +--- langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java ++++ langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java +@@ -45,11 +45,11 @@ + //Input for string search tests. + private static final String[][] TEST = { + {BUG_ID + FS + "pkg" + FS + "C.html", +- "<A HREF=\"../index.html?pkg/C.html\" target=\"_top\"><STRONG>FRAMES</STRONG></A>"}, ++ "<a href=\"../index.html?pkg/C.html\" target=\"_top\">FRAMES</a>"}, + {BUG_ID + FS + "TestJavascript.html", +- "<A HREF=\"index.html?TestJavascript.html\" target=\"_top\"><STRONG>FRAMES</STRONG></A>"}, ++ "<a href=\"index.html?TestJavascript.html\" target=\"_top\">FRAMES</a>"}, + {BUG_ID + FS + "index.html", +- "<SCRIPT type=\"text/javascript\">" + NL + ++ "<script type=\"text/javascript\">" + NL + + " targetPage = \"\" + window.location.search;" + NL + + " if (targetPage != \"\" && targetPage != \"undefined\")" + NL + + " targetPage = targetPage.substring(1);" + NL + +@@ -59,7 +59,7 @@ + " if (targetPage != \"\" && targetPage != \"undefined\")" + NL + + " top.classFrame.location = top.targetPage;" + NL + + " }" + NL + +- "</SCRIPT>"}, ++ "</script>"}, + + //Make sure title javascript only runs if is-external is not true + {BUG_ID + FS + "pkg" + FS + "C.html", +diff --git a/test/com/sun/javadoc/testLinkOption/TestLinkOption.java b/test/com/sun/javadoc/testLinkOption/TestLinkOption.java +--- langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java ++++ langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java +@@ -46,25 +46,25 @@ + + private static final String[][] TEST1 = { + {BUG_ID + "-1" + FS + "pkg" + FS + "C.html", +- "<A HREF=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/String.html?is-external=true\" " + +- "title=\"class or interface in java.lang\"><CODE>Link to String Class</CODE></A>" ++ "<a href=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/String.html?is-external=true\" " + ++ "title=\"class or interface in java.lang\"><code>Link to String Class</code></a>" + }, + //Make sure the parameters are indented properly when the -link option is used. + {BUG_ID + "-1" + FS + "pkg" + FS + "C.html", + "(int p1," + NL + +- " int p2," + NL + +- " int p3)" ++ " int p2," + NL + ++ " int p3)" + }, + {BUG_ID + "-1" + FS + "pkg" + FS + "C.html", + "(int p1," + NL + +- " int p2," + NL + +- " " + +- "<A HREF=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true\" " + +- "title=\"class or interface in java.lang\">Object</A> p3)" ++ " int p2," + NL + ++ " <a href=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true\" title=\"class or interface in java.lang\">" + ++ "Object</a> p3)" + }, + {BUG_ID + "-1" + FS + "java" + FS + "lang" + FS + "StringBuilderChild.html", +- "public abstract class <STRONG>StringBuilderChild</STRONG>" + NL + +- "extends <A HREF=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true\" title=\"class or interface in java.lang\">Object</A>" ++ "<pre>public abstract class <strong>StringBuilderChild</strong>" + NL + ++ "extends <a href=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true\" " + ++ "title=\"class or interface in java.lang\">Object</a></pre>" + }, + + }; +@@ -79,8 +79,8 @@ + + private static final String[][] TEST2 = { + {BUG_ID + "-2" + FS + "pkg2" + FS + "C2.html", +- "This is a link to <A HREF=\"../../" + BUG_ID + "-1/pkg/C.html?is-external=true\" " + +- "title=\"class or interface in pkg\"><CODE>Class C</CODE></A>." ++ "This is a link to <a href=\"../../" + BUG_ID + "-1/pkg/C.html?is-external=true\" " + ++ "title=\"class or interface in pkg\"><code>Class C</code></a>." + } + }; + private static final String[][] NEGATED_TEST2 = NO_TEST; +diff --git a/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java b/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java +--- langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java ++++ langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java +@@ -46,20 +46,22 @@ + //Input for string search tests. + private static final String[][] TEST = { + {BUG_ID + FS + "pkg" + FS + "C.html", +- "Qualified Link: <A HREF=\"../pkg/C.InnerC.html\" title=\"class in pkg\"><CODE>C.InnerC</CODE></A>.<br/>\n" + +- " Unqualified Link1: <A HREF=\"../pkg/C.InnerC.html\" title=\"class in pkg\"><CODE>C.InnerC</CODE></A>.<br/>\n" + +- " Unqualified Link2: <A HREF=\"../pkg/C.InnerC.html\" title=\"class in pkg\"><CODE>C.InnerC</CODE></A>.<br/>\n" + +- " Qualified Link: <A HREF=\"../pkg/C.html#method(pkg.C.InnerC, pkg.C.InnerC2)\"><CODE>method(pkg.C.InnerC, pkg.C.InnerC2)</CODE></A>.<br/>\n" + +- " Unqualified Link: <A HREF=\"../pkg/C.html#method(pkg.C.InnerC, pkg.C.InnerC2)\"><CODE>method(C.InnerC, C.InnerC2)</CODE></A>.<br/>\n" + +- " Unqualified Link: <A HREF=\"../pkg/C.html#method(pkg.C.InnerC, pkg.C.InnerC2)\"><CODE>method(InnerC, InnerC2)</CODE></A>.<br/>" ++ "Qualified Link: <a href=\"../pkg/C.InnerC.html\" title=\"class in pkg\"><code>C.InnerC</code></a>.<br/>\n" + ++ " Unqualified Link1: <a href=\"../pkg/C.InnerC.html\" title=\"class in pkg\"><code>C.InnerC</code></a>.<br/>\n" + ++ " Unqualified Link2: <a href=\"../pkg/C.InnerC.html\" title=\"class in pkg\"><code>C.InnerC</code></a>.<br/>\n" + ++ " Qualified Link: <a href=\"../pkg/C.html#method(pkg.C.InnerC, pkg.C.InnerC2)\"><code>method(pkg.C.InnerC, pkg.C.InnerC2)</code></a>.<br/>\n" + ++ " Unqualified Link: <a href=\"../pkg/C.html#method(pkg.C.InnerC, pkg.C.InnerC2)\"><code>method(C.InnerC, C.InnerC2)</code></a>.<br/>\n" + ++ " Unqualified Link: <a href=\"../pkg/C.html#method(pkg.C.InnerC, pkg.C.InnerC2)\"><code>method(InnerC, InnerC2)</code></a>.<br/>" + }, + {BUG_ID + FS + "pkg" + FS + "C.InnerC.html", +- "Link to member in outer class: <A HREF=\"../pkg/C.html#MEMBER\"><CODE>C.MEMBER</CODE></A> <br/>\n" + +- " Link to member in inner class: <A HREF=\"../pkg/C.InnerC2.html#MEMBER2\"><CODE>C.InnerC2.MEMBER2</CODE></A> <br/>\n" + +- " Link to another inner class: <A HREF=\"../pkg/C.InnerC2.html\" title=\"class in pkg\"><CODE>C.InnerC2</CODE></A>" ++ "Link to member in outer class: <a href=\"../pkg/C.html#MEMBER\"><code>C.MEMBER</code></a> <br/>\n" + ++ " Link to member in inner class: <a href=\"../pkg/C.InnerC2.html#MEMBER2\"><code>C.InnerC2.MEMBER2</code></a> <br/>\n" + ++ " Link to another inner class: <a href=\"../pkg/C.InnerC2.html\" title=\"class in pkg\"><code>C.InnerC2</code></a>" + }, + {BUG_ID + FS + "pkg" + FS + "C.InnerC2.html", +- "Enclosing class:</STRONG></DT><DD><A HREF=\"../pkg/C.html\" title=\"class in pkg\">C</A>" ++ "<dl>" + NL + "<dt>Enclosing class:</dt>" + NL + ++ "<dd><a href=\"../pkg/C.html\" title=\"class in pkg\">C</a></dd>" + NL + ++ "</dl>" + }, + }; + private static final String[][] NEGATED_TEST = { +diff --git a/test/com/sun/javadoc/testLinkToSerialForm/TestLinkToSerialForm.java b/test/com/sun/javadoc/testLinkToSerialForm/TestLinkToSerialForm.java +--- langtools/test/com/sun/javadoc/testLinkToSerialForm/TestLinkToSerialForm.java ++++ langtools/test/com/sun/javadoc/testLinkToSerialForm/TestLinkToSerialForm.java +@@ -37,8 +37,8 @@ + + private static final String BUG_ID = "4521661"; + private static final String[][] TEST = { +- {BUG_ID + FS + "serialized-form.html", "<A NAME=\"pkg.C\">"}, +- {BUG_ID + FS + "pkg" + FS + "C.html", "<A HREF=\"../serialized-form.html#pkg.C\">"} ++ {BUG_ID + FS + "serialized-form.html", "<a name=\"pkg.C\">"}, ++ {BUG_ID + FS + "pkg" + FS + "C.html", "<a href=\"../serialized-form.html#pkg.C\">"} + }; + private static final String[][] NEGATED_TEST = NO_TEST; + private static final String[] ARGS = +diff --git a/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java b/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java +--- langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java ++++ langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java +@@ -40,55 +40,57 @@ + private static final String[][] TEST = { + //Public field should be inherited + {BUG_ID + FS + "pkg" + FS + "SubClass.html", +- "<A HREF=\"../pkg/BaseClass.html#pubField\">"}, ++ "<a href=\"../pkg/BaseClass.html#pubField\">"}, + + //Public method should be inherited + {BUG_ID + FS + "pkg" + FS + "SubClass.html", +- "<A HREF=\"../pkg/BaseClass.html#pubMethod()\">"}, ++ "<a href=\"../pkg/BaseClass.html#pubMethod()\">"}, + + //Public inner class should be inherited. + {BUG_ID + FS + "pkg" + FS + "SubClass.html", +- "<A HREF=\"../pkg/BaseClass.pubInnerClass.html\" title=\"class in pkg\">"}, ++ "<a href=\"../pkg/BaseClass.pubInnerClass.html\" title=\"class in pkg\">"}, + + //Protected field should be inherited + {BUG_ID + FS + "pkg" + FS + "SubClass.html", +- "<A HREF=\"../pkg/BaseClass.html#proField\">"}, ++ "<a href=\"../pkg/BaseClass.html#proField\">"}, + + //Protected method should be inherited + {BUG_ID + FS + "pkg" + FS + "SubClass.html", +- "<A HREF=\"../pkg/BaseClass.html#proMethod()\">"}, ++ "<a href=\"../pkg/BaseClass.html#proMethod()\">"}, + + //Protected inner class should be inherited. + {BUG_ID + FS + "pkg" + FS + "SubClass.html", +- "<A HREF=\"../pkg/BaseClass.proInnerClass.html\" title=\"class in pkg\">"}, ++ "<a href=\"../pkg/BaseClass.proInnerClass.html\" title=\"class in pkg\">"}, + + // New labels as of 1.5.0 + {BUG_ID + FS + "pkg" + FS + "SubClass.html", +- "<STRONG>Nested classes/interfaces inherited from class pkg." + +- "<A HREF=\"../pkg/BaseClass.html\" title=\"class in pkg\">" + +- "BaseClass</A></STRONG>"}, ++ "Nested classes/interfaces inherited from class pkg." + ++ "<a href=\"../pkg/BaseClass.html\" title=\"class in pkg\">BaseClass</a>"}, + {BUG_ID + FS + "pkg" + FS + "SubClass.html", +- "<STRONG>Nested classes/interfaces inherited from interface pkg." + +- "<A HREF=\"../pkg/BaseInterface.html\" title=\"interface in pkg\">" + +- "BaseInterface</A></STRONG>"}, ++ "Nested classes/interfaces inherited from interface pkg." + ++ "<a href=\"../pkg/BaseInterface.html\" title=\"interface in pkg\">BaseInterface</a>"}, + + // Test overriding/implementing methods with generic parameters. + {BUG_ID + FS + "pkg" + FS + "BaseClass.html", +- "<DT><STRONG>Specified by:</STRONG></DT><DD><CODE><A HREF=\"../pkg/BaseInterface.html#getAnnotation(java.lang.Class)\">getAnnotation</A></CODE> in interface <CODE><A HREF=\"../pkg/BaseInterface.html\" title=\"interface in pkg\">BaseInterface</A></CODE></DD>"+NL+"</DL>"}, ++ "<dl>" + NL + "<dt><strong>Specified by:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg/BaseInterface.html#getAnnotation(java.lang.Class)\">" + ++ "getAnnotation</a></code> in interface <code>" + ++ "<a href=\"../pkg/BaseInterface.html\" title=\"interface in pkg\">" + ++ "BaseInterface</a></code></dd>" + NL + "</dl>"}, + + // Test diamond inheritence member summary (6256068) + {BUG_ID + FS + "diamond" + FS + "Z.html", +- "<TD><CODE><A HREF=\"../diamond/A.html#aMethod()\">aMethod</A></CODE></TD>"}, ++ "<code><a href=\"../diamond/A.html#aMethod()\">aMethod</a></code>"}, + + // Test that doc is inherited from closed parent (6270645) + {BUG_ID + FS + "inheritDist" + FS + "C.html", +- " m1-B</TD>"}, ++ "<div class=\"block\">m1-B</div>"}, + + }; + + private static final String[][] NEGATED_TEST = { + {BUG_ID + FS + "pkg" + FS + "SubClass.html", +- "<A HREF=\"../pkg/BaseClass.html#staticMethod()\">staticMethod</A></CODE>"}, ++ "<a href=\"../pkg/BaseClass.html#staticMethod()\">staticMethod</a></code>"}, + }; + private static final String[] ARGS = + new String[] { +diff --git a/test/com/sun/javadoc/testMemberSummary/TestMemberSummary.java b/test/com/sun/javadoc/testMemberSummary/TestMemberSummary.java +--- langtools/test/com/sun/javadoc/testMemberSummary/TestMemberSummary.java ++++ langtools/test/com/sun/javadoc/testMemberSummary/TestMemberSummary.java +@@ -48,21 +48,23 @@ + private static final String[][] TEST = { + // Check return type in member summary. + {BUG_ID + FS + "pkg" + FS + "PublicChild.html", +- "<CODE> <A HREF=\"../pkg/PublicChild.html\" " + +- "title=\"class in pkg\">PublicChild</A></CODE></FONT></TD>" + NL + +- "<TD><CODE><STRONG><A HREF=\"../pkg/PublicChild.html#" + +- "returnTypeTest()\">returnTypeTest</A></STRONG>()</CODE>" ++ "<code><a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">PublicChild</a></code></td>" + NL + ++ "<td class=\"colLast\"><code><strong><a href=\"../pkg/PublicChild.html#returnTypeTest()\">" + ++ "returnTypeTest</a></strong>()</code>" + }, + // Check return type in member detail. + {BUG_ID + FS + "pkg" + FS + "PublicChild.html", +- "public <A HREF=\"../pkg/PublicChild.html\" " + +- "title=\"class in pkg\">PublicChild</A> " + +- "<STRONG>returnTypeTest</STRONG>()" ++ "<pre>public <a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">" + ++ "PublicChild</a> returnTypeTest()</pre>" + }, + + // Legacy anchor dimensions (6290760) + {BUG_ID + FS + "pkg2" + FS + "A.html", +- "<A NAME=\"f(java.lang.Object[])\"><!-- --></A><A NAME=\"f(T[])\"><!-- --></A>" ++ "<a name=\"f(java.lang.Object[])\">" + NL + ++ "<!-- -->" + NL + ++ "</a><a name=\"f(T[])\">" + NL + ++ "<!-- -->" + NL + ++ "</a>" + }, + }; + private static final String[][] NEGATED_TEST = NO_TEST; +diff --git a/test/com/sun/javadoc/testNavagation/TestNavagation.java b/test/com/sun/javadoc/testNavagation/TestNavagation.java +--- langtools/test/com/sun/javadoc/testNavagation/TestNavagation.java ++++ langtools/test/com/sun/javadoc/testNavagation/TestNavagation.java +@@ -45,24 +45,24 @@ + + //Input for string search tests. + private static final String[][] TEST = { +- {BUG_ID + FS + "pkg" + FS + "A.html", " PREV CLASS "}, ++ {BUG_ID + FS + "pkg" + FS + "A.html", "<li>PREV CLASS</li>"}, + {BUG_ID + FS + "pkg" + FS + "A.html", +- "<A HREF=\"../pkg/C.html\" title=\"class in pkg\"><STRONG>NEXT CLASS</STRONG></A>"}, ++ "<a href=\"../pkg/C.html\" title=\"class in pkg\"><span class=\"strong\">NEXT CLASS</span></a>"}, + {BUG_ID + FS + "pkg" + FS + "C.html", +- "<A HREF=\"../pkg/A.html\" title=\"annotation in pkg\"><STRONG>PREV CLASS</STRONG></A>"}, ++ "<a href=\"../pkg/A.html\" title=\"annotation in pkg\"><span class=\"strong\">PREV CLASS</span></a>"}, + {BUG_ID + FS + "pkg" + FS + "C.html", +- "<A HREF=\"../pkg/E.html\" title=\"enum in pkg\"><STRONG>NEXT CLASS</STRONG></A>"}, ++ "<a href=\"../pkg/E.html\" title=\"enum in pkg\"><span class=\"strong\">NEXT CLASS</span></a>"}, + {BUG_ID + FS + "pkg" + FS + "E.html", +- "<A HREF=\"../pkg/C.html\" title=\"class in pkg\"><STRONG>PREV CLASS</STRONG></A>"}, ++ "<a href=\"../pkg/C.html\" title=\"class in pkg\"><span class=\"strong\">PREV CLASS</span></a>"}, + {BUG_ID + FS + "pkg" + FS + "E.html", +- "<A HREF=\"../pkg/I.html\" title=\"interface in pkg\"><STRONG>NEXT CLASS</STRONG></A>"}, ++ "<a href=\"../pkg/I.html\" title=\"interface in pkg\"><span class=\"strong\">NEXT CLASS</span></a>"}, + {BUG_ID + FS + "pkg" + FS + "I.html", +- "<A HREF=\"../pkg/E.html\" title=\"enum in pkg\"><STRONG>PREV CLASS</STRONG></A>"}, +- {BUG_ID + FS + "pkg" + FS + "I.html", " NEXT CLASS"}, ++ "<a href=\"../pkg/E.html\" title=\"enum in pkg\"><span class=\"strong\">PREV CLASS</span></a>"}, ++ {BUG_ID + FS + "pkg" + FS + "I.html", "<li>NEXT CLASS</li>"}, + // Test for 4664607 + {BUG_ID + FS + "pkg" + FS + "I.html", +- "<TD COLSPAN=2 BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\">" + NL + +- "<A NAME=\"navbar_top_firstrow\"><!-- --></A>"} ++ "<a href=\"#skip-navbar_top\" title=\"Skip navigation links\"></a><a name=\"navbar_top_firstrow\">" + NL + ++ "<!-- -->" + NL + "</a>"} + }; + private static final String[][] NEGATED_TEST = NO_TEST; + +diff --git a/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java b/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java +--- langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java ++++ langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java +@@ -51,18 +51,18 @@ + // ENUM TESTING + //================================= + //Make sure enum header is correct. +- {BUG_ID + FS + "pkg" + FS + "Coin.html", "Enum Coin</H2>"}, ++ {BUG_ID + FS + "pkg" + FS + "Coin.html", "Enum Coin</h2>"}, + //Make sure enum signature is correct. +- {BUG_ID + FS + "pkg" + FS + "Coin.html", "public enum "+ +- "<STRONG>Coin</STRONG>" + NL + "extends java.lang.Enum<" + +- "<A HREF=\"../pkg/Coin.html\" title=\"enum in pkg\">Coin</A>>" ++ {BUG_ID + FS + "pkg" + FS + "Coin.html", "<pre>public enum <strong>Coin</strong>" + NL + ++ "extends java.lang.Enum<<a href=\"../pkg/Coin.html\" " + ++ "title=\"enum in pkg\">Coin</a>></pre>" + }, + //Check for enum constant section +- {BUG_ID + FS + "pkg" + FS + "Coin.html", "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Enum Constant Summary</CAPTION>"}, ++ {BUG_ID + FS + "pkg" + FS + "Coin.html", "<caption><span>Enum Constants" + ++ "</span><span class=\"tabEnd\"> </span></caption>"}, + //Detail for enum constant + {BUG_ID + FS + "pkg" + FS + "Coin.html", +- "<STRONG><A HREF=\"../pkg/Coin.html#Dime\">Dime</A></STRONG>"}, ++ "<strong><a href=\"../pkg/Coin.html#Dime\">Dime</a></strong>"}, + //Automatically insert documentation for values() and valueOf(). + {BUG_ID + FS + "pkg" + FS + "Coin.html", + "Returns an array containing the constants of this enum type,"}, +@@ -77,38 +77,39 @@ + //================================= + //Make sure the header is correct. + {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", +- "Class TypeParameters<E></H2>"}, ++ "Class TypeParameters<E></h2>"}, + //Check class type parameters section. + {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", +- "<DT><STRONG>Type Parameters:</STRONG></DT><DD><CODE>E</CODE> - " + ++ "<dt><span class=\"strong\">Type Parameters:</span></dt><dd><code>E</code> - " + + "the type parameter for this class."}, + //Type parameters in @see/@link + {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", +- "<DT><STRONG>See Also:</STRONG></DT><DD><A HREF=\"../pkg/TypeParameters.html\" " + +- "title=\"class in pkg\"><CODE>TypeParameters</CODE></A></DD></DL>"}, ++ "<dl><dt><span class=\"strong\">See Also:</span></dt><dd>" + ++ "<a href=\"../pkg/TypeParameters.html\" title=\"class in pkg\">" + ++ "<code>TypeParameters</code></a></dd></dl>"}, + //Method that uses class type parameter. + {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", +- "(<A HREF=\"../pkg/TypeParameters.html\" title=\"type " + +- "parameter in TypeParameters\">E</A> param)"}, ++ "(<a href=\"../pkg/TypeParameters.html\" title=\"type " + ++ "parameter in TypeParameters\">E</a> param)"}, + //Method type parameter section. + {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", +- "<STRONG>Type Parameters:</STRONG></DT><DD><CODE>T</CODE> - This is the first " + +- "type parameter.</DD><DD><CODE>V</CODE> - This is the second type " + ++ "<span class=\"strong\">Type Parameters:</span></dt><dd><code>T</code> - This is the first " + ++ "type parameter.</dd><dd><code>V</code> - This is the second type " + + "parameter."}, + //Signature of method with type parameters + {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", +- "public <T extends java.util.List,V> " + +- "java.lang.String[] <STRONG>methodThatHasTypeParameters</STRONG>"}, ++ "public <T extends java.util.List,V> " + ++ "java.lang.String[] methodThatHasTypeParameters"}, + //Wildcard testing. + {BUG_ID + FS + "pkg" + FS + "Wildcards.html", +- "<A HREF=\"../pkg/TypeParameters.html\" title=\"class in pkg\">" + +- "TypeParameters</A><? super java.lang.String> a"}, ++ "<a href=\"../pkg/TypeParameters.html\" title=\"class in pkg\">" + ++ "TypeParameters</a><? super java.lang.String> a"}, + {BUG_ID + FS + "pkg" + FS + "Wildcards.html", +- "<A HREF=\"../pkg/TypeParameters.html\" title=\"class in pkg\">" + +- "TypeParameters</A><? extends java.lang.StringBuffer> b"}, ++ "<a href=\"../pkg/TypeParameters.html\" title=\"class in pkg\">" + ++ "TypeParameters</a><? extends java.lang.StringBuffer> b"}, + {BUG_ID + FS + "pkg" + FS + "Wildcards.html", +- "<A HREF=\"../pkg/TypeParameters.html\" title=\"class in pkg\">" + +- "TypeParameters</A> c"}, ++ "<a href=\"../pkg/TypeParameters.html\" title=\"class in pkg\">" + ++ "TypeParameters</a> c"}, + //Bad type parameter warnings. + {WARNING_OUTPUT, "warning - @param argument " + + "\"<BadClassTypeParam>\" is not a type parameter name."}, +@@ -117,18 +118,27 @@ + + //Signature of subclass that has type parameters. + {BUG_ID + FS + "pkg" + FS + "TypeParameterSubClass.html", +- "public class <STRONG>TypeParameterSubClass<T extends java.lang.String>" + +- "</STRONG>" + NL + "extends <A HREF=\"../pkg/TypeParameterSuperClass.html\" " + +- "title=\"class in pkg\">TypeParameterSuperClass</A><T>"}, ++ "<pre>public class <strong>TypeParameterSubClass<T extends " + ++ "java.lang.String></strong>" + NL + "extends " + ++ "<a href=\"../pkg/TypeParameterSuperClass.html\" title=\"class in pkg\">" + ++ "TypeParameterSuperClass</a><T></pre>"}, + + //Interface generic parameter substitution + //Signature of subclass that has type parameters. + {BUG_ID + FS + "pkg" + FS + "TypeParameters.html", +- "<STRONG>All Implemented Interfaces:</STRONG></DT> <DD><A HREF=\"../pkg/SubInterface.html\" title=\"interface in pkg\">SubInterface</A><E>, <A HREF=\"../pkg/SuperInterface.html\" title=\"interface in pkg\">SuperInterface</A><E></DD>"}, ++ "<dl>" + NL + "<dt>All Implemented Interfaces:</dt>" + NL + ++ "<dd><a href=\"../pkg/SubInterface.html\" title=\"interface in pkg\">" + ++ "SubInterface</a><E>, <a href=\"../pkg/SuperInterface.html\" " + ++ "title=\"interface in pkg\">SuperInterface</a><E></dd>" + NL + ++ "</dl>"}, + {BUG_ID + FS + "pkg" + FS + "SuperInterface.html", +- "<STRONG>All Known Subinterfaces:</STRONG></DT> <DD><A HREF=\"../pkg/SubInterface.html\" title=\"interface in pkg\">SubInterface</A><V></DD>"}, ++ "<dl>" + NL + "<dt>All Known Subinterfaces:</dt>" + NL + ++ "<dd><a href=\"../pkg/SubInterface.html\" title=\"interface in pkg\">" + ++ "SubInterface</a><V></dd>" + NL + "</dl>"}, + {BUG_ID + FS + "pkg" + FS + "SubInterface.html", +- "<STRONG>All Superinterfaces:</STRONG></DT> <DD><A HREF=\"../pkg/SuperInterface.html\" title=\"interface in pkg\">SuperInterface</A><V></DD>"}, ++ "<dl>" + NL + "<dt>All Superinterfaces:</dt>" + NL + ++ "<dd><a href=\"../pkg/SuperInterface.html\" title=\"interface in pkg\">" + ++ "SuperInterface</a><V></dd>" + NL + "</dl>"}, + + //================================= + // VAR ARG TESTING +@@ -137,39 +147,40 @@ + {BUG_ID + FS + "pkg" + FS + "VarArgs.html", "(int[][]... i)"}, + {BUG_ID + FS + "pkg" + FS + "VarArgs.html", "(int[]...)"}, + {BUG_ID + FS + "pkg" + FS + "VarArgs.html", +- "<A HREF=\"../pkg/TypeParameters.html\" title=\"class in pkg\">" + +- "TypeParameters</A>... t"}, ++ "<a href=\"../pkg/TypeParameters.html\" title=\"class in pkg\">" + ++ "TypeParameters</a>... t"}, + + //================================= + // ANNOTATION TYPE TESTING + //================================= + //Make sure the summary links are correct. + {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", +- "SUMMARY: <A HREF=\"#annotation_type_required_element_summary\">" + +- "REQUIRED</A> | <A HREF=\"#annotation_type_optional_element_summary\">" + +- "OPTIONAL</A>"}, ++ "<li>SUMMARY: </li>" + NL + ++ "<li><a href=\"#annotation_type_required_element_summary\">" + ++ "REQUIRED</a> | </li>" + NL + "<li>" + ++ "<a href=\"#annotation_type_optional_element_summary\">OPTIONAL</a></li>"}, + //Make sure the detail links are correct. + {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", +- "DETAIL: <A HREF=\"#annotation_type_element_detail\">ELEMENT</A>"}, ++ "<li>DETAIL: </li>" + NL + ++ "<li><a href=\"#annotation_type_element_detail\">ELEMENT</a></li>"}, + //Make sure the heading is correct. + {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", +- "Annotation Type AnnotationType</H2>"}, ++ "Annotation Type AnnotationType</h2>"}, + //Make sure the signature is correct. + {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", +- "public @interface <STRONG>AnnotationType</STRONG>"}, ++ "public @interface <strong>AnnotationType</strong>"}, + //Make sure member summary headings are correct. + {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Required Element Summary</CAPTION>"}, ++ "<h3>Required Element Summary</h3>"}, + {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", +- "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Optional Element Summary</CAPTION>"}, ++ "<h3>Optional Element Summary</h3>"}, + //Make sure element detail heading is correct + {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", + "Element Detail"}, + //Make sure default annotation type value is printed when necessary. + {BUG_ID + FS + "pkg" + FS + "AnnotationType.html", +- "<STRONG>Default:</STRONG></DT><DD>\"unknown\"</DD>"}, ++ "<dl>" + NL + "<dt>Default:</dt>" + NL + "<dd>\"unknown\"</dd>" + NL + ++ "</dl>"}, + + //================================= + // ANNOTATION TYPE USAGE TESTING +@@ -177,51 +188,65 @@ + + //PACKAGE + {BUG_ID + FS + "pkg" + FS + "package-summary.html", +- "<A HREF=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">@AnnotationType</A>(<A HREF=\"../pkg/AnnotationType.html#optional()\">optional</A>=\"Package Annotation\"," + NL + +- " <A HREF=\"../pkg/AnnotationType.html#required()\">required</A>=1994)"}, ++ "<a href=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">@AnnotationType</a>(<a href=\"../pkg/AnnotationType.html#optional()\">optional</a>=\"Package Annotation\"," + NL + ++ " <a href=\"../pkg/AnnotationType.html#required()\">required</a>=1994)"}, + + //CLASS + {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", +- "<FONT SIZE=\"-1\">" + +- "<A HREF=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">@AnnotationType</A>(<A HREF=\"../pkg/AnnotationType.html#optional()\">optional</A>=\"Class Annotation\","+NL + +- " <A HREF=\"../pkg/AnnotationType.html#required()\">required</A>=1994)"+NL + +- "</FONT>public class <STRONG>AnnotationTypeUsage</STRONG>" + NL + +- "extends java.lang.Object"}, ++ "<pre><a href=\"../pkg/AnnotationType.html\" " + ++ "title=\"annotation in pkg\">@AnnotationType</a>(" + ++ "<a href=\"../pkg/AnnotationType.html#optional()\">optional</a>" + ++ "=\"Class Annotation\"," + NL + ++ " <a href=\"../pkg/AnnotationType.html#required()\">" + ++ "required</a>=1994)" + NL + "public class <strong>" + ++ "AnnotationTypeUsage</strong>" + NL + "extends java.lang.Object</pre>"}, + + //FIELD + {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", +- "<FONT SIZE=\"-1\">" + +- "<A HREF=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">@AnnotationType</A>(<A HREF=\"../pkg/AnnotationType.html#optional()\">optional</A>=\"Field Annotation\","+NL + +- " <A HREF=\"../pkg/AnnotationType.html#required()\">required</A>=1994)"+NL + +- "</FONT>public int <STRONG>field</STRONG>"}, ++ "<pre><a href=\"../pkg/AnnotationType.html\" " + ++ "title=\"annotation in pkg\">@AnnotationType</a>(" + ++ "<a href=\"../pkg/AnnotationType.html#optional()\">optional</a>" + ++ "=\"Field Annotation\"," + NL + ++ " <a href=\"../pkg/AnnotationType.html#required()\">" + ++ "required</a>=1994)" + NL + "public int field</pre>"}, + + //CONSTRUCTOR + {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", +- "<FONT SIZE=\"-1\">" + +- "<A HREF=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">@AnnotationType</A>(<A HREF=\"../pkg/AnnotationType.html#optional()\">optional</A>=\"Constructor Annotation\","+NL + +- " <A HREF=\"../pkg/AnnotationType.html#required()\">required</A>=1994)"+NL + +- "</FONT>public <STRONG>AnnotationTypeUsage</STRONG>()"}, ++ "<pre><a href=\"../pkg/AnnotationType.html\" " + ++ "title=\"annotation in pkg\">@AnnotationType</a>(" + ++ "<a href=\"../pkg/AnnotationType.html#optional()\">optional</a>" + ++ "=\"Constructor Annotation\"," + NL + ++ " <a href=\"../pkg/AnnotationType.html#required()\">" + ++ "required</a>=1994)" + NL + "public AnnotationTypeUsage()</pre>"}, + + //METHOD + {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", +- "<FONT SIZE=\"-1\">" + +- "<A HREF=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">@AnnotationType</A>(<A HREF=\"../pkg/AnnotationType.html#optional()\">optional</A>=\"Method Annotation\","+NL + +- " <A HREF=\"../pkg/AnnotationType.html#required()\">required</A>=1994)"+NL + +- "</FONT>public void <STRONG>method</STRONG>()"}, ++ "<pre><a href=\"../pkg/AnnotationType.html\" " + ++ "title=\"annotation in pkg\">@AnnotationType</a>(" + ++ "<a href=\"../pkg/AnnotationType.html#optional()\">optional</a>" + ++ "=\"Method Annotation\"," + NL + ++ " <a href=\"../pkg/AnnotationType.html#required()\">" + ++ "required</a>=1994)" + NL + "public void method()</pre>"}, + + //METHOD PARAMS + {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", +- "<PRE>" + NL + +- "public void <STRONG>methodWithParams</STRONG>(<FONT SIZE=\"-1\"><A HREF=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">@AnnotationType</A>(<A HREF=\"../pkg/AnnotationType.html#optional()\">optional</A>=\"Parameter Annotation\",<A HREF=\"../pkg/AnnotationType.html#required()\">required</A>=1994)</FONT>" + NL + +- " int documented," + NL + +- " int undocmented)</PRE>"}, ++ "<pre>public void methodWithParams(" + ++ "<a href=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">" + ++ "@AnnotationType</a>(<a href=\"../pkg/AnnotationType.html#optional()\">" + ++ "optional</a>=\"Parameter Annotation\",<a " + ++ "href=\"../pkg/AnnotationType.html#required()\">required</a>=1994)" + NL + ++ " int documented," + NL + ++ " int undocmented)</pre>"}, + + //CONSTRUCTOR PARAMS + {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", +- "<PRE>" + NL + +- "public <STRONG>AnnotationTypeUsage</STRONG>(<FONT SIZE=\"-1\"><A HREF=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">@AnnotationType</A>(<A HREF=\"../pkg/AnnotationType.html#optional()\">optional</A>=\"Constructor Param Annotation\",<A HREF=\"../pkg/AnnotationType.html#required()\">required</A>=1994)</FONT>" + NL + +- " int documented," + NL + +- " int undocmented)</PRE>"}, ++ "<pre>public AnnotationTypeUsage(<a " + ++ "href=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">" + ++ "@AnnotationType</a>(<a href=\"../pkg/AnnotationType.html#optional()\">" + ++ "optional</a>=\"Constructor Param Annotation\",<a " + ++ "href=\"../pkg/AnnotationType.html#required()\">required</a>=1994)" + NL + ++ " int documented," + NL + ++ " int undocmented)</pre>"}, + + //================================= + // ANNOTATION TYPE USAGE TESTING (All Different Types). +@@ -229,59 +254,59 @@ + + //Integer + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "<A HREF=\"../pkg1/A.html#d()\">d</A>=3.14,"}, ++ "<a href=\"../pkg1/A.html#d()\">d</a>=3.14,"}, + + //Double + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "<A HREF=\"../pkg1/A.html#d()\">d</A>=3.14,"}, ++ "<a href=\"../pkg1/A.html#d()\">d</a>=3.14,"}, + + //Boolean + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "<A HREF=\"../pkg1/A.html#b()\">b</A>=true,"}, ++ "<a href=\"../pkg1/A.html#b()\">b</a>=true,"}, + + //String + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "<A HREF=\"../pkg1/A.html#s()\">s</A>=\"sigh\","}, ++ "<a href=\"../pkg1/A.html#s()\">s</a>=\"sigh\","}, + + //Class + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "<A HREF=\"../pkg1/A.html#c()\">c</A>=<A HREF=\"../pkg2/Foo.html\" title=\"class in pkg2\">Foo.class</A>,"}, ++ "<a href=\"../pkg1/A.html#c()\">c</a>=<a href=\"../pkg2/Foo.html\" title=\"class in pkg2\">Foo.class</a>,"}, + + //Bounded Class + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "<A HREF=\"../pkg1/A.html#w()\">w</A>=<A HREF=\"../pkg/TypeParameterSubClass.html\" title=\"class in pkg\">TypeParameterSubClass.class</A>,"}, ++ "<a href=\"../pkg1/A.html#w()\">w</a>=<a href=\"../pkg/TypeParameterSubClass.html\" title=\"class in pkg\">TypeParameterSubClass.class</a>,"}, + + //Enum + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "<A HREF=\"../pkg1/A.html#e()\">e</A>=<A HREF=\"../pkg/Coin.html#Penny\">Penny</A>,"}, ++ "<a href=\"../pkg1/A.html#e()\">e</a>=<a href=\"../pkg/Coin.html#Penny\">Penny</a>,"}, + + //Annotation Type + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "<A HREF=\"../pkg1/A.html#a()\">a</A>=<A HREF=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">@AnnotationType</A>(<A HREF=\"../pkg/AnnotationType.html#optional()\">optional</A>=\"foo\",<A HREF=\"../pkg/AnnotationType.html#required()\">required</A>=1994),"}, ++ "<a href=\"../pkg1/A.html#a()\">a</a>=<a href=\"../pkg/AnnotationType.html\" title=\"annotation in pkg\">@AnnotationType</a>(<a href=\"../pkg/AnnotationType.html#optional()\">optional</a>=\"foo\",<a href=\"../pkg/AnnotationType.html#required()\">required</a>=1994),"}, + + //String Array + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "<A HREF=\"../pkg1/A.html#sa()\">sa</A>={\"up\",\"down\"},"}, ++ "<a href=\"../pkg1/A.html#sa()\">sa</a>={\"up\",\"down\"},"}, + + //Primitive + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "<A HREF=\"../pkg1/A.html#primitiveClassTest()\">primitiveClassTest</A>=boolean.class,"}, ++ "<a href=\"../pkg1/A.html#primitiveClassTest()\">primitiveClassTest</a>=boolean.class,"}, + + //XXX: Add array test case after this if fixed: + //5020899: Incorrect internal representation of class-valued annotation elements + + //Make sure that annotations are surrounded by <pre> and </pre> + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "<PRE><FONT SIZE=\"-1\"><A HREF=\"../pkg1/A.html\" title=\"annotation in pkg1\">@A</A>"}, ++ "<pre><a href=\"../pkg1/A.html\" title=\"annotation in pkg1\">@A</a>"}, + {BUG_ID + FS + "pkg1" + FS + "B.html", +- "</FONT>public interface <STRONG>B</STRONG></PRE>"}, ++ "public interface <strong>B</strong></pre>"}, + + + //============================================================== + // Handle multiple bounds. + //============================================================== + {BUG_ID + FS + "pkg" + FS + "MultiTypeParameters.html", +- "public <T extends java.lang.Number & java.lang.Runnable> T <STRONG>foo</STRONG>(T t)"}, ++ "public <T extends java.lang.Number & java.lang.Runnable> T foo(T t)"}, + + //============================================================== + // Test Class-Use Documenation for Type Parameters. +@@ -289,347 +314,356 @@ + + //ClassUseTest1: <T extends Foo & Foo2> + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Classes in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type <A HREF=\"../../pkg2/Foo.html\" " + +- "title=\"class in pkg2\">Foo</A></CAPTION>" ++ "<caption><span>Classes in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/Foo.html\" title=\"class in pkg2\">" + ++ "Foo</a></span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", +- "<TD><CODE><STRONG><A HREF=\"../../pkg2/ClassUseTest1.html\" title=\"class in pkg2\">ClassUseTest1<T extends Foo & Foo2></A></STRONG></CODE>" ++ "<td class=\"colLast\"><code><strong><a href=\"../../pkg2/" + ++ "ClassUseTest1.html\" title=\"class in pkg2\">ClassUseTest1" + ++ "<T extends Foo & Foo2></a></strong></code> </td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type <A HREF=\"../../pkg2/Foo.html\" " + +- "title=\"class in pkg2\">Foo</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/Foo.html\" title=\"class in " + ++ "pkg2\">Foo</a></span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", +- "<TD><CODE><STRONG>ClassUseTest1.</STRONG><STRONG><A HREF=\"../../pkg2/ClassUseTest1.html#method(T)\">method</A></STRONG>(T t)</CODE>" ++ "<td class=\"colLast\"><span class=\"strong\">ClassUseTest1." + ++ "</span><code><strong><a href=\"../../pkg2/" + ++ "ClassUseTest1.html#method(T)\">method</a></strong>" + ++ "(T t)</code> </td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Fields in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type <A HREF=\"../../pkg2/Foo.html\" " + +- "title=\"class in pkg2\">Foo</A></CAPTION>" ++ "<caption><span>Fields in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/Foo.html\" title=\"class in pkg2\">" + ++ "Foo</a></span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo.html", +- "<A HREF=\"../../pkg2/ParamTest.html\" title=\"class in pkg2\">ParamTest</A><<A HREF=\"../../pkg2/Foo.html\" title=\"class in pkg2\">Foo</A>></CODE></FONT></TD>" ++ "td class=\"colFirst\"><code><a href=\"../../pkg2/" + ++ "ParamTest.html\" title=\"class in pkg2\">ParamTest</a>" + ++ "<<a href=\"../../pkg2/Foo.html\" title=\"class in pkg2\"" + ++ ">Foo</a>></code></td>" + }, + + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Fields in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> declared as <A HREF=\"../../pkg2/ParamTest.html\" " + +- "title=\"class in pkg2\">ParamTest</A></CAPTION>" ++ "<caption><span>Fields in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> declared as <a href=\"../" + ++ "../pkg2/ParamTest.html\" title=\"class in pkg2\">ParamTest" + ++ "</a></span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", +- "<A HREF=\"../../pkg2/ParamTest.html\" title=\"class in pkg2\">ParamTest</A><<A HREF=\"../../pkg2/Foo.html\" title=\"class in pkg2\">Foo</A>></CODE></FONT></TD>" ++ "<td class=\"colFirst\"><code><a href=\"../../pkg2/" + ++ "ParamTest.html\" title=\"class in pkg2\">ParamTest</a><<a " + ++ "href=\"../../pkg2/Foo.html\" title=\"class in pkg2\">Foo</a" + ++ ">></code></td>" + }, + + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo2.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Classes in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type <A HREF=\"../../pkg2/Foo2.html\" " + +- "title=\"interface in pkg2\">Foo2</A></CAPTION>" ++ "<caption><span>Classes in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/Foo2.html\" title=\"interface " + ++ "in pkg2\">Foo2</a></span><span class=\"tabEnd\"> " + ++ "</span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo2.html", +- "<TD><CODE><STRONG><A HREF=\"../../pkg2/ClassUseTest1.html\" title=\"class in pkg2\">ClassUseTest1<T extends Foo & Foo2></A></STRONG></CODE>" ++ "<td class=\"colLast\"><code><strong><a href=\"../../pkg2/" + ++ "ClassUseTest1.html\" title=\"class in pkg2\">" + ++ "ClassUseTest1<T extends Foo & Foo2></a></strong>" + ++ "</code> </td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo2.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type <A HREF=\"../../pkg2/Foo2.html\" " + +- "title=\"interface in pkg2\">Foo2</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/Foo2.html\" title=\"interface " + ++ "in pkg2\">Foo2</a></span><span class=\"tabEnd\"> " + ++ "</span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo2.html", +- "<TD><CODE><STRONG>ClassUseTest1.</STRONG><STRONG><A HREF=\"../../pkg2/ClassUseTest1.html#method(T)\">method</A></STRONG>(T t)</CODE>" ++ "<td class=\"colLast\"><span class=\"strong\">" + ++ "ClassUseTest1.</span><code><strong><a href=\"../../" + ++ "pkg2/ClassUseTest1.html#method(T)\">method</a></strong>" + ++ "(T t)</code> </td>" + }, + + //ClassUseTest2: <T extends ParamTest<Foo3>> + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Classes in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type <A HREF=\"../../pkg2/ParamTest.html\" " + +- "title=\"class in pkg2\">ParamTest</A></CAPTION>" ++ "<caption><span>Classes in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/ParamTest.html\" title=\"class " + ++ "in pkg2\">ParamTest</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", +- "<TD><CODE><STRONG><A HREF=\"../../pkg2/ClassUseTest2.html\" title=\"class in pkg2\">ClassUseTest2<T extends ParamTest<<A HREF=\"../../pkg2/Foo3.html\" title=\"class in pkg2\">Foo3</A>>></A></STRONG></CODE>" ++ "<td class=\"colLast\"><code><strong><a href=\"../../pkg2/" + ++ "ClassUseTest2.html\" title=\"class in pkg2\">ClassUseTest2<T " + ++ "extends ParamTest<<a href=\"../../pkg2/Foo3.html\" title=\"class " + ++ "in pkg2\">Foo3</a>>></a></strong></code> </td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type <A HREF=\"../../pkg2/ParamTest.html\" " + +- "title=\"class in pkg2\">ParamTest</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/ParamTest.html\" title=\"class " + ++ "in pkg2\">ParamTest</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", +- "<TD><CODE><STRONG>ClassUseTest2.</STRONG><STRONG><A HREF=\"../../pkg2/ClassUseTest2.html#method(T)\">method</A></STRONG>(T t)</CODE>" ++ "<td class=\"colLast\"><span class=\"strong\">ClassUseTest2." + ++ "</span><code><strong><a href=\"../../pkg2/" + ++ "ClassUseTest2.html#method(T)\">method</a></strong>" + ++ "(T t)</code> </td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Fields in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> declared as <A HREF=\"../../pkg2/ParamTest.html\" " + +- "title=\"class in pkg2\">ParamTest</A></CAPTION>" ++ "<caption><span>Fields in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> declared as <a href=\"../" + ++ "../pkg2/ParamTest.html\" title=\"class in pkg2\">ParamTest" + ++ "</a></span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", +- "<A HREF=\"../../pkg2/ParamTest.html\" title=\"class in pkg2\">ParamTest</A><<A HREF=\"../../pkg2/Foo.html\" title=\"class in pkg2\">Foo</A>></CODE></FONT></TD>" ++ "<td class=\"colFirst\"><code><a href=\"../../pkg2/" + ++ "ParamTest.html\" title=\"class in pkg2\">ParamTest</a>" + ++ "<<a href=\"../../pkg2/Foo.html\" title=\"class in pkg2\">" + ++ "Foo</a>></code></td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type <A HREF=\"../../pkg2/ParamTest.html\" " + +- "title=\"class in pkg2\">ParamTest</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/ParamTest.html\" title=\"class " + ++ "in pkg2\">ParamTest</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest.html", +- "<T extends <A HREF=\"../../pkg2/ParamTest.html\" title=\"class in pkg2\">ParamTest</A><<A HREF=\"../../pkg2/Foo3.html\" title=\"class in pkg2\">Foo3</A>>>" ++ "<td class=\"colFirst\"><code><T extends <a href=\"../" + ++ "../pkg2/ParamTest.html\" title=\"class in pkg2\">ParamTest" + ++ "</a><<a href=\"../../pkg2/Foo3.html\" title=\"class in " + ++ "pkg2\">Foo3</a>>> <br><a href=\"../../pkg2/" + ++ "ParamTest.html\" title=\"class in pkg2\">ParamTest</a>" + ++ "<<a href=\"../../pkg2/Foo3.html\" title=\"class in " + ++ "pkg2\">Foo3</a>></code></td>" + }, + + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Classes in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type <A HREF=\"../../pkg2/Foo3.html\" " + +- "title=\"class in pkg2\">Foo3</A></CAPTION>" ++ "<caption><span>Classes in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/Foo3.html\" title=\"class in pkg2\">" + ++ "Foo3</a></span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", +- "<TD><CODE><STRONG><A HREF=\"../../pkg2/ClassUseTest2.html\" title=\"class in pkg2\">ClassUseTest2<T extends ParamTest<<A HREF=\"../../pkg2/Foo3.html\" title=\"class in pkg2\">Foo3</A>>></A></STRONG></CODE>" ++ "<td class=\"colLast\"><code><strong><a href=\"../../" + ++ "pkg2/ClassUseTest2.html\" title=\"class in pkg2\">" + ++ "ClassUseTest2<T extends ParamTest<<a href=\"../../" + ++ "pkg2/Foo3.html\" title=\"class in pkg2\">Foo3</a>>>" + ++ "</a></strong></code> </td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type <A HREF=\"../../pkg2/Foo3.html\" " + +- "title=\"class in pkg2\">Foo3</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/Foo3.html\" title=\"class in " + ++ "pkg2\">Foo3</a></span><span class=\"tabEnd\"> " + ++ "</span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", +- "<TD><CODE><STRONG>ClassUseTest2.</STRONG><STRONG><A HREF=\"../../pkg2/ClassUseTest2.html#method(T)\">method</A></STRONG>(T t)</CODE>" ++ "<td class=\"colLast\"><span class=\"strong\">ClassUseTest2." + ++ "</span><code><strong><a href=\"../../pkg2/" + ++ "ClassUseTest2.html#method(T)\">method</a></strong>" + ++ "(T t)</code> </td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> that return types with arguments of type " + +- "<A HREF=\"../../pkg2/Foo3.html\" title=\"class in pkg2\">" + +- "Foo3</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> that return types with " + ++ "arguments of type <a href=\"../../pkg2/Foo3.html\" title" + ++ "=\"class in pkg2\">Foo3</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo3.html", +- "<T extends <A HREF=\"../../pkg2/ParamTest.html\" title=\"class in pkg2\">ParamTest</A><<A HREF=\"../../pkg2/Foo3.html\" title=\"class in pkg2\">Foo3</A>>>" ++ "<td class=\"colFirst\"><code><T extends <a href=\"../../" + ++ "pkg2/ParamTest.html\" title=\"class in pkg2\">ParamTest</a><" + ++ "<a href=\"../../pkg2/Foo3.html\" title=\"class in pkg2\">Foo3" + ++ "</a>>> <br><a href=\"../../pkg2/ParamTest.html\" " + ++ "title=\"class in pkg2\">ParamTest</a><<a href=\"../../pkg2/" + ++ "Foo3.html\" title=\"class in pkg2\">Foo3</a>></code></td>" + }, + + //ClassUseTest3: <T extends ParamTest2<List<? extends Foo4>>> + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Classes in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type " + +- "<A HREF=\"../../pkg2/ParamTest2.html\" title=\"class in pkg2\">" + +- "ParamTest2</A></CAPTION>" ++ "<caption><span>Classes in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/ParamTest2.html\" title=\"class " + ++ "in pkg2\">ParamTest2</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", +- "<TD><CODE><STRONG><A HREF=\"../../pkg2/ClassUseTest3.html\" title=\"class in pkg2\">ClassUseTest3<T extends ParamTest2<java.util.List<? extends Foo4>>></A></STRONG></CODE>" ++ "<td class=\"colLast\"><code><strong><a href=\"../../pkg2/" + ++ "ClassUseTest3.html\" title=\"class in pkg2\">" + ++ "ClassUseTest3<T extends ParamTest2<java.util.List" + ++ "<? extends Foo4>>></a></strong></code> </td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type " + +- "<A HREF=\"../../pkg2/ParamTest2.html\" title=\"class in pkg2\">" + +- "ParamTest2</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/ParamTest2.html\" title=\"class " + ++ "in pkg2\">ParamTest2</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", +- "<TD><CODE><STRONG>ClassUseTest3.</STRONG><STRONG><A HREF=\"../../pkg2/ClassUseTest3.html#method(T)\">method</A></STRONG>(T t)</CODE>" ++ "<td class=\"colLast\"><span class=\"strong\">ClassUseTest3" + ++ ".</span><code><strong><a href=\"../../pkg2/ClassUseTest3." + ++ "html#method(T)\">method</a></strong>(T t)</code> </td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type " + +- "<A HREF=\"../../pkg2/ParamTest2.html\" title=\"class in pkg2\">" + +- "ParamTest2</A></CAPTION>" +- }, +- {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "ParamTest2.html", +- "<T extends <A HREF=\"../../pkg2/ParamTest2.html\" title=\"class in pkg2\">ParamTest2</A><java.util.List<? extends <A HREF=\"../../pkg2/Foo4.html\" title=\"class in pkg2\">Foo4</A>>>>" ++ "<td class=\"colFirst\"><code><T extends <a href=\"../" + ++ "../pkg2/ParamTest2.html\" title=\"class in pkg2\">" + ++ "ParamTest2</a><java.util.List<? extends <a href=\".." + ++ "/../pkg2/Foo4.html\" title=\"class in pkg2\">Foo4</a>>" + ++ ">> <br><a href=\"../../pkg2/ParamTest2.html\" " + ++ "title=\"class in pkg2\">ParamTest2</a><java.util.List" + ++ "<? extends <a href=\"../../pkg2/Foo4.html\" title=\"" + ++ "class in pkg2\">Foo4</a>>></code></td>" + }, + + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Classes in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type " + +- "<A HREF=\"../../pkg2/Foo4.html\" title=\"class in pkg2\">" + +- "Foo4</A></CAPTION>" ++ "<caption><span>Classes in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/Foo4.html\" title=\"class in " + ++ "pkg2\">Foo4</a></span><span class=\"tabEnd\"> " + ++ "</span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", +- "<TD><CODE><STRONG><A HREF=\"../../pkg2/ClassUseTest3.html\" title=\"class in pkg2\">ClassUseTest3<T extends ParamTest2<java.util.List<? extends Foo4>>></A></STRONG></CODE>" ++ "<td class=\"colLast\"><code><strong><a href=\"../../" + ++ "pkg2/ClassUseTest3.html\" title=\"class in pkg2\">" + ++ "ClassUseTest3<T extends ParamTest2<java.util.List" + ++ "<? extends Foo4>>></a></strong></code> </td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type parameters of type <A HREF=\"../../pkg2/Foo4.html\" " + +- "title=\"class in pkg2\">Foo4</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type parameters of " + ++ "type <a href=\"../../pkg2/Foo4.html\" title=\"class in " + ++ "pkg2\">Foo4</a></span><span class=\"tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", +- "<TD><CODE><STRONG>ClassUseTest3.</STRONG><STRONG><A HREF=\"../../pkg2/ClassUseTest3.html#method(T)\">method</A></STRONG>(T t)</CODE>" ++ "<td class=\"colLast\"><span class=\"strong\">ClassUseTest3." + ++ "</span><code><strong><a href=\"../../pkg2/ClassUseTest3." + ++ "html#method(T)\">method</a></strong>(T t)</code>" + ++ " </td>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Methods in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> that return types with arguments of type " + +- "<A HREF=\"../../pkg2/Foo4.html\" title=\"class in pkg2\">" + +- "Foo4</A></CAPTION>" ++ "<caption><span>Methods in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> that return types with " + ++ "arguments of type <a href=\"../../pkg2/Foo4.html\" " + ++ "title=\"class in pkg2\">Foo4</a></span><span class=\"" + ++ "tabEnd\"> </span></caption>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", +- "<T extends <A HREF=\"../../pkg2/ParamTest2.html\" title=\"class in pkg2\">ParamTest2</A><java.util.List<? extends <A HREF=\"../../pkg2/Foo4.html\" title=\"class in pkg2\">Foo4</A>>>>" ++ "<td class=\"colFirst\"><code><T extends <a href=\"../" + ++ "../pkg2/ParamTest2.html\" title=\"class in pkg2\">" + ++ "ParamTest2</a><java.util.List<? extends <a href=\".." + ++ "/../pkg2/Foo4.html\" title=\"class in pkg2\">Foo4</a>>" + ++ ">> <br><a href=\"../../pkg2/ParamTest2.html\" " + ++ "title=\"class in pkg2\">ParamTest2</a><java.util.List" + ++ "<? extends <a href=\"../../pkg2/Foo4.html\" title=\"" + ++ "class in pkg2\">Foo4</a>>></code></td>" + }, + + //Type parameters in constructor and method args + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Method parameters in <A HREF=\"../../pkg2/package-summary.html\">pkg2" + +- "</A> with type arguments of type <A HREF=\"../../pkg2/Foo4.html\" " + +- "title=\"class in pkg2\">Foo4</A></CAPTION>" + NL + +- "<TR>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Modifier and Type" + +- "</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Method and Description</TH>" + NL + +- "</TR>" + NL + +- "<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">" + NL + +- "<TD ALIGN=\"right\" VALIGN=\"top\" WIDTH=\"1%\"><FONT SIZE=\"-1\">" + NL + +- "<CODE> void</CODE></FONT></TD>" + NL + +- "<TD><CODE><STRONG>ClassUseTest3.</STRONG><STRONG>" + +- "<A HREF=\"../../pkg2/ClassUseTest3.html#method(java.util.Set)\">" + +- "method</A></STRONG>(java.util.Set<<A HREF=\"../../pkg2/Foo4.html\" " + +- "title=\"class in pkg2\">Foo4</A>> p)</CODE>" ++ "<caption><span>Method parameters in <a href=\"../../pkg2/" + ++ "package-summary.html\">pkg2</a> with type arguments of " + ++ "type <a href=\"../../pkg2/Foo4.html\" title=\"class in " + ++ "pkg2\">Foo4</a></span><span class=\"tabEnd\"> " + ++ "</span></caption>" + NL + "<tr>" + NL + ++ "<th class=\"colFirst\" scope=\"col\">Modifier and Type</th>" + NL + ++ "<th class=\"colLast\" scope=\"col\">Method and Description</th>" + NL + ++ "</tr>" + NL + "<tbody>" + NL + "<tr class=\"altColor\">" + NL + ++ "<td class=\"colFirst\"><code>void</code></td>" + NL + ++ "<td class=\"colLast\"><span class=\"strong\">ClassUseTest3." + ++ "</span><code><strong><a href=\"../../pkg2/ClassUseTest3." + ++ "html#method(java.util.Set)\">method</a></strong>(java." + ++ "util.Set<<a href=\"../../pkg2/Foo4.html\" title=\"" + ++ "class in pkg2\">Foo4</a>> p)</code> </td>" + NL + ++ "</tr>" + NL + "</tbody>" + }, + {BUG_ID + FS + "pkg2" + FS + "class-use" + FS + "Foo4.html", +- "<CAPTION CLASS=\"TableSubCaption\">" + NL + +- "Constructor parameters in <A HREF=\"../../pkg2/package-summary.html\">" + +- "pkg2</A> with type arguments of type <A HREF=\"../../pkg2/Foo4.html\" " + +- "title=\"class in pkg2\">Foo4</A></CAPTION>" + NL + +- "<TR>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Constructor and Description" + +- "</TH>" + NL + "</TR>" + NL + +- "<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">" + NL + +- "<TD><CODE><STRONG><A HREF=\"../../pkg2/ClassUseTest3.html#ClassUseTest3" + +- "(java.util.Set)\">ClassUseTest3</A></STRONG>(java.util.Set<" + +- "<A HREF=\"../../pkg2/Foo4.html\" title=\"class in pkg2\">" + +- "Foo4</A>> p)</CODE>" ++ "<caption><span>Constructor parameters in <a href=\"../../" + ++ "pkg2/package-summary.html\">pkg2</a> with type arguments " + ++ "of type <a href=\"../../pkg2/Foo4.html\" title=\"class in " + ++ "pkg2\">Foo4</a></span><span class=\"tabEnd\"> " + ++ "</span></caption>" + }, + + //================================= + // Annotatation Type Usage + //================================= + {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", +- "Packages with annotations of type " + +- "<A HREF=\"../../pkg/AnnotationType.html\" " + +- "title=\"annotation in pkg\">AnnotationType</A></CAPTION>" + NL + +- "<TR>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Package" + +- "</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Description</TH>" + NL + "</TR>" + NL + +- "<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">" + NL + +- "<TD><A HREF=\"../../pkg/package-summary.html\"><STRONG>pkg" + +- "</STRONG></A></TD>" ++ "<caption><span>Packages with annotations of type <a href=\"" + ++ "../../pkg/AnnotationType.html\" title=\"annotation in pkg\">" + ++ "AnnotationType</a></span><span class=\"tabEnd\"> " + ++ "</span></caption>" + }, + + {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", +- "Classes in <A HREF=\"../../pkg/package-summary.html\">pkg" + +- "</A> with annotations of type <A HREF=\"../../pkg/AnnotationType.html\" " + +- "title=\"annotation in pkg\">AnnotationType</A></CAPTION>" + NL + +- "<TR>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Modifier and Type" + +- "</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Class and Description</TH>" + NL + +- "</TR>" + NL + +- "<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">" + NL + +- "<TD ALIGN=\"right\" VALIGN=\"top\" WIDTH=\"1%\"><FONT SIZE=\"-1\">" + NL + +- "<CODE> class</CODE></FONT></TD>" + NL + +- "<TD><CODE><STRONG><A HREF=\"../../pkg/AnnotationTypeUsage.html\" " + +- "title=\"class in pkg\">AnnotationTypeUsage</A></STRONG></CODE>" ++ "<caption><span>Classes in <a href=\"../../pkg/" + ++ "package-summary.html\">pkg</a> with annotations of type " + ++ "<a href=\"../../pkg/AnnotationType.html\" title=\"" + ++ "annotation in pkg\">AnnotationType</a></span><span class" + ++ "=\"tabEnd\"> </span></caption>" + }, + + {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", +- "Fields in <A HREF=\"../../pkg/package-summary.html\">pkg" + +- "</A> with annotations of type <A HREF=\"../../pkg/AnnotationType.html\" " + +- "title=\"annotation in pkg\">AnnotationType</A></CAPTION>" + NL + +- "<TR>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Modifier and Type" + +- "</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Field and Description</TH>" + NL + +- "</TR>" + NL + +- "<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">" + NL + +- "<TD ALIGN=\"right\" VALIGN=\"top\" WIDTH=\"1%\"><FONT SIZE=\"-1\">" + NL + +- "<CODE> int</CODE></FONT></TD>" + NL + +- "<TD><CODE><STRONG>AnnotationTypeUsage.</STRONG><STRONG>" + +- "<A HREF=\"../../pkg/AnnotationTypeUsage.html#field\">field" + +- "</A></STRONG></CODE>" ++ "<caption><span>Fields in <a href=\"../../pkg/" + ++ "package-summary.html\">pkg</a> with annotations of type " + ++ "<a href=\"../../pkg/AnnotationType.html\" title=\"annotation " + ++ "in pkg\">AnnotationType</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + + {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", +- "Methods in <A HREF=\"../../pkg/package-summary.html\">pkg" + +- "</A> with annotations of type <A HREF=\"../../pkg/AnnotationType.html\" " + +- "title=\"annotation in pkg\">AnnotationType</A></CAPTION>" + NL + +- "<TR>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Modifier and Type" + +- "</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Method and Description</TH>" + NL + +- "</TR>" + NL + +- "<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">" + NL + +- "<TD ALIGN=\"right\" VALIGN=\"top\" WIDTH=\"1%\"><FONT SIZE=\"-1\">" + NL + +- "<CODE> void</CODE></FONT></TD>" + NL + +- "<TD><CODE><STRONG>AnnotationTypeUsage.</STRONG><STRONG>" + +- "<A HREF=\"../../pkg/AnnotationTypeUsage.html#method()\">" + +- "method</A></STRONG>()</CODE>" ++ "<caption><span>Methods in <a href=\"../../pkg/" + ++ "package-summary.html\">pkg</a> with annotations of type " + ++ "<a href=\"../../pkg/AnnotationType.html\" title=\"annotation " + ++ "in pkg\">AnnotationType</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + + {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", +- "Method parameters in <A HREF=\"../../pkg/package-summary.html\">pkg" + +- "</A> with annotations of type <A HREF=\"../../pkg/AnnotationType.html\" " + +- "title=\"annotation in pkg\">AnnotationType</A></CAPTION>" + NL + +- "<TR>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Modifier and Type" + +- "</TH>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Method and Description</TH>" + NL + +- "</TR>" + NL + +- "<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">" + NL + +- "<TD ALIGN=\"right\" VALIGN=\"top\" WIDTH=\"1%\"><FONT SIZE=\"-1\">" + NL + +- "<CODE> void</CODE></FONT></TD>" + NL + +- "<TD><CODE><STRONG>AnnotationTypeUsage.</STRONG><STRONG>" + +- "<A HREF=\"../../pkg/AnnotationTypeUsage.html#methodWithParams" + +- "(int, int)\">methodWithParams</A></STRONG>(int documented," + NL + +- " int undocmented)</CODE>" ++ "<caption><span>Method parameters in <a href=\"../../pkg/" + ++ "package-summary.html\">pkg</a> with annotations of type " + ++ "<a href=\"../../pkg/AnnotationType.html\" title=\"annotation " + ++ "in pkg\">AnnotationType</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + + {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", +- "Constructors in <A HREF=\"../../pkg/package-summary.html\">pkg" + +- "</A> with annotations of type <A HREF=\"../../pkg/AnnotationType.html\" " + +- "title=\"annotation in pkg\">AnnotationType</A></CAPTION>" + NL + +- "<TR>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Constructor and Description" + +- "</TH>" + NL + "</TR>" + NL + +- "<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">" + NL + +- "<TD><CODE><STRONG><A HREF=\"../../pkg/" + +- "AnnotationTypeUsage.html#AnnotationTypeUsage()\">" + +- "AnnotationTypeUsage</A></STRONG>()</CODE>" ++ "<caption><span>Constructors in <a href=\"../../pkg/" + ++ "package-summary.html\">pkg</a> with annotations of type " + ++ "<a href=\"../../pkg/AnnotationType.html\" title=\"annotation " + ++ "in pkg\">AnnotationType</a></span><span class=\"tabEnd\">" + ++ " </span></caption>" + }, + + {BUG_ID + FS + "pkg" + FS + "class-use" + FS + "AnnotationType.html", +- "Constructor parameters in <A HREF=\"../../pkg/package-summary.html\">pkg" + +- "</A> with annotations of type <A HREF=\"../../pkg/AnnotationType.html\" " + +- "title=\"annotation in pkg\">AnnotationType</A></CAPTION>" + NL + +- "<TR>" + NL + "<TH CLASS=\"TableHeader\" SCOPE=\"col\"" + +- " NOWRAP>Constructor and Description" + +- "</TH>" + NL + "</TR>" + NL + +- "<TR BGCOLOR=\"white\" CLASS=\"TableRowColor\">" + NL + +- "<TD><CODE><STRONG><A HREF=\"../../pkg/" + +- "AnnotationTypeUsage.html#AnnotationTypeUsage(int, int)\">" + +- "AnnotationTypeUsage</A></STRONG>(int documented," + NL + +- " int undocmented)</CODE>" ++ "<caption><span>Constructor parameters in <a href=\"../../" + ++ "pkg/package-summary.html\">pkg</a> with annotations of " + ++ "type <a href=\"../../pkg/AnnotationType.html\" title=\"" + ++ "annotation in pkg\">AnnotationType</a></span><span class=\"" + ++ "tabEnd\"> </span></caption>" + }, + + //================================= + // TYPE PARAMETER IN INDEX + //================================= + {BUG_ID + FS + "index-all.html", +- "<A HREF=\"./pkg2/Foo.html#method(java.util.Vector)\"><STRONG>method(Vector<Object>)</STRONG></A>" ++ "<span class=\"strong\"><a href=\"./pkg2/Foo.html#method(java.util.Vector)\">" + ++ "method(Vector<Object>)</a></span>" + }, + //================================= + // TYPE PARAMETER IN INDEX + //================================= + {BUG_ID + FS + "index-all.html", +- "<A HREF=\"./pkg2/Foo.html#method(java.util.Vector)\"><STRONG>method(Vector<Object>)</STRONG></A>" ++ "<span class=\"strong\"><a href=\"./pkg2/Foo.html#method(java.util.Vector)\">" + ++ "method(Vector<Object>)</a></span>" + }, + }; + private static final String[][] NEGATED_TEST = { +@@ -637,15 +671,15 @@ + // ENUM TESTING + //================================= + //NO constructor section +- {BUG_ID + FS + "pkg" + FS + "Coin.html", "<STRONG>Constructor Summary</STRONG>"}, ++ {BUG_ID + FS + "pkg" + FS + "Coin.html", "<span class=\"strong\">Constructor Summary</span>"}, + //================================= + // TYPE PARAMETER TESTING + //================================= + //No type parameters in class frame. + {BUG_ID + FS + "allclasses-frame.html", +- "<A HREF=\"../pkg/TypeParameters.html\" title=\"class in pkg\">" + +- "TypeParameters</A><<A HREF=\"../pkg/TypeParameters.html\" " + +- "title=\"type parameter in TypeParameters\">E</A>>" ++ "<a href=\"../pkg/TypeParameters.html\" title=\"class in pkg\">" + ++ "TypeParameters</a><<a href=\"../pkg/TypeParameters.html\" " + ++ "title=\"type parameter in TypeParameters\">E</a>>" + }, + + //============================================================== +@@ -654,31 +688,27 @@ + + //CLASS + {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", +- "<FONT SIZE=\"-1\">" + NL + +- "<A HREF=\"../pkg/AnnotationTypeUndocumented.html\" title=\"annotation in pkg\">@AnnotationTypeUndocumented</A>(<A HREF=\"../pkg/AnnotationType.html#optional\">optional</A>=\"Class Annotation\"," + NL + +- " <A HREF=\"../pkg/AnnotationType.html#required\">required</A>=1994)" + NL + +- "</FONT>public class <STRONG>AnnotationTypeUsage</STRONG></DT><DT>extends java.lang.Object</DT></DL>"}, ++ "<a href=\"../pkg/AnnotationTypeUndocumented.html\" title=\"annotation in pkg\">@AnnotationTypeUndocumented</a>(<a href=\"../pkg/AnnotationType.html#optional\">optional</a>=\"Class Annotation\"," + NL + ++ " <a href=\"../pkg/AnnotationType.html#required\">required</a>=1994)" + NL + ++ "public class <strong>AnnotationTypeUsage</strong></dt><dt>extends java.lang.Object</dt>"}, + + //FIELD + {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", +- "<FONT SIZE=\"-1\">" + NL + +- "<A HREF=\"../pkg/AnnotationTypeUndocumented.html\" title=\"annotation in pkg\">@AnnotationTypeUndocumented</A>(<A HREF=\"../pkg/AnnotationType.html#optional\">optional</A>=\"Field Annotation\"," + NL + +- " <A HREF=\"../pkg/AnnotationType.html#required\">required</A>=1994)" + NL + +- "</FONT>public int <STRONG>field</STRONG>"}, ++ "<a href=\"../pkg/AnnotationTypeUndocumented.html\" title=\"annotation in pkg\">@AnnotationTypeUndocumented</a>(<a href=\"../pkg/AnnotationType.html#optional\">optional</a>=\"Field Annotation\"," + NL + ++ " <a href=\"../pkg/AnnotationType.html#required\">required</a>=1994)" + NL + ++ "public int <strong>field</strong>"}, + + //CONSTRUCTOR + {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", +- "<FONT SIZE=\"-1\">" + NL + +- "<A HREF=\"../pkg/AnnotationTypeUndocumented.html\" title=\"annotation in pkg\">@AnnotationTypeUndocumented</A>(<A HREF=\"../pkg/AnnotationType.html#optional\">optional</A>=\"Constructor Annotation\"," + NL + +- " <A HREF=\"../pkg/AnnotationType.html#required\">required</A>=1994)" + NL + +- "</FONT>public <STRONG>AnnotationTypeUsage</STRONG>()"}, ++ "<a href=\"../pkg/AnnotationTypeUndocumented.html\" title=\"annotation in pkg\">@AnnotationTypeUndocumented</a>(<a href=\"../pkg/AnnotationType.html#optional\">optional</a>=\"Constructor Annotation\"," + NL + ++ " <a href=\"../pkg/AnnotationType.html#required\">required</a>=1994)" + NL + ++ "public <strong>AnnotationTypeUsage</strong>()"}, + + //METHOD + {BUG_ID + FS + "pkg" + FS + "AnnotationTypeUsage.html", +- "<FONT SIZE=\"-1\">" + NL + +- "<A HREF=\"../pkg/AnnotationTypeUndocumented.html\" title=\"annotation in pkg\">@AnnotationTypeUndocumented</A>(<A HREF=\"../pkg/AnnotationType.html#optional\">optional</A>=\"Method Annotation\"," + NL + +- " <A HREF=\"../pkg/AnnotationType.html#required\">required</A>=1994)" + NL + +- "</FONT>public void <STRONG>method</STRONG>()"}, ++ "<a href=\"../pkg/AnnotationTypeUndocumented.html\" title=\"annotation in pkg\">@AnnotationTypeUndocumented</a>(<a href=\"../pkg/AnnotationType.html#optional\">optional</a>=\"Method Annotation\"," + NL + ++ " <a href=\"../pkg/AnnotationType.html#required\">required</a>=1994)" + NL + ++ "public void <strong>method</strong>()"}, + + //================================= + // Make sure annotation types do not +diff --git a/test/com/sun/javadoc/testOverridenMethods/TestMultiInheritence.java b/test/com/sun/javadoc/testOverridenMethods/TestMultiInheritence.java +--- langtools/test/com/sun/javadoc/testOverridenMethods/TestMultiInheritence.java ++++ langtools/test/com/sun/javadoc/testOverridenMethods/TestMultiInheritence.java +@@ -46,27 +46,34 @@ + //Method foo() is inherited from BOTH I2 and I3 + private static final String[][] TEST = { + {BUG_ID + FS + "pkg3" + FS + "I1.html", +- "Methods inherited from interface pkg3." +
"<A HREF=\"../pkg3/I2.html\" title=\"interface in pkg3\">I2</A>"}, ++ "Methods inherited from interface pkg3." + ++ "<a href=\"../pkg3/I2.html\" title=\"interface in pkg3\">" + ++ "I2</a>"}, + {BUG_ID + FS + "pkg3" + FS +"I1.html", +- "Methods inherited from interface pkg3." + +- "<A HREF=\"../pkg3/I3.html\" title=\"interface in pkg3\">I3</A>"}, ++ "Methods inherited from interface pkg3." + ++ "<a href=\"../pkg3/I3.html\" title=\"interface in pkg3\">" + ++ "I3</a>"}, + {BUG_ID + FS + "pkg3" + FS + "I0.html", +- "Methods inherited from interface pkg3." + +- "<A HREF=\"../pkg3/I2.html\" title=\"interface in pkg3\">I2</A>"}, ++ "Methods inherited from interface pkg3." + ++ "<a href=\"../pkg3/I2.html\" title=\"interface in pkg3\">" + ++ "I2</a>"}, + {BUG_ID + FS + "pkg3" + FS +"I0.html", +- "Methods inherited from interface pkg3." + +- "<A HREF=\"../pkg3/I3.html\" title=\"interface in pkg3\">I3</A>"}, ++ "Methods inherited from interface pkg3." + ++ "<a href=\"../pkg3/I3.html\" title=\"interface in pkg3\">" + ++ "I3</a>"}, + }; + + //Method foo() is NOT inherited from I4 because it is overriden by + //I3. + private static final String[][] NEGATED_TEST = { + {BUG_ID + FS + "pkg3" + FS + "I1.html", +- "Methods inherited from interface pkg3." + +- "<A HREF=\"../pkg3/I4.html\" title=\"interface in pkg3\">I4</A>"}, ++ "Methods inherited from interface pkg3." + ++ "<a href=\"../pkg3/I4.html\" title=\"interface in pkg3\">" + ++ "I4</a>"}, + {BUG_ID + FS + "pkg3" + FS + "I0.html", +- "Methods inherited from interface pkg3." + +- "<A HREF=\"../pkg3/I4.html\" title=\"interface in pkg3\">I4</A>"}, ++ "Methods inherited from interface pkg3." + ++ "<a href=\"../pkg3/I4.html\" title=\"interface in pkg3\">" + ++ "I4</a>"}, + }; + + /** +diff --git a/test/com/sun/javadoc/testOverridenMethods/TestOverridenMethodDocCopy.java b/test/com/sun/javadoc/testOverridenMethods/TestOverridenMethodDocCopy.java +--- langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenMethodDocCopy.java ++++ langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenMethodDocCopy.java +@@ -46,9 +46,9 @@ + //Input for string search tests. + private static final String[][] TEST = { + {BUG_ID + FS + "pkg1" + FS + "SubClass.html", +- "<STRONG>Description copied from class: <CODE>" + +- "<A HREF=\"../pkg1/BaseClass.html#overridenMethodWithDocsToCopy()\">" + +- "BaseClass</A></CODE></STRONG>" ++ "<strong>Description copied from class: <code>" + ++ "<a href=\"../pkg1/BaseClass.html#overridenMethodWithDocsToCopy()\">" + ++ "BaseClass</a></code></strong>" + } + }; + private static final String[][] NEGATED_TEST = NO_TEST; +diff --git a/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java b/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java +--- langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java ++++ langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java +@@ -40,11 +40,13 @@ + private static final String[][] TEST = { + //The public method should be overriden + {BUG_ID + FS + "pkg1" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#publicMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#publicMethod"}, + + //The public method in different package should be overriden + {BUG_ID + FS + "pkg2" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#publicMethod"} ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#publicMethod"} + }; + + private static final String[][] NEGATED_TEST = { +@@ -52,20 +54,23 @@ + //The package private method should be overriden since the base and sub class are in the same + //package. However, the link should not show up because the package private methods are not documented. + {BUG_ID + FS + "pkg1" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#packagePrivateMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#packagePrivateMethod"}, + + //The private method in should not be overriden + {BUG_ID + FS + "pkg1" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#privateMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#privateMethod"}, + + //The private method in different package should not be overriden + {BUG_ID + FS + "pkg2" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#privateMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#privateMethod"}, + + //The package private method should not be overriden since the base and sub class are in + //different packages. + {BUG_ID + FS + "pkg2" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#packagePrivateMethod"} ++ "Overrides:</strong></dt><dd><code><a href=\"../pkg1/BaseClass.html#packagePrivateMethod"} + }; + + private static final String[] ARGS = +diff --git a/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPackageFlag.java b/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPackageFlag.java +--- langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPackageFlag.java ++++ langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPackageFlag.java +@@ -40,32 +40,44 @@ + private static final String[][] TEST = { + //The public method should be overriden + {BUG_ID + FS + "pkg1" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#publicMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#publicMethod()\">" + ++ "publicMethod</a></code> in class <code>" + ++ "<a href=\"../pkg1/BaseClass.html\" title=\"class in pkg1\">BaseClass</a></code></dd>"}, + + //The public method in different package should be overriden + {BUG_ID + FS + "pkg2" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#publicMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#publicMethod()\">" + ++ "publicMethod</a></code> in class <code>" + ++ "<a href=\"../pkg1/BaseClass.html\" title=\"class in pkg1\">BaseClass</a></code></dd>"}, + + //The package private method should be overriden since the base and sub class are in the same + //package. + {BUG_ID + FS + "pkg1" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#packagePrivateMethod"} ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#packagePrivateMethod()\">" + ++ "packagePrivateMethod</a></code> in class <code>" + ++ "<a href=\"../pkg1/BaseClass.html\" title=\"class in pkg1\">BaseClass</a></code></dd>"} + }; + + private static final String[][] NEGATED_TEST = { + + //The private method in should not be overriden + {BUG_ID + FS + "pkg1" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#privateMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#privateMethod()\">"}, + + //The private method in different package should not be overriden + {BUG_ID + FS + "pkg2" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#privateMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#privateMethod()\">"}, + + //The package private method should not be overriden since the base and sub class are in + //different packages. + {BUG_ID + FS + "pkg2" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#packagePrivateMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#packagePrivateMethod()\">"}, + }; + + private static final String[] ARGS = +diff --git a/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPrivateFlag.java b/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPrivateFlag.java +--- langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPrivateFlag.java ++++ langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPrivateFlag.java +@@ -40,32 +40,38 @@ + private static final String[][] TEST = { + //The public method should be overriden + {BUG_ID + FS + "pkg1" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#publicMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#publicMethod"}, + + //The package private method should be overriden since the base and sub class are in the same + //package. + {BUG_ID + FS + "pkg1" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#packagePrivateMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#packagePrivateMethod"}, + + //The public method in different package should be overriden + {BUG_ID + FS + "pkg2" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#publicMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#publicMethod"}, + }; + + private static final String[][] NEGATED_TEST = { + + //The private method in should not be overriden + {BUG_ID + FS + "pkg1" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#privateMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#privateMethod"}, + + //The private method in different package should not be overriden + {BUG_ID + FS + "pkg2" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#privateMethod"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#privateMethod"}, + + //The package private method should not be overriden since the base and sub class are in + //different packages. + {BUG_ID + FS + "pkg2" + FS + "SubClass.html", +- "Overrides:</STRONG></DT><DD><CODE><A HREF=\"../pkg1/BaseClass.html#packagePrivateMethod"} ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg1/BaseClass.html#packagePrivateMethod"} + + + }; +diff --git a/test/com/sun/javadoc/testPackagePage/TestPackagePage.java b/test/com/sun/javadoc/testPackagePage/TestPackagePage.java +--- langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java ++++ langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java +@@ -43,37 +43,32 @@ + }, + //With just one package, all general pages link to the single package page. + {BUG_ID + "-1" + FS + "com" + FS + "pkg" + FS + "C.html", +- "<A HREF=\"../../com/pkg/package-summary.html\">" + +- "<FONT CLASS=\"NavBarFont1\"><STRONG>Package</STRONG></FONT></A>" ++ "<a href=\"../../com/pkg/package-summary.html\">Package</a>" + }, + {BUG_ID + "-1" + FS + "com" + FS + "pkg" + FS + "package-tree.html", +- "<A HREF=\"../../com/pkg/package-summary.html\">" + +- "<FONT CLASS=\"NavBarFont1\"><STRONG>Package</STRONG></FONT></A>" ++ "<li><a href=\"../../com/pkg/package-summary.html\">Package</a></li>" + }, + {BUG_ID + "-1" + FS + "deprecated-list.html", +- "<A HREF=\"com/pkg/package-summary.html\">" + +- "<FONT CLASS=\"NavBarFont1\"><STRONG>Package</STRONG></FONT></A>" ++ "<li><a href=\"com/pkg/package-summary.html\">Package</a></li>" + }, + {BUG_ID + "-1" + FS + "index-all.html", +- "<A HREF=\"./com/pkg/package-summary.html\">" + +- "<FONT CLASS=\"NavBarFont1\"><STRONG>Package</STRONG></FONT></A>" ++ "<li><a href=\"./com/pkg/package-summary.html\">Package</a></li>" + }, + {BUG_ID + "-1" + FS + "help-doc.html", +- "<A HREF=\"com/pkg/package-summary.html\">" + +- "<FONT CLASS=\"NavBarFont1\"><STRONG>Package</STRONG></FONT></A>" ++ "<li><a href=\"com/pkg/package-summary.html\">Package</a></li>" + }, + }; + + private static final String[][] TEST2 = { + //With multiple packages, there is no package link in general pages. + {BUG_ID + "-2" + FS + "deprecated-list.html", +- " <FONT CLASS=\"NavBarFont1\">Package</FONT> " ++ "<li>Package</li>" + }, + {BUG_ID + "-2" + FS + "index-all.html", +- " <FONT CLASS=\"NavBarFont1\">Package</FONT> " ++ "<li>Package</li>" + }, + {BUG_ID + "-2" + FS + "help-doc.html", +- " <FONT CLASS=\"NavBarFont1\">Package</FONT> " ++ "<li>Package</li>" + }, + }; + +diff --git a/test/com/sun/javadoc/testParamTaglet/TestParamTaglet.java b/test/com/sun/javadoc/testParamTaglet/TestParamTaglet.java +--- langtools/test/com/sun/javadoc/testParamTaglet/TestParamTaglet.java ++++ langtools/test/com/sun/javadoc/testParamTaglet/TestParamTaglet.java +@@ -48,20 +48,20 @@ + private static final String[][] TEST = { + //Regular param tags. + {BUG_ID + FS + "pkg" + FS + "C.html", +- "<STRONG>Parameters:</STRONG></DT><DD><CODE>param1</CODE> - testing 1 2 3.</DD>" + +- "<DD><CODE>param2</CODE> - testing 1 2 3." ++ "<span class=\"strong\">Parameters:</span></dt><dd><code>param1</code> - testing 1 2 3.</dd>" + ++ "<dd><code>param2</code> - testing 1 2 3." + }, + //Param tags that don't match with any real parameters. + {BUG_ID + FS + "pkg" + FS + "C.html", +- "<STRONG>Parameters:</STRONG></DT><DD><CODE><I>p1</I></CODE> - testing 1 2 3.</DD>" + +- "<DD><CODE><I>p2</I></CODE> - testing 1 2 3." ++ "<span class=\"strong\">Parameters:</span></dt><dd><code><I>p1</I></code> - testing 1 2 3.</dd>" + ++ "<dd><code><I>p2</I></code> - testing 1 2 3." + }, + //{@inherit} doc misuse does not cause doclet to throw exception. + // Param is printed with nothing inherited. + //XXX: in the future when Configuration is available during doc inheritence, + //print a warning for this mistake. + {BUG_ID + FS + "pkg" + FS + "C.html", +- "<CODE><I>inheritBug</I></CODE> -" ++ "<code><I>inheritBug</I></code> -" + }, + + }; +diff --git a/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java b/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java +--- langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java ++++ langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java +@@ -58,50 +58,50 @@ + private static final String[][] TEST1 = { + // Field inheritence from non-public superclass. + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicChild.html", +- "<A HREF=\"../pkg/PublicChild.html#fieldInheritedFromParent\">" + +- "fieldInheritedFromParent</A>" ++ "<a href=\"../pkg/PublicChild.html#fieldInheritedFromParent\">" + ++ "fieldInheritedFromParent</a>" + }, + + // Method inheritence from non-public superclass. + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicChild.html", +- "<A HREF=\"../pkg/PublicChild.html#methodInheritedFromParent(int)\">" + +- "methodInheritedFromParent</A>" ++ "<a href=\"../pkg/PublicChild.html#methodInheritedFromParent(int)\">" + ++ "methodInheritedFromParent</a>" + }, + + // Field inheritence from non-public superinterface. + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicInterface.html", +- "<A HREF=\"../pkg/PublicInterface.html#fieldInheritedFromInterface\">" + +- "fieldInheritedFromInterface</A>" ++ "<a href=\"../pkg/PublicInterface.html#fieldInheritedFromInterface\">" + ++ "fieldInheritedFromInterface</a>" + }, + + // Method inheritence from non-public superinterface. + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicInterface.html", +- "<A HREF=\"../pkg/PublicInterface.html#methodInterface(int)\">" + +- "methodInterface</A>" ++ "<a href=\"../pkg/PublicInterface.html#methodInterface(int)\">" + ++ "methodInterface</a>" + }, + + // private class does not show up in tree + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicChild.html", +- "<PRE>" + NL + +- "java.lang.Object" + NL + +- " <IMG SRC=\"../resources/inherit.gif\" " + +- "ALT=\"extended by \"><STRONG>pkg.PublicChild</STRONG>" + NL + +- "</PRE>" ++ "<ul class=\"inheritance\">" + NL + "<li>java.lang.Object</li>" + NL + ++ "<li>" + NL + "<ul class=\"inheritance\">" + NL + "<li>pkg.PublicChild</li>" + NL + ++ "</ul>" + NL + "</li>" + NL + "</ul>" + }, + + // Method is documented as though it is declared in the inheriting method. + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicChild.html", +- "public void <STRONG>methodInheritedFromParent</STRONG>(int p1)" ++ "<pre>public void methodInheritedFromParent(int p1)" + }, + + //Make sure implemented interfaces from private superclass are inherited + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicInterface.html", +- "<STRONG>All Known Implementing Classes:</STRONG></DT> <DD><A HREF=\"../pkg/PublicChild.html\" " + +- "title=\"class in pkg\">PublicChild</A>"}, ++ "<dl>" + NL + "<dt>All Known Implementing Classes:</dt>" + NL + ++ "<dd><a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">" + ++ "PublicChild</a></dd>" + NL + "</dl>"}, + + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicChild.html", +- "<STRONG>All Implemented Interfaces:</STRONG></DT> <DD><A HREF=\"../pkg/PublicInterface.html\" " + +- "title=\"interface in pkg\">PublicInterface</A>"}, ++ "<dl>" + NL + "<dt>All Implemented Interfaces:</dt>" + NL + ++ "<dd><a href=\"../pkg/PublicInterface.html\" title=\"interface in pkg\">" + ++ "PublicInterface</a></dd>" + NL + "</dl>"}, + + //Generic interface method test. + {BUG_ID + "-1" + FS + "pkg2" + FS + "C.html", +@@ -110,12 +110,12 @@ + private static final String[][] NEGATED_TEST1 = { + // Should not document that a method overrides method from private class. + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicChild.html", +- "<STRONG>Overrides:</STRONG>"}, ++ "<strong>Overrides:</strong>"}, + // Should not document that a method specified by private interface. + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicChild.html", +- "<STRONG>Specified by:</STRONG>"}, ++ "<strong>Specified by:</strong>"}, + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicInterface.html", +- "<STRONG>Specified by:</STRONG>"}, ++ "<strong>Specified by:</strong>"}, + // Should not mention that any documentation was copied. + {BUG_ID + "-1" + FS + "pkg" + FS + "PublicChild.html", + "Description copied from"}, +@@ -137,64 +137,64 @@ + //Do not inherit private interface method with generic parameters. + //This method has been implemented. + {BUG_ID + "-1" + FS + "pkg2" + FS + "C.html", +- "<STRONG><A HREF=\"../pkg2/I.html#hello(T)\">hello</A></STRONG>"}, ++ "<strong><a href=\"../pkg2/I.html#hello(T)\">hello</a></strong>"}, + }; + + // Test output when -private flag is used. + private static final String[][] TEST2 = { + // Field inheritence from non-public superclass. + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html", +- "Fields inherited from class " + +- "pkg.<A HREF=\"../pkg/PrivateParent.html\" " + +- "title=\"class in pkg\">PrivateParent</A>" ++ "Fields inherited from class pkg." + ++ "<a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">" + ++ "PrivateParent</a>" + }, + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html", +- "<A HREF=\"../pkg/PrivateParent.html#fieldInheritedFromParent\">" + +- "fieldInheritedFromParent</A>" ++ "<a href=\"../pkg/PrivateParent.html#fieldInheritedFromParent\">" + ++ "fieldInheritedFromParent</a>" + }, + // Field inheritence from non-public superinterface. + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicInterface.html", +- "Fields inherited from interface " + +- "pkg.<A HREF=\"../pkg/PrivateInterface.html\" " + +- "title=\"interface in pkg\">PrivateInterface</A>" ++ "Fields inherited from interface pkg." + ++ "<a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">" + ++ "PrivateInterface</a>" + }, + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicInterface.html", +- "<A HREF=\"../pkg/PrivateInterface.html#fieldInheritedFromInterface\">" + +- "fieldInheritedFromInterface</A>" ++ "<a href=\"../pkg/PrivateInterface.html#fieldInheritedFromInterface\">" + ++ "fieldInheritedFromInterface</a>" + }, + // Method inheritence from non-public superclass. + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html", +- "Methods inherited from class " + +- "pkg.<A HREF=\"../pkg/PrivateParent.html\" " + +- "title=\"class in pkg\">PrivateParent</A>" ++ "Methods inherited from class pkg." + ++ "<a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">" + ++ "PrivateParent</a>" + }, + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html", +- "<A HREF=\"../pkg/PrivateParent.html#methodInheritedFromParent(int)\">" + +- "methodInheritedFromParent</A>" ++ "<a href=\"../pkg/PrivateParent.html#methodInheritedFromParent(int)\">" + ++ "methodInheritedFromParent</a>" + }, + // Should document that a method overrides method from private class. + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html", +- "<STRONG>Overrides:</STRONG></DT><DD><CODE>" + +- "<A HREF=\"../pkg/PrivateParent.html#methodOverridenFromParent(char[], int, T, V, java.util.List)\">" + +- "methodOverridenFromParent</A></CODE> in class <CODE>" + +- "<A HREF=\"../pkg/PrivateParent.html\" title=\"class in pkg\">" + +- "PrivateParent</A></CODE></DD>" + NL + "</DL>"}, ++ "<dt><strong>Overrides:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg/PrivateParent.html#methodOverridenFromParent(char[], int, T, V, java.util.List)\">" + ++ "methodOverridenFromParent</a></code> in class <code>" + ++ "<a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">" + ++ "PrivateParent</a></code></dd>"}, + // Should document that a method is specified by private interface. + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html", +- "<STRONG>Specified by:</STRONG></DT><DD><CODE>" + +- "<A HREF=\"../pkg/PrivateInterface.html#methodInterface(int)\">" + +- "methodInterface</A></CODE> in interface <CODE>" + +- "<A HREF=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">" + +- "PrivateInterface</A></CODE></DD>" + NL + "</DL>" + NL + "</DD>"}, ++ "<dt><strong>Specified by:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg/PrivateInterface.html#methodInterface(int)\">" + ++ "methodInterface</a></code> in interface <code>" + ++ "<a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">" + ++ "PrivateInterface</a></code></dd>"}, + // Method inheritence from non-public superinterface. + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicInterface.html", +- "Methods inherited from interface " + +- "pkg.<A HREF=\"../pkg/PrivateInterface.html\" " + +- "title=\"interface in pkg\">PrivateInterface</A>" ++ "Methods inherited from interface pkg." + ++ "<a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">" + ++ "PrivateInterface</a>" + }, + {BUG_ID + "-2" + FS + "pkg" + FS + "PrivateInterface.html", +- "<A HREF=\"../pkg/PrivateInterface.html#methodInterface(int)\">" + +- "methodInterface</A>" ++ "<a href=\"../pkg/PrivateInterface.html#methodInterface(int)\">" + ++ "methodInterface</a>" + }, + // Should mention that any documentation was copied. + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html", +@@ -209,26 +209,31 @@ + + //Make sure implemented interfaces from private superclass are inherited + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicInterface.html", +- "<STRONG>All Known Implementing Classes:</STRONG></DT> <DD><A HREF=\"../pkg/PrivateParent.html\" " + +- "title=\"class in pkg\">PrivateParent</A>, " + +- "<A HREF=\"../pkg/PublicChild.html\" title=\"class in pkg\">PublicChild</A>"}, ++ "<dl>" + NL + "<dt>All Known Implementing Classes:</dt>" + NL + ++ "<dd><a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">" + ++ "PrivateParent</a>, " + ++ "<a href=\"../pkg/PublicChild.html\" title=\"class in pkg\">PublicChild" + ++ "</a></dd>" + NL + "</dl>"}, + + {BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html", +- "<STRONG>All Implemented Interfaces:</STRONG></DT> <DD><A HREF=\"../pkg/PrivateInterface.html\" " + +- "title=\"interface in pkg\">PrivateInterface</A>, " + +- "<A HREF=\"../pkg/PublicInterface.html\" title=\"interface in pkg\">" + +- "PublicInterface</A>"}, ++ "<dl>" + NL + "<dt>All Implemented Interfaces:</dt>" + NL + ++ "<dd><a href=\"../pkg/PrivateInterface.html\" title=\"interface in pkg\">" + ++ "PrivateInterface</a>, " + ++ "<a href=\"../pkg/PublicInterface.html\" title=\"interface in pkg\">" + ++ "PublicInterface</a></dd>" + NL + "</dl>"}, + + //Since private flag is used, we can document that private interface method + //with generic parameters has been implemented. + {BUG_ID + "-2" + FS + "pkg2" + FS + "C.html", +- "<STRONG>Description copied from interface: " + +- "<CODE><A HREF=\"../pkg2/I.html#hello(T)\">I</A></CODE></STRONG>"}, ++ "<strong>Description copied from interface: <code>" + ++ "<a href=\"../pkg2/I.html#hello(T)\">I</a></code></strong>"}, + + {BUG_ID + "-2" + FS + "pkg2" + FS + "C.html", +- "<STRONG>Specified by:</STRONG></DT><DD><CODE><A HREF=\"../pkg2/I.html#hello(T)\">" + +- "hello</A></CODE> in interface <CODE><A HREF=\"../pkg2/I.html\" " + +- "title=\"interface in pkg2\">I</A>"}, ++ "<dt><strong>Specified by:</strong></dt>" + NL + ++ "<dd><code><a href=\"../pkg2/I.html#hello(T)\">hello</a></code>" + ++ " in interface <code>" + ++ "<a href=\"../pkg2/I.html\" title=\"interface in pkg2\">I</a>" + ++ "<java.lang.String></code></dd>"}, + }; + private static final String[][] NEGATED_TEST2 = NO_TEST; + +diff --git a/test/com/sun/javadoc/testSerializedForm/TestSerializedForm.java b/test/com/sun/javadoc/testSerializedForm/TestSerializedForm.java +--- langtools/test/com/sun/javadoc/testSerializedForm/TestSerializedForm.java ++++ langtools/test/com/sun/javadoc/testSerializedForm/TestSerializedForm.java +@@ -47,11 +47,11 @@ + + private static final String[][] TEST = { + {BUG_ID + FS + "serialized-form.html", +- "protected java.lang.Object <STRONG>readResolve</STRONG>()"}, ++ "protected java.lang.Object readResolve()"}, + {BUG_ID + FS + "serialized-form.html", +- "protected java.lang.Object <STRONG>writeReplace</STRONG>()"}, ++ "protected java.lang.Object writeReplace()"}, + {BUG_ID + FS + "serialized-form.html", +- "protected java.lang.Object <STRONG>readObjectNoData</STRONG>()"}, ++ "protected java.lang.Object readObjectNoData()"}, + {BUG_ID + FS + "serialized-form.html", + "See Also"}, + }; +diff --git a/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java b/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java +--- langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java ++++ langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java +@@ -41,58 +41,47 @@ + // Test for normal run of javadoc. The serialized-form.html should + // display the inline comments, tags and deprecation information if any. + private static final String[][] TEST_CMNT_DEPR = { +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + "<DD><DL>" + NL + +- "<DT><STRONG>Throws:</STRONG></DT>" + NL + "<DD><CODE>" + +- "java.io.IOException</CODE></DD><DT><STRONG>See Also:</STRONG>" + +- "</DT><DD><A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>C1.setUndecorated(boolean)</CODE></A></DD></DL>" + NL + +- "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> <I>As of JDK version " + +- "1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I></DD>" + +- "<DD>This field indicates whether the C1 is undecorated." + NL + +- "<P>" + NL + "</DD>" + NL + "<DD> </DD>" + NL + +- "<DD><DL>" + NL + "<DT><STRONG>Since:</STRONG></DT>" + NL + +- " <DD>1.4</DD>" + NL + "<DT><STRONG>See Also:</STRONG>" + +- "</DT><DD><A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>C1.setUndecorated(boolean)</CODE></A></DD></DL>" + NL + +- "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> <I>As of JDK version" + +- " 1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I>" + NL + "<P>" + NL + +- "</DD><DD>Reads the object stream." + NL + "<P>" + NL + +- "</DD>" + NL + "<DD><DL>" + NL + "<DT><STRONG>Throws:" + +- "</STRONG></DT>" + NL + "<DD><CODE><code>" + +- "IOException</code></CODE></DD>" + NL + +- "<DD><CODE>java.io.IOException</CODE></DD></DL>" + NL + +- "</DD>" + NL + "</DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + +- "<DD><STRONG>Deprecated.</STRONG> </DD><DD>" + +- "The name for this class." + NL + "<P>" + NL + "</DD>" + NL + +- "<DD> </DD>" + NL + "</DL>"}}; ++ {BUG_ID + FS + "serialized-form.html", "<dl>" + ++ "<dt><span class=\"strong\">Throws:</span></dt>" + NL + "<dd><code>" + ++ "java.io.IOException</code></dd><dt><span class=\"strong\">See Also:</span>" + ++ "</dt><dd><a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>C1.setUndecorated(boolean)</code></a></dd></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<span class=\"strong\">Deprecated.</span>" + ++ " <i>As of JDK version 1.5, replaced by" + NL + ++ " <a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>setUndecorated(boolean)</code></a>.</i></div>" + NL + ++ "<div class=\"block\">This field indicates whether the C1 " + ++ "is undecorated.</div>" + NL + " " + NL + ++ "<dl><dt><span class=\"strong\">Since:</span></dt>" + NL + ++ " <dd>1.4</dd>" + NL + "<dt><span class=\"strong\">See Also:</span>" + ++ "</dt><dd><a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>C1.setUndecorated(boolean)</code></a></dd></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<span class=\"strong\">Deprecated.</span>" + ++ " <i>As of JDK version 1.5, replaced by" + NL + ++ " <a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>setUndecorated(boolean)</code></a>.</i></div>" + NL + ++ "<div class=\"block\">Reads the object stream.</div>" + NL + ++ "<dl><dt><span class=\"strong\">Throws:</span></dt>" + NL + "<dd><code><code>" + ++ "IOException</code></code></dd>" + NL + ++ "<dd><code>java.io.IOException</code></dd></dl>"}, ++ {BUG_ID + FS + "serialized-form.html", "<span class=\"strong\">Deprecated.</span>" + ++ " </div>" + NL + "<div class=\"block\">" + ++ "The name for this class.</div>"}}; + + // Test with -nocomment option. The serialized-form.html should + // not display the inline comments and tags but should display deprecation + // information if any. + private static final String[][] TEST_NOCMNT = { +- {BUG_ID + FS + "serialized-form.html", "<PRE>" + NL + "boolean <STRONG>" + +- "undecorated</STRONG></PRE>" + NL + "<DL>" + NL + "<DD><STRONG>" + +- "Deprecated.</STRONG> <I>As of JDK version 1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\"><CODE>" + +- "setUndecorated(boolean)</CODE></A>.</I></DD></DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<DL>" + NL + "<DD><STRONG>" + +- "Deprecated.</STRONG> <I>As of JDK version" + ++ {BUG_ID + FS + "serialized-form.html", "<pre>boolean undecorated</pre>" + NL + ++ "<div class=\"block\"><span class=\"strong\">Deprecated.</span> <i>" + ++ "As of JDK version 1.5, replaced by" + NL + ++ " <a href=\"pkg1/C1.html#setUndecorated(boolean)\"><code>" + ++ "setUndecorated(boolean)</code></a>.</i></div>" + NL + "</li>"}, ++ {BUG_ID + FS + "serialized-form.html", "<span class=\"strong\">" + ++ "Deprecated.</span> <i>As of JDK version" + + " 1.5, replaced by" + NL + +- " <A HREF=\"pkg1/C1.html#setUndecorated(boolean)\">" + +- "<CODE>setUndecorated(boolean)</CODE></A>.</I>" + NL + "<P>" + NL + +- "</DD></DL>"}, +- {BUG_ID + FS + "serialized-form.html", "<PRE>" + NL + "int <STRONG>" + +- "publicKey</STRONG></PRE>" + NL + "<DL>" + NL + "<DD><STRONG>" + +- "Deprecated.</STRONG> </DD></DL>"}}; ++ " <a href=\"pkg1/C1.html#setUndecorated(boolean)\">" + ++ "<code>setUndecorated(boolean)</code></a>.</i></div>" + NL + "</li>"}}; + + // Test with -nodeprecated option. The serialized-form.html should + // ignore the -nodeprecated tag and display the deprecation info. This +diff --git a/test/com/sun/javadoc/testSimpleTag/TestSimpleTag.java b/test/com/sun/javadoc/testSimpleTag/TestSimpleTag.java +--- langtools/test/com/sun/javadoc/testSimpleTag/TestSimpleTag.java ++++ langtools/test/com/sun/javadoc/testSimpleTag/TestSimpleTag.java +@@ -42,13 +42,13 @@ + private static final String[][] TEST = + new String[][] { + {"./" + BUG_ID + "/C.html", +- "<STRONG>Todo:</STRONG>"}, ++ "<span class=\"strong\">Todo:</span>"}, + {"./" + BUG_ID + "/C.html", +- "<STRONG>EJB Beans:</STRONG>"}, ++ "<span class=\"strong\">EJB Beans:</span>"}, + {"./" + BUG_ID + "/C.html", +- "<STRONG>Regular Tag:</STRONG>"}, ++ "<span class=\"strong\">Regular Tag:</span>"}, + {"./" + BUG_ID + "/C.html", +- "<STRONG>Back-Slash-Tag:</STRONG>"}, ++ "<span class=\"strong\">Back-Slash-Tag:</span>"}, + }; + + private static final String[] ARGS = new String[] { +diff --git a/test/com/sun/javadoc/testStylesheet/TestStylesheet.java b/test/com/sun/javadoc/testStylesheet/TestStylesheet.java +--- langtools/test/com/sun/javadoc/testStylesheet/TestStylesheet.java ++++ langtools/test/com/sun/javadoc/testStylesheet/TestStylesheet.java +@@ -45,32 +45,24 @@ + //Input for string search tests. + private static final String[][] TEST = { + {BUG_ID + FS + "stylesheet.css", +- "body { background-color: #FFFFFF; color:#000000 }"}, ++ "/* Javadoc style sheet */"}, + {BUG_ID + FS + "stylesheet.css", +- ".TableHeadingColor { background: #CCCCFF; color:#000000 }"}, ++ "/*" + NL + "Overall document style" + NL + "*/"}, + {BUG_ID + FS + "stylesheet.css", +- ".TableSubHeadingColor { background: #EEEEFF; color:#000000 }"}, ++ "/*" + NL + "Heading styles" + NL + "*/"}, + {BUG_ID + FS + "stylesheet.css", +- ".TableRowColor { background: #FFFFFF; color:#000000 }"}, ++ "/*" + NL + "Navigation bar styles" + NL + "*/"}, + {BUG_ID + FS + "stylesheet.css", +- ".FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 }"}, ++ "body {" + NL + " font-family:Helvetica, Arial, sans-serif;" + NL + ++ " color:#000000;" + NL + "}"}, + {BUG_ID + FS + "stylesheet.css", +- ".FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }"}, +- {BUG_ID + FS + "stylesheet.css", +- ".FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }"}, +- {BUG_ID + FS + "stylesheet.css", +- ".NavBarCell1 { background-color:#EEEEFF; color:#000000}"}, +- {BUG_ID + FS + "stylesheet.css", +- ".NavBarCell1Rev { background-color:#00008B; color:#FFFFFF}"}, +- {BUG_ID + FS + "stylesheet.css", +- ".NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;}"}, +- {BUG_ID + FS + "stylesheet.css", +- ".NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;}"}, +- {BUG_ID + FS + "stylesheet.css", +- ".NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000}"}, +- {BUG_ID + FS + "stylesheet.css", +- ".NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000}"}, +- ++ "dl dd ul li {" + NL + " list-style:none;" + NL + ++ " margin:10px 0 10px 0;" + NL + "}"}, ++ // Test whether a link to the stylesheet file is inserted properly ++ // in the class documentation. ++ {BUG_ID + FS + "pkg" + FS + "A.html", ++ "<link rel=\"stylesheet\" type=\"text/css\" " + ++ "href=\"../stylesheet.css\" title=\"Style\">"} + }; + private static final String[][] NEGATED_TEST = NO_TEST; + +diff --git a/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java b/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java +--- langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java ++++ langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java +@@ -46,8 +46,7 @@ + + //Input for string search tests. + private static final String[][] TEST = { +- {BUG_ID + FS + "C.html", "<CAPTION CLASS=\"TableCaption\">" + NL + +- "Method Summary</CAPTION>"} ++ {BUG_ID + FS + "C.html", "<h3>Method Summary</h3>"} + }; + private static final String[][] NEGATED_TEST = NO_TEST; + +diff --git a/test/com/sun/javadoc/testSuperclassInSerialForm/TestSuperClassInSerialForm.java b/test/com/sun/javadoc/testSuperclassInSerialForm/TestSuperClassInSerialForm.java +--- langtools/test/com/sun/javadoc/testSuperclassInSerialForm/TestSuperClassInSerialForm.java ++++ langtools/test/com/sun/javadoc/testSuperclassInSerialForm/TestSuperClassInSerialForm.java +@@ -39,7 +39,7 @@ + + private static final String[][] TEST = { + {BUG_ID + FS + "serialized-form.html", +- "<A HREF=\"pkg/SubClass.html\" title=\"class in pkg\">pkg.SubClass</A> extends <A HREF=\"pkg/SuperClass.html\" title=\"class in pkg\">SuperClass</A>"} ++ "<a href=\"pkg/SubClass.html\" title=\"class in pkg\">pkg.SubClass</a> extends <a href=\"pkg/SuperClass.html\" title=\"class in pkg\">SuperClass</a>"} + }; + + private static final String[][] NEGATED_TEST = NO_TEST; +diff --git a/test/com/sun/javadoc/testTagInheritence/TestTagInheritence.java b/test/com/sun/javadoc/testTagInheritence/TestTagInheritence.java +--- langtools/test/com/sun/javadoc/testTagInheritence/TestTagInheritence.java ++++ langtools/test/com/sun/javadoc/testTagInheritence/TestTagInheritence.java +@@ -59,12 +59,12 @@ + //First sentence test (6253614) + tests[tests.length - 2][0] =BUG_ID + FS + "firstSentence" + FS + + "B.html"; +- tests[tests.length - 2][1] = " First sentence.</TD>"; ++ tests[tests.length - 2][1] = "<div class=\"block\">First sentence.</div>"; + + //Another first sentence test (6253604) + tests[tests.length - 1][0] =BUG_ID + FS + "firstSentence2" + FS + + "C.html"; +- tests[tests.length - 1][1] = " First sentence.</TD>"; ++ tests[tests.length - 1][1] = "<div class=\"block\">First sentence.</div>"; + + TestTagInheritence tester = new TestTagInheritence(); + run(tester, ARGS, tests, NO_TEST); +diff --git a/test/com/sun/javadoc/testTaglets/TestTaglets.java b/test/com/sun/javadoc/testTaglets/TestTaglets.java +--- langtools/test/com/sun/javadoc/testTaglets/TestTaglets.java ++++ langtools/test/com/sun/javadoc/testTaglets/TestTaglets.java +@@ -55,13 +55,15 @@ + + //Input for string search tests. + private static final String[][] TEST_4654308 = new String[][] { +- {"4654308" + FS + "C.html", "<B>Foo:</B><DD>my only method is " +
"<A HREF=\"C.html#method()\"><CODE>here</CODE></A>"} ++ {"4654308" + FS + "C.html", "<span class=\"strong\">Foo:</span></dt>" + ++ "<dd>my only method is <a href=\"C.html#method()\"><code>here" + ++ "</code></a></dd></dl>"} + }; + private static final String[][] NEGATED_TEST_4654308 = NO_TEST; + + private static final String[][] TEST_4767038 = new String[][] { + {"4767038" + FS + "Child.html", +- " This is the first sentence.</TD>"} ++ "This is the first sentence."} + }; + private static final String[][] NEGATED_TEST_4767038 = NO_TEST; + +diff --git a/test/com/sun/javadoc/testTaglets/taglets/Foo.java b/test/com/sun/javadoc/testTaglets/taglets/Foo.java +--- langtools/test/com/sun/javadoc/testTaglets/taglets/Foo.java ++++ langtools/test/com/sun/javadoc/testTaglets/taglets/Foo.java +@@ -50,9 +50,9 @@ + */ + public TagletOutput getTagletOutput(Tag tag, TagletWriter writer) { + ArrayList inlineTags = new ArrayList(); +- inlineTags.add(new TextTag(tag.holder(), "<DT><B>Foo:</B><DD>")); ++ inlineTags.add(new TextTag(tag.holder(), "<dt><span class=\"strong\">Foo:</span></dt><dd>")); + inlineTags.addAll(Arrays.asList(tag.inlineTags())); +- inlineTags.add(new TextTag(tag.holder(), "</DD>")); ++ inlineTags.add(new TextTag(tag.holder(), "</dd>")); + return writer.commentTagsToOutput(tag, + (Tag[]) inlineTags.toArray(new Tag[] {})); + } +diff --git a/test/com/sun/javadoc/testThrowsHead/TestThrowsHead.java b/test/com/sun/javadoc/testThrowsHead/TestThrowsHead.java +--- langtools/test/com/sun/javadoc/testThrowsHead/TestThrowsHead.java ++++ langtools/test/com/sun/javadoc/testThrowsHead/TestThrowsHead.java +@@ -38,7 +38,7 @@ + + private static final String BUG_ID = "4530727"; + private static final String[][] TEST = { +- {BUG_ID + FS + "C.html", "<DT><STRONG>Throws:</STRONG>"} ++ {BUG_ID + FS + "C.html", "<dt><span class=\"strong\">Throws:</span>"} + }; + private static final String[][] NEGATED_TEST = NO_TEST; + private static final String[] ARGS = new String[] { +diff --git a/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java b/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java +--- langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java ++++ langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java +@@ -46,14 +46,14 @@ + //Input for string search tests. + private static final String[][] TEST = { + {BUG_ID + FS + "pkg" + FS + "C.html", +- "<DD><CODE><A HREF=\"../pkg/T1.html\" title=\"class in pkg\">T1</A></CODE> - the first throws tag.</DD>" + NL + +- "<DD><CODE><A HREF=\"../pkg/T2.html\" title=\"class in pkg\">T2</A></CODE> - the second throws tag.</DD>" + NL + +- "<DD><CODE><A HREF=\"../pkg/T3.html\" title=\"class in pkg\">T3</A></CODE> - the third throws tag.</DD>" + NL + +- "<DD><CODE><A HREF=\"../pkg/T4.html\" title=\"class in pkg\">T4</A></CODE> - the fourth throws tag.</DD>" + NL + +- "<DD><CODE><A HREF=\"../pkg/T5.html\" title=\"class in pkg\">T5</A></CODE> - the first inherited throws tag.</DD>" + NL + +- "<DD><CODE><A HREF=\"../pkg/T6.html\" title=\"class in pkg\">T6</A></CODE> - the second inherited throws tag.</DD>" + NL + +- "<DD><CODE><A HREF=\"../pkg/T7.html\" title=\"class in pkg\">T7</A></CODE> - the third inherited throws tag.</DD>" + NL + +- "<DD><CODE><A HREF=\"../pkg/T8.html\" title=\"class in pkg\">T8</A></CODE> - the fourth inherited throws tag.</DD>" ++ "<dd><code><a href=\"../pkg/T1.html\" title=\"class in pkg\">T1</a></code> - the first throws tag.</dd>" + NL + ++ "<dd><code><a href=\"../pkg/T2.html\" title=\"class in pkg\">T2</a></code> - the second throws tag.</dd>" + NL + ++ "<dd><code><a href=\"../pkg/T3.html\" title=\"class in pkg\">T3</a></code> - the third throws tag.</dd>" + NL + ++ "<dd><code><a href=\"../pkg/T4.html\" title=\"class in pkg\">T4</a></code> - the fourth throws tag.</dd>" + NL + ++ "<dd><code><a href=\"../pkg/T5.html\" title=\"class in pkg\">T5</a></code> - the first inherited throws tag.</dd>" + NL + ++ "<dd><code><a href=\"../pkg/T6.html\" title=\"class in pkg\">T6</a></code> - the second inherited throws tag.</dd>" + NL + ++ "<dd><code><a href=\"../pkg/T7.html\" title=\"class in pkg\">T7</a></code> - the third inherited throws tag.</dd>" + NL + ++ "<dd><code><a href=\"../pkg/T8.html\" title=\"class in pkg\">T8</a></code> - the fourth inherited throws tag.</dd>" + }, + }; + private static final String[][] NEGATED_TEST = NO_TEST; +diff --git a/test/com/sun/javadoc/testTitleInHref/TestTitleInHref.java b/test/com/sun/javadoc/testTitleInHref/TestTitleInHref.java +--- langtools/test/com/sun/javadoc/testTitleInHref/TestTitleInHref.java ++++ langtools/test/com/sun/javadoc/testTitleInHref/TestTitleInHref.java +@@ -38,13 +38,13 @@ + + private static final String[][] TEST = { + //Test to make sure that the title shows up in a class link. +- {BUG_ID + FS + "pkg" + FS + "Links.html", "<A HREF=\"../pkg/Class.html\" title=\"class in pkg\">"}, ++ {BUG_ID + FS + "pkg" + FS + "Links.html", "<a href=\"../pkg/Class.html\" title=\"class in pkg\">"}, + + //Test to make sure that the title shows up in an interface link. +- {BUG_ID + FS + "pkg" + FS + "Links.html", "<A HREF=\"../pkg/Interface.html\" title=\"interface in pkg\">"}, ++ {BUG_ID + FS + "pkg" + FS + "Links.html", "<a href=\"../pkg/Interface.html\" title=\"interface in pkg\">"}, + + //Test to make sure that the title shows up in cross link shows up +- {BUG_ID + FS + "pkg" + FS + "Links.html", "<A HREF=\"http://java.sun.com/j2se/1.4/docs/api/java/io/File.html?is-external=true\" title=\"class or interface in java.io\"><CODE>This is a cross link to class File</CODE></A>"}, ++ {BUG_ID + FS + "pkg" + FS + "Links.html", "<a href=\"http://java.sun.com/j2se/1.4/docs/api/java/io/File.html?is-external=true\" title=\"class or interface in java.io\"><code>This is a cross link to class File</code></a>"}, + + }; + +diff --git a/test/com/sun/javadoc/testTypeParams/TestTypeParameters.java b/test/com/sun/javadoc/testTypeParams/TestTypeParameters.java +--- langtools/test/com/sun/javadoc/testTypeParams/TestTypeParameters.java ++++ langtools/test/com/sun/javadoc/testTypeParams/TestTypeParameters.java +@@ -49,16 +49,17 @@ + private static final String[][] TEST = + { + {BUG_ID + FS + "pkg" + FS + "C.html", +- "<CODE><W extends java.lang.String,V extends java.util.List> " + NL + +- "<BR>" + NL + +- "java.lang.Object</CODE>"}, ++ "<td class=\"colFirst\"><code><W extends java.lang.String,V extends " + ++ "java.util.List> <br>java.lang.Object</code></td>"}, + {BUG_ID + FS + "pkg" + FS + "C.html", +- "<CODE><T> java.lang.Object</CODE>"}, ++ "<code><T> java.lang.Object</code>"}, + {BUG_ID + FS + "pkg" + FS + "package-summary.html", + "C<E extends Parent>"}, + //Nested type parameters + {BUG_ID + FS + "pkg" + FS + "C.html", +- "<A NAME=\"formatDetails(java.util.Collection, java.util.Collection)\"><!-- --></A>"}, ++ "<a name=\"formatDetails(java.util.Collection, java.util.Collection)\">" + NL + ++ "<!-- -->" + NL + ++ "</a>"}, + + }; + private static final String[][] NEGATED_TEST = NO_TEST; +diff --git a/test/com/sun/javadoc/testUnnamedPackage/TestUnnamedPackage.java b/test/com/sun/javadoc/testUnnamedPackage/TestUnnamedPackage.java +--- langtools/test/com/sun/javadoc/testUnnamedPackage/TestUnnamedPackage.java ++++ langtools/test/com/sun/javadoc/testUnnamedPackage/TestUnnamedPackage.java +@@ -46,7 +46,7 @@ + //Input for string search tests. + private static final String[][] TEST = { + {BUG_ID + FS + "package-summary.html", +- "<H2>"+NL+"Package <Unnamed>"+NL+"</H2>" ++ "<h1 title=\"Package\" class=\"title\">Package <Unnamed></h1>" + }, + {BUG_ID + FS + "package-summary.html", + "This is a package comment for the unnamed package." +@@ -55,12 +55,12 @@ + "This is a class in the unnamed package." + }, + {BUG_ID + FS + "package-tree.html", +- "<H2>"+NL+"Hierarchy For Package <Unnamed>"+NL+"</H2>" ++ "<h1 class=\"title\">Hierarchy For Package <Unnamed></h1>" + }, + {BUG_ID + FS + "index-all.html", + "title=\"class in <Unnamed>\"" + }, +- {BUG_ID + FS + "C.html", "<A HREF=\"package-summary.html\">"} ++ {BUG_ID + FS + "C.html", "<a href=\"package-summary.html\">"} + }; + private static final String[][] NEGATED_TEST = { + {ERROR_OUTPUT, "BadSource"}, +diff --git a/test/com/sun/javadoc/testValueTag/TestValueTag.java b/test/com/sun/javadoc/testValueTag/TestValueTag.java +--- langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java ++++ langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java +@@ -52,44 +52,44 @@ + "Result: \"Test 1 passes\""}, + //Retrieve value of constant in same class. + {BUG_ID + FS + "pkg1" + FS + "Class1.html", +- "Result: <A HREF=\"../pkg1/Class1.html#TEST_2_PASSES\">\"Test 2 passes\"</A>"}, ++ "Result: <a href=\"../pkg1/Class1.html#TEST_2_PASSES\">\"Test 2 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class1.html", +- "Result: <A HREF=\"../pkg1/Class1.html#TEST_3_PASSES\">\"Test 3 passes\"</A>"}, ++ "Result: <a href=\"../pkg1/Class1.html#TEST_3_PASSES\">\"Test 3 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class1.html", +- "Result: <A HREF=\"../pkg1/Class1.html#TEST_4_PASSES\">\"Test 4 passes\"</A>"}, ++ "Result: <a href=\"../pkg1/Class1.html#TEST_4_PASSES\">\"Test 4 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class1.html", +- "Result: <A HREF=\"../pkg1/Class1.html#TEST_5_PASSES\">\"Test 5 passes\"</A>"}, ++ "Result: <a href=\"../pkg1/Class1.html#TEST_5_PASSES\">\"Test 5 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class1.html", +- "Result: <A HREF=\"../pkg1/Class1.html#TEST_6_PASSES\">\"Test 6 passes\"</A>"}, ++ "Result: <a href=\"../pkg1/Class1.html#TEST_6_PASSES\">\"Test 6 passes\"</a>"}, + //Retrieve value of constant in different class. + {BUG_ID + FS + "pkg1" + FS + "Class2.html", +- "Result: <A HREF=\"../pkg1/Class1.html#TEST_7_PASSES\">\"Test 7 passes\"</A>"}, ++ "Result: <a href=\"../pkg1/Class1.html#TEST_7_PASSES\">\"Test 7 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class2.html", +- "Result: <A HREF=\"../pkg1/Class1.html#TEST_8_PASSES\">\"Test 8 passes\"</A>"}, ++ "Result: <a href=\"../pkg1/Class1.html#TEST_8_PASSES\">\"Test 8 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class2.html", +- "Result: <A HREF=\"../pkg1/Class1.html#TEST_9_PASSES\">\"Test 9 passes\"</A>"}, ++ "Result: <a href=\"../pkg1/Class1.html#TEST_9_PASSES\">\"Test 9 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class2.html", +- "Result: <A HREF=\"../pkg1/Class1.html#TEST_10_PASSES\">\"Test 10 passes\"</A>"}, ++ "Result: <a href=\"../pkg1/Class1.html#TEST_10_PASSES\">\"Test 10 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class2.html", +- "Result: <A HREF=\"../pkg1/Class1.html#TEST_11_PASSES\">\"Test 11 passes\"</A>"}, ++ "Result: <a href=\"../pkg1/Class1.html#TEST_11_PASSES\">\"Test 11 passes\"</a>"}, + //Retrieve value of constant in different package + {BUG_ID + FS + "pkg1" + FS + "Class2.html", +- "Result: <A HREF=\"../pkg2/Class3.html#TEST_12_PASSES\">\"Test 12 passes\"</A>"}, ++ "Result: <a href=\"../pkg2/Class3.html#TEST_12_PASSES\">\"Test 12 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class2.html", +- "Result: <A HREF=\"../pkg2/Class3.html#TEST_13_PASSES\">\"Test 13 passes\"</A>"}, ++ "Result: <a href=\"../pkg2/Class3.html#TEST_13_PASSES\">\"Test 13 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class2.html", +- "Result: <A HREF=\"../pkg2/Class3.html#TEST_14_PASSES\">\"Test 14 passes\"</A>"}, ++ "Result: <a href=\"../pkg2/Class3.html#TEST_14_PASSES\">\"Test 14 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class2.html", +- "Result: <A HREF=\"../pkg2/Class3.html#TEST_15_PASSES\">\"Test 15 passes\"</A>"}, ++ "Result: <a href=\"../pkg2/Class3.html#TEST_15_PASSES\">\"Test 15 passes\"</a>"}, + {BUG_ID + FS + "pkg1" + FS + "Class2.html", +- "Result: <A HREF=\"../pkg2/Class3.html#TEST_16_PASSES\">\"Test 16 passes\"</A>"}, ++ "Result: <a href=\"../pkg2/Class3.html#TEST_16_PASSES\">\"Test 16 passes\"</a>"}, + //Retrieve value of constant from a package page + {BUG_ID + FS + "pkg2" + FS + "package-summary.html", +- "Result: <A HREF=\"../pkg2/Class3.html#TEST_17_PASSES\">\"Test 17 passes\"</A>"}, ++ "Result: <a href=\"../pkg2/Class3.html#TEST_17_PASSES\">\"Test 17 passes\"</a>"}, + //Test @value tag used with custom tag. + {BUG_ID + FS + "pkg1" + FS + "CustomTagUsage.html", +- "<DT><STRONG>Todo:</STRONG></DT>" + NL + +- " <DD>the value of this constant is 55.</DD>"}, ++ "<dt><span class=\"strong\">Todo:</span></dt>" + NL + ++ " <dd>the value of this constant is 55.</dd>"}, + //Test @value warning printed when used with non-constant. + {WARNING_OUTPUT,"warning - @value tag (which references nonConstant) " + + "can only be used in constants." +diff --git a/test/com/sun/javadoc/testWarnings/TestWarnings.java b/test/com/sun/javadoc/testWarnings/TestWarnings.java +--- langtools/test/com/sun/javadoc/testWarnings/TestWarnings.java ++++ langtools/test/com/sun/javadoc/testWarnings/TestWarnings.java +@@ -65,9 +65,9 @@ + }; + + private static final String[][] TEST2 = { +- {BUG_ID + FS + "pkg" + FS + "X.html", "<A HREF=\"../pkg/X.html#m()\"><CODE>m()</CODE></A><br/>"}, +- {BUG_ID + FS + "pkg" + FS + "X.html", "<A HREF=\"../pkg/X.html#X()\"><CODE>X()</CODE></A><br/>"}, +- {BUG_ID + FS + "pkg" + FS + "X.html", "<A HREF=\"../pkg/X.html#f\"><CODE>f</CODE></A><br/>"}, ++ {BUG_ID + FS + "pkg" + FS + "X.html", "<a href=\"../pkg/X.html#m()\"><code>m()</code></a><br/>"}, ++ {BUG_ID + FS + "pkg" + FS + "X.html", "<a href=\"../pkg/X.html#X()\"><code>X()</code></a><br/>"}, ++ {BUG_ID + FS + "pkg" + FS + "X.html", "<a href=\"../pkg/X.html#f\"><code>f</code></a><br/>"}, + }; + + private static final String[][] NEGATED_TEST2 = NO_TEST; |