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

Thu, 15 Nov 2012 09:18:36 -0800

author
jjg
date
Thu, 15 Nov 2012 09:18:36 -0800
changeset 1410
bfec2a1cc869
parent 1359
25e14ad23cef
child 1417
522a1ee72340
permissions
-rw-r--r--

8000800: javadoc uses static non-final fields
Reviewed-by: bpatel

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

mercurial