blob: 27d0cd8e8ddb0e53f2d9a46d558c950a7687f8a8 [file] [log] [blame]
/*
* Copyright 2003-2008 Sun Microsystems, Inc. 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. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.tools.doclets.internal.toolkit.builders;
import com.sun.tools.doclets.internal.toolkit.util.*;
import com.sun.tools.doclets.internal.toolkit.*;
import com.sun.javadoc.*;
import java.util.*;
import java.lang.reflect.*;
/**
* Builds the member summary.
*
* This code is not part of an API.
* It is implementation that is subject to change.
* Do not use it as an API
*
* @author Jamie Ho
* @since 1.5
*/
public class MemberSummaryBuilder extends AbstractMemberBuilder {
/**
* The XML root for this builder.
*/
public static final String NAME = "MemberSummary";
/**
* The visible members for the given class.
*/
private VisibleMemberMap[] visibleMemberMaps;
/**
* The member summary writers for the given class.
*/
private MemberSummaryWriter[] memberSummaryWriters;
/**
* The type being documented.
*/
private ClassDoc classDoc;
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 annotationTypeWriter the writer for the class whose members are
* being summarized.
* @param configuration the current configuration of the doclet.
*/
public static MemberSummaryBuilder getInstance(
AnnotationTypeWriter annotationTypeWriter, Configuration configuration)
throws Exception {
MemberSummaryBuilder builder = new MemberSummaryBuilder(configuration);
builder.classDoc = annotationTypeWriter.getAnnotationTypeDoc();
builder.init(annotationTypeWriter);
return builder;
}
private void init(Object writer) throws Exception {
visibleMemberMaps =
new VisibleMemberMap[VisibleMemberMap.NUM_MEMBER_TYPES];
for (int i = 0; i < VisibleMemberMap.NUM_MEMBER_TYPES; i++) {
visibleMemberMaps[i] =
new VisibleMemberMap(
classDoc,
i,
configuration.nodeprecated);
}
memberSummaryWriters =
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);
} else {
memberSummaryWriters[i] =
visibleMemberMaps[i].noVisibleMembers()?
null :
configuration.getWriterFactory().getMemberSummaryWriter(
(ClassWriter) writer, i);
}
}
}
/**
* {@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 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);
}
/**
* {@inheritDoc}
*/
public void invokeMethod(
String methodName,
Class[] paramClasses,
Object[] params)
throws Exception {
if (DEBUG) {
configuration.root.printError(
"DEBUG: " + this.getClass().getName() + "." + methodName);
}
Method method = this.getClass().getMethod(methodName, paramClasses);
method.invoke(this, params);
}
/**
* 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;
}
/**
* Build the summary for the enum constants.
*/
public void buildEnumConstantsSummary() {
buildSummary(
memberSummaryWriters[VisibleMemberMap.ENUM_CONSTANTS],
visibleMemberMaps[VisibleMemberMap.ENUM_CONSTANTS]);
}
/**
* Build the summary for the optional members.
*/
public void buildAnnotationTypeOptionalMemberSummary() {
buildSummary(
memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL],
visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL]);
}
/**
* Build the summary for the optional members.
*/
public void buildAnnotationTypeRequiredMemberSummary() {
buildSummary(
memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED],
visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED]);
}
/**
* Build the summary for the fields.
*/
public void buildFieldsSummary() {
buildSummary(
memberSummaryWriters[VisibleMemberMap.FIELDS],
visibleMemberMaps[VisibleMemberMap.FIELDS]);
}
/**
* Build the inherited summary for the fields.
*/
public void buildFieldsInheritedSummary() {
buildInheritedSummary(
memberSummaryWriters[VisibleMemberMap.FIELDS],
visibleMemberMaps[VisibleMemberMap.FIELDS]);
}
/**
* Build the summary for the nested classes.
*/
public void buildNestedClassesSummary() {
buildSummary(
memberSummaryWriters[VisibleMemberMap.INNERCLASSES],
visibleMemberMaps[VisibleMemberMap.INNERCLASSES]);
}
/**
* Build the inherited summary for the nested classes.
*/
public void buildNestedClassesInheritedSummary() {
buildInheritedSummary(
memberSummaryWriters[VisibleMemberMap.INNERCLASSES],
visibleMemberMaps[VisibleMemberMap.INNERCLASSES]);
}
/**
* Build the method summary.
*/
public void buildMethodsSummary() {
buildSummary(
memberSummaryWriters[VisibleMemberMap.METHODS],
visibleMemberMaps[VisibleMemberMap.METHODS]);
}
/**
* Build the inherited method summary.
*/
public void buildMethodsInheritedSummary() {
buildInheritedSummary(
memberSummaryWriters[VisibleMemberMap.METHODS],
visibleMemberMaps[VisibleMemberMap.METHODS]);
}
/**
* Build the constructor summary.
*/
public void buildConstructorsSummary() {
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<ProgramElementDoc> members = new ArrayList<ProgramElementDoc>(visibleMemberMap.getLeafClassMembers(
configuration));
if (members.size() > 0) {
Collections.sort(members);
writer.writeMemberSummaryHeader(classDoc);
for (int i = 0; i < members.size(); i++) {
ProgramElementDoc member = members.get(i);
Tag[] firstSentenceTags = member.firstSentenceTags();
if (member instanceof MethodDoc && firstSentenceTags.length == 0) {
//Inherit comments from overriden or implemented method if
//necessary.
DocFinder.Output inheritedDoc =
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.writeMemberSummaryFooter(classDoc);
}
}
/**
* Build the inherited member summary for the given methods.
*
* @param writer the writer for this member summary.
* @param visibleMemberMap the map for the members to document.
*/
private void buildInheritedSummary(MemberSummaryWriter writer,
VisibleMemberMap visibleMemberMap) {
for (Iterator iter = visibleMemberMap.getVisibleClassesList().iterator();
iter.hasNext();) {
ClassDoc inhclass = (ClassDoc) (iter.next());
if (! (inhclass.isPublic() ||
Util.isLinkable(inhclass, configuration))) {
continue;
}
if (inhclass == classDoc) {
continue;
}
List<ProgramElementDoc> inhmembers = visibleMemberMap.getMembersFor(inhclass);
if (inhmembers.size() > 0) {
Collections.sort(inhmembers);
writer.writeInheritedMemberSummaryHeader(inhclass);
for (int j = 0; j < inhmembers.size(); ++j) {
writer.writeInheritedMemberSummary(
inhclass.isPackagePrivate() &&
! Util.isLinkable(inhclass, configuration) ?
classDoc : inhclass,
inhmembers.get(j),
j == 0,
j == inhmembers.size() - 1);
}
writer.writeInheritedMemberSummaryFooter(inhclass);
}
}
}
}