src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java

Thu, 02 Oct 2008 19:58:40 -0700

author
xdono
date
Thu, 02 Oct 2008 19:58:40 -0700
changeset 117
24a47c3062fe
parent 74
5a9172b251dd
child 182
47a62d8d98b4
permissions
-rw-r--r--

6754988: Update copyright year
Summary: Update for files that have been modified starting July 2008
Reviewed-by: ohair, tbell

duke@1 1 /*
xdono@117 2 * Copyright 1997-2008 Sun Microsystems, Inc. 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
duke@1 7 * published by the Free Software Foundation. Sun designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
duke@1 9 * by Sun 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 *
duke@1 21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@1 22 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@1 23 * have any questions.
duke@1 24 */
duke@1 25
duke@1 26 package com.sun.tools.doclets.formats.html;
duke@1 27
duke@1 28 import com.sun.tools.doclets.internal.toolkit.util.*;
duke@1 29 import com.sun.tools.doclets.internal.toolkit.taglets.*;
duke@1 30
duke@1 31 import com.sun.javadoc.*;
duke@1 32 import java.util.*;
duke@1 33 import java.lang.reflect.Modifier;
duke@1 34
duke@1 35 /**
duke@1 36 * The base class for member writers.
duke@1 37 *
duke@1 38 * @author Robert Field
duke@1 39 * @author Atul M Dambalkar
duke@1 40 * @author Jamie Ho (Re-write)
duke@1 41 */
duke@1 42 public abstract class AbstractMemberWriter {
duke@1 43
duke@1 44 protected boolean printedSummaryHeader = false;
duke@1 45 protected final SubWriterHolderWriter writer;
duke@1 46 protected final ClassDoc classdoc;
duke@1 47 public final boolean nodepr;
duke@1 48
duke@1 49 public AbstractMemberWriter(SubWriterHolderWriter writer,
duke@1 50 ClassDoc classdoc) {
duke@1 51 this.writer = writer;
duke@1 52 this.nodepr = configuration().nodeprecated;
duke@1 53 this.classdoc = classdoc;
duke@1 54 }
duke@1 55
duke@1 56 public AbstractMemberWriter(SubWriterHolderWriter writer) {
duke@1 57 this(writer, null);
duke@1 58 }
duke@1 59
duke@1 60 /*** abstracts ***/
duke@1 61
duke@1 62 public abstract void printSummaryLabel(ClassDoc cd);
duke@1 63
duke@1 64 public abstract void printInheritedSummaryLabel(ClassDoc cd);
duke@1 65
duke@1 66 public abstract void printSummaryAnchor(ClassDoc cd);
duke@1 67
duke@1 68 public abstract void printInheritedSummaryAnchor(ClassDoc cd);
duke@1 69
duke@1 70 protected abstract void printSummaryType(ProgramElementDoc member);
duke@1 71
duke@1 72 protected void writeSummaryLink(ClassDoc cd, ProgramElementDoc member) {
duke@1 73 writeSummaryLink(LinkInfoImpl.CONTEXT_MEMBER, cd, member);
duke@1 74 }
duke@1 75
duke@1 76 protected abstract void writeSummaryLink(int context,
duke@1 77 ClassDoc cd,
duke@1 78 ProgramElementDoc member);
duke@1 79
duke@1 80 protected abstract void writeInheritedSummaryLink(ClassDoc cd,
duke@1 81 ProgramElementDoc member);
duke@1 82
duke@1 83 protected abstract void writeDeprecatedLink(ProgramElementDoc member);
duke@1 84
duke@1 85 protected abstract void printNavSummaryLink(ClassDoc cd, boolean link);
duke@1 86
duke@1 87 protected abstract void printNavDetailLink(boolean link);
duke@1 88
duke@1 89 /*** ***/
duke@1 90
duke@1 91 protected void print(String str) {
duke@1 92 writer.print(str);
duke@1 93 writer.displayLength += str.length();
duke@1 94 }
duke@1 95
duke@1 96 protected void print(char ch) {
duke@1 97 writer.print(ch);
duke@1 98 writer.displayLength++;
duke@1 99 }
duke@1 100
duke@1 101 protected void bold(String str) {
duke@1 102 writer.bold(str);
duke@1 103 writer.displayLength += str.length();
duke@1 104 }
duke@1 105
duke@1 106 /**
duke@1 107 * Return a string describing the access modifier flags.
duke@1 108 * Don't include native or synchronized.
duke@1 109 *
duke@1 110 * The modifier names are returned in canonical order, as
duke@1 111 * specified by <em>The Java Language Specification</em>.
duke@1 112 */
duke@1 113 protected String modifierString(MemberDoc member) {
duke@1 114 int ms = member.modifierSpecifier();
duke@1 115 int no = Modifier.NATIVE | Modifier.SYNCHRONIZED;
duke@1 116 return Modifier.toString(ms & ~no);
duke@1 117 }
duke@1 118
duke@1 119 protected String typeString(MemberDoc member) {
duke@1 120 String type = "";
duke@1 121 if (member instanceof MethodDoc) {
duke@1 122 type = ((MethodDoc)member).returnType().toString();
duke@1 123 } else if (member instanceof FieldDoc) {
duke@1 124 type = ((FieldDoc)member).type().toString();
duke@1 125 }
duke@1 126 return type;
duke@1 127 }
duke@1 128
duke@1 129 protected void printModifiers(MemberDoc member) {
duke@1 130 String mod = modifierString(member);
duke@1 131 // According to JLS, we should not be showing public modifier for
duke@1 132 // interface methods.
duke@1 133 if ((member.isField() || member.isMethod()) &&
duke@1 134 writer instanceof ClassWriterImpl &&
duke@1 135 ((ClassWriterImpl) writer).getClassDoc().isInterface()) {
duke@1 136 mod = Util.replaceText(mod, "public", "").trim();
duke@1 137 }
duke@1 138 if(mod.length() > 0) {
duke@1 139 print(mod);
duke@1 140 print(' ');
duke@1 141 }
duke@1 142 }
duke@1 143
duke@1 144 protected String makeSpace(int len) {
duke@1 145 if (len <= 0) {
duke@1 146 return "";
duke@1 147 }
duke@1 148 StringBuffer sb = new StringBuffer(len);
duke@1 149 for(int i = 0; i < len; i++) {
duke@1 150 sb.append(' ');
duke@1 151 }
duke@1 152 return sb.toString();
duke@1 153 }
duke@1 154
duke@1 155 /**
duke@1 156 * Print 'static' if static and type link.
duke@1 157 */
duke@1 158 protected void printStaticAndType(boolean isStatic, Type type) {
duke@1 159 writer.printTypeSummaryHeader();
duke@1 160 if (isStatic) {
duke@1 161 print("static");
duke@1 162 }
duke@1 163 writer.space();
duke@1 164 if (type != null) {
duke@1 165 writer.printLink(new LinkInfoImpl(LinkInfoImpl.CONTEXT_MEMBER,
duke@1 166 type));
duke@1 167 }
duke@1 168 writer.printTypeSummaryFooter();
duke@1 169 }
duke@1 170
duke@1 171 /**
duke@1 172 * Print the modifier and type for the member in the member summary.
duke@1 173 *
duke@1 174 * @param member the member to print the type for.
duke@1 175 * @param type the type to print.
duke@1 176 */
duke@1 177 protected void printModifierAndType(ProgramElementDoc member, Type type) {
duke@1 178 writer.printTypeSummaryHeader();
duke@1 179 printModifier(member);
duke@1 180 if (type == null) {
duke@1 181 writer.space();
duke@1 182 if (member.isClass()) {
duke@1 183 print("class");
duke@1 184 } else {
duke@1 185 print("interface");
duke@1 186 }
duke@1 187 } else {
duke@1 188 if (member instanceof ExecutableMemberDoc &&
duke@1 189 ((ExecutableMemberDoc) member).typeParameters().length > 0) {
duke@1 190 //Code to avoid ugly wrapping in member summary table.
duke@1 191 writer.table(0,0,0);
duke@1 192 writer.trAlignVAlign("right", "");
duke@1 193 writer.tdNowrap();
duke@1 194 writer.font("-1");
duke@1 195 writer.code();
duke@1 196 int displayLength = ((AbstractExecutableMemberWriter) this).
duke@1 197 writeTypeParameters((ExecutableMemberDoc) member);
duke@1 198 if (displayLength > 10) {
duke@1 199 writer.br();
duke@1 200 }
duke@1 201 writer.printLink(new LinkInfoImpl(
duke@1 202 LinkInfoImpl.CONTEXT_SUMMARY_RETURN_TYPE, type));
duke@1 203 writer.codeEnd();
duke@1 204 writer.fontEnd();
duke@1 205 writer.tdEnd();
duke@1 206 writer.trEnd();
duke@1 207 writer.tableEnd();
duke@1 208 } else {
duke@1 209 writer.space();
duke@1 210 writer.printLink(new LinkInfoImpl(
duke@1 211 LinkInfoImpl.CONTEXT_SUMMARY_RETURN_TYPE, type));
duke@1 212 }
duke@1 213
duke@1 214 }
duke@1 215 writer.printTypeSummaryFooter();
duke@1 216 }
duke@1 217
duke@1 218 private void printModifier(ProgramElementDoc member) {
duke@1 219 if (member.isProtected()) {
duke@1 220 print("protected ");
duke@1 221 } else if (member.isPrivate()) {
duke@1 222 print("private ");
duke@1 223 } else if (!member.isPublic()) { // Package private
duke@1 224 writer.printText("doclet.Package_private");
duke@1 225 print(" ");
duke@1 226 }
duke@1 227 if (member.isMethod() && ((MethodDoc)member).isAbstract()) {
duke@1 228 print("abstract ");
duke@1 229 }
duke@1 230 if (member.isStatic()) {
duke@1 231 print("static");
duke@1 232 }
duke@1 233 }
duke@1 234
duke@1 235 protected void printComment(ProgramElementDoc member) {
duke@1 236 if (member.inlineTags().length > 0) {
duke@1 237 writer.dd();
duke@1 238 writer.printInlineComment(member);
duke@1 239 }
duke@1 240 }
duke@1 241
duke@1 242 protected String name(ProgramElementDoc member) {
duke@1 243 return member.name();
duke@1 244 }
duke@1 245
duke@1 246 protected void printHead(MemberDoc member) {
duke@1 247 writer.h3();
duke@1 248 writer.print(member.name());
duke@1 249 writer.h3End();
duke@1 250 }
duke@1 251
duke@1 252 protected void printFullComment(ProgramElementDoc member) {
duke@1 253 if(configuration().nocomment){
duke@1 254 return;
duke@1 255 }
duke@1 256 writer.dl();
duke@1 257 print(((TagletOutputImpl)
duke@1 258 (new DeprecatedTaglet()).getTagletOutput(member,
duke@1 259 writer.getTagletWriterInstance(false))).toString());
duke@1 260 printCommentAndTags(member);
duke@1 261 writer.dlEnd();
duke@1 262 }
duke@1 263
duke@1 264 protected void printCommentAndTags(ProgramElementDoc member) {
duke@1 265 printComment(member);
duke@1 266 writer.printTags(member);
duke@1 267 }
duke@1 268
duke@1 269 /**
duke@1 270 * Forward to containing writer
duke@1 271 */
duke@1 272 public void printSummaryHeader(ClassDoc cd) {
duke@1 273 printedSummaryHeader = true;
duke@1 274 writer.printSummaryHeader(this, cd);
duke@1 275 }
duke@1 276
duke@1 277 /**
duke@1 278 * Forward to containing writer
duke@1 279 */
duke@1 280 public void printInheritedSummaryHeader(ClassDoc cd) {
duke@1 281 writer.printInheritedSummaryHeader(this, cd);
duke@1 282 }
duke@1 283
duke@1 284 /**
duke@1 285 * Forward to containing writer
duke@1 286 */
duke@1 287 public void printInheritedSummaryFooter(ClassDoc cd) {
duke@1 288 writer.printInheritedSummaryFooter(this, cd);
duke@1 289 }
duke@1 290
duke@1 291 /**
duke@1 292 * Forward to containing writer
duke@1 293 */
duke@1 294 public void printSummaryFooter(ClassDoc cd) {
duke@1 295 writer.printSummaryFooter(this, cd);
duke@1 296 }
duke@1 297
duke@1 298 /**
duke@1 299 * Return true if the given <code>ProgramElement</code> is inherited
duke@1 300 * by the class that is being documented.
duke@1 301 *
duke@1 302 * @param ped The <code>ProgramElement</code> being checked.
duke@1 303 * return true if the <code>ProgramElement</code> is being inherited and
duke@1 304 * false otherwise.
duke@1 305 */
duke@1 306 protected boolean isInherited(ProgramElementDoc ped){
duke@1 307 if(ped.isPrivate() || (ped.isPackagePrivate() &&
duke@1 308 ! ped.containingPackage().equals(classdoc.containingPackage()))){
duke@1 309 return false;
duke@1 310 }
duke@1 311 return true;
duke@1 312 }
duke@1 313
duke@1 314
duke@1 315 /**
duke@1 316 * Generate the code for listing the deprecated APIs. Create the table
duke@1 317 * format for listing the API. Call methods from the sub-class to complete
duke@1 318 * the generation.
duke@1 319 */
duke@1 320 protected void printDeprecatedAPI(List deprmembers, String headingKey) {
duke@1 321 if (deprmembers.size() > 0) {
duke@1 322 writer.tableIndexSummary();
duke@1 323 writer.tableHeaderStart("#CCCCFF");
duke@1 324 writer.boldText(headingKey);
duke@1 325 writer.tableHeaderEnd();
duke@1 326 for (int i = 0; i < deprmembers.size(); i++) {
duke@1 327 ProgramElementDoc member =(ProgramElementDoc)deprmembers.get(i);
duke@1 328 writer.trBgcolorStyle("white", "TableRowColor");
duke@1 329 writer.summaryRow(0);
duke@1 330 writeDeprecatedLink(member);
duke@1 331 writer.br();
duke@1 332 writer.printNbsps();
duke@1 333 if (member.tags("deprecated").length > 0)
duke@1 334 writer.printInlineDeprecatedComment(member, member.tags("deprecated")[0]);
duke@1 335 writer.space();
duke@1 336 writer.summaryRowEnd();
duke@1 337 writer.trEnd();
duke@1 338 }
duke@1 339 writer.tableEnd();
duke@1 340 writer.space();
duke@1 341 writer.p();
duke@1 342 }
duke@1 343 }
duke@1 344
duke@1 345 /**
duke@1 346 * Print use info.
duke@1 347 */
jjg@74 348 protected void printUseInfo(List<? extends ProgramElementDoc> mems, String heading) {
duke@1 349 if (mems == null) {
duke@1 350 return;
duke@1 351 }
jjg@74 352 List<? extends ProgramElementDoc> members = mems;
duke@1 353 if (members.size() > 0) {
duke@1 354 writer.tableIndexSummary();
duke@1 355 writer.tableUseInfoHeaderStart("#CCCCFF");
duke@1 356 writer.print(heading);
duke@1 357 writer.tableHeaderEnd();
jjg@74 358 for (Iterator<? extends ProgramElementDoc> it = members.iterator(); it.hasNext(); ) {
jjg@74 359 ProgramElementDoc pgmdoc = it.next();
duke@1 360 ClassDoc cd = pgmdoc.containingClass();
duke@1 361
duke@1 362 writer.printSummaryLinkType(this, pgmdoc);
duke@1 363 if (cd != null && !(pgmdoc instanceof ConstructorDoc)
duke@1 364 && !(pgmdoc instanceof ClassDoc)) {
duke@1 365 // Add class context
duke@1 366 writer.bold(cd.name() + ".");
duke@1 367 }
duke@1 368 writeSummaryLink(
duke@1 369 pgmdoc instanceof ClassDoc ?
duke@1 370 LinkInfoImpl.CONTEXT_CLASS_USE : LinkInfoImpl.CONTEXT_MEMBER,
duke@1 371 cd, pgmdoc);
duke@1 372 writer.printSummaryLinkComment(this, pgmdoc);
duke@1 373 }
duke@1 374 writer.tableEnd();
duke@1 375 writer.space();
duke@1 376 writer.p();
duke@1 377 }
duke@1 378 }
duke@1 379
duke@1 380 protected void navDetailLink(List members) {
duke@1 381 printNavDetailLink(members.size() > 0? true: false);
duke@1 382 }
duke@1 383
duke@1 384
duke@1 385 protected void navSummaryLink(List members,
duke@1 386 VisibleMemberMap visibleMemberMap) {
duke@1 387 if (members.size() > 0) {
duke@1 388 printNavSummaryLink(null, true);
duke@1 389 return;
duke@1 390 } else {
duke@1 391 ClassDoc icd = classdoc.superclass();
duke@1 392 while (icd != null) {
duke@1 393 List inhmembers = visibleMemberMap.getMembersFor(icd);
duke@1 394 if (inhmembers.size() > 0) {
duke@1 395 printNavSummaryLink(icd, true);
duke@1 396 return;
duke@1 397 }
duke@1 398 icd = icd.superclass();
duke@1 399 }
duke@1 400 }
duke@1 401 printNavSummaryLink(null, false);
duke@1 402 }
duke@1 403
duke@1 404 protected void serialWarning(SourcePosition pos, String key, String a1, String a2) {
duke@1 405 if (configuration().serialwarn) {
duke@1 406 ConfigurationImpl.getInstance().getDocletSpecificMsg().warning(pos, key, a1, a2);
duke@1 407 }
duke@1 408 }
duke@1 409
duke@1 410 public ProgramElementDoc[] eligibleMembers(ProgramElementDoc[] members) {
duke@1 411 return nodepr? Util.excludeDeprecatedMembers(members): members;
duke@1 412 }
duke@1 413
duke@1 414 public ConfigurationImpl configuration() {
duke@1 415 return writer.configuration;
duke@1 416 }
duke@1 417
duke@1 418 /**
duke@1 419 * {@inheritDoc}
duke@1 420 */
duke@1 421 public void writeMemberSummary(ClassDoc classDoc, ProgramElementDoc member,
duke@1 422 Tag[] firstSentenceTags, boolean isFirst, boolean isLast) {
duke@1 423 writer.printSummaryLinkType(this, member);
duke@1 424 writeSummaryLink(classDoc, member);
duke@1 425 writer.printSummaryLinkComment(this, member, firstSentenceTags);
duke@1 426 }
duke@1 427 }

mercurial