FileDocCategorySizeDatePackage
ClassUseWriter.javaAPI DocExample10215Wed Apr 19 11:17:14 BST 2000com.sun.tools.doclets.standard

ClassUseWriter.java

/*
 * @(#)ClassUseWriter.java	1.9 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.io.*;
import java.lang.*;
import java.util.*;

/**
 * Generate class usage information. 
 *
 * @author Robert G. Field
 */
public class ClassUseWriter extends SubWriterHolderWriter {

    final ClassDoc classdoc;
    final Map pkgToSubclass;
    final Map pkgToSubinterface;
    final Map pkgToImplementingClass;
    final Map pkgToField;
    final Map pkgToMethodReturn;
    final Map pkgToMethodArgs;
    final Map pkgToMethodThrows;
    final Map pkgToConstructorArgs;
    final Map pkgToConstructorThrows;
    final SortedSet pkgSet;
    final MethodSubWriter methodSubWriter;
    final ConstructorSubWriter constrSubWriter;
    final FieldSubWriter fieldSubWriter;
    final ClassSubWriter classSubWriter;


    /**
     * Constructor.
     *
     * @param filename the file to be generated. 
     */
    public ClassUseWriter(ClassUseMapper mapper, String path, 
                          String filename, String relpath,
                          ClassDoc classdoc) 
                   throws IOException, DocletAbortException {
        super(path, filename, relpath);
        this.classdoc = classdoc;
        HtmlStandardWriter.currentcd = classdoc;
	this.pkgSet = new TreeSet();
	this.pkgToSubclass = pkgDivide(mapper.classToSubclass);
	this.pkgToSubinterface = pkgDivide(mapper.classToSubinterface);
	this.pkgToImplementingClass = pkgDivide(mapper.classToImplementingClass);
	this.pkgToField = pkgDivide(mapper.classToField);
	this.pkgToMethodReturn = pkgDivide(mapper.classToMethodReturn);
	this.pkgToMethodArgs = pkgDivide(mapper.classToMethodArgs);
	this.pkgToMethodThrows = pkgDivide(mapper.classToMethodThrows);
	this.pkgToConstructorArgs = pkgDivide(mapper.classToConstructorArgs);
	this.pkgToConstructorThrows = pkgDivide(mapper.classToConstructorThrows);
	//tmp test
	if (!pkgSet.equals(mapper.classToPackage.get(classdoc))) {
	    System.err.println("Internal error: package sets don't match: " + pkgSet + " with: " +
			       mapper.classToPackage.get(classdoc));
	}
        methodSubWriter = new MethodSubWriter(this);
        constrSubWriter = new ConstructorSubWriter(this);
        fieldSubWriter = new FieldSubWriter(this);
        classSubWriter = new ClassSubWriter(this);
    }

    private Map pkgDivide(Map classMap) {
        Map map = new HashMap();
        List list= (List)classMap.get(classdoc);
        if (list != null) {
            Iterator it = list.iterator();
            while (it.hasNext()) {
                ProgramElementDoc doc = (ProgramElementDoc)it.next();
                PackageDoc pkg = doc.containingPackage();
                pkgSet.add(pkg);
                List inPkg = (List)map.get(pkg);
                if (inPkg == null) {
                    inPkg = new ArrayList();
                    map.put(pkg, inPkg);
                }
                inPkg.add(doc);
            }
        }
        return map;
    }
	
    /**
     * Generate a class page.
     *
     * @param prev the previous class to generated, or null if no previous.
     * @param classdoc the class to generate.
     * @param next the next class to be generated, or null if no next.
     */
    public static void generate(ClassUseMapper mapper, 
				ClassDoc classdoc) 
                         throws DocletAbortException {
            ClassUseWriter clsgen;
            String path = DirectoryManager.getDirectoryPath(classdoc.
                                                    containingPackage());
            if (path.length() > 0) {
                path += File.separator;
            }
            path += "class-use";
            String filename = classdoc.name() + ".html";
            String pkgname = classdoc.containingPackage().name();
            pkgname += (pkgname.length() > 0)? ".class-use": "class-use";
            String relpath = DirectoryManager.getRelativePath(pkgname); 
            try {
                clsgen = new ClassUseWriter(mapper, path, filename, 
                                            relpath, classdoc);
                clsgen.generateClassUseFile();
                clsgen.close();
            } catch (IOException exc) {
                Standard.configuration().standardmessage.
                    error("doclet.exception_encountered",
                           exc.toString(), filename);
                throw new DocletAbortException();
            }
    }

    /** 
     * Print the class use list.
     */ 
    protected void generateClassUseFile() throws IOException {

        printClassUseHeader();

	if (pkgSet.size() > 0) {
            generateClassUse();
        } else {
            printText("doclet.ClassUse_No.usage.of.0", 
                     classdoc.qualifiedName());
            p();
        }
        
        printClassUseFooter();
    }        

    protected void generateClassUse() throws IOException {
        if (Standard.configuration().packages.length > 1) {
            generatePackageList();
        }
        generateClassList();
    }

    protected void generatePackageList() throws IOException {
	tableIndexSummary();
	tableHeaderStart("#CCCCFF");
	printText("doclet.ClassUse_Packages.that.use.0",
		  getClassLink(classdoc));
	tableHeaderEnd();

	for (Iterator it = pkgSet.iterator(); it.hasNext();) {
	    PackageDoc pkg = (PackageDoc)it.next();
	    generatePackageUse(pkg);
	}
	tableEnd();
	space();
	p();
    }
        
    protected void generateClassList() throws IOException {
	for (Iterator it = pkgSet.iterator(); it.hasNext();) {
	    PackageDoc pkg = (PackageDoc)it.next();
	    anchor(pkg.name());
	    tableIndexSummary();
	    tableHeaderStart("#CCCCFF");
	    printText("doclet.ClassUse_Uses.of.0.in.1",
		      getClassLink(classdoc), 
		      getPackageLink(pkg));
	    tableHeaderEnd();
	    tableEnd();
            space();
            p();
	    generateClassUse(pkg);
	}
    }        

    /** 
     * Print the package use list.
     */ 
    protected void generatePackageUse(PackageDoc pkg) throws IOException {
        trBgcolorStyle("white", "TableRowColor");
	summaryRow(0);
	printHyperLink("", pkg.name(), pkg.name(), true);
	summaryRowEnd();
	summaryRow(0);
	printSummaryComment(pkg);
	space();
	summaryRowEnd();
	trEnd();
    }

    /** 
     * Print the class use list.
     */ 
    protected void generateClassUse(PackageDoc pkg) throws IOException {
        String classLink = getClassLink(classdoc);
	String pkgLink = getPackageLink(pkg);
        classSubWriter.printUseInfo(pkgToSubclass.get(pkg),
				    getText("doclet.ClassUse_Subclass",
					    classLink, 
					    pkgLink));
        classSubWriter.printUseInfo(pkgToSubinterface.get(pkg),
				    getText("doclet.ClassUse_Subinterface",
					    classLink, 
					    pkgLink));
        classSubWriter.printUseInfo(pkgToImplementingClass.get(pkg),
				    getText("doclet.ClassUse_ImplementingClass",
					    classLink, 
					    pkgLink));
        fieldSubWriter.printUseInfo(pkgToField.get(pkg),
				    getText("doclet.ClassUse_Field",
					    classLink, 
					    pkgLink));
        methodSubWriter.printUseInfo(pkgToMethodReturn.get(pkg),
				    getText("doclet.ClassUse_MethodReturn",
					    classLink, 
					    pkgLink));
        methodSubWriter.printUseInfo(pkgToMethodArgs.get(pkg),
				    getText("doclet.ClassUse_MethodArgs",
					    classLink, 
					    pkgLink));
        methodSubWriter.printUseInfo(pkgToMethodThrows.get(pkg),
				    getText("doclet.ClassUse_MethodThrows",
					    classLink, 
					    pkgLink));
        constrSubWriter.printUseInfo(pkgToConstructorArgs.get(pkg),
				    getText("doclet.ClassUse_ConstructorArgs",
					    classLink, 
					    pkgLink));
        constrSubWriter.printUseInfo(pkgToConstructorThrows.get(pkg),
				    getText("doclet.ClassUse_ConstructorThrows",
					    classLink, 
					    pkgLink));
    }        

    /**
     * Print the header for the class use Listing.
     */
    protected void printClassUseHeader() {
        String cltype = getText(classdoc.isInterface()? 
                                    "doclet.Interface": 
                                    "doclet.Class");
        String clname = classdoc.qualifiedName();
        printHeader(getText("doclet.Window_ClassUse_Header", 
                            Standard.configuration().windowtitle, 
                            cltype, clname));
        navLinks(true);
        hr();
        center();
        h2();
        boldText("doclet.ClassUse_Title", cltype, clname);
        h2End();
        centerEnd();
    }

    /**
     * Print the footer for the class use Listing.
     */
    protected void printClassUseFooter() {
        hr();
        navLinks(false);
        printBottom();
        printBodyHtmlEnd();
    }


    /**
     * Print this package link
     */
    protected void navLinkPackage() {
        navCellStart();
        printHyperLink("../package-summary.html", "", 
                       getText("doclet.Package"), true, "NavBarFont1");
        navCellEnd();
    }
                                
    /**
     * Print class page indicator
     */
    protected void navLinkClass() {
        navCellStart();
        printClassLink(classdoc, "", getText("doclet.Class"), true, "NavBarFont1");
        navCellEnd();
    }

    /**
     * Print class use link
     */
    protected void navLinkClassUse() {
        navCellRevStart();
        fontStyle("NavBarFont1Rev");
        boldText("doclet.navClassUse");
        fontEnd();
        navCellEnd();
    }

    protected void navLinkTree() {
        navCellStart();
        if (classdoc.containingPackage().isIncluded()) {
            printHyperLink("../package-tree.html", "", getText("doclet.Tree"),
                           true, "NavBarFont1");
        } else {
            printHyperLink(relativepath + "overview-tree.html", "", 
                           getText("doclet.Tree"), true, "NavBarFont1");
        }
        navCellEnd();
    }

}