duke@1: /* duke@1: * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@1: * duke@1: * This code is free software; you can redistribute it and/or modify it duke@1: * under the terms of the GNU General Public License version 2 only, as duke@1: * published by the Free Software Foundation. duke@1: * duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@1: * version 2 for more details (a copy is included in the LICENSE file that duke@1: * accompanied this code). duke@1: * duke@1: * You should have received a copy of the GNU General Public License version duke@1: * 2 along with this work; if not, write to the Free Software Foundation, duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@1: * duke@1: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@1: * CA 95054 USA or visit www.sun.com if you need additional information or duke@1: * have any questions. duke@1: */ duke@1: duke@1: /** duke@1: * @test darcy@208: * @bug 6374357 6308351 6707027 duke@1: * @summary PackageElement.getEnclosedElements() throws ClassReader$BadClassFileException duke@1: * @author Peter von der Ah\u00e9 duke@1: * @run main/othervm -Xmx256m Main duke@1: */ duke@1: duke@1: import java.io.File; duke@1: import java.util.*; duke@1: import javax.lang.model.SourceVersion; duke@1: import javax.lang.model.element.Element; duke@1: import javax.lang.model.element.ElementKind; duke@1: import javax.lang.model.element.PackageElement; duke@1: import javax.lang.model.element.TypeElement; duke@1: import javax.lang.model.util.Elements; duke@1: import javax.tools.*; duke@1: import com.sun.source.util.JavacTask; duke@1: duke@1: import static javax.tools.StandardLocation.CLASS_PATH; duke@1: import static javax.tools.StandardLocation.PLATFORM_CLASS_PATH; duke@1: import static javax.tools.JavaFileObject.Kind.CLASS; duke@1: duke@1: duke@1: public class Main { duke@1: duke@1: public static PackageElement getPackage(TypeElement type) { duke@1: Element owner = type; duke@1: while (owner.getKind() != ElementKind.PACKAGE) duke@1: owner = owner.getEnclosingElement(); duke@1: return (PackageElement)owner; duke@1: } duke@1: duke@1: static int progress = 0; duke@1: static JavaCompiler tool; duke@1: static JavacTask javac; duke@1: static Elements elements; duke@1: duke@1: public static void main(String[] args) throws Exception { duke@1: duke@1: JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); duke@1: StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null); duke@1: fm.setLocation(CLASS_PATH, Collections.emptyList()); duke@1: JavacTask javac = (JavacTask)tool.getTask(null, fm, null, null, null, null); duke@1: Elements elements = javac.getElements(); duke@1: duke@1: final Set packages = new LinkedHashSet(); duke@1: duke@1: int nestedClasses = 0; duke@1: int classes = 0; duke@1: duke@1: for (JavaFileObject file : fm.list(PLATFORM_CLASS_PATH, "", EnumSet.of(CLASS), true)) { duke@1: String type = fm.inferBinaryName(PLATFORM_CLASS_PATH, file); duke@1: if (type.endsWith("package-info")) duke@1: continue; duke@1: try { duke@1: TypeElement elem = elements.getTypeElement(type); duke@1: if (elem == null && type.indexOf('$') > 0) { duke@1: nestedClasses++; duke@1: type = null; duke@1: continue; duke@1: } duke@1: classes++; duke@1: packages.add(getPackage(elem).getQualifiedName().toString()); duke@1: elements.getTypeElement(type).getKind(); // force completion duke@1: type = null; duke@1: } finally { duke@1: if (type != null) duke@1: System.err.println("Looking at " + type); duke@1: } duke@1: } duke@1: javac = null; duke@1: elements = null; duke@1: duke@1: javac = (JavacTask)tool.getTask(null, null, null, null, null, null); duke@1: elements = javac.getElements(); duke@1: duke@1: for (String name : packages) { duke@1: PackageElement pe = elements.getPackageElement(name); duke@1: for (Element e : pe.getEnclosedElements()) { duke@1: e.getSimpleName().getClass(); duke@1: } duke@1: } duke@1: /* duke@1: * A few sanity checks based on current values: duke@1: * duke@1: * packages: 775, classes: 12429 + 5917 duke@1: * duke@1: * As the platform evolves the numbers are likely to grow duke@1: * monotonically but in case somebody gets a clever idea for duke@1: * limiting the number of packages exposed, this number might duke@1: * drop. So we test low values. duke@1: */ duke@1: System.out.format("packages: %s, classes: %s + %s%n", duke@1: packages.size(), classes, nestedClasses); duke@1: if (classes < 9000) duke@1: throw new AssertionError("Too few classes in PLATFORM_CLASS_PATH ;-)"); darcy@208: if (packages.size() < 530) duke@1: throw new AssertionError("Too few packages in PLATFORM_CLASS_PATH ;-)"); duke@1: if (nestedClasses < 3000) duke@1: throw new AssertionError("Too few nested classes in PLATFORM_CLASS_PATH ;-)"); duke@1: } duke@1: }