src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/builders/ConstantsSummaryBuilder.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -21,19 +21,25 @@
  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
 
-package com.sun.tools.doclets.internal.toolkit.builders;
+package jdk.javadoc.internal.doclets.toolkit.builders;
 
 import java.io.*;
 import java.util.*;
 
-import com.sun.javadoc.*;
-import com.sun.tools.doclets.internal.toolkit.*;
-import com.sun.tools.doclets.internal.toolkit.util.*;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.PackageElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.VariableElement;
 
+import jdk.javadoc.internal.doclets.toolkit.ConstantsSummaryWriter;
+import jdk.javadoc.internal.doclets.toolkit.Content;
+import jdk.javadoc.internal.doclets.toolkit.util.VisibleMemberMap;
+
+
 /**
  * Builds the Constants Summary Page.
  *
  *  <p><b>This is NOT part of any supported API.
  *  If you write code that depends on this, you do so at your own risk.

@@ -61,28 +67,28 @@
      * The writer used to write the results.
      */
     protected final ConstantsSummaryWriter writer;
 
     /**
-     * The set of ClassDocs that have constant fields.
+     * The set of TypeElements that have constant fields.
      */
-    protected final Set<ClassDoc> classDocsWithConstFields;
+    protected final Set<TypeElement> typeElementsWithConstFields;
 
     /**
      * The set of printed package headers.
      */
-    protected Set<String> printedPackageHeaders;
+    protected final Set<PackageElement> printedPackageHeaders;
 
     /**
      * The current package being documented.
      */
-    private PackageDoc currentPackage;
+    private PackageElement currentPackage;
 
     /**
      * The current class being documented.
      */
-    private ClassDoc currentClass;
+    private TypeElement currentClass;
 
     /**
      * The content tree for the constant summary documentation.
      */
     private Content contentTree;

@@ -100,11 +106,12 @@
      */
     private ConstantsSummaryBuilder(Context context,
             ConstantsSummaryWriter writer) {
         super(context);
         this.writer = writer;
-        this.classDocsWithConstFields = new HashSet<>();
+        this.typeElementsWithConstFields = new HashSet<>();
+        this.printedPackageHeaders = new TreeSet<>(utils.makePackageComparator());
     }
 
     /**
      * Construct a ConstantsSummaryBuilder.
      *

@@ -117,10 +124,11 @@
     }
 
     /**
      * {@inheritDoc}
      */
+    @Override
     public void build() throws IOException {
         if (writer == null) {
             //Doclet does not support this output.
             return;
         }

@@ -128,10 +136,11 @@
     }
 
     /**
      * {@inheritDoc}
      */
+    @Override
     public String getName() {
         return ROOT;
     }
 
     /**

@@ -154,16 +163,14 @@
      * @param node the XML element that specifies which components to document
      * @param contentTree the content tree to which the content list will be added
      */
     public void buildContents(XMLNode node, Content contentTree) {
         Content contentListTree = writer.getContentsHeader();
-        printedPackageHeaders = new HashSet<>();
-        for (PackageDoc pkg : configuration.packages) {
-            if (hasConstantField(pkg) && !hasPrintedPackageIndex(pkg.name())) {
-                writer.addLinkToPackageContent(pkg,
-                                               parsePackageName(pkg.name()),
-                                               printedPackageHeaders, contentListTree);
+        printedPackageHeaders.clear();
+        for (PackageElement pkg : configuration.packages) {
+            if (hasConstantField(pkg) && !hasPrintedPackageIndex(pkg)) {
+                writer.addLinkToPackageContent(pkg, printedPackageHeaders, contentListTree);
             }
         }
         writer.addContentsList(contentTree, contentListTree);
     }
 

@@ -172,13 +179,13 @@
      *
      * @param node the XML element that specifies which components to document
      * @param contentTree the tree to which the summaries will be added
      */
     public void buildConstantSummaries(XMLNode node, Content contentTree) {
-        printedPackageHeaders = new HashSet<>();
+        printedPackageHeaders.clear();
         Content summariesTree = writer.getConstantSummaries();
-        for (PackageDoc aPackage : configuration.packages) {
+        for (PackageElement aPackage : configuration.packages) {
             if (hasConstantField(aPackage)) {
                 currentPackage = aPackage;
                 //Build the documentation for the current package.
                 buildChildren(node, summariesTree);
                 first = false;

@@ -192,14 +199,15 @@
      *
      * @param node the XML element that specifies which components to document
      * @param summariesTree the tree to which the package header will be added
      */
     public void buildPackageHeader(XMLNode node, Content summariesTree) {
-        String parsedPackageName = parsePackageName(currentPackage.name());
-        if (! printedPackageHeaders.contains(parsedPackageName)) {
-            writer.addPackageName(parsePackageName(currentPackage.name()), summariesTree, first);
-            printedPackageHeaders.add(parsedPackageName);
+        String parsedPackageName = utils.parsePackageName(currentPackage);
+        PackageElement p = utils.elementUtils.getPackageElement(parsedPackageName);
+        if (!printedPackageHeaders.contains(p)) {
+            writer.addPackageName(currentPackage, summariesTree, first);
+            printedPackageHeaders.add(p);
         }
     }
 
     /**
      * Build the summary for the current class.

@@ -206,22 +214,20 @@
      *
      * @param node the XML element that specifies which components to document
      * @param summariesTree the tree to which the class constant summary will be added
      */
     public void buildClassConstantSummary(XMLNode node, Content summariesTree) {
-        ClassDoc[] classes = currentPackage.name().length() > 0 ?
-            currentPackage.allClasses() :
-            configuration.classDocCatalog.allClasses(
-                DocletConstants.DEFAULT_PACKAGE_NAME);
-        Arrays.sort(classes);
+        SortedSet<TypeElement> classes = !currentPackage.isUnnamed()
+                ? utils.getAllClasses(currentPackage)
+                : configuration.classDocCatalog.allUnnamedClasses();
         Content classConstantTree = writer.getClassConstantHeader();
-        for (ClassDoc doc : classes) {
-            if (!classDocsWithConstFields.contains(doc) ||
-                !doc.isIncluded()) {
+        for (TypeElement te : classes) {
+            if (!typeElementsWithConstFields.contains(te) ||
+                !utils.isIncluded(te)) {
                 continue;
             }
-            currentClass = doc;
+            currentClass = te;
             //Build the documentation for the current class.
             buildChildren(node, classConstantTree);
         }
         writer.addClassConstant(summariesTree, classConstantTree);
     }

@@ -241,38 +247,37 @@
      * Return true if the given package has constant fields to document.
      *
      * @param pkg   the package being checked.
      * @return true if the given package has constant fields to document.
      */
-    private boolean hasConstantField(PackageDoc pkg) {
-        ClassDoc[] classes
-                = (pkg.name().length() > 0)
-                  ? pkg.allClasses()
-                  : configuration.classDocCatalog.allClasses(DocletConstants.DEFAULT_PACKAGE_NAME);
+    private boolean hasConstantField(PackageElement pkg) {
+        SortedSet<TypeElement> classes = !pkg.isUnnamed()
+                  ? utils.getAllClasses(pkg)
+                  : configuration.classDocCatalog.allUnnamedClasses();
         boolean found = false;
-        for (ClassDoc doc : classes) {
-            if (doc.isIncluded() && hasConstantField(doc)) {
+        for (TypeElement te : classes) {
+            if (utils.isIncluded(te) && hasConstantField(te)) {
                 found = true;
             }
         }
         return found;
     }
 
     /**
      * Return true if the given class has constant fields to document.
      *
-     * @param classDoc the class being checked.
+     * @param typeElement the class being checked.
      * @return true if the given package has constant fields to document.
      */
-    private boolean hasConstantField (ClassDoc classDoc) {
-        VisibleMemberMap visibleMemberMapFields = new VisibleMemberMap(classDoc,
-            VisibleMemberMap.FIELDS, configuration);
-        List<?> fields = visibleMemberMapFields.getLeafClassMembers(configuration);
-        for (Object f : fields) {
-            FieldDoc field = (FieldDoc) f;
-            if (field.constantValueExpression() != null) {
-                classDocsWithConstFields.add(classDoc);
+    private boolean hasConstantField (TypeElement typeElement) {
+        VisibleMemberMap visibleMemberMapFields = new VisibleMemberMap(typeElement,
+            VisibleMemberMap.Kind.FIELDS, configuration);
+        SortedSet<Element> fields = visibleMemberMapFields.getLeafClassMembers();
+        for (Element f : fields) {
+            VariableElement field = (VariableElement)f;
+            if (field.getConstantValue() != null) {
+                typeElementsWithConstFields.add(typeElement);
                 return true;
             }
         }
         return false;
     }

@@ -281,14 +286,13 @@
      * Return true if the given package name has been printed.  Also
      * return true if the root of this package has been printed.
      *
      * @param pkgname the name of the package to check.
      */
-    private boolean hasPrintedPackageIndex(String pkgname) {
-        String[] list = printedPackageHeaders.toArray(new String[] {});
-        for (String packageHeader : list) {
-            if (pkgname.startsWith(packageHeader)) {
+    private boolean hasPrintedPackageIndex(PackageElement pkg) {
+        for (PackageElement printedPkg : printedPackageHeaders) {
+            if (utils.getPackageName(pkg).startsWith(utils.parsePackageName(printedPkg))) {
                 return true;
             }
         }
         return false;
     }

@@ -310,24 +314,24 @@
          * The map used to get the visible variables.
          */
         protected VisibleMemberMap visibleMemberMapEnumConst = null;
 
         /**
-         * The classdoc that we are examining constants for.
+         * The typeElement that we are examining constants for.
          */
-        protected ClassDoc classdoc;
+        protected TypeElement typeElement;
 
         /**
          * Construct a ConstantFieldSubWriter.
-         * @param classdoc the classdoc that we are examining constants for.
+         * @param typeElement the typeElement that we are examining constants for.
          */
-        public ConstantFieldBuilder(ClassDoc classdoc) {
-            this.classdoc = classdoc;
-            visibleMemberMapFields = new VisibleMemberMap(classdoc,
-                VisibleMemberMap.FIELDS, configuration);
-            visibleMemberMapEnumConst = new VisibleMemberMap(classdoc,
-                VisibleMemberMap.ENUM_CONSTANTS, configuration);
+        public ConstantFieldBuilder(TypeElement typeElement) {
+            this.typeElement = typeElement;
+            visibleMemberMapFields = new VisibleMemberMap(typeElement,
+                VisibleMemberMap.Kind.FIELDS, configuration);
+            visibleMemberMapEnumConst = new VisibleMemberMap(typeElement,
+                VisibleMemberMap.Kind.ENUM_CONSTANTS, configuration);
         }
 
         /**
          * Builds the table of constants for a given class.
          *

@@ -334,53 +338,30 @@
          * @param node the XML element that specifies which components to document
          * @param classConstantTree the tree to which the class constants table
          *                          will be added
          */
         protected void buildMembersSummary(XMLNode node, Content classConstantTree) {
-            List<FieldDoc> members = new ArrayList<>(members());
-            if (members.size() > 0) {
-                Collections.sort(members);
-                writer.addConstantMembers(classdoc, members, classConstantTree);
+            SortedSet<VariableElement> members = members();
+            if (!members.isEmpty()) {
+                writer.addConstantMembers(typeElement, members, classConstantTree);
             }
         }
 
         /**
-         * Return the list of visible constant fields for the given classdoc.
-         * @return the list of visible constant fields for the given classdoc.
+         * Return the list of visible constant fields for the given TypeElement.
+         * @return the list of visible constant fields for the given TypeElement.
          */
-        protected List<FieldDoc> members() {
-            List<ProgramElementDoc> l = visibleMemberMapFields.getLeafClassMembers(configuration);
-            l.addAll(visibleMemberMapEnumConst.getLeafClassMembers(configuration));
-            Iterator<ProgramElementDoc> iter;
-
-            if(l != null){
-                iter = l.iterator();
-            } else {
-                return null;
-            }
-            List<FieldDoc> inclList = new LinkedList<>();
-            FieldDoc member;
-            while(iter.hasNext()){
-                member = (FieldDoc)iter.next();
-                if(member.constantValue() != null){
+        protected SortedSet<VariableElement> members() {
+            SortedSet<Element> list = visibleMemberMapFields.getLeafClassMembers();
+            list.addAll(visibleMemberMapEnumConst.getLeafClassMembers());
+            SortedSet<VariableElement> inclList =
+                    new TreeSet<>(utils.makeGeneralPurposeComparator());
+            for (Element element : list) {
+                VariableElement member = (VariableElement)element;
+                if (member.getConstantValue() != null) {
                     inclList.add(member);
                 }
             }
             return inclList;
         }
     }
-
-    /**
-     * Parse the package name.  We only want to display package name up to
-     * 2 levels.
-     */
-    private String parsePackageName(String pkgname) {
-        int index = -1;
-        for (int j = 0; j < MAX_CONSTANT_VALUE_INDEX_LENGTH; j++) {
-            index = pkgname.indexOf(".", index + 1);
-        }
-        if (index != -1) {
-            pkgname = pkgname.substring(0, index);
-        }
-        return pkgname;
-    }
 }