src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java

Wed, 10 Oct 2012 16:48:21 -0700

author
jjg
date
Wed, 10 Oct 2012 16:48:21 -0700
changeset 1359
25e14ad23cef
parent 1358
fc123bdeddb8
child 1410
bfec2a1cc869
permissions
-rw-r--r--

8000665: fix "internal API" comments on javadoc files
Reviewed-by: darcy

duke@1 1 /*
jjg@1357 2 * Copyright (c) 2003, 2012, 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.internal.toolkit.builders;
duke@1 27
bpatel@766 28 import java.util.*;
jjg@1357 29
jjg@1357 30 import com.sun.javadoc.*;
jjg@1357 31 import com.sun.tools.doclets.internal.toolkit.*;
duke@1 32 import com.sun.tools.doclets.internal.toolkit.util.*;
duke@1 33
duke@1 34 /**
duke@1 35 * Builds the member summary.
duke@1 36 *
jjg@1359 37 * <p><b>This is NOT part of any supported API.
jjg@1359 38 * If you write code that depends on this, you do so at your own risk.
jjg@1359 39 * This code and its internal interfaces are subject to change or
jjg@1359 40 * deletion without notice.</b>
duke@1 41 *
duke@1 42 * @author Jamie Ho
bpatel@766 43 * @author Bhavesh Patel (Modified)
duke@1 44 * @since 1.5
duke@1 45 */
duke@1 46 public class MemberSummaryBuilder extends AbstractMemberBuilder {
duke@1 47
bpatel@766 48 /**
bpatel@766 49 * The XML root for this builder.
bpatel@766 50 */
bpatel@766 51 public static final String NAME = "MemberSummary";
duke@1 52
bpatel@766 53 /**
bpatel@766 54 * The visible members for the given class.
bpatel@766 55 */
bpatel@766 56 private VisibleMemberMap[] visibleMemberMaps;
duke@1 57
bpatel@766 58 /**
bpatel@766 59 * The member summary writers for the given class.
bpatel@766 60 */
bpatel@766 61 private MemberSummaryWriter[] memberSummaryWriters;
duke@1 62
bpatel@766 63 /**
bpatel@766 64 * The type being documented.
bpatel@766 65 */
bpatel@766 66 private ClassDoc classDoc;
duke@1 67
bpatel@766 68 private MemberSummaryBuilder(Configuration configuration) {
bpatel@766 69 super(configuration);
bpatel@766 70 }
duke@1 71
bpatel@766 72 /**
bpatel@766 73 * Construct a new MemberSummaryBuilder.
bpatel@766 74 *
bpatel@766 75 * @param classWriter the writer for the class whose members are being
bpatel@766 76 * summarized.
bpatel@766 77 * @param configuration the current configuration of the doclet.
bpatel@766 78 */
bpatel@766 79 public static MemberSummaryBuilder getInstance(
bpatel@766 80 ClassWriter classWriter, Configuration configuration)
bpatel@766 81 throws Exception {
bpatel@766 82 MemberSummaryBuilder builder = new MemberSummaryBuilder(configuration);
bpatel@766 83 builder.classDoc = classWriter.getClassDoc();
bpatel@766 84 builder.init(classWriter);
bpatel@766 85 return builder;
bpatel@766 86 }
duke@1 87
duke@1 88 /**
duke@1 89 * Construct a new MemberSummaryBuilder.
duke@1 90 *
duke@1 91 * @param annotationTypeWriter the writer for the class whose members are
duke@1 92 * being summarized.
duke@1 93 * @param configuration the current configuration of the doclet.
duke@1 94 */
duke@1 95 public static MemberSummaryBuilder getInstance(
bpatel@766 96 AnnotationTypeWriter annotationTypeWriter, Configuration configuration)
bpatel@766 97 throws Exception {
duke@1 98 MemberSummaryBuilder builder = new MemberSummaryBuilder(configuration);
duke@1 99 builder.classDoc = annotationTypeWriter.getAnnotationTypeDoc();
duke@1 100 builder.init(annotationTypeWriter);
duke@1 101 return builder;
duke@1 102 }
duke@1 103
duke@1 104 private void init(Object writer) throws Exception {
duke@1 105 visibleMemberMaps =
bpatel@766 106 new VisibleMemberMap[VisibleMemberMap.NUM_MEMBER_TYPES];
duke@1 107 for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
duke@1 108 visibleMemberMaps[i] =
bpatel@766 109 new VisibleMemberMap(
duke@1 110 classDoc,
duke@1 111 i,
duke@1 112 configuration.nodeprecated);
duke@1 113 }
duke@1 114 memberSummaryWriters =
bpatel@766 115 new MemberSummaryWriter[VisibleMemberMap.NUM_MEMBER_TYPES];
duke@1 116 for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
duke@1 117 if (classDoc.isAnnotationType()) {
duke@1 118 memberSummaryWriters[i] =
duke@1 119 visibleMemberMaps[i].noVisibleMembers()?
duke@1 120 null :
duke@1 121 configuration.getWriterFactory().getMemberSummaryWriter(
bpatel@766 122 (AnnotationTypeWriter) writer, i);
duke@1 123 } else {
duke@1 124 memberSummaryWriters[i] =
duke@1 125 visibleMemberMaps[i].noVisibleMembers()?
duke@1 126 null :
duke@1 127 configuration.getWriterFactory().getMemberSummaryWriter(
bpatel@766 128 (ClassWriter) writer, i);
duke@1 129 }
duke@1 130 }
duke@1 131
duke@1 132 }
duke@1 133
bpatel@766 134 /**
bpatel@766 135 * {@inheritDoc}
bpatel@766 136 */
bpatel@766 137 public String getName() {
bpatel@766 138 return NAME;
bpatel@766 139 }
duke@1 140
bpatel@766 141 /**
bpatel@766 142 * Return the specified visible member map.
bpatel@766 143 *
bpatel@766 144 * @param type the type of visible member map to return.
bpatel@766 145 * @return the specified visible member map.
bpatel@766 146 * @throws ArrayIndexOutOfBoundsException when the type is invalid.
bpatel@766 147 * @see VisibleMemberMap
bpatel@766 148 */
bpatel@766 149 public VisibleMemberMap getVisibleMemberMap(int type) {
bpatel@766 150 return visibleMemberMaps[type];
bpatel@766 151 }
duke@1 152
bpatel@766 153 /**
bpatel@766 154 * Return the specified member summary writer.
bpatel@766 155 *
bpatel@766 156 * @param type the type of member summary writer to return.
bpatel@766 157 * @return the specified member summary writer.
bpatel@766 158 * @throws ArrayIndexOutOfBoundsException when the type is invalid.
bpatel@766 159 * @see VisibleMemberMap
bpatel@766 160 */
bpatel@766 161 public MemberSummaryWriter getMemberSummaryWriter(int type) {
bpatel@766 162 return memberSummaryWriters[type];
bpatel@766 163 }
duke@1 164
bpatel@766 165 /**
bpatel@766 166 * Returns a list of methods that will be documented for the given class.
bpatel@766 167 * This information can be used for doclet specific documentation
bpatel@766 168 * generation.
bpatel@766 169 *
bpatel@766 170 * @param type the type of members to return.
bpatel@766 171 * @return a list of methods that will be documented.
bpatel@766 172 * @see VisibleMemberMap
bpatel@766 173 */
bpatel@766 174 public List<ProgramElementDoc> members(int type) {
bpatel@766 175 return visibleMemberMaps[type].getLeafClassMembers(configuration);
bpatel@766 176 }
duke@1 177
bpatel@766 178 /**
bpatel@766 179 * Return true it there are any members to summarize.
bpatel@766 180 *
bpatel@766 181 * @return true if there are any members to summarize.
bpatel@766 182 */
bpatel@766 183 public boolean hasMembersToDocument() {
duke@1 184 if (classDoc instanceof AnnotationTypeDoc) {
duke@1 185 return ((AnnotationTypeDoc) classDoc).elements().length > 0;
duke@1 186 }
bpatel@766 187 for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
bpatel@766 188 VisibleMemberMap members = visibleMemberMaps[i];
bpatel@766 189 if (!members.noVisibleMembers()) {
bpatel@766 190 return true;
bpatel@766 191 }
duke@1 192 }
bpatel@766 193 return false;
bpatel@766 194 }
duke@1 195
duke@1 196 /**
bpatel@766 197 * Build the summary for the enum constants.
bpatel@766 198 *
bpatel@766 199 * @param node the XML element that specifies which components to document
bpatel@766 200 * @param memberSummaryTree the content tree to which the documentation will be added
duke@1 201 */
bpatel@766 202 public void buildEnumConstantsSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 203 MemberSummaryWriter writer =
bpatel@766 204 memberSummaryWriters[VisibleMemberMap.ENUM_CONSTANTS];
bpatel@766 205 VisibleMemberMap visibleMemberMap =
bpatel@766 206 visibleMemberMaps[VisibleMemberMap.ENUM_CONSTANTS];
bpatel@766 207 addSummary(writer, visibleMemberMap, false, memberSummaryTree);
duke@1 208 }
duke@1 209
duke@1 210 /**
duke@1 211 * Build the summary for the optional members.
bpatel@766 212 *
bpatel@766 213 * @param node the XML element that specifies which components to document
bpatel@766 214 * @param memberSummaryTree the content tree to which the documentation will be added
duke@1 215 */
bpatel@766 216 public void buildAnnotationTypeOptionalMemberSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 217 MemberSummaryWriter writer =
bpatel@766 218 memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL];
bpatel@766 219 VisibleMemberMap visibleMemberMap =
bpatel@766 220 visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL];
bpatel@766 221 addSummary(writer, visibleMemberMap, false, memberSummaryTree);
duke@1 222 }
duke@1 223
bpatel@766 224 /**
bpatel@766 225 * Build the summary for the optional members.
bpatel@766 226 *
bpatel@766 227 * @param node the XML element that specifies which components to document
bpatel@766 228 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 229 */
bpatel@766 230 public void buildAnnotationTypeRequiredMemberSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 231 MemberSummaryWriter writer =
bpatel@766 232 memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED];
bpatel@766 233 VisibleMemberMap visibleMemberMap =
bpatel@766 234 visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED];
bpatel@766 235 addSummary(writer, visibleMemberMap, false, memberSummaryTree);
bpatel@766 236 }
duke@1 237
bpatel@766 238 /**
bpatel@766 239 * Build the summary for the fields.
bpatel@766 240 *
bpatel@766 241 * @param node the XML element that specifies which components to document
bpatel@766 242 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 243 */
bpatel@766 244 public void buildFieldsSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 245 MemberSummaryWriter writer =
bpatel@766 246 memberSummaryWriters[VisibleMemberMap.FIELDS];
bpatel@766 247 VisibleMemberMap visibleMemberMap =
bpatel@766 248 visibleMemberMaps[VisibleMemberMap.FIELDS];
bpatel@766 249 addSummary(writer, visibleMemberMap, true, memberSummaryTree);
bpatel@766 250 }
duke@1 251
bpatel@766 252 /**
bpatel@766 253 * Build the summary for the nested classes.
bpatel@766 254 *
bpatel@766 255 * @param node the XML element that specifies which components to document
bpatel@766 256 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 257 */
bpatel@766 258 public void buildNestedClassesSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 259 MemberSummaryWriter writer =
bpatel@766 260 memberSummaryWriters[VisibleMemberMap.INNERCLASSES];
bpatel@766 261 VisibleMemberMap visibleMemberMap =
bpatel@766 262 visibleMemberMaps[VisibleMemberMap.INNERCLASSES];
bpatel@766 263 addSummary(writer, visibleMemberMap, true, memberSummaryTree);
bpatel@766 264 }
duke@1 265
bpatel@766 266 /**
bpatel@766 267 * Build the method summary.
bpatel@766 268 *
bpatel@766 269 * @param node the XML element that specifies which components to document
bpatel@766 270 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 271 */
bpatel@766 272 public void buildMethodsSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 273 MemberSummaryWriter writer =
bpatel@766 274 memberSummaryWriters[VisibleMemberMap.METHODS];
bpatel@766 275 VisibleMemberMap visibleMemberMap =
bpatel@766 276 visibleMemberMaps[VisibleMemberMap.METHODS];
bpatel@766 277 addSummary(writer, visibleMemberMap, true, memberSummaryTree);
bpatel@766 278 }
duke@1 279
bpatel@766 280 /**
bpatel@766 281 * Build the constructor summary.
bpatel@766 282 *
bpatel@766 283 * @param node the XML element that specifies which components to document
bpatel@766 284 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 285 */
bpatel@766 286 public void buildConstructorsSummary(XMLNode node, Content memberSummaryTree) {
bpatel@766 287 MemberSummaryWriter writer =
bpatel@766 288 memberSummaryWriters[VisibleMemberMap.CONSTRUCTORS];
bpatel@766 289 VisibleMemberMap visibleMemberMap =
bpatel@766 290 visibleMemberMaps[VisibleMemberMap.CONSTRUCTORS];
bpatel@766 291 addSummary(writer, visibleMemberMap, false, memberSummaryTree);
bpatel@766 292 }
duke@1 293
bpatel@766 294 /**
bpatel@766 295 * Build the member summary for the given members.
bpatel@766 296 *
bpatel@766 297 * @param writer the summary writer to write the output.
bpatel@766 298 * @param visibleMemberMap the given members to summarize.
bpatel@766 299 * @param summaryTreeList list of content trees to which the documentation will be added
bpatel@766 300 */
bpatel@766 301 private void buildSummary(MemberSummaryWriter writer,
bpatel@766 302 VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) {
jjg@74 303 List<ProgramElementDoc> members = new ArrayList<ProgramElementDoc>(visibleMemberMap.getLeafClassMembers(
bpatel@766 304 configuration));
duke@1 305 if (members.size() > 0) {
duke@1 306 Collections.sort(members);
bpatel@766 307 Content tableTree = writer.getSummaryTableTree(classDoc);
duke@1 308 for (int i = 0; i < members.size(); i++) {
jjg@74 309 ProgramElementDoc member = members.get(i);
duke@1 310 Tag[] firstSentenceTags = member.firstSentenceTags();
duke@1 311 if (member instanceof MethodDoc && firstSentenceTags.length == 0) {
duke@1 312 //Inherit comments from overriden or implemented method if
duke@1 313 //necessary.
duke@1 314 DocFinder.Output inheritedDoc =
bpatel@766 315 DocFinder.search(new DocFinder.Input((MethodDoc) member));
duke@1 316 if (inheritedDoc.holder != null &&
duke@1 317 inheritedDoc.holder.firstSentenceTags().length > 0) {
duke@1 318 firstSentenceTags = inheritedDoc.holder.firstSentenceTags();
duke@1 319 }
duke@1 320 }
bpatel@766 321 writer.addMemberSummary(classDoc, member, firstSentenceTags, tableTree, i);
duke@1 322 }
bpatel@766 323 summaryTreeList.add(tableTree);
duke@1 324 }
bpatel@766 325 }
duke@1 326
duke@1 327 /**
duke@1 328 * Build the inherited member summary for the given methods.
duke@1 329 *
bpatel@766 330 * @param writer the writer for this member summary.
duke@1 331 * @param visibleMemberMap the map for the members to document.
bpatel@766 332 * @param summaryTreeList list of content trees to which the documentation will be added
duke@1 333 */
bpatel@766 334 private void buildInheritedSummary(MemberSummaryWriter writer,
bpatel@766 335 VisibleMemberMap visibleMemberMap, LinkedList<Content> summaryTreeList) {
mcimadamore@184 336 for (Iterator<ClassDoc> iter = visibleMemberMap.getVisibleClassesList().iterator();
duke@1 337 iter.hasNext();) {
mcimadamore@184 338 ClassDoc inhclass = iter.next();
duke@1 339 if (! (inhclass.isPublic() ||
bpatel@766 340 Util.isLinkable(inhclass, configuration))) {
duke@1 341 continue;
duke@1 342 }
duke@1 343 if (inhclass == classDoc) {
duke@1 344 continue;
duke@1 345 }
jjg@74 346 List<ProgramElementDoc> inhmembers = visibleMemberMap.getMembersFor(inhclass);
duke@1 347 if (inhmembers.size() > 0) {
duke@1 348 Collections.sort(inhmembers);
bpatel@766 349 Content inheritedTree = writer.getInheritedSummaryHeader(inhclass);
bpatel@766 350 Content linksTree = writer.getInheritedSummaryLinksTree();
duke@1 351 for (int j = 0; j < inhmembers.size(); ++j) {
bpatel@766 352 writer.addInheritedMemberSummary(
bpatel@766 353 inhclass.isPackagePrivate() &&
duke@1 354 ! Util.isLinkable(inhclass, configuration) ?
duke@1 355 classDoc : inhclass,
bpatel@766 356 inhmembers.get(j),
bpatel@766 357 j == 0,
bpatel@766 358 j == inhmembers.size() - 1, linksTree);
duke@1 359 }
bpatel@766 360 inheritedTree.addContent(linksTree);
bpatel@766 361 summaryTreeList.add(writer.getMemberTree(inheritedTree));
duke@1 362 }
duke@1 363 }
duke@1 364 }
bpatel@766 365
bpatel@766 366 /**
bpatel@766 367 * Add the summary for the documentation.
bpatel@766 368 *
bpatel@766 369 * @param writer the writer for this member summary.
bpatel@766 370 * @param visibleMemberMap the map for the members to document.
bpatel@766 371 * @param showInheritedSummary true if inherited summary should be documented
bpatel@766 372 * @param memberSummaryTree the content tree to which the documentation will be added
bpatel@766 373 */
bpatel@766 374 private void addSummary(MemberSummaryWriter writer,
bpatel@766 375 VisibleMemberMap visibleMemberMap, boolean showInheritedSummary,
bpatel@766 376 Content memberSummaryTree) {
bpatel@766 377 LinkedList<Content> summaryTreeList = new LinkedList<Content>();
bpatel@766 378 buildSummary(writer, visibleMemberMap, summaryTreeList);
bpatel@766 379 if (showInheritedSummary)
bpatel@766 380 buildInheritedSummary(writer, visibleMemberMap, summaryTreeList);
bpatel@766 381 if (!summaryTreeList.isEmpty()) {
bpatel@766 382 Content memberTree = writer.getMemberSummaryHeader(
bpatel@766 383 classDoc, memberSummaryTree);
bpatel@766 384 for (int i = 0; i < summaryTreeList.size(); i++) {
bpatel@766 385 memberTree.addContent(summaryTreeList.get(i));
bpatel@766 386 }
bpatel@766 387 memberSummaryTree.addContent(writer.getMemberTree(memberTree));
bpatel@766 388 }
bpatel@766 389 }
duke@1 390 }

mercurial