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

Fri, 27 Feb 2009 18:57:17 -0800

author
bpatel
date
Fri, 27 Feb 2009 18:57:17 -0800
changeset 233
5240b1120530
parent 184
905e151a185a
child 243
edd944553131
permissions
-rw-r--r--

6786690: Javadoc HTML WCAG 2.0 accessibility issues in standard doclet - DL tag and nesting issue
Reviewed-by: jjg

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

mercurial