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