/* * @(#)AbstractSubWriter.java 1.29 00/02/17 * * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. * * This software is the proprietary information of Sun Microsystems, Inc. * Use is subject to license terms. * */ package com.sun.tools.doclets.standard; import com.sun.tools.doclets.*; import com.sun.javadoc.*; import java.util.*; import java.lang.reflect.Modifier; /** * * @author Robert Field * @author Atul M Dambalkar */ public abstract class AbstractSubWriter { protected final SubWriterHolderWriter writer; protected final ClassDoc classdoc; public VisibleMemberMap visibleMemberMap = null; public List visibleClasses = null; public boolean nodepr = Standard.configuration().nodeprecated; public AbstractSubWriter(SubWriterHolderWriter writer, ClassDoc classdoc) { this.writer = writer; this.classdoc = classdoc; buildVisibleMemberMap(); } public AbstractSubWriter(SubWriterHolderWriter writer) { this.writer = writer; classdoc = null; } /*** abstracts ***/ public abstract int getMemberKind(); public abstract void printSummaryLabel(ClassDoc cd); public abstract void printInheritedSummaryLabel(ClassDoc cd); public abstract void printSummaryAnchor(ClassDoc cd); public abstract void printInheritedSummaryAnchor(ClassDoc cd); protected abstract void printSummaryType(ProgramElementDoc member); protected abstract void printSummaryLink(ClassDoc cd, ProgramElementDoc member); protected abstract void printInheritedSummaryLink(ClassDoc cd, ProgramElementDoc member); protected abstract void printHeader(ClassDoc cd); protected abstract void printBodyHtmlEnd(ClassDoc cd); protected abstract void printMember(ProgramElementDoc elem); protected abstract void printDeprecatedLink(ProgramElementDoc member); protected abstract void printNavSummaryLink(ClassDoc cd, boolean link); protected abstract void printNavDetailLink(boolean link); /*** ***/ protected void print(String str) { writer.print(str); writer.displayLength += str.length(); } protected void print(char ch) { writer.print(ch); writer.displayLength++; } protected void bold(String str) { writer.bold(str); writer.displayLength += str.length(); } protected void printTypeLinkNoDimension(Type type) { ClassDoc cd = type.asClassDoc(); if (cd == null) { print(type.typeName()); } else { writer.printClassLink(cd); } } protected void printTypeLink(Type type) { printTypeLinkNoDimension(type); print(type.dimension()); } /** * Return a string describing the access modifier flags. * Don't include native or synchronized. * * The modifier names are returned in canonical order, as * specified by The Java Language Specification. */ protected String modifierString(MemberDoc member) { int ms = member.modifierSpecifier(); int no = Modifier.NATIVE | Modifier.SYNCHRONIZED; return Modifier.toString(ms & ~no); } protected String typeString(MemberDoc member) { String type = ""; if (member instanceof MethodDoc) { type = ((MethodDoc)member).returnType().toString(); } else if (member instanceof FieldDoc) { type = ((FieldDoc)member).type().toString(); } return type; } protected void printModifiers(MemberDoc member) { String mod; mod = modifierString(member); if(mod.length() > 0) { print(mod); print(' '); } } protected void printTypedName(Type type, String name) { if (type != null) { printTypeLink(type); } if(name.length() > 0) { writer.space(); writer.print(name); } } protected String makeSpace(int len) { if (len <= 0) { return ""; } StringBuffer sb = new StringBuffer(len); for(int i = 0; i < len; i++) { sb.append(' '); } return sb.toString(); } /** * Print 'static' if static and type link. */ protected void printStaticAndType(boolean isStatic, Type type) { writer.printTypeSummaryHeader(); if (isStatic) { print("static"); } writer.space(); if (type != null) { printTypeLink(type); } writer.printTypeSummaryFooter(); } protected void printModifierAndType(ProgramElementDoc member, Type type) { writer.printTypeSummaryHeader(); printModifier(member); if (type == null) { if (member.isClass()) { print("class"); } else { print("interface"); } } else { printTypeLink(type); } writer.printTypeSummaryFooter(); } protected void printModifier(ProgramElementDoc member) { if (member.isProtected()) { print("protected "); } else if (member.isPrivate()) { print("private "); } else if (!member.isPublic()) { // Package private writer.printText("doclet.Package_private"); print(" "); } if (member.isMethod() && ((MethodDoc)member).isAbstract()) { print("abstract "); } if (member.isStatic()) { print("static"); } writer.space(); } protected void printComment(ProgramElementDoc member) { if (member.inlineTags().length > 0) { writer.dd(); writer.printInlineComment(member); } } protected void printTags(ProgramElementDoc member) { Tag[] since = member.tags("since"); if (member.seeTags().length + since.length > 0) { writer.dd(); writer.dl(); writer.printSeeTags(member); writer.printSinceTag(member); writer.dlEnd(); writer.ddEnd(); } } protected String name(ProgramElementDoc member) { return member.name(); } protected void printDeprecated(ProgramElementDoc member) { Tag[] deprs = member.tags("deprecated"); if (deprs.length > 0) { writer.dd(); writer.boldText("doclet.Deprecated"); writer.space(); writer.printInlineDeprecatedComment(deprs[0]); writer.p(); } else { printDeprecatedClassComment(member); } } protected void printDeprecatedClassComment(ProgramElementDoc member) { Tag[] deprs = member.containingClass().tags("deprecated"); if (deprs.length > 0) { writer.dd(); writer.boldText("doclet.Deprecated"); writer.space(); } } protected void printHead(MemberDoc member) { writer.h3(); writer.print(member.name()); writer.h3End(); } protected void printFullComment(ProgramElementDoc member) { writer.dl(); printDeprecated(member); printCommentAndTags(member); writer.dlEnd(); } protected void printCommentAndTags(ProgramElementDoc member) { printComment(member); printTags(member); } /** * Forward to containing writer */ public void printSummaryHeader(ClassDoc cd) { writer.printSummaryHeader(this, cd); } /** * Forward to containing writer */ public void printInheritedSummaryHeader(ClassDoc cd) { writer.printInheritedSummaryHeader(this, cd); } /** * Forward to containing writer */ public void printInheritedSummaryFooter(ClassDoc cd) { writer.printInheritedSummaryFooter(this, cd); } /** * Forward to containing writer */ public void printSummaryFooter(ClassDoc cd) { writer.printSummaryFooter(this, cd); } /** * Forward to containing writer */ public void printSummaryMember(ClassDoc cd, ProgramElementDoc member) { writer.printSummaryMember(this, cd, member); } /** * Forward to containing writer */ public void printInheritedSummaryMember(ClassDoc cd, ProgramElementDoc member) { writer.printInheritedSummaryMember(this, cd, member); } public void printMembersSummary() { List members = new ArrayList(members(classdoc)); if (members.size() > 0) { printSummaryHeader(classdoc); Collections.sort(members); for (int i = 0; i < members.size(); ++i) { printSummaryMember(classdoc, (ProgramElementDoc)(members.get(i))); } printSummaryFooter(classdoc); } } public void printInheritedMembersSummary() { for (int i = 0; i < visibleClasses.size(); i++) { ClassDoc inhclass = (ClassDoc)(visibleClasses.get(i)); if (inhclass == classdoc) { continue; } List inhmembers = new ArrayList(members(inhclass)); if (inhmembers.size() > 0) { Collections.sort(inhmembers); printInheritedSummaryHeader(inhclass); printInheritedSummaryMember(inhclass, (ProgramElementDoc)(inhmembers.get(0))); for (int j = 1; j < inhmembers.size(); ++j) { print(", "); printInheritedSummaryMember(inhclass, (ProgramElementDoc)(inhmembers.get(j))); } printInheritedSummaryFooter(inhclass); } } } public void printMembers() { List members = members(classdoc); if (members.size() > 0) { printHeader(classdoc); for (int i = 0; i < members.size(); ++i) { if (i > 0) { writer.printMemberHeader(); } writer.println(""); printMember((ProgramElementDoc)(members.get(i))); writer.printMemberFooter(); } printBodyHtmlEnd(classdoc); } } /** * Generate the code for listing the deprecated APIs. Create the table * format for listing the API. Call methods from the sub-class to complete * the generation. */ protected void printDeprecatedAPI(List deprmembers, String headingKey) { if (deprmembers.size() > 0) { writer.tableIndexSummary(); writer.tableHeaderStart("#CCCCFF"); writer.boldText(headingKey); writer.tableHeaderEnd(); for (int i = 0; i < deprmembers.size(); i++) { ProgramElementDoc member =(ProgramElementDoc)deprmembers.get(i); ClassDoc cd = member.containingClass(); writer.trBgcolorStyle("white", "TableRowColor"); writer.summaryRow(0); printDeprecatedLink(member); writer.br(); writer.printNbsps(); writer.printInlineDeprecatedComment(member.tags("deprecated")[0]); writer.space(); writer.summaryRowEnd(); writer.trEnd(); } writer.tableEnd(); writer.space(); writer.p(); } } /** * Print use info. */ protected void printUseInfo(Object mems, String heading) { if (mems == null) { return; } List members = (List)mems; if (members.size() > 0) { writer.tableIndexSummary(); writer.tableUseInfoHeaderStart("#CCCCFF"); writer.print(heading); writer.tableHeaderEnd(); for (Iterator it = members.iterator(); it.hasNext(); ) { ProgramElementDoc pgmdoc = (ProgramElementDoc)it.next(); ClassDoc cd = pgmdoc.containingClass(); writer.printSummaryLinkType(this, pgmdoc); if (cd != null && !(pgmdoc instanceof ConstructorDoc) && !(pgmdoc instanceof ClassDoc)) { // Add class context writer.bold(cd.name() + "."); } printSummaryLink(cd, pgmdoc); writer.printSummaryLinkComment(this, pgmdoc); } writer.tableEnd(); writer.space(); writer.p(); } } protected void navSummaryLink() { List members = members(classdoc); if (members.size() > 0) { printNavSummaryLink(null, true); return; } else { ClassDoc icd = classdoc.superclass(); while (icd != null) { List inhmembers = members(icd); if (inhmembers.size() > 0) { printNavSummaryLink(icd, true); return; } icd = icd.superclass(); } } printNavSummaryLink(null, false); } protected void navDetailLink() { List members = visibleMemberMap.getMembersFor(classdoc); printNavDetailLink(members.size() > 0? true: false); } protected void serialWarning(String key, String a1, String a2) { if (Standard.configuration().serialwarn) { Standard.configuration().standardmessage.warning(key, a1, a2); } } public void buildVisibleMemberMap() { visibleMemberMap = new VisibleMemberMap(classdoc, getMemberKind(), nodepr); visibleClasses = visibleMemberMap.getVisibleClassesList(); } public ProgramElementDoc[] eligibleMembers(ProgramElementDoc[] members) { return nodepr? Util.excludeDeprecatedMembers(members): members; } public List members(ClassDoc cd) { return visibleMemberMap.getMembersFor(cd); } }