Thu, 13 Jan 2011 21:28:38 -0800
7010528: javadoc performance regression
Reviewed-by: jjg
duke@1 | 1 | /* |
ohair@798 | 2 | * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. |
duke@1 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
duke@1 | 4 | * |
duke@1 | 5 | * This code is free software; you can redistribute it and/or modify it |
duke@1 | 6 | * under the terms of the GNU General Public License version 2 only, as |
ohair@554 | 7 | * published by the Free Software Foundation. Oracle designates this |
duke@1 | 8 | * particular file as subject to the "Classpath" exception as provided |
ohair@554 | 9 | * by Oracle in the LICENSE file that accompanied this code. |
duke@1 | 10 | * |
duke@1 | 11 | * This code is distributed in the hope that it will be useful, but WITHOUT |
duke@1 | 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
duke@1 | 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
duke@1 | 14 | * version 2 for more details (a copy is included in the LICENSE file that |
duke@1 | 15 | * accompanied this code). |
duke@1 | 16 | * |
duke@1 | 17 | * You should have received a copy of the GNU General Public License version |
duke@1 | 18 | * 2 along with this work; if not, write to the Free Software Foundation, |
duke@1 | 19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
duke@1 | 20 | * |
ohair@554 | 21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
ohair@554 | 22 | * or visit www.oracle.com if you need additional information or have any |
ohair@554 | 23 | * questions. |
duke@1 | 24 | */ |
duke@1 | 25 | |
duke@1 | 26 | package com.sun.tools.doclets.formats.html; |
duke@1 | 27 | |
bpatel@766 | 28 | import java.io.*; |
duke@1 | 29 | import com.sun.tools.doclets.internal.toolkit.util.*; |
bpatel@766 | 30 | import com.sun.tools.doclets.internal.toolkit.*; |
bpatel@766 | 31 | import com.sun.tools.doclets.formats.html.markup.*; |
duke@1 | 32 | |
duke@1 | 33 | /** |
duke@1 | 34 | * Generate the Help File for the generated API documentation. The help file |
duke@1 | 35 | * contents are helpful for browsing the generated documentation. |
duke@1 | 36 | * |
duke@1 | 37 | * @author Atul M Dambalkar |
duke@1 | 38 | */ |
duke@1 | 39 | public class HelpWriter extends HtmlDocletWriter { |
duke@1 | 40 | |
duke@1 | 41 | /** |
duke@1 | 42 | * Constructor to construct HelpWriter object. |
duke@1 | 43 | * @param filename File to be generated. |
duke@1 | 44 | */ |
duke@1 | 45 | public HelpWriter(ConfigurationImpl configuration, |
duke@1 | 46 | String filename) throws IOException { |
duke@1 | 47 | super(configuration, filename); |
duke@1 | 48 | } |
duke@1 | 49 | |
duke@1 | 50 | /** |
duke@1 | 51 | * Construct the HelpWriter object and then use it to generate the help |
duke@1 | 52 | * file. The name of the generated file is "help-doc.html". The help file |
duke@1 | 53 | * will get generated if and only if "-helpfile" and "-nohelp" is not used |
duke@1 | 54 | * on the command line. |
duke@1 | 55 | * @throws DocletAbortException |
duke@1 | 56 | */ |
duke@1 | 57 | public static void generate(ConfigurationImpl configuration) { |
duke@1 | 58 | HelpWriter helpgen; |
duke@1 | 59 | String filename = ""; |
duke@1 | 60 | try { |
duke@1 | 61 | filename = "help-doc.html"; |
duke@1 | 62 | helpgen = new HelpWriter(configuration, filename); |
duke@1 | 63 | helpgen.generateHelpFile(); |
duke@1 | 64 | helpgen.close(); |
duke@1 | 65 | } catch (IOException exc) { |
duke@1 | 66 | configuration.standardmessage.error( |
duke@1 | 67 | "doclet.exception_encountered", |
duke@1 | 68 | exc.toString(), filename); |
duke@1 | 69 | throw new DocletAbortException(); |
duke@1 | 70 | } |
duke@1 | 71 | } |
duke@1 | 72 | |
duke@1 | 73 | /** |
duke@1 | 74 | * Generate the help file contents. |
duke@1 | 75 | */ |
duke@1 | 76 | protected void generateHelpFile() { |
bpatel@766 | 77 | String title = configuration.getText("doclet.Window_Help_title"); |
bpatel@766 | 78 | Content body = getBody(true, getWindowTitle(title)); |
bpatel@766 | 79 | addTop(body); |
bpatel@766 | 80 | addNavLinks(true, body); |
bpatel@766 | 81 | addHelpFileContents(body); |
bpatel@766 | 82 | addNavLinks(false, body); |
bpatel@766 | 83 | addBottom(body); |
bpatel@766 | 84 | printHtmlDocument(null, true, body); |
duke@1 | 85 | } |
duke@1 | 86 | |
duke@1 | 87 | /** |
bpatel@766 | 88 | * Add the help file contents from the resource file to the content tree. While adding the |
duke@1 | 89 | * help file contents it also keeps track of user options. If "-notree" |
bpatel@766 | 90 | * is used, then the "overview-tree.html" will not get added and hence |
bpatel@766 | 91 | * help information also will not get added. |
bpatel@766 | 92 | * |
bpatel@766 | 93 | * @param contentTree the content tree to which the help file contents will be added |
duke@1 | 94 | */ |
bpatel@766 | 95 | protected void addHelpFileContents(Content contentTree) { |
bpatel@766 | 96 | Content heading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, false, HtmlStyle.title, |
bpatel@766 | 97 | getResource("doclet.Help_line_1")); |
bpatel@766 | 98 | Content div = HtmlTree.DIV(HtmlStyle.header, heading); |
bpatel@766 | 99 | Content line2 = HtmlTree.P(HtmlStyle.subTitle, |
bpatel@766 | 100 | getResource("doclet.Help_line_2")); |
bpatel@766 | 101 | div.addContent(line2); |
bpatel@766 | 102 | contentTree.addContent(div); |
bpatel@766 | 103 | HtmlTree ul = new HtmlTree(HtmlTag.UL); |
bpatel@766 | 104 | ul.addStyle(HtmlStyle.blockList); |
duke@1 | 105 | if (configuration.createoverview) { |
bpatel@766 | 106 | Content overviewHeading = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 107 | getResource("doclet.Overview")); |
bpatel@766 | 108 | Content liOverview = HtmlTree.LI(HtmlStyle.blockList, overviewHeading); |
bpatel@766 | 109 | Content line3 = getResource("doclet.Help_line_3", |
bpatel@766 | 110 | getHyperLinkString("overview-summary.html", |
bpatel@766 | 111 | configuration.getText("doclet.Overview"))); |
bpatel@766 | 112 | Content overviewPara = HtmlTree.P(line3); |
bpatel@766 | 113 | liOverview.addContent(overviewPara); |
bpatel@766 | 114 | ul.addContent(liOverview); |
duke@1 | 115 | } |
bpatel@766 | 116 | Content packageHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 117 | getResource("doclet.Package")); |
bpatel@766 | 118 | Content liPackage = HtmlTree.LI(HtmlStyle.blockList, packageHead); |
bpatel@766 | 119 | Content line4 = getResource("doclet.Help_line_4"); |
bpatel@766 | 120 | Content packagePara = HtmlTree.P(line4); |
bpatel@766 | 121 | liPackage.addContent(packagePara); |
bpatel@766 | 122 | HtmlTree ulPackage = new HtmlTree(HtmlTag.UL); |
bpatel@766 | 123 | ulPackage.addContent(HtmlTree.LI( |
bpatel@766 | 124 | getResource("doclet.Interfaces_Italic"))); |
bpatel@766 | 125 | ulPackage.addContent(HtmlTree.LI( |
bpatel@766 | 126 | getResource("doclet.Classes"))); |
bpatel@766 | 127 | ulPackage.addContent(HtmlTree.LI( |
bpatel@766 | 128 | getResource("doclet.Enums"))); |
bpatel@766 | 129 | ulPackage.addContent(HtmlTree.LI( |
bpatel@766 | 130 | getResource("doclet.Exceptions"))); |
bpatel@766 | 131 | ulPackage.addContent(HtmlTree.LI( |
bpatel@766 | 132 | getResource("doclet.Errors"))); |
bpatel@766 | 133 | ulPackage.addContent(HtmlTree.LI( |
bpatel@766 | 134 | getResource("doclet.AnnotationTypes"))); |
bpatel@766 | 135 | liPackage.addContent(ulPackage); |
bpatel@766 | 136 | ul.addContent(liPackage); |
bpatel@766 | 137 | Content classHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 138 | getResource("doclet.Help_line_5")); |
bpatel@766 | 139 | Content liClass = HtmlTree.LI(HtmlStyle.blockList, classHead); |
bpatel@766 | 140 | Content line6 = getResource("doclet.Help_line_6"); |
bpatel@766 | 141 | Content classPara = HtmlTree.P(line6); |
bpatel@766 | 142 | liClass.addContent(classPara); |
bpatel@766 | 143 | HtmlTree ul1 = new HtmlTree(HtmlTag.UL); |
bpatel@766 | 144 | ul1.addContent(HtmlTree.LI( |
bpatel@766 | 145 | getResource("doclet.Help_line_7"))); |
bpatel@766 | 146 | ul1.addContent(HtmlTree.LI( |
bpatel@766 | 147 | getResource("doclet.Help_line_8"))); |
bpatel@766 | 148 | ul1.addContent(HtmlTree.LI( |
bpatel@766 | 149 | getResource("doclet.Help_line_9"))); |
bpatel@766 | 150 | ul1.addContent(HtmlTree.LI( |
bpatel@766 | 151 | getResource("doclet.Help_line_10"))); |
bpatel@766 | 152 | ul1.addContent(HtmlTree.LI( |
bpatel@766 | 153 | getResource("doclet.Help_line_11"))); |
bpatel@766 | 154 | ul1.addContent(HtmlTree.LI( |
bpatel@766 | 155 | getResource("doclet.Help_line_12"))); |
bpatel@766 | 156 | liClass.addContent(ul1); |
bpatel@766 | 157 | HtmlTree ul2 = new HtmlTree(HtmlTag.UL); |
bpatel@766 | 158 | ul2.addContent(HtmlTree.LI( |
bpatel@766 | 159 | getResource("doclet.Nested_Class_Summary"))); |
bpatel@766 | 160 | ul2.addContent(HtmlTree.LI( |
bpatel@766 | 161 | getResource("doclet.Field_Summary"))); |
bpatel@766 | 162 | ul2.addContent(HtmlTree.LI( |
bpatel@766 | 163 | getResource("doclet.Constructor_Summary"))); |
bpatel@766 | 164 | ul2.addContent(HtmlTree.LI( |
bpatel@766 | 165 | getResource("doclet.Method_Summary"))); |
bpatel@766 | 166 | liClass.addContent(ul2); |
bpatel@766 | 167 | HtmlTree ul3 = new HtmlTree(HtmlTag.UL); |
bpatel@766 | 168 | ul3.addContent(HtmlTree.LI( |
bpatel@766 | 169 | getResource("doclet.Field_Detail"))); |
bpatel@766 | 170 | ul3.addContent(HtmlTree.LI( |
bpatel@766 | 171 | getResource("doclet.Constructor_Detail"))); |
bpatel@766 | 172 | ul3.addContent(HtmlTree.LI( |
bpatel@766 | 173 | getResource("doclet.Method_Detail"))); |
bpatel@766 | 174 | liClass.addContent(ul3); |
bpatel@766 | 175 | Content line13 = getResource("doclet.Help_line_13"); |
bpatel@766 | 176 | Content para = HtmlTree.P(line13); |
bpatel@766 | 177 | liClass.addContent(para); |
bpatel@766 | 178 | ul.addContent(liClass); |
duke@1 | 179 | //Annotation Types |
bpatel@766 | 180 | Content aHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 181 | getResource("doclet.AnnotationType")); |
bpatel@766 | 182 | Content liAnnotation = HtmlTree.LI(HtmlStyle.blockList, aHead); |
bpatel@766 | 183 | Content aline1 = getResource("doclet.Help_annotation_type_line_1"); |
bpatel@766 | 184 | Content aPara = HtmlTree.P(aline1); |
bpatel@766 | 185 | liAnnotation.addContent(aPara); |
bpatel@766 | 186 | HtmlTree aul = new HtmlTree(HtmlTag.UL); |
bpatel@766 | 187 | aul.addContent(HtmlTree.LI( |
bpatel@766 | 188 | getResource("doclet.Help_annotation_type_line_2"))); |
bpatel@766 | 189 | aul.addContent(HtmlTree.LI( |
bpatel@766 | 190 | getResource("doclet.Help_annotation_type_line_3"))); |
bpatel@766 | 191 | aul.addContent(HtmlTree.LI( |
bpatel@766 | 192 | getResource("doclet.Annotation_Type_Required_Member_Summary"))); |
bpatel@766 | 193 | aul.addContent(HtmlTree.LI( |
bpatel@766 | 194 | getResource("doclet.Annotation_Type_Optional_Member_Summary"))); |
bpatel@766 | 195 | aul.addContent(HtmlTree.LI( |
bpatel@766 | 196 | getResource("doclet.Annotation_Type_Member_Detail"))); |
bpatel@766 | 197 | liAnnotation.addContent(aul); |
bpatel@766 | 198 | ul.addContent(liAnnotation); |
duke@1 | 199 | //Enums |
bpatel@766 | 200 | Content enumHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 201 | getResource("doclet.Enum")); |
bpatel@766 | 202 | Content liEnum = HtmlTree.LI(HtmlStyle.blockList, enumHead); |
bpatel@766 | 203 | Content eline1 = getResource("doclet.Help_enum_line_1"); |
bpatel@766 | 204 | Content enumPara = HtmlTree.P(eline1); |
bpatel@766 | 205 | liEnum.addContent(enumPara); |
bpatel@766 | 206 | HtmlTree eul = new HtmlTree(HtmlTag.UL); |
bpatel@766 | 207 | eul.addContent(HtmlTree.LI( |
bpatel@766 | 208 | getResource("doclet.Help_enum_line_2"))); |
bpatel@766 | 209 | eul.addContent(HtmlTree.LI( |
bpatel@766 | 210 | getResource("doclet.Help_enum_line_3"))); |
bpatel@766 | 211 | eul.addContent(HtmlTree.LI( |
bpatel@766 | 212 | getResource("doclet.Enum_Constant_Summary"))); |
bpatel@766 | 213 | eul.addContent(HtmlTree.LI( |
bpatel@766 | 214 | getResource("doclet.Enum_Constant_Detail"))); |
bpatel@766 | 215 | liEnum.addContent(eul); |
bpatel@766 | 216 | ul.addContent(liEnum); |
duke@1 | 217 | if (configuration.classuse) { |
bpatel@766 | 218 | Content useHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 219 | getResource("doclet.Help_line_14")); |
bpatel@766 | 220 | Content liUse = HtmlTree.LI(HtmlStyle.blockList, useHead); |
bpatel@766 | 221 | Content line15 = getResource("doclet.Help_line_15"); |
bpatel@766 | 222 | Content usePara = HtmlTree.P(line15); |
bpatel@766 | 223 | liUse.addContent(usePara); |
bpatel@766 | 224 | ul.addContent(liUse); |
duke@1 | 225 | } |
duke@1 | 226 | if (configuration.createtree) { |
bpatel@766 | 227 | Content treeHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 228 | getResource("doclet.Help_line_16")); |
bpatel@766 | 229 | Content liTree = HtmlTree.LI(HtmlStyle.blockList, treeHead); |
bpatel@766 | 230 | Content line17 = getResource("doclet.Help_line_17_with_tree_link", |
bpatel@766 | 231 | getHyperLinkString("overview-tree.html", |
bpatel@766 | 232 | configuration.getText("doclet.Class_Hierarchy"))); |
bpatel@766 | 233 | Content treePara = HtmlTree.P(line17); |
bpatel@766 | 234 | liTree.addContent(treePara); |
bpatel@766 | 235 | HtmlTree tul = new HtmlTree(HtmlTag.UL); |
bpatel@766 | 236 | tul.addContent(HtmlTree.LI( |
bpatel@766 | 237 | getResource("doclet.Help_line_18"))); |
bpatel@766 | 238 | tul.addContent(HtmlTree.LI( |
bpatel@766 | 239 | getResource("doclet.Help_line_19"))); |
bpatel@766 | 240 | liTree.addContent(tul); |
bpatel@766 | 241 | ul.addContent(liTree); |
duke@1 | 242 | } |
duke@1 | 243 | if (!(configuration.nodeprecatedlist || |
duke@1 | 244 | configuration.nodeprecated)) { |
bpatel@766 | 245 | Content dHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 246 | getResource("doclet.Deprecated_API")); |
bpatel@766 | 247 | Content liDeprecated = HtmlTree.LI(HtmlStyle.blockList, dHead); |
bpatel@766 | 248 | Content line20 = getResource("doclet.Help_line_20_with_deprecated_api_link", |
bpatel@766 | 249 | getHyperLinkString("deprecated-list.html", |
bpatel@766 | 250 | configuration.getText("doclet.Deprecated_API"))); |
bpatel@766 | 251 | Content dPara = HtmlTree.P(line20); |
bpatel@766 | 252 | liDeprecated.addContent(dPara); |
bpatel@766 | 253 | ul.addContent(liDeprecated); |
duke@1 | 254 | } |
duke@1 | 255 | if (configuration.createindex) { |
duke@1 | 256 | String indexlink; |
duke@1 | 257 | if (configuration.splitindex) { |
bpatel@766 | 258 | indexlink = getHyperLinkString("index-files/index-1.html", |
bpatel@766 | 259 | configuration.getText("doclet.Index")); |
duke@1 | 260 | } else { |
bpatel@766 | 261 | indexlink = getHyperLinkString("index-all.html", |
bpatel@766 | 262 | configuration.getText("doclet.Index")); |
duke@1 | 263 | } |
bpatel@766 | 264 | Content indexHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 265 | getResource("doclet.Help_line_21")); |
bpatel@766 | 266 | Content liIndex = HtmlTree.LI(HtmlStyle.blockList, indexHead); |
bpatel@766 | 267 | Content line22 = getResource("doclet.Help_line_22", indexlink); |
bpatel@766 | 268 | Content indexPara = HtmlTree.P(line22); |
bpatel@766 | 269 | liIndex.addContent(indexPara); |
bpatel@766 | 270 | ul.addContent(liIndex); |
duke@1 | 271 | } |
bpatel@766 | 272 | Content prevHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 273 | getResource("doclet.Help_line_23")); |
bpatel@766 | 274 | Content liPrev = HtmlTree.LI(HtmlStyle.blockList, prevHead); |
bpatel@766 | 275 | Content line24 = getResource("doclet.Help_line_24"); |
bpatel@766 | 276 | Content prevPara = HtmlTree.P(line24); |
bpatel@766 | 277 | liPrev.addContent(prevPara); |
bpatel@766 | 278 | ul.addContent(liPrev); |
bpatel@766 | 279 | Content frameHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 280 | getResource("doclet.Help_line_25")); |
bpatel@766 | 281 | Content liFrame = HtmlTree.LI(HtmlStyle.blockList, frameHead); |
bpatel@766 | 282 | Content line26 = getResource("doclet.Help_line_26"); |
bpatel@766 | 283 | Content framePara = HtmlTree.P(line26); |
bpatel@766 | 284 | liFrame.addContent(framePara); |
bpatel@766 | 285 | ul.addContent(liFrame); |
bpatel@766 | 286 | Content sHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 287 | getResource("doclet.Serialized_Form")); |
bpatel@766 | 288 | Content liSerial = HtmlTree.LI(HtmlStyle.blockList, sHead); |
bpatel@766 | 289 | Content line27 = getResource("doclet.Help_line_27"); |
bpatel@766 | 290 | Content serialPara = HtmlTree.P(line27); |
bpatel@766 | 291 | liSerial.addContent(serialPara); |
bpatel@766 | 292 | ul.addContent(liSerial); |
bpatel@766 | 293 | Content constHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, |
bpatel@766 | 294 | getResource("doclet.Constants_Summary")); |
bpatel@766 | 295 | Content liConst = HtmlTree.LI(HtmlStyle.blockList, constHead); |
bpatel@766 | 296 | Content line28 = getResource("doclet.Help_line_28"); |
bpatel@766 | 297 | Content constPara = HtmlTree.P(line28); |
bpatel@766 | 298 | liConst.addContent(constPara); |
bpatel@766 | 299 | ul.addContent(liConst); |
bpatel@766 | 300 | Content divContent = HtmlTree.DIV(HtmlStyle.contentContainer, ul); |
bpatel@766 | 301 | Content line29 = HtmlTree.EM(getResource("doclet.Help_line_29")); |
bpatel@766 | 302 | divContent.addContent(line29); |
bpatel@766 | 303 | contentTree.addContent(divContent); |
duke@1 | 304 | } |
duke@1 | 305 | |
duke@1 | 306 | /** |
bpatel@766 | 307 | * Get the help label. |
bpatel@766 | 308 | * |
bpatel@766 | 309 | * @return a content tree for the help label |
duke@1 | 310 | */ |
bpatel@766 | 311 | protected Content getNavLinkHelp() { |
bpatel@766 | 312 | Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, helpLabel); |
bpatel@766 | 313 | return li; |
duke@1 | 314 | } |
duke@1 | 315 | } |