1 /*
   2  * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.tools.doclets.formats.html;
  27 
  28 import java.io.*;
  29 import java.util.*;
  30 
  31 import com.sun.javadoc.*;
  32 import com.sun.tools.javac.jvm.Profile;
  33 import com.sun.tools.doclets.formats.html.markup.*;
  34 import com.sun.tools.doclets.internal.toolkit.*;
  35 import com.sun.tools.doclets.internal.toolkit.util.*;
  36 
  37 /**
  38  * Class to generate file for each profile package contents in the right-hand
  39  * frame. This will list all the Class Kinds in the package. A click on any
  40  * class-kind will update the frame with the clicked class-kind page.
  41  *
  42  *  <p><b>This is NOT part of any supported API.
  43  *  If you write code that depends on this, you do so at your own risk.
  44  *  This code and its internal interfaces are subject to change or
  45  *  deletion without notice.</b>
  46  *
  47  * @author Bhavesh Patel
  48  */
  49 public class ProfilePackageWriterImpl extends HtmlDocletWriter
  50     implements ProfilePackageSummaryWriter {
  51 
  52     /**
  53      * The prev package name in the alpha-order list.
  54      */
  55     protected PackageDoc prev;
  56 
  57     /**
  58      * The next package name in the alpha-order list.
  59      */
  60     protected PackageDoc next;
  61 
  62     /**
  63      * The profile package being documented.
  64      */
  65     protected PackageDoc packageDoc;
  66 
  67     /**
  68      * The name of the profile being documented.
  69      */
  70     protected String profileName;
  71 
  72     /**
  73      * The value of the profile being documented.
  74      */
  75     protected int profileValue;
  76 
  77     /**
  78      * Constructor to construct ProfilePackageWriter object and to generate
  79      * "profilename-package-summary.html" file in the respective package directory.
  80      * For example for profile compact1 and package "java.lang" this will generate file
  81      * "compact1-package-summary.html" file in the "java/lang" directory. It will also
  82      * create "java/lang" directory in the current or the destination directory
  83      * if it doesn't exist.
  84      *
  85      * @param configuration the configuration of the doclet.
  86      * @param packageDoc    PackageDoc under consideration.
  87      * @param prev          Previous package in the sorted array.
  88      * @param next          Next package in the sorted array.
  89      * @param profile       The profile being documented.
  90      */
  91     public ProfilePackageWriterImpl(ConfigurationImpl configuration,
  92             PackageDoc packageDoc, PackageDoc prev, PackageDoc next,
  93             Profile profile) throws IOException {
  94         super(configuration, DocPath.forPackage(packageDoc).resolve(
  95                 DocPaths.profilePackageSummary(profile.name)));
  96         this.prev = prev;
  97         this.next = next;
  98         this.packageDoc = packageDoc;
  99         this.profileName = profile.name;
 100         this.profileValue = profile.value;
 101     }
 102 
 103     /**
 104      * {@inheritDoc}
 105      */
 106     public Content getPackageHeader(String heading) {
 107         String pkgName = packageDoc.name();
 108         Content bodyTree = getBody(true, getWindowTitle(pkgName));
 109         addTop(bodyTree);
 110         addNavLinks(true, bodyTree);
 111         HtmlTree div = new HtmlTree(HtmlTag.DIV);
 112         div.addStyle(HtmlStyle.header);
 113         Content profileContent = new StringContent(profileName);
 114         Content profileNameDiv = HtmlTree.DIV(HtmlStyle.subTitle, profileContent);
 115         div.addContent(profileNameDiv);
 116         Content annotationContent = new HtmlTree(HtmlTag.P);
 117         addAnnotationInfo(packageDoc, annotationContent);
 118         div.addContent(annotationContent);
 119         Content tHeading = HtmlTree.HEADING(HtmlConstants.TITLE_HEADING, true,
 120                 HtmlStyle.title, packageLabel);
 121         tHeading.addContent(getSpace());
 122         Content packageHead = new RawHtml(heading);
 123         tHeading.addContent(packageHead);
 124         div.addContent(tHeading);
 125         addDeprecationInfo(div);
 126         if (packageDoc.inlineTags().length > 0 && ! configuration.nocomment) {
 127             HtmlTree docSummaryDiv = new HtmlTree(HtmlTag.DIV);
 128             docSummaryDiv.addStyle(HtmlStyle.docSummary);
 129             addSummaryComment(packageDoc, docSummaryDiv);
 130             div.addContent(docSummaryDiv);
 131             Content space = getSpace();
 132             Content descLink = getHyperLink(DocLink.fragment("package_description"),
 133                     descriptionLabel, "", "");
 134             Content descPara = new HtmlTree(HtmlTag.P, seeLabel, space, descLink);
 135             div.addContent(descPara);
 136         }
 137         bodyTree.addContent(div);
 138         return bodyTree;
 139     }
 140 
 141     /**
 142      * {@inheritDoc}
 143      */
 144     public Content getContentHeader() {
 145         HtmlTree div = new HtmlTree(HtmlTag.DIV);
 146         div.addStyle(HtmlStyle.contentContainer);
 147         return div;
 148     }
 149 
 150     /**
 151      * Add the package deprecation information to the documentation tree.
 152      *
 153      * @param div the content tree to which the deprecation information will be added
 154      */
 155     public void addDeprecationInfo(Content div) {
 156         Tag[] deprs = packageDoc.tags("deprecated");
 157         if (Util.isDeprecated(packageDoc)) {
 158             HtmlTree deprDiv = new HtmlTree(HtmlTag.DIV);
 159             deprDiv.addStyle(HtmlStyle.deprecatedContent);
 160             Content deprPhrase = HtmlTree.SPAN(HtmlStyle.strong, deprecatedPhrase);
 161             deprDiv.addContent(deprPhrase);
 162             if (deprs.length > 0) {
 163                 Tag[] commentTags = deprs[0].inlineTags();
 164                 if (commentTags.length > 0) {
 165                     addInlineDeprecatedComment(packageDoc, deprs[0], deprDiv);
 166                 }
 167             }
 168             div.addContent(deprDiv);
 169         }
 170     }
 171 
 172     /**
 173      * {@inheritDoc}
 174      */
 175     public void addClassesSummary(ClassDoc[] classes, String label,
 176             String tableSummary, String[] tableHeader, Content packageSummaryContentTree) {
 177         addClassesSummary(classes, label, tableSummary, tableHeader,
 178                 packageSummaryContentTree, profileValue);
 179     }
 180 
 181     /**
 182      * {@inheritDoc}
 183      */
 184     public Content getSummaryHeader() {
 185         HtmlTree ul = new HtmlTree(HtmlTag.UL);
 186         ul.addStyle(HtmlStyle.blockList);
 187         return ul;
 188     }
 189 
 190     /**
 191      * {@inheritDoc}
 192      */
 193     public void addPackageDescription(Content packageContentTree) {
 194         if (packageDoc.inlineTags().length > 0) {
 195             packageContentTree.addContent(getMarkerAnchor("package_description"));
 196             Content h2Content = new StringContent(
 197                     configuration.getText("doclet.Package_Description",
 198                     packageDoc.name()));
 199             packageContentTree.addContent(HtmlTree.HEADING(HtmlConstants.PACKAGE_HEADING,
 200                     true, h2Content));
 201             addInlineComment(packageDoc, packageContentTree);
 202         }
 203     }
 204 
 205     /**
 206      * {@inheritDoc}
 207      */
 208     public void addPackageTags(Content packageContentTree) {
 209         addTagsInfo(packageDoc, packageContentTree);
 210     }
 211 
 212     /**
 213      * {@inheritDoc}
 214      */
 215     public void addPackageFooter(Content contentTree) {
 216         addNavLinks(false, contentTree);
 217         addBottom(contentTree);
 218     }
 219 
 220     /**
 221      * {@inheritDoc}
 222      */
 223     public void printDocument(Content contentTree) throws IOException {
 224         printHtmlDocument(configuration.metakeywords.getMetaKeywords(packageDoc),
 225                 true, contentTree);
 226     }
 227 
 228     /**
 229      * Get "Use" link for this package in the navigation bar.
 230      *
 231      * @return a content tree for the class use link
 232      */
 233     protected Content getNavLinkClassUse() {
 234         Content useLink = getHyperLink(DocPaths.PACKAGE_USE,
 235                 useLabel, "", "");
 236         Content li = HtmlTree.LI(useLink);
 237         return li;
 238     }
 239 
 240     /**
 241      * Get "PREV PACKAGE" link in the navigation bar.
 242      *
 243      * @return a content tree for the previous link
 244      */
 245     public Content getNavLinkPrevious() {
 246         Content li;
 247         if (prev == null) {
 248             li = HtmlTree.LI(prevpackageLabel);
 249         } else {
 250             DocPath path = DocPath.relativePath(packageDoc, prev);
 251             li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.profilePackageSummary(profileName)),
 252                 prevpackageLabel, "", ""));
 253         }
 254         return li;
 255     }
 256 
 257     /**
 258      * Get "NEXT PACKAGE" link in the navigation bar.
 259      *
 260      * @return a content tree for the next link
 261      */
 262     public Content getNavLinkNext() {
 263         Content li;
 264         if (next == null) {
 265             li = HtmlTree.LI(nextpackageLabel);
 266         } else {
 267             DocPath path = DocPath.relativePath(packageDoc, next);
 268             li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.profilePackageSummary(profileName)),
 269                 nextpackageLabel, "", ""));
 270         }
 271         return li;
 272     }
 273 
 274     /**
 275      * Get "Tree" link in the navigation bar. This will be link to the package
 276      * tree file.
 277      *
 278      * @return a content tree for the tree link
 279      */
 280     protected Content getNavLinkTree() {
 281         Content useLink = getHyperLink(DocPaths.PACKAGE_TREE,
 282                 treeLabel, "", "");
 283         Content li = HtmlTree.LI(useLink);
 284         return li;
 285     }
 286 
 287     /**
 288      * Highlight "Package" in the navigation bar, as this is the package page.
 289      *
 290      * @return a content tree for the package link
 291      */
 292     protected Content getNavLinkPackage() {
 293         Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, packageLabel);
 294         return li;
 295     }
 296 }