home *** CD-ROM | disk | FTP | other *** search
/ Internet News 1999 October / INEWS_10_CD.ISO / pc / jdk / jdk1.2.2 / docs / tooldocs / javadoc / source / standard / ClassWriter.java < prev    next >
Encoding:
Java Source  |  1999-09-19  |  13.3 KB  |  452 lines

  1. /*
  2.  * @(#)ClassWriter.java    1.39 98/08/06
  3.  *
  4.  * Copyright 1997, 1998 by Sun Microsystems, Inc.,
  5.  * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
  6.  * All rights reserved.
  7.  *
  8.  * This software is the confidential and proprietary information
  9.  * of Sun Microsystems, Inc. ("Confidential Information").  You
  10.  * shall not disclose such Confidential Information and shall use
  11.  * it only in accordance with the terms of the license agreement
  12.  * you entered into with Sun.
  13.  */
  14.  
  15. package com.sun.tools.doclets.standard;
  16.  
  17. import com.sun.tools.doclets.*;
  18. import com.sun.javadoc.*;
  19. import java.io.*;
  20. import java.lang.*;
  21. import java.util.*;
  22.  
  23. /**
  24.  * Generate the Class Information Page.
  25.      * @see com.sun.javadoc.ClassDoc 
  26.      * @see java.util.Collections
  27.      * @see java.util.List
  28.      * @see java.util.ArrayList
  29.      * @see java.util.HashMap
  30.  *
  31.  * @author Atul M Dambalkar
  32.  * @author Robert Field
  33.  */
  34. public class ClassWriter extends SubWriterHolderWriter {
  35.  
  36.     protected ClassDoc classdoc;
  37.  
  38.     protected ClassTree classtree;
  39.  
  40.     protected ClassDoc prev;
  41.  
  42.     protected ClassDoc next;
  43.  
  44.     protected boolean nopackage;
  45.  
  46.     protected MethodSubWriter methodSubWriter;
  47.  
  48.     protected ConstructorSubWriter constrSubWriter;
  49.  
  50.     protected FieldSubWriter fieldSubWriter;
  51.  
  52.     protected ClassSubWriter innerSubWriter;
  53.  
  54.     public ClassWriter(String path, String filename, ClassDoc classdoc,
  55.                 ClassDoc prev, ClassDoc next, ClassTree classtree,
  56.                 boolean nopackage) throws IOException, DocletAbortException {
  57.         super(path, filename, 
  58.          DirectoryManager.getRelativePath(classdoc.containingPackage().name()));
  59.         this.classdoc = classdoc;
  60.         HtmlStandardWriter.currentcd = classdoc;
  61.         this.classtree = classtree;
  62.         this.prev = prev;
  63.         this.next = next;
  64.         this.nopackage = nopackage;
  65.         methodSubWriter = new MethodSubWriter(this);
  66.         constrSubWriter = new ConstructorSubWriter(this);
  67.         fieldSubWriter = new FieldSubWriter(this);
  68.         innerSubWriter = new ClassSubWriter(this);
  69.     }
  70.  
  71.     /**
  72.      * Generate a class page.
  73.      *
  74.      * @param prev the previous class to generated, or null if no previous.
  75.      * @param classdoc the class to generate.
  76.      * @param next the next class to be generated, or null if no next.
  77.      */
  78.     public static void generate(ClassDoc classdoc, ClassDoc prev, 
  79.                              ClassDoc next, ClassTree classtree, 
  80.                              boolean nopackage) throws DocletAbortException {
  81.             ClassWriter clsgen;
  82.             String path = 
  83.                DirectoryManager.getDirectoryPath(classdoc.containingPackage());
  84.             String filename = classdoc.name() + ".html";
  85.             try {
  86.                 clsgen = new ClassWriter(path, filename, classdoc, 
  87.                                          prev, next, classtree, nopackage);
  88.                 clsgen.generateClassFile();
  89.                 clsgen.close();
  90.             } catch (IOException exc) {
  91.                 Standard.configuration().standardmessage.
  92.                     error("doclet.exception_encountered",
  93.                            exc.toString(), filename);
  94.                 throw new DocletAbortException();
  95.             }
  96.     }
  97.  
  98.     /**
  99.      * Print this package link
  100.      */
  101.     protected void navLinkPackage() {
  102.         navCellStart();
  103.         printHyperLink("package-summary.html", "", getText("doclet.Package"),
  104.                        true, "NavBarFont1");
  105.         navCellEnd();
  106.     }
  107.                                 
  108.     /**
  109.      * Print class page indicator
  110.      */
  111.     protected void navLinkClass() {
  112.         navCellRevStart();
  113.         fontStyle("NavBarFont1Rev");
  114.         boldText("doclet.Class");
  115.         fontEnd();
  116.         navCellEnd();
  117.     }
  118.  
  119.     /**
  120.      * Print class use link
  121.      */
  122.     protected void navLinkClassUse() {
  123.         navCellStart();
  124.         printHyperLink("class-use/" + filename, "", 
  125.                        getText("doclet.navClassUse"), true, "NavBarFont1");
  126.         navCellEnd();
  127.     }
  128.  
  129.     /**
  130.      * Print previous package link
  131.      */
  132.     protected void navLinkPrevious() {
  133.         if (prev == null) {
  134.             printText("doclet.Prev_Class"); 
  135.         } else {
  136.             printClassLink(prev, getText("doclet.Prev_Class"), true);
  137.         }
  138.     }
  139.                                 
  140.     /**
  141.      * Print next package link
  142.      */
  143.     protected void navLinkNext() {
  144.         if (next == null) {
  145.             printText("doclet.Next_Class"); 
  146.         } else {
  147.             printClassLink(next, getText("doclet.Next_Class"), true);
  148.         }
  149.     }                               
  150.  
  151.     /**
  152.      * Generate the class file contents.
  153.      */
  154.     public void generateClassFile() {
  155.         String cltype = getText(classdoc.isInterface()? 
  156.                                     "doclet.Interface": 
  157.                                     "doclet.Class") + " ";
  158.         PackageDoc pkg = classdoc.containingPackage();
  159.         String pkgname = (pkg != null)? pkg.name(): "";
  160.         String clname = classdoc.name();
  161.         String label = cltype + ' ' + clname;
  162.  
  163.         printHeader(getText("doclet.Window_ClassFile_label", 
  164.                             Standard.configuration().windowtitle, label));
  165.         navLinks(true);
  166.         hr();
  167.         println("<!-- ======== START OF CLASS DATA ======== -->");
  168.         h2();
  169.         if (pkgname.length() > 0) {
  170.             font("-1"); print(pkgname); fontEnd(); br();
  171.         }
  172.         print(label);
  173.         h2End();
  174.  
  175.         // if this is a class (not an interface) then generate 
  176.         // the super class tree.
  177.         if (!classdoc.isInterface()) {
  178.             pre();
  179.             printTreeForClass(classdoc);
  180.             preEnd();
  181.         }
  182.  
  183.         printSubClassInterfaceInfo();
  184.         
  185.         if (classdoc.isInterface()) {
  186.             printImplementingClasses();
  187.         }
  188.  
  189.         hr();
  190.  
  191.         printDeprecated();
  192.  
  193.         printClassDescription();
  194.         p();
  195.         // generate documentation for the class.
  196.         if (classdoc.inlineTags().length > 0) {
  197.             printInlineComment(classdoc);
  198.             p();
  199.         }
  200.         // Print Information about all the tags here
  201.         generateTagInfo(classdoc);
  202.         hr();
  203.         p();
  204.  
  205.     printAllMembers();
  206.  
  207.         println("<!-- ========= END OF CLASS DATA ========= -->");
  208.         hr();
  209.         navLinks(false);
  210.         printBottom();
  211.         printBodyHtmlEnd();
  212.     }
  213.  
  214.     /**
  215.      * Print summary and detail information for the specified members in the 
  216.      * class.
  217.      */
  218.     protected void printAllMembers() {
  219.         println("<!-- ======== INNER CLASS SUMMARY ======== -->"); println();
  220.     innerSubWriter.printMembersSummary(classdoc);
  221.     innerSubWriter.printInheritedMembersSummary(classdoc);
  222.         println(); 
  223.         println("<!-- =========== FIELD SUMMARY =========== -->"); println();
  224.     fieldSubWriter.printMembersSummary(classdoc);
  225.     fieldSubWriter.printInheritedMembersSummary(classdoc);
  226.         println(); 
  227.         println("<!-- ======== CONSTRUCTOR SUMMARY ======== -->"); println();
  228.     constrSubWriter.printMembersSummary(classdoc);
  229.         println(); 
  230.         println("<!-- ========== METHOD SUMMARY =========== -->"); println();
  231.     methodSubWriter.printMembersSummary(classdoc);
  232.         methodSubWriter.printInheritedMembersSummary(classdoc);
  233.  
  234.         p();
  235.  
  236.         println(); 
  237.         println("<!-- ============ FIELD DETAIL =========== -->"); println();
  238.     fieldSubWriter.printMembers(classdoc);
  239.         println(); 
  240.         println("<!-- ========= CONSTRUCTOR DETAIL ======== -->"); println();
  241.     constrSubWriter.printMembers(classdoc);
  242.         println(); 
  243.         println("<!-- ============ METHOD DETAIL ========== -->"); println();
  244.     methodSubWriter.printMembers(classdoc);
  245.     }
  246.  
  247.  
  248.     /**
  249.      * Print the class description regarding iterfaces implemented, classes
  250.      * inheritted.
  251.      */
  252.     protected void printClassDescription() {
  253.         boolean isInterface = classdoc.isInterface();
  254.         dl();
  255.         dt();
  256.  
  257.         print(classdoc.modifiers() + " ");  
  258.  
  259.         if (!isInterface) {
  260.             print("class ");
  261.         }
  262.         bold(classdoc.name());
  263.  
  264.         if (!isInterface) {
  265.             ClassDoc superclass = classdoc.superclass();
  266.             if (superclass != null) {
  267.                 dt();
  268.                 print("extends ");
  269.                 printClassLink(superclass); 
  270.             }
  271.         }
  272.  
  273.         ClassDoc[] implIntfacs = classdoc.interfaces();
  274.         if (implIntfacs != null && implIntfacs.length > 0) {
  275.             dt();
  276.             print(isInterface? "extends " : "implements ");
  277.             printClassLink(implIntfacs[0]);
  278.             for (int i = 1; i < implIntfacs.length; i++) {
  279.                 print(", ");
  280.                 printClassLink(implIntfacs[i]);
  281.             }
  282.         }
  283.         dlEnd();
  284.     }
  285.   
  286.     /**
  287.      * Mark the class as deprecated if it is.
  288.      */
  289.     protected void printDeprecated() {
  290.         Tag[] deprs = classdoc.tags("deprecated");
  291.         if (deprs.length > 0) {
  292.             Tag[] commentTags = deprs[0].inlineTags();
  293.             if (commentTags.length > 0) {
  294.                 boldText("doclet.Deprecated");
  295.                 space();
  296.                 printInlineDeprecatedComment(deprs[0]);
  297.             }
  298.             p();
  299.         }
  300.     }
  301.  
  302.     /**
  303.      * Generate the step like diagram for the class hierarchy.
  304.      */
  305.     protected void printStep(int indent) {
  306.         String spc = spaces(6 * indent - 4);
  307.         print(spc);
  308.         println("|");
  309.         print(spc);
  310.         print("+--");
  311.     }
  312.  
  313.     /**
  314.      * Print the class hierarchy tree for this class only.
  315.      */
  316.     protected int printTreeForClass(ClassDoc cd) {
  317.         ClassDoc sup = cd.superclass();
  318.         int indent = 0;
  319.         if (sup != null) {
  320.             indent = printTreeForClass(sup);
  321.             printStep(indent);
  322.         }
  323.         if (cd.equals(classdoc)) {
  324.             bold(cd.qualifiedName());
  325.         } else {
  326.             printQualifiedClassLink(cd);
  327.         }
  328.         println();
  329.         return indent + 1;
  330.     }
  331.  
  332.     /**
  333.      * Which are the sub-classes or sub-interfaces for this class?
  334.      */ 
  335.     protected void printSubClassInterfaceInfo() {
  336.         // Before using TreeBuilder.getSubClassList
  337.         // make sure that tree.html is generated prior.
  338.         if (classdoc.qualifiedName().equals("java.lang.Object") ||
  339.                classdoc.qualifiedName().equals("org.omg.CORBA.Object")) {
  340.             return;    // Don't generate the list, too huge
  341.         }
  342.         List subclasses = classdoc.isClass()? 
  343.                              classtree.subs(classdoc): // it's a class
  344.                              classtree.allSubs(classdoc); // it's an interface
  345.         if (subclasses.size() > 0) {
  346.             printSubClassInfoHeader(subclasses);
  347.             if (classdoc.isClass()) {
  348.                 boldText("doclet.Subclasses");
  349.             } else { // this is an interface
  350.                 boldText("doclet.Subinterfaces");
  351.             }
  352.             printSubClassLinkInfo(subclasses);
  353.         }
  354.     }
  355.  
  356.     /**
  357.      * If this is the interface which are the classes, that implement this?
  358.      */
  359.     protected void printImplementingClasses() {
  360.         if (classdoc.qualifiedName().equals("java.lang.Cloneable") || 
  361.                 classdoc.qualifiedName().equals("java.io.Serializable")) {
  362.             return;   // Don't generate the list, too big
  363.         }
  364.         List implcl = classtree.implementingclasses(classdoc);
  365.         if (implcl.size() > 0) {
  366.             printSubClassInfoHeader(implcl);
  367.             boldText("doclet.Implementing_Classes");
  368.             printSubClassLinkInfo(implcl);
  369.         }
  370.     }
  371.  
  372.     protected void printSubClassInfoHeader(List list) {
  373.         dl();
  374.         dt();
  375.     }
  376.  
  377.     /**
  378.      * Generate a link for the sub-classes.
  379.      */
  380.     protected void printSubClassLinkInfo(List list) {
  381.         int i = 0;
  382.         print(' ');
  383.         dd();
  384.         for (; i < list.size() - 1; i++) {
  385.             printClassLink((ClassDoc)(list.get(i)));
  386.             print(", ");
  387.         }
  388.         printClassLink((ClassDoc)(list.get(i)));
  389.         ddEnd();
  390.         dlEnd();
  391.     }
  392.  
  393.     protected void navLinkTree() {
  394.         navCellStart();
  395.         if (nopackage) {
  396.             printHyperLink(relativepath + "overview-tree.html", "",
  397.                            getText("doclet.Tree"), true, "NavBarFont1");
  398.         } else {
  399.             printHyperLink("package-tree.html", "", getText("doclet.Tree"),
  400.                            true, "NavBarFont1");
  401.         }
  402.         navCellEnd();
  403.     }
  404.  
  405.     protected void printSummaryDetailLinks() {
  406.         tr();
  407.         tdVAlignClass("top", "NavBarCell3");
  408.         font("-2");
  409.         print("  ");
  410.         navSummaryLinks();
  411.         fontEnd();
  412.         tdEnd();
  413.         
  414.         tdVAlignClass("top", "NavBarCell3");
  415.         font("-2");
  416.         navDetailLinks();
  417.         fontEnd();
  418.         tdEnd();
  419.         trEnd();
  420.     }   
  421.  
  422.     protected void navSummaryLinks() {
  423.         printText("doclet.Summary");
  424.         print(" ");
  425.         innerSubWriter.navSummaryLink(classdoc);
  426.         navGap();
  427.         fieldSubWriter.navSummaryLink(classdoc);
  428.         navGap();
  429.         constrSubWriter.navSummaryLink(classdoc);
  430.         navGap();
  431.         methodSubWriter.navSummaryLink(classdoc);
  432.     }
  433.  
  434.     protected void navDetailLinks() {
  435.         printText("doclet.Detail");
  436.         print(" ");
  437.         fieldSubWriter.navDetailLink(classdoc);
  438.         navGap();
  439.         constrSubWriter.navDetailLink(classdoc);
  440.         navGap();
  441.         methodSubWriter.navDetailLink(classdoc);
  442.     }
  443.  
  444.     protected void navGap() {
  445.         space();
  446.         print('|');
  447.         space();
  448.     }
  449. }
  450.  
  451.  
  452.