FileDocCategorySizeDatePackage
PackageWriter.javaAPI DocExample10948Wed Apr 19 11:17:12 BST 2000com.sun.tools.doclets.standard

PackageWriter.java

/*
 * @(#)PackageWriter.java	1.35 00/02/02
 *
 * 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.*;

/**
 * Class to generate file for each package contents in the right-hand 
 * frame. This will list all the Class Kinds in the package. A click on any
 * class-kind will update the frame with the clicked class-kind page.
 *
 * @author Atul M Dambalkar
 */
public class PackageWriter extends AbstractPackageWriter {

    /** 
     * The prev package name in the alpha-order list.
     */
    protected PackageDoc prev;

    /** 
     * The next package name in the alpha-order list.
     */
    protected PackageDoc next;

    /**
     * Constructor to construct PackageWriter object and to generate 
     * "package-summary.html" file in the respective package directory. 
     * For example for package "java.lang" this will generate file 
     * "package-summary.html" file in the "java/lang" directory. It will also 
     * create "java/lang" directory in the current or the destination directory
     * if it doesen't exist.
     *
     * @param path Directories in this path will be created if they are not 
     * already there.
     * @param filename Name of the package summary file to be generated, 
     * "package-frame.html".
     * @param packagedoc PackageDoc under consideration.
     * @param prev Previous package in the sorted array.
     * @param next Next package in the sorted array.
     */
    public PackageWriter(String path, String filename, PackageDoc packagedoc,
                         PackageDoc prev, PackageDoc next) 
                         throws IOException, DocletAbortException {
        super(path, filename, packagedoc);
        this.prev = prev;
        this.next = next;
    }

    /**
     * Generate a package summary page for the right-hand frame. Construct
     * the PackageFrameWriter object and then uses it generate the file.
     *
     * @param pkg The package for which "pacakge-summary.html" is to be
     * generated.
     * @param prev Previous package in the sorted array.
     * @param next Next package in the sorted array.
     */
    public static void generate(PackageDoc pkg, PackageDoc prev,
                                PackageDoc next) throws DocletAbortException {
        PackageWriter packgen;
        String path = DirectoryManager.getDirectoryPath(pkg);
        String filename = "package-summary.html";
        try {
            packgen = new PackageWriter(path, filename, pkg, prev, next);
            packgen.generatePackageFile();
            packgen.close();
            packgen.copyDocFiles(path);
        } catch (IOException exc) {
            Standard.configuration().standardmessage.
                error("doclet.exception_encountered", exc.toString(), filename);
            throw new DocletAbortException();
        }
    }

    /**
     * Generate class listing for all the classes in this package. Divide class
     * listing as per the class kind and generate separate listing for 
     * Classes, Interfaces, Exceptions and Errors.
     */
    protected void generateClassListing() {
        generateClassKindListing(packagedoc.interfaces(), 
                                 getText("doclet.Interface_Summary"));
        generateClassKindListing(packagedoc.ordinaryClasses(),
                                 getText("doclet.Class_Summary"));
        generateClassKindListing(packagedoc.exceptions(),
                                 getText("doclet.Exception_Summary"));
        generateClassKindListing(packagedoc.errors(),
                                 getText("doclet.Error_Summary"));
    }
    
    /** 
     * Generate specific class kind listing. Also add label to the listing.
     *
     * @param arr Array of specific class kinds, namely Class or Interface or
     * Exception or Error.
     * @param label Label for the listing
     */
    protected void generateClassKindListing(ClassDoc[] arr, String label) {
        if(arr.length > 0) {
            Arrays.sort(arr);    
            tableIndexSummary();
            printFirstRow(label);
            for (int i = 0; i < arr.length; i++) {
                boolean deprecated = arr[i].tags("deprecated").length > 0;
                if (!Util.isCoreClass(arr[i]) || !isGeneratedDoc(arr[i])) {
                    continue;
                }
                trBgcolorStyle("white", "TableRowColor");
                summaryRow(15);
                bold();
                printClassLinkForSameDir(arr[i]);
                boldEnd();
                summaryRowEnd();
                summaryRow(0);
                if (deprecated) {
                    boldText("doclet.Deprecated");
                    space();
                    printSummaryDeprecatedComment(
                                              arr[i].tags("deprecated")[0]);
                } else {
                    printSummaryComment(arr[i]);
                }
                summaryRowEnd();
                trEnd();
            }
            tableEnd();
            println(" ");
            p();
        }
    }

    /**
     * Print the table heading for the class-listing.
     *
     * @param label Label for the Class kind listing.
     */
    protected void printFirstRow(String label) {
        tableHeaderStart("#CCCCFF");
        bold(label);
        tableHeaderEnd();
    }

    /**
     * Print the package comment as specified in the "packages.html" file in 
     * the source package directory.
     */
    protected void printPackageComment() {
        if (packagedoc.inlineTags().length > 0) {
            anchor("package_description");
            h2(getText("doclet.Package_Description", packagedoc.name()));
            p();
            printInlineComment(packagedoc);
            p();
        }
    }
   
    /**
     * Print the package description and the tag information from the
     * "packages.html" file.
     */ 
    protected void printPackageDescription() throws IOException {
        printPackageComment();
        generateTagInfo(packagedoc);
    }
    
    /**
     * Print one line summary cooment for the package at the top of the page and
     * add link to the description which is generated at the end of the page.
     *
     * @param heading Package name.
     */                            
    protected void printPackageHeader(String heading) {
        navLinks(true);
        hr();
        h2(getText("doclet.Package") + " " + heading);
        if (packagedoc.inlineTags().length > 0) {
            printSummaryComment(packagedoc);
            p();
            bold(getText("doclet.See"));
            br();
            printNbsps();
            printHyperLink("", "package_description",
                           getText("doclet.Description"), true);
            p();
        }
    }   

    /**
     * Print the navigation bar links at the bottom also print the "-bottom"
     * if specified on the command line.
     */                            
    protected void printPackageFooter() {
        hr();
        navLinks(false);
        printBottom();
    }

    /**
     * Copy the "doc-files" directory contents from the source package directory
     * to the generated documentation directory. For example for a package 
     * java.lang this method find out the source location of the package using
     * {@link SourcePath} and if "doc-files" directory is found in the source
     * directory structure, copy the entire directory, to the generated 
     * documentation hierarchy.
     *
     * @param path The sourcepath.
     */
    protected void copyDocFiles(String path) throws DocletAbortException {
        SourcePath sourcePath = new SourcePath(
                                  Standard.configuration().sourcepath);
        String docfilesdir = path + fileseparator + "doc-files";
        File sourcedir = sourcePath.getDirectory(docfilesdir);
        if (sourcedir == null) {
            return;
        }
        String destname = destdir;
        if (destname.length() > 0 && !destname.endsWith(fileseparator)) {
            destname += fileseparator;      
        }
        String src = sourcedir.toString();
        String dest = destname + path + fileseparator + "doc-files";
        try {
            File srcdir = new File(src);
            File destdir = new File(dest);
            DirectoryManager.createDirectory(dest);
            String[] files = srcdir.list();
            for (int i = 0; i < files.length; i++) {
                File srcfile = new File(srcdir, files[i]);
                File destfile = new File(destdir, files[i]);
                if (srcfile.isFile()) {
                    notice("doclet.Copying_File_0_To_Dir_1", 
                            srcfile.toString(), destdir.toString());
                    Util.copyFile(destfile, srcfile); 
                }
            }
        } catch (SecurityException exc) {
            throw new DocletAbortException();
        } catch (IOException exc) {
            throw new DocletAbortException();
        }
    }
                
    /**
     * Print "Use" link for this pacakge in the navigation bar.
     */
    protected void navLinkClassUse() {
        navCellStart();
        printHyperLink("package-use.html", "", getText("doclet.navClassUse"),
                       true, "NavBarFont1");
        navCellEnd();
    }

    /**
     * Print "PREV PACKAGE" link in the navigation bar.
     */
    protected void navLinkPrevious() {
        if (prev == null) {
            printText("doclet.Prev_Package");
        } else {
            String path = DirectoryManager.getRelativePath(packagedoc.name(),
                                                           prev.name());
            printHyperLink(path + "package-summary.html", "",
                           getText("doclet.Prev_Package"), true);
        }
    }
                                
    /**
     * Print "NEXT PACKAGE" link in the navigation bar.
     */
    protected void navLinkNext() {
        if (next == null) {
            printText("doclet.Next_Package");
        } else {
            String path = DirectoryManager.getRelativePath(packagedoc.name(),
                                                           next.name());
            printHyperLink(path + "package-summary.html", "",
                           getText("doclet.Next_Package"), true);
        }
    }

    /**
     * Print "Tree" link in the navigation bar. This will be link to the package
     * tree file.
     */
    protected void navLinkTree() {
        navCellStart();
        printHyperLink("package-tree.html", "", getText("doclet.Tree"),
                       true, "NavBarFont1");
        navCellEnd();
    }
}