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
41import java.util.Collections;
42import java.util.LinkedHashSet;
43import java.util.List;
44import java.util.Locale;
45import java.util.Set;
46import java.util.stream.Collectors;
47
48import javax.lang.model.SourceVersion;
49
50import javax.lang.model.element.Element;
51import javax.lang.model.element.ElementKind;
52import javax.lang.model.element.TypeElement;
53import javax.lang.model.util.ElementFilter;
54import javax.lang.model.util.Elements;
55
56import jdk.javadoc.doclet.*;
57
58public class BaseClass implements Doclet {
59
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
115    public Set<Doclet.Option> getSupportedOptions() {
116        return Collections.emptySet();
117    }
118
119    public void init(Locale locale, Reporter reporter) {
120        return;
121    }
122
123    @Override
124    public String getName() {
125        return "BaseClass";
126    }
127
128    @Override
129    public SourceVersion getSupportedSourceVersion() {
130        return SourceVersion.latest();
131    }
132}
133