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 /**
|