1 /*
2  * Copyright (c) 1999, 2016, 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.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /**
25  * Regression test for:
26  * Javadoc does not process base class. If user specifies few classes on the
27  * command line and few packages, with a situation where one of the specified
28  * classes(on the command line) extends a class from one of the packages, then
29  * due to some anomaly in ordering in which all the class and package objects
30  * get constructed, few classes were getting marked as "not included", even
31  * thought they were included in this run and hence documentation for those
32  * packages was wrong. The test case for which javadoc was failing is given
33  * in bug# 4197513.
34  *
35  * @bug 4197513
36  * @summary Javadoc does not process base class.
37  * @build BaseClass.java
38  * @author Atul M Dambalkar
39  */
40 
41 import java.util.Collections;
42 import java.util.LinkedHashSet;
43 import java.util.List;
44 import java.util.Locale;
45 import java.util.Set;
46 import java.util.stream.Collectors;
47 
48 import javax.lang.model.SourceVersion;
49 
50 import javax.lang.model.element.Element;
51 import javax.lang.model.element.ElementKind;
52 import javax.lang.model.element.TypeElement;
53 import javax.lang.model.util.ElementFilter;
54 import javax.lang.model.util.Elements;
55 
56 import jdk.javadoc.doclet.*;
57 
58 public class BaseClass implements Doclet {
59 
run(DocletEnvironment root)60     public boolean run(DocletEnvironment root) {
61         Elements elementUtils = root.getElementUtils();
62         TypeElement klass = elementUtils.getTypeElement("baz.Foo");
63         if (!root.isIncluded(klass)) {
64             throw new AssertionError("Base class is not included: baz.Foo");
65         }
66 
67         for (TypeElement te : ElementFilter.typesIn(root.getSpecifiedElements())) {
68             if (te.getKind() == ElementKind.CLASS &&
69                     te.getSimpleName().contentEquals("Bar")) {
70                 klass = te;
71             }
72         }
73         if (klass == null) {
74             throw new AssertionError("class Bar not found");
75         }
76         List<? extends Element> members = klass.getEnclosedElements();
77 
78 
79         boolean foundPublic = false;
80         boolean foundProtected = false;
81 
82         boolean foundPackagePrivate = false;
83         boolean foundPrivate = false;
84 
85         List<Element> included = members.stream()
86                 .filter(cls -> root.isIncluded(cls))
87                 .collect(Collectors.toList());
88 
89         for (Element e : included) {
90             System.out.println("element: " + e);
91             if (e.getSimpleName().toString().equals("aPublicMethod")) {
92                 foundPublic = true;
93             }
94             if (e.getSimpleName().toString().equals("aProtectedMethod")) {
95                 foundProtected = true;
96             }
97             if (e.getSimpleName().toString().equals("aPackagePrivateMethod")) {
98                 foundPackagePrivate = true;
99             }
100             if (e.getSimpleName().toString().equals("aPackagePrivateMethod")) {
101                 foundPrivate = true;
102             }
103         }
104         if (!foundPublic || !foundProtected) {
105             throw new AssertionError("selected methods not found");
106         }
107 
108         if (foundPrivate || foundPackagePrivate) {
109              throw new AssertionError("unselected methods found");
110         }
111 
112         return true;
113     }
114 
getSupportedOptions()115     public Set<Doclet.Option> getSupportedOptions() {
116         return Collections.emptySet();
117     }
118 
init(Locale locale, Reporter reporter)119     public void init(Locale locale, Reporter reporter) {
120         return;
121     }
122 
123     @Override
getName()124     public String getName() {
125         return "BaseClass";
126     }
127 
128     @Override
getSupportedSourceVersion()129     public SourceVersion getSupportedSourceVersion() {
130         return SourceVersion.latest();
131     }
132 }
133