< prev index next >

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ClassUseWriter.java

Print this page




   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 jdk.javadoc.internal.doclets.formats.html;
  27 

  28 import java.util.ArrayList;
  29 import java.util.Collections;
  30 import java.util.HashMap;
  31 import java.util.List;
  32 import java.util.Map;
  33 import java.util.Set;
  34 import java.util.SortedSet;
  35 import java.util.TreeSet;
  36 
  37 import javax.lang.model.element.Element;
  38 import javax.lang.model.element.PackageElement;
  39 import javax.lang.model.element.TypeElement;
  40 import javax.tools.Diagnostic;
  41 
  42 import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
  43 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
  44 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
  45 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
  46 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
  47 import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;


  84     final Map<PackageElement, List<Element>> pkgToMethodReturn;
  85     final Map<PackageElement, List<Element>> pkgToMethodArgs;
  86     final Map<PackageElement, List<Element>> pkgToMethodThrows;
  87     final Map<PackageElement, List<Element>> pkgToConstructorAnnotations;
  88     final Map<PackageElement, List<Element>> pkgToConstructorParameterAnnotations;
  89     final Map<PackageElement, List<Element>> pkgToConstructorArgs;
  90     final Map<PackageElement, List<Element>> pkgToConstructorArgTypeParameter;
  91     final Map<PackageElement, List<Element>> pkgToConstructorThrows;
  92     final SortedSet<PackageElement> pkgSet;
  93     final MethodWriterImpl methodSubWriter;
  94     final ConstructorWriterImpl constrSubWriter;
  95     final FieldWriterImpl fieldSubWriter;
  96     final NestedClassWriterImpl classSubWriter;
  97     // Summary for various use tables.
  98     final String classUseTableSummary;
  99     final String subclassUseTableSummary;
 100     final String subinterfaceUseTableSummary;
 101     final String fieldUseTableSummary;
 102     final String methodUseTableSummary;
 103     final String constructorUseTableSummary;

 104 
 105     /**
 106      * The HTML tree for main tag.
 107      */
 108     protected HtmlTree mainTree = HtmlTree.MAIN();
 109 
 110     /**
 111      * Constructor.
 112      *
 113      * @param filename the file to be generated.
 114      */
 115     public ClassUseWriter(HtmlConfiguration configuration,
 116                           ClassUseMapper mapper, DocPath filename,
 117                           TypeElement typeElement) {
 118         super(configuration, filename);
 119         this.typeElement = typeElement;
 120         if (mapper.classToPackageAnnotations.containsKey(typeElement)) {
 121             pkgToPackageAnnotations = new TreeSet<>(utils.makeClassUseComparator());
 122             pkgToPackageAnnotations.addAll(mapper.classToPackageAnnotations.get(typeElement));
 123         }


 135         this.pkgToSubclass = pkgDivide(mapper.classToSubclass);
 136         this.pkgToSubinterface = pkgDivide(mapper.classToSubinterface);
 137         this.pkgToImplementingClass = pkgDivide(mapper.classToImplementingClass);
 138         this.pkgToField = pkgDivide(mapper.classToField);
 139         this.pkgToMethodReturn = pkgDivide(mapper.classToMethodReturn);
 140         this.pkgToMethodArgs = pkgDivide(mapper.classToMethodArgs);
 141         this.pkgToMethodThrows = pkgDivide(mapper.classToMethodThrows);
 142         this.pkgToConstructorAnnotations = pkgDivide(mapper.classToConstructorAnnotations);
 143         this.pkgToConstructorParameterAnnotations = pkgDivide(mapper.classToConstructorParamAnnotation);
 144         this.pkgToConstructorArgs = pkgDivide(mapper.classToConstructorArgs);
 145         this.pkgToConstructorArgTypeParameter = pkgDivide(mapper.classToConstructorArgTypeParam);
 146         this.pkgToConstructorThrows = pkgDivide(mapper.classToConstructorThrows);
 147         //tmp test
 148         if (pkgSet.size() > 0 &&
 149             mapper.classToPackage.containsKey(this.typeElement) &&
 150             !pkgSet.equals(mapper.classToPackage.get(this.typeElement))) {
 151             configuration.reporter.print(Diagnostic.Kind.WARNING,
 152                     "Internal error: package sets don't match: "
 153                     + pkgSet + " with: " + mapper.classToPackage.get(this.typeElement));
 154         }

 155         methodSubWriter = new MethodWriterImpl(this);
 156         constrSubWriter = new ConstructorWriterImpl(this);
 157         fieldSubWriter = new FieldWriterImpl(this);
 158         classSubWriter = new NestedClassWriterImpl(this);
 159         classUseTableSummary = configuration.getText("doclet.Use_Table_Summary",
 160                 configuration.getText("doclet.classes"));
 161         subclassUseTableSummary = configuration.getText("doclet.Use_Table_Summary",
 162                 configuration.getText("doclet.subclasses"));
 163         subinterfaceUseTableSummary = configuration.getText("doclet.Use_Table_Summary",
 164                 configuration.getText("doclet.subinterfaces"));
 165         fieldUseTableSummary = configuration.getText("doclet.Use_Table_Summary",
 166                 configuration.getText("doclet.fields"));
 167         methodUseTableSummary = configuration.getText("doclet.Use_Table_Summary",
 168                 configuration.getText("doclet.methods"));
 169         constructorUseTableSummary = configuration.getText("doclet.Use_Table_Summary",
 170                 configuration.getText("doclet.constructors"));




 171     }
 172 
 173     /**
 174      * Write out class use pages.
 175      *
 176      * @param configuration the configuration for this doclet
 177      * @param classtree the class tree hierarchy
 178      * @throws DocFileIOException if there is an error while generating the documentation
 179      */
 180     public static void generate(HtmlConfiguration configuration, ClassTree classtree) throws DocFileIOException  {
 181         ClassUseMapper mapper = new ClassUseMapper(configuration, classtree);
 182         for (TypeElement aClass : configuration.getIncludedTypeElements()) {
 183             // If -nodeprecated option is set and the containing package is marked
 184             // as deprecated, do not generate the class-use page. We will still generate
 185             // the class-use page if the class is marked as deprecated but the containing
 186             // package is not since it could still be linked from that package-use page.
 187             if (!(configuration.nodeprecated &&
 188                   configuration.utils.isDeprecated(configuration.utils.containingPackage(aClass))))
 189                 ClassUseWriter.generate(configuration, mapper, aClass);
 190         }


 273         if (configuration.packages.size() > 1) {
 274             addPackageList(ul);
 275             addPackageAnnotationList(ul);
 276         }
 277         addClassList(ul);
 278         contentTree.addContent(ul);
 279     }
 280 
 281     /**
 282      * Add the packages elements that use the given class.
 283      *
 284      * @param contentTree the content tree to which the packages elements will be added
 285      */
 286     protected void addPackageList(Content contentTree) {
 287         Content caption = getTableCaption(configuration.getContent(
 288                 "doclet.ClassUse_Packages.that.use.0",
 289                 getLink(new LinkInfoImpl(configuration,
 290                         LinkInfoImpl.Kind.CLASS_USE_HEADER, typeElement))));
 291         Content table = (configuration.isOutputHtml5())
 292                 ? HtmlTree.TABLE(HtmlStyle.useSummary, caption)
 293                 : HtmlTree.TABLE(HtmlStyle.useSummary, useTableSummary, caption);
 294         table.addContent(getSummaryTableHeader(packageTableHeader, "col"));
 295         Content tbody = new HtmlTree(HtmlTag.TBODY);
 296         boolean altColor = true;
 297         for (PackageElement pkg : pkgSet) {
 298             HtmlTree tr = new HtmlTree(HtmlTag.TR);
 299             tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
 300             altColor = !altColor;
 301             addPackageUse(pkg, tr);
 302             tbody.addContent(tr);
 303         }
 304         table.addContent(tbody);
 305         Content li = HtmlTree.LI(HtmlStyle.blockList, table);
 306         contentTree.addContent(li);
 307     }
 308 
 309     /**
 310      * Add the package annotation elements.
 311      *
 312      * @param contentTree the content tree to which the package annotation elements will be added
 313      */
 314     protected void addPackageAnnotationList(Content contentTree) {
 315         if (!utils.isAnnotationType(typeElement) ||
 316                 pkgToPackageAnnotations == null ||
 317                 pkgToPackageAnnotations.isEmpty()) {
 318             return;
 319         }
 320         Content caption = getTableCaption(configuration.getContent(
 321                 "doclet.ClassUse_PackageAnnotation",
 322                 getLink(new LinkInfoImpl(configuration,
 323                         LinkInfoImpl.Kind.CLASS_USE_HEADER, typeElement))));
 324         Content table = (configuration.isOutputHtml5())
 325                 ? HtmlTree.TABLE(HtmlStyle.useSummary, caption)
 326                 : HtmlTree.TABLE(HtmlStyle.useSummary, useTableSummary, caption);
 327         table.addContent(getSummaryTableHeader(packageTableHeader, "col"));
 328         Content tbody = new HtmlTree(HtmlTag.TBODY);
 329         boolean altColor = true;
 330         for (PackageElement pkg : pkgToPackageAnnotations) {
 331             HtmlTree tr = new HtmlTree(HtmlTag.TR);
 332             tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
 333             altColor = !altColor;
 334             Content thFirst = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, getPackageLink(pkg));
 335             tr.addContent(thFirst);
 336             HtmlTree tdLast = new HtmlTree(HtmlTag.TD);
 337             tdLast.addStyle(HtmlStyle.colLast);
 338             addSummaryComment(pkg, tdLast);
 339             tr.addContent(tdLast);
 340             tbody.addContent(tr);
 341         }
 342         table.addContent(tbody);
 343         Content li = HtmlTree.LI(HtmlStyle.blockList, table);
 344         contentTree.addContent(li);
 345     }
 346 
 347     /**




   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 jdk.javadoc.internal.doclets.formats.html;
  27 
  28 import java.text.MessageFormat;
  29 import java.util.ArrayList;
  30 import java.util.Collections;
  31 import java.util.HashMap;
  32 import java.util.List;
  33 import java.util.Map;
  34 import java.util.Set;
  35 import java.util.SortedSet;
  36 import java.util.TreeSet;
  37 
  38 import javax.lang.model.element.Element;
  39 import javax.lang.model.element.PackageElement;
  40 import javax.lang.model.element.TypeElement;
  41 import javax.tools.Diagnostic;
  42 
  43 import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
  44 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlConstants;
  45 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlStyle;
  46 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTag;
  47 import jdk.javadoc.internal.doclets.formats.html.markup.HtmlTree;
  48 import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;


  85     final Map<PackageElement, List<Element>> pkgToMethodReturn;
  86     final Map<PackageElement, List<Element>> pkgToMethodArgs;
  87     final Map<PackageElement, List<Element>> pkgToMethodThrows;
  88     final Map<PackageElement, List<Element>> pkgToConstructorAnnotations;
  89     final Map<PackageElement, List<Element>> pkgToConstructorParameterAnnotations;
  90     final Map<PackageElement, List<Element>> pkgToConstructorArgs;
  91     final Map<PackageElement, List<Element>> pkgToConstructorArgTypeParameter;
  92     final Map<PackageElement, List<Element>> pkgToConstructorThrows;
  93     final SortedSet<PackageElement> pkgSet;
  94     final MethodWriterImpl methodSubWriter;
  95     final ConstructorWriterImpl constrSubWriter;
  96     final FieldWriterImpl fieldSubWriter;
  97     final NestedClassWriterImpl classSubWriter;
  98     // Summary for various use tables.
  99     final String classUseTableSummary;
 100     final String subclassUseTableSummary;
 101     final String subinterfaceUseTableSummary;
 102     final String fieldUseTableSummary;
 103     final String methodUseTableSummary;
 104     final String constructorUseTableSummary;
 105     final String packageUseTableSummary;
 106 
 107     /**
 108      * The HTML tree for main tag.
 109      */
 110     protected HtmlTree mainTree = HtmlTree.MAIN();
 111 
 112     /**
 113      * Constructor.
 114      *
 115      * @param filename the file to be generated.
 116      */
 117     public ClassUseWriter(HtmlConfiguration configuration,
 118                           ClassUseMapper mapper, DocPath filename,
 119                           TypeElement typeElement) {
 120         super(configuration, filename);
 121         this.typeElement = typeElement;
 122         if (mapper.classToPackageAnnotations.containsKey(typeElement)) {
 123             pkgToPackageAnnotations = new TreeSet<>(utils.makeClassUseComparator());
 124             pkgToPackageAnnotations.addAll(mapper.classToPackageAnnotations.get(typeElement));
 125         }


 137         this.pkgToSubclass = pkgDivide(mapper.classToSubclass);
 138         this.pkgToSubinterface = pkgDivide(mapper.classToSubinterface);
 139         this.pkgToImplementingClass = pkgDivide(mapper.classToImplementingClass);
 140         this.pkgToField = pkgDivide(mapper.classToField);
 141         this.pkgToMethodReturn = pkgDivide(mapper.classToMethodReturn);
 142         this.pkgToMethodArgs = pkgDivide(mapper.classToMethodArgs);
 143         this.pkgToMethodThrows = pkgDivide(mapper.classToMethodThrows);
 144         this.pkgToConstructorAnnotations = pkgDivide(mapper.classToConstructorAnnotations);
 145         this.pkgToConstructorParameterAnnotations = pkgDivide(mapper.classToConstructorParamAnnotation);
 146         this.pkgToConstructorArgs = pkgDivide(mapper.classToConstructorArgs);
 147         this.pkgToConstructorArgTypeParameter = pkgDivide(mapper.classToConstructorArgTypeParam);
 148         this.pkgToConstructorThrows = pkgDivide(mapper.classToConstructorThrows);
 149         //tmp test
 150         if (pkgSet.size() > 0 &&
 151             mapper.classToPackage.containsKey(this.typeElement) &&
 152             !pkgSet.equals(mapper.classToPackage.get(this.typeElement))) {
 153             configuration.reporter.print(Diagnostic.Kind.WARNING,
 154                     "Internal error: package sets don't match: "
 155                     + pkgSet + " with: " + mapper.classToPackage.get(this.typeElement));
 156         }
 157 
 158         methodSubWriter = new MethodWriterImpl(this);
 159         constrSubWriter = new ConstructorWriterImpl(this);
 160         fieldSubWriter = new FieldWriterImpl(this);
 161         classSubWriter = new NestedClassWriterImpl(this);
 162 
 163         String useTableSummary = resources.getText("doclet.Use_Table_Summary");
 164         classUseTableSummary = MessageFormat.format(useTableSummary,
 165                 resources.getText("doclet.classes"));
 166         subclassUseTableSummary = MessageFormat.format(useTableSummary,
 167                 resources.getText("doclet.subclasses"));
 168         subinterfaceUseTableSummary = MessageFormat.format(useTableSummary,
 169                 resources.getText("doclet.subinterfaces"));
 170         fieldUseTableSummary = MessageFormat.format(useTableSummary,
 171                 resources.getText("doclet.fields"));
 172         methodUseTableSummary = MessageFormat.format(useTableSummary,
 173                 resources.getText("doclet.methods"));
 174         constructorUseTableSummary = MessageFormat.format(useTableSummary,
 175                 resources.getText("doclet.constructors"));
 176         packageUseTableSummary = MessageFormat.format(useTableSummary,
 177                 resources.getText("doclet.packages"));
 178     }
 179 
 180     /**
 181      * Write out class use pages.
 182      *
 183      * @param configuration the configuration for this doclet
 184      * @param classtree the class tree hierarchy
 185      * @throws DocFileIOException if there is an error while generating the documentation
 186      */
 187     public static void generate(HtmlConfiguration configuration, ClassTree classtree) throws DocFileIOException  {
 188         ClassUseMapper mapper = new ClassUseMapper(configuration, classtree);
 189         for (TypeElement aClass : configuration.getIncludedTypeElements()) {
 190             // If -nodeprecated option is set and the containing package is marked
 191             // as deprecated, do not generate the class-use page. We will still generate
 192             // the class-use page if the class is marked as deprecated but the containing
 193             // package is not since it could still be linked from that package-use page.
 194             if (!(configuration.nodeprecated &&
 195                   configuration.utils.isDeprecated(configuration.utils.containingPackage(aClass))))
 196                 ClassUseWriter.generate(configuration, mapper, aClass);
 197         }


 280         if (configuration.packages.size() > 1) {
 281             addPackageList(ul);
 282             addPackageAnnotationList(ul);
 283         }
 284         addClassList(ul);
 285         contentTree.addContent(ul);
 286     }
 287 
 288     /**
 289      * Add the packages elements that use the given class.
 290      *
 291      * @param contentTree the content tree to which the packages elements will be added
 292      */
 293     protected void addPackageList(Content contentTree) {
 294         Content caption = getTableCaption(configuration.getContent(
 295                 "doclet.ClassUse_Packages.that.use.0",
 296                 getLink(new LinkInfoImpl(configuration,
 297                         LinkInfoImpl.Kind.CLASS_USE_HEADER, typeElement))));
 298         Content table = (configuration.isOutputHtml5())
 299                 ? HtmlTree.TABLE(HtmlStyle.useSummary, caption)
 300                 : HtmlTree.TABLE(HtmlStyle.useSummary, packageUseTableSummary, caption);
 301         table.addContent(getPackageTableHeader().toContent());
 302         Content tbody = new HtmlTree(HtmlTag.TBODY);
 303         boolean altColor = true;
 304         for (PackageElement pkg : pkgSet) {
 305             HtmlTree tr = new HtmlTree(HtmlTag.TR);
 306             tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
 307             altColor = !altColor;
 308             addPackageUse(pkg, tr);
 309             tbody.addContent(tr);
 310         }
 311         table.addContent(tbody);
 312         Content li = HtmlTree.LI(HtmlStyle.blockList, table);
 313         contentTree.addContent(li);
 314     }
 315 
 316     /**
 317      * Add the package annotation elements.
 318      *
 319      * @param contentTree the content tree to which the package annotation elements will be added
 320      */
 321     protected void addPackageAnnotationList(Content contentTree) {
 322         if (!utils.isAnnotationType(typeElement) ||
 323                 pkgToPackageAnnotations == null ||
 324                 pkgToPackageAnnotations.isEmpty()) {
 325             return;
 326         }
 327         Content caption = getTableCaption(configuration.getContent(
 328                 "doclet.ClassUse_PackageAnnotation",
 329                 getLink(new LinkInfoImpl(configuration,
 330                         LinkInfoImpl.Kind.CLASS_USE_HEADER, typeElement))));
 331         Content table = (configuration.isOutputHtml5())
 332                 ? HtmlTree.TABLE(HtmlStyle.useSummary, caption)
 333                 : HtmlTree.TABLE(HtmlStyle.useSummary, packageUseTableSummary, caption);
 334         table.addContent(getPackageTableHeader().toContent());
 335         Content tbody = new HtmlTree(HtmlTag.TBODY);
 336         boolean altColor = true;
 337         for (PackageElement pkg : pkgToPackageAnnotations) {
 338             HtmlTree tr = new HtmlTree(HtmlTag.TR);
 339             tr.addStyle(altColor ? HtmlStyle.altColor : HtmlStyle.rowColor);
 340             altColor = !altColor;
 341             Content thFirst = HtmlTree.TH_ROW_SCOPE(HtmlStyle.colFirst, getPackageLink(pkg));
 342             tr.addContent(thFirst);
 343             HtmlTree tdLast = new HtmlTree(HtmlTag.TD);
 344             tdLast.addStyle(HtmlStyle.colLast);
 345             addSummaryComment(pkg, tdLast);
 346             tr.addContent(tdLast);
 347             tbody.addContent(tr);
 348         }
 349         table.addContent(tbody);
 350         Content li = HtmlTree.LI(HtmlStyle.blockList, table);
 351         contentTree.addContent(li);
 352     }
 353 
 354     /**


< prev index next >