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

Tue, 28 Dec 2010 15:54:52 -0800

author
ohair
date
Tue, 28 Dec 2010 15:54:52 -0800
changeset 798
4868a36f6fd8
parent 766
90af8d87741f
child 1357
c75be5bc5283
permissions
-rw-r--r--

6962318: Update copyright year
Reviewed-by: xdono

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

mercurial