8049367: Modular Run-Time Images

Co-authored-by: Alan Bateman <alan.bateman@oracle.com>
Co-authored-by: Alex Buckley <alex.buckley@oracle.com>
Co-authored-by: Bradford Wetmore <bradford.wetmore@oracle.com>
Co-authored-by: Erik Joelsson <erik.joelsson@oracle.com>
Co-authored-by: James Laskey <james.laskey@oracle.com>
Co-authored-by: Jonathan Gibbons <jonathan.gibbons@oracle.com>
Co-authored-by: Karen Kinnear <karen.kinnear@oracle.com>
Co-authored-by: Magnus Ihse Bursie <magnus.ihse.bursie@oracle.com>
Co-authored-by: Mandy Chung <mandy.chung@oracle.com>
Co-authored-by: Mark Reinhold <mark.reinhold@oracle.com>
Co-authored-by: Paul Sandoz <paul.sandoz@oracle.com>
Co-authored-by: Sundararajan Athijegannathan <sundararajan.athijegannathan@oracle.com>
Reviewed-by: jlahoda, ksrini
This commit is contained in:
Chris Hegarty 2014-12-03 14:25:46 +00:00
parent f141ae6666
commit 8bc2b3ff3a
80 changed files with 2575 additions and 2861 deletions

View file

@ -29,9 +29,9 @@ default: all
include $(SPEC) include $(SPEC)
include MakeBase.gmk include MakeBase.gmk
include JavaCompilation.gmk include JavaCompilation.gmk
include SetupJavaCompilers.gmk
include CommonLangtools.gmk ################################################################################
# Setup the rules to build the interim langtools jar, which is compiled by # Setup the rules to build the interim langtools jar, which is compiled by
# the boot javac and can be run on the boot jdk. This will be used to compile # the boot javac and can be run on the boot jdk. This will be used to compile
# the rest of the product. Include the Genstubs build tool in this compilation # the rest of the product. Include the Genstubs build tool in this compilation
@ -44,12 +44,12 @@ $(eval $(call SetupJavaCompilation,BUILD_INTERIM_LANGTOOLS, \
$(LANGTOOLS_TOPDIR)/src/jdk.dev/share/classes \ $(LANGTOOLS_TOPDIR)/src/jdk.dev/share/classes \
$(LANGTOOLS_TOPDIR)/src/jdk.javadoc/share/classes \ $(LANGTOOLS_TOPDIR)/src/jdk.javadoc/share/classes \
$(LANGTOOLS_TOPDIR)/src/java.base/share/classes \ $(LANGTOOLS_TOPDIR)/src/java.base/share/classes \
$(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.compiler \ $(SUPPORT_OUTPUTDIR)/gensrc/jdk.compiler \
$(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.dev \ $(SUPPORT_OUTPUTDIR)/gensrc/jdk.dev \
$(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.javadoc, \ $(SUPPORT_OUTPUTDIR)/gensrc/jdk.javadoc, \
EXCLUDES := com/sun/tools/javac/nio compileproperties anttasks crules, \ EXCLUDES := sun jdk, \
COPY := $(RESOURCE_SUFFIXES) jdeps.properties jdkinternals.properties version.properties, \ COPY := .gif .xml .css .js javax.tools.JavaCompilerTool, \
BIN := $(LANGTOOLS_OUTPUTDIR)/interim_classes, \ BIN := $(BUILDTOOLS_OUTPUTDIR)/langtools_interim_classes, \
JAR := $(INTERIM_LANGTOOLS_JAR))) JAR := $(INTERIM_LANGTOOLS_JAR)))
all: $(BUILD_INTERIM_LANGTOOLS) all: $(BUILD_INTERIM_LANGTOOLS)

View file

@ -1,111 +0,0 @@
#
# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# This must be the first rule
default: all
include $(SPEC)
include MakeBase.gmk
include JavaCompilation.gmk
include CommonLangtools.gmk
################################################################################
# Setup the compilation of the properties compilation tool. You can depend
# upon $(BUILD_TOOLS_LANGTOOLS) to trigger a compilation of the tools. Note that
# we add src/share/classes to the sourcepath. This is necessary since the
# GenStubs program needs to be linked and run with the new javac sources.
$(eval $(call SetupJavaCompilation,BUILD_TOOLS_LANGTOOLS, \
SETUP := BOOT_JAVAC, \
DISABLE_SJAVAC := true, \
ADD_JAVAC_FLAGS := -Xprefer:source, \
SRC := $(LANGTOOLS_TOPDIR)/make/tools, \
INCLUDES := compileproperties, \
BIN := $(LANGTOOLS_OUTPUTDIR)/buildtools_classes))
################################################################################
# The compileprops tools compiles a properties file into a resource bundle.
TOOL_COMPILEPROPS_CMD := $(JAVA) -cp $(LANGTOOLS_OUTPUTDIR)/buildtools_classes \
compileproperties.CompileProperties -quiet
# Lookup the properties that need to be compiled into resource bundles.
PROPSOURCES := $(shell $(FIND) $(LANGTOOLS_TOPDIR)/src/*/share/classes -name "*.properties")
# Convert .../src/<module>/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties
# to .../langtools/gensrc/<module>/com/sun/tools/javac/resources/javac_zh_CN.java
# Strip away prefix and suffix, leaving for example only:
# "<module>/share/classes/com/sun/tools/javac/resources/javac_zh_CN"
PROPJAVAS := $(patsubst $(LANGTOOLS_TOPDIR)/src/%.properties, \
$(LANGTOOLS_OUTPUTDIR)/gensrc/%.java, \
$(subst /share/classes,,$(PROPSOURCES)))
# Generate the package dirs for the tobe generated java files. Sort to remove
# duplicates.
PROPDIRS := $(sort $(dir $(PROPJAVAS)))
# Now generate a sequence of:
# "-compile ...javac_zh_CN.properties ...javac_zh_CN.java java.util.ListResourceBundle"
# suitable to be fed into the CompileProperties command.
PROPCMDLINE := $(subst _SPACE_, $(SPACE), \
$(join $(addprefix -compile_SPACE_, $(PROPSOURCES)), \
$(addsuffix _SPACE_java.util.ListResourceBundle, \
$(addprefix _SPACE_, $(PROPJAVAS)))))
# Now setup the rule for the generation of the resource bundles.
$(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props: $(PROPSOURCES) $(BUILD_TOOLS_LANGTOOLS)
$(RM) -r $(@D)/*
$(MKDIR) -p $(@D) $(PROPDIRS)
$(PRINTF) "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" \
> $(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.compiler/com/sun/tools/javah/resources/version.properties
$(PRINTF) "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" \
> $(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.compiler/com/sun/tools/javap/resources/version.properties
$(PRINTF) "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" \
> $(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.compiler/com/sun/tools/javac/resources/version.properties
$(PRINTF) "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" \
> $(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.dev/com/sun/tools/jdeps/resources/version.properties
$(PRINTF) "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" \
> $(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.javadoc/com/sun/tools/javadoc/resources/version.properties
$(ECHO) Compiling $(words $(PROPSOURCES) v1 v2 v3) properties into resource bundles
$(TOOL_COMPILEPROPS_CMD) $(PROPCMDLINE) \
-compile $(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.compiler/com/sun/tools/javah/resources/version.properties \
$(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.compiler/com/sun/tools/javah/resources/version.java \
java.util.ListResourceBundle \
-compile $(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.compiler/com/sun/tools/javap/resources/version.properties \
$(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.compiler/com/sun/tools/javap/resources/version.java \
java.util.ListResourceBundle \
-compile $(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.compiler/com/sun/tools/javac/resources/version.properties \
$(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.compiler/com/sun/tools/javac/resources/version.java \
java.util.ListResourceBundle \
-compile $(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.dev/com/sun/tools/jdeps/resources/version.properties \
$(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.dev/com/sun/tools/jdeps/resources/version.java \
java.util.ListResourceBundle \
-compile $(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.javadoc/com/sun/tools/javadoc/resources/version.properties \
$(LANGTOOLS_OUTPUTDIR)/gensrc/jdk.javadoc/com/sun/tools/javadoc/resources/version.java \
java.util.ListResourceBundle
$(TOUCH) $@
all: $(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props
################################################################################

45
langtools/make/Tools.gmk Normal file
View file

@ -0,0 +1,45 @@
#
# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# This must be the first rule
default: all
include $(SPEC)
include MakeBase.gmk
include JavaCompilation.gmk
include SetupJavaCompilers.gmk
################################################################################
# Setup the compilation of the properties compilation tool. You can depend
# upon $(BUILD_TOOLS_LANGTOOLS) to trigger a compilation of the tools.
$(eval $(call SetupJavaCompilation,BUILD_TOOLS_LANGTOOLS, \
SETUP := BOOT_JAVAC, \
DISABLE_SJAVAC := true, \
ADD_JAVAC_FLAGS := -Xprefer:source, \
SRC := $(LANGTOOLS_TOPDIR)/make/tools, \
INCLUDES := compileproperties, \
BIN := $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes))
all: $(BUILD_TOOLS_LANGTOOLS)

View file

@ -23,13 +23,18 @@
# questions. # questions.
# #
# The BOOT_JAVAC setup uses the boot jdk compiler to compile the tools include GensrcCommon.gmk
# and the interim javac, to be run by the boot jdk.
$(eval $(call SetupJavaCompiler,BOOT_JAVAC, \
JAVAC := $(JAVAC), \
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
SERVER_JVM := $(SJAVAC_SERVER_JAVA), \
FLAGS := -XDignore.symbol.file=true -g -Xlint:all$(COMMA)-deprecation -Werror))
# javax.tools.JavaCompilerTool isn't really a suffix but this gets the file copied. $(eval $(call SetupVersionProperties,JAVAC_VERSION,\
RESOURCE_SUFFIXES := .gif .xml .css .js javax.tools.JavaCompilerTool com/sun/tools/javac/resources/version.properties))
$(eval $(call SetupVersionProperties,JAVAH_VERSION,\
com/sun/tools/javah/resources/version.properties))
$(eval $(call SetupVersionProperties,JAVAP_VERSION,\
com/sun/tools/javap/resources/version.properties))
$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES,\
$(JAVAC_VERSION) $(JAVAH_VERSION) $(JAVAP_VERSION)))
all: $(COMPILE_PROPERTIES)

View file

@ -1,11 +1,12 @@
#!/bin/sh
# #
# Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as # under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. # published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
# #
# This code is distributed in the hope that it will be useful, but WITHOUT # This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
@ -22,22 +23,11 @@
# questions. # questions.
# #
jdk=${1:-/opt/jdk/1.6.0} include GensrcCommon.gmk
javah=${jdk}/bin/javah
rtjar=${jdk}/jre/lib/rt.jar
# compile test $(eval $(call SetupVersionProperties,JDEPS_VERSION,\
mkdir -p build/compareTest com/sun/tools/jdeps/resources/version.properties))
/opt/jdk/1.7.0/bin/javac -classpath build/classes -d build/compareTest test/tools/javah/compareTest/*.java
# run test $(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, $(JDEPS_VERSION)))
/opt/jdk/1.7.0/bin/java -classpath build/compareTest:build/classes CompareTest $javah $rtjar 2>&1 | tee CompareTest.out
# show diffs for tests that failed
grep 'error:' CompareTest.out | sed -e 's|.*new/||' -e 's/\.h$//' -e 's|_|.|g' > CompareTest.classes.fail
for i in $(cat CompareTest.classes.fail) ; do
/opt/jdk/1.7.0/bin/java -classpath compareTest:build/classes CompareTest $javah $rtjar $i
diff -r old new
done
all: $(COMPILE_PROPERTIES)

View file

@ -0,0 +1,33 @@
#
# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
include GensrcCommon.gmk
$(eval $(call SetupVersionProperties,JAVADOC_VERSION,\
com/sun/tools/javadoc/resources/version.properties))
$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, $(JAVADOC_VERSION)))
all: $(COMPILE_PROPERTIES)

View file

@ -0,0 +1,95 @@
#
# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# This must be the first rule
default: all
include $(SPEC)
include MakeBase.gmk
include JavaCompilation.gmk
################################################################################
# The compileprops tools compiles a properties file into a resource bundle.
TOOL_COMPILEPROPS_CMD := $(JAVA) -cp $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes \
compileproperties.CompileProperties -quiet
################################################################################
# Sets up a rule that creates a version.properties file in the gensrc output
# directory.
# Param 1 - Variable to add generated file name to
# Param 2 - Name of version.properties file including packages from the src
# root.
define SetupVersionProperties
$(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/$$(strip $2):
$(MKDIR) -p $$(@D)
$(PRINTF) "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" \
> $$@
$$(strip $1) += $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/$$(strip $2)
endef
################################################################################
# Finds all properties files in the module source and creates a rule that runs
# CompileProperties on them into the gensrc dir.
# Param 1 - Variable to add targets to
# Param 2 - Extra properties files to process
define SetupCompileProperties
# Lookup the properties that need to be compiled into resource bundles.
PROPSOURCES := $2 $$(shell $(FIND) $(LANGTOOLS_TOPDIR)/src/$(MODULE)/share/classes -name "*.properties")
# Convert .../src/<module>/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties
# to .../langtools/gensrc/<module>/com/sun/tools/javac/resources/javac_zh_CN.java
# Strip away prefix and suffix, leaving for example only:
# "<module>/share/classes/com/sun/tools/javac/resources/javac_zh_CN"
PROPJAVAS := $$(patsubst $(LANGTOOLS_TOPDIR)/src/%, \
$(SUPPORT_OUTPUTDIR)/gensrc/%, \
$$(patsubst %.properties, %.java, \
$$(subst /share/classes,, $$(PROPSOURCES))))
# Generate the package dirs for the tobe generated java files. Sort to remove
# duplicates.
PROPDIRS := $$(sort $$(dir $$(PROPJAVAS)))
# Now generate a sequence of:
# "-compile ...javac_zh_CN.properties ...javac_zh_CN.java java.util.ListResourceBundle"
# suitable to be fed into the CompileProperties command.
PROPCMDLINE := $$(subst _SPACE_, $(SPACE), \
$$(join $$(addprefix -compile_SPACE_, $$(PROPSOURCES)), \
$$(addsuffix _SPACE_java.util.ListResourceBundle, \
$$(addprefix _SPACE_, $$(PROPJAVAS)))))
# Now setup the rule for the generation of the resource bundles.
$(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/_the_props: $$(PROPSOURCES)
$(FIND) $$(@D) -name "*.java" $(FIND_DELETE)
$(MKDIR) -p $$(@D) $$(PROPDIRS)
$(ECHO) Compiling $$(words $$(PROPSOURCES)) properties into resource bundles for $(MODULE)
$(TOOL_COMPILEPROPS_CMD) $$(PROPCMDLINE)
$(TOUCH) $$@
$$(strip $1) += $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/_the_props
endef
################################################################################

View file

@ -102,6 +102,9 @@ public class MutableFieldsAnalyzer extends AbstractCodingRulesAnalyzer {
classFieldsToIgnoreMap. classFieldsToIgnoreMap.
put("com.sun.tools.javac.file.ZipFileIndexCache", put("com.sun.tools.javac.file.ZipFileIndexCache",
Arrays.asList("sharedInstance")); Arrays.asList("sharedInstance"));
classFieldsToIgnoreMap.
put("com.sun.tools.javac.file.JRTIndex",
Arrays.asList("sharedInstance"));
classFieldsToIgnoreMap. classFieldsToIgnoreMap.
put("com.sun.tools.javac.main.JavaCompiler", put("com.sun.tools.javac.main.JavaCompiler",
Arrays.asList("versionRB")); Arrays.asList("versionRB"));

View file

@ -25,17 +25,14 @@
package javax.tools; package javax.tools;
import java.io.File;
import java.lang.ref.Reference; import java.lang.ref.Reference;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.MalformedURLException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.logging.Level; import java.util.logging.Level;
import static java.util.logging.Level.*; import static java.util.logging.Level.*;
/** /**
@ -89,7 +86,7 @@ public class ToolProvider {
return null; return null;
} }
private static final String defaultJavaCompilerName private static final String systemJavaCompilerName
= "com.sun.tools.javac.api.JavacTool"; = "com.sun.tools.javac.api.JavacTool";
/** /**
@ -99,10 +96,10 @@ public class ToolProvider {
* {@code null} if no compiler is provided * {@code null} if no compiler is provided
*/ */
public static JavaCompiler getSystemJavaCompiler() { public static JavaCompiler getSystemJavaCompiler() {
return instance().getSystemTool(JavaCompiler.class, defaultJavaCompilerName); return instance().getSystemTool(JavaCompiler.class, systemJavaCompilerName);
} }
private static final String defaultDocumentationToolName private static final String systemDocumentationToolName
= "com.sun.tools.javadoc.api.JavadocTool"; = "com.sun.tools.javadoc.api.JavadocTool";
/** /**
@ -112,7 +109,7 @@ public class ToolProvider {
* {@code null} if no documentation tool is provided * {@code null} if no documentation tool is provided
*/ */
public static DocumentationTool getSystemDocumentationTool() { public static DocumentationTool getSystemDocumentationTool() {
return instance().getSystemTool(DocumentationTool.class, defaultDocumentationToolName); return instance().getSystemTool(DocumentationTool.class, systemDocumentationToolName);
} }
/** /**
@ -125,13 +122,7 @@ public class ToolProvider {
* or {@code null} if no tools are provided * or {@code null} if no tools are provided
*/ */
public static ClassLoader getSystemToolClassLoader() { public static ClassLoader getSystemToolClassLoader() {
try { return ClassLoader.getSystemClassLoader();
Class<? extends JavaCompiler> c =
instance().getSystemToolClass(JavaCompiler.class, defaultJavaCompilerName);
return c.getClassLoader();
} catch (Throwable e) {
return trace(WARNING, e);
}
} }
@ -145,12 +136,7 @@ public class ToolProvider {
// Cache for tool classes. // Cache for tool classes.
// Use weak references to avoid keeping classes around unnecessarily // Use weak references to avoid keeping classes around unnecessarily
private Map<String, Reference<Class<?>>> toolClasses = new HashMap<>(); private final Map<String, Reference<Class<?>>> toolClasses = new HashMap<>();
// Cache for tool classloader.
// Use a weak reference to avoid keeping it around unnecessarily
private Reference<ClassLoader> refToolClassLoader = null;
private ToolProvider() { } private ToolProvider() { }
@ -158,9 +144,8 @@ public class ToolProvider {
Class<? extends T> c = getSystemToolClass(clazz, name); Class<? extends T> c = getSystemToolClass(clazz, name);
try { try {
return c.asSubclass(clazz).newInstance(); return c.asSubclass(clazz).newInstance();
} catch (Throwable e) { } catch (InstantiationException | IllegalAccessException | RuntimeException | Error e) {
trace(WARNING, e); return trace(WARNING, e);
return null;
} }
} }
@ -169,48 +154,12 @@ public class ToolProvider {
Class<?> c = (refClass == null ? null : refClass.get()); Class<?> c = (refClass == null ? null : refClass.get());
if (c == null) { if (c == null) {
try { try {
c = findSystemToolClass(name); c = Class.forName(name, false, ClassLoader.getSystemClassLoader());
} catch (Throwable e) { } catch (ClassNotFoundException | RuntimeException | Error e) {
return trace(WARNING, e); return trace(WARNING, e);
} }
toolClasses.put(name, new WeakReference<Class<?>>(c)); toolClasses.put(name, new WeakReference<>(c));
} }
return c.asSubclass(clazz); return c.asSubclass(clazz);
} }
private static final String[] defaultToolsLocation = { "lib", "tools.jar" };
private Class<?> findSystemToolClass(String toolClassName)
throws MalformedURLException, ClassNotFoundException
{
// try loading class directly, in case tool is on the bootclasspath
try {
return Class.forName(toolClassName, false, null);
} catch (ClassNotFoundException e) {
trace(FINE, e);
// if tool not on bootclasspath, look in default tools location (tools.jar)
ClassLoader cl = (refToolClassLoader == null ? null : refToolClassLoader.get());
if (cl == null) {
File file = new File(System.getProperty("java.home"));
if (file.getName().equalsIgnoreCase("jre"))
file = file.getParentFile();
for (String name : defaultToolsLocation)
file = new File(file, name);
// if tools not found, no point in trying a URLClassLoader
// so rethrow the original exception.
if (!file.exists())
throw e;
URL[] urls = { file.toURI().toURL() };
trace(FINE, urls[0].toString());
cl = URLClassLoader.newInstance(urls);
refToolClassLoader = new WeakReference<>(cl);
}
return Class.forName(toolClassName, false, cl);
}
}
} }

View file

@ -26,6 +26,7 @@
package com.sun.tools.javac.api; package com.sun.tools.javac.api;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
@ -55,6 +56,7 @@ import javax.tools.JavaFileManager;
import javax.tools.JavaFileManager.Location; import javax.tools.JavaFileManager.Location;
import javax.tools.JavaFileObject; import javax.tools.JavaFileObject;
import javax.tools.JavaFileObject.Kind; import javax.tools.JavaFileObject.Kind;
import javax.tools.StandardJavaFileManager;
import com.sun.source.util.TaskEvent; import com.sun.source.util.TaskEvent;
import com.sun.source.util.TaskListener; import com.sun.source.util.TaskListener;
@ -115,11 +117,13 @@ public class ClientCodeWrapper {
public JavaFileManager wrap(JavaFileManager fm) { public JavaFileManager wrap(JavaFileManager fm) {
if (isTrusted(fm)) if (isTrusted(fm))
return fm; return fm;
if (fm instanceof StandardJavaFileManager)
return new WrappedStandardJavaFileManager((StandardJavaFileManager) fm);
return new WrappedJavaFileManager(fm); return new WrappedJavaFileManager(fm);
} }
public FileObject wrap(FileObject fo) { public FileObject wrap(FileObject fo) {
if (isTrusted(fo)) if (fo == null || isTrusted(fo))
return fo; return fo;
return new WrappedFileObject(fo); return new WrappedFileObject(fo);
} }
@ -132,7 +136,7 @@ public class ClientCodeWrapper {
} }
public JavaFileObject wrap(JavaFileObject fo) { public JavaFileObject wrap(JavaFileObject fo) {
if (isTrusted(fo)) if (fo == null || isTrusted(fo))
return fo; return fo;
return new WrappedJavaFileObject(fo); return new WrappedJavaFileObject(fo);
} }
@ -360,6 +364,79 @@ public class ClientCodeWrapper {
} }
} }
protected class WrappedStandardJavaFileManager extends WrappedJavaFileManager
implements StandardJavaFileManager {
WrappedStandardJavaFileManager(StandardJavaFileManager clientJavaFileManager) {
super(clientJavaFileManager);
}
@Override @DefinedBy(Api.COMPILER)
public Iterable<? extends JavaFileObject> getJavaFileObjectsFromFiles(Iterable<? extends File> files) {
try {
return ((StandardJavaFileManager)clientJavaFileManager).getJavaFileObjectsFromFiles(files);
} catch (ClientCodeException e) {
throw e;
} catch (RuntimeException | Error e) {
throw new ClientCodeException(e);
}
}
@Override @DefinedBy(Api.COMPILER)
public Iterable<? extends JavaFileObject> getJavaFileObjects(File... files) {
try {
return ((StandardJavaFileManager)clientJavaFileManager).getJavaFileObjects(files);
} catch (ClientCodeException e) {
throw e;
} catch (RuntimeException | Error e) {
throw new ClientCodeException(e);
}
}
@Override @DefinedBy(Api.COMPILER)
public Iterable<? extends JavaFileObject> getJavaFileObjectsFromStrings(Iterable<String> names) {
try {
return ((StandardJavaFileManager)clientJavaFileManager).getJavaFileObjectsFromStrings(names);
} catch (ClientCodeException e) {
throw e;
} catch (RuntimeException | Error e) {
throw new ClientCodeException(e);
}
}
@Override @DefinedBy(Api.COMPILER)
public Iterable<? extends JavaFileObject> getJavaFileObjects(String... names) {
try {
return ((StandardJavaFileManager)clientJavaFileManager).getJavaFileObjects(names);
} catch (ClientCodeException e) {
throw e;
} catch (RuntimeException | Error e) {
throw new ClientCodeException(e);
}
}
@Override @DefinedBy(Api.COMPILER)
public void setLocation(Location location, Iterable<? extends File> path) throws IOException {
try {
((StandardJavaFileManager)clientJavaFileManager).setLocation(location, path);
} catch (ClientCodeException e) {
throw e;
} catch (RuntimeException | Error e) {
throw new ClientCodeException(e);
}
}
@Override @DefinedBy(Api.COMPILER)
public Iterable<? extends File> getLocation(Location location) {
try {
return ((StandardJavaFileManager)clientJavaFileManager).getLocation(location);
} catch (ClientCodeException e) {
throw e;
} catch (RuntimeException | Error e) {
throw new ClientCodeException(e);
}
}
}
protected class WrappedFileObject implements FileObject { protected class WrappedFileObject implements FileObject {
protected FileObject clientFileObject; protected FileObject clientFileObject;
WrappedFileObject(FileObject clientFileObject) { WrappedFileObject(FileObject clientFileObject) {
@ -558,47 +635,47 @@ public class ClientCodeWrapper {
this.d = d; this.d = d;
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public Diagnostic.Kind getKind() { public Diagnostic.Kind getKind() {
return d.getKind(); return d.getKind();
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public JavaFileObject getSource() { public JavaFileObject getSource() {
return unwrap(d.getSource()); return unwrap(d.getSource());
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public long getPosition() { public long getPosition() {
return d.getPosition(); return d.getPosition();
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public long getStartPosition() { public long getStartPosition() {
return d.getStartPosition(); return d.getStartPosition();
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public long getEndPosition() { public long getEndPosition() {
return d.getEndPosition(); return d.getEndPosition();
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public long getLineNumber() { public long getLineNumber() {
return d.getLineNumber(); return d.getLineNumber();
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public long getColumnNumber() { public long getColumnNumber() {
return d.getColumnNumber(); return d.getColumnNumber();
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public String getCode() { public String getCode() {
return d.getCode(); return d.getCode();
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public String getMessage(Locale locale) { public String getMessage(Locale locale) {
return d.getMessage(locale); return d.getMessage(locale);
} }

View file

@ -27,21 +27,33 @@ package com.sun.tools.javac.code;
import java.io.*; import java.io.*;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.lang.model.SourceVersion; import javax.lang.model.SourceVersion;
import javax.tools.JavaFileObject;
import javax.tools.JavaFileManager; import javax.tools.JavaFileManager;
import javax.tools.JavaFileManager.Location; import javax.tools.JavaFileManager.Location;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager; import javax.tools.StandardJavaFileManager;
import static javax.tools.StandardLocation.*;
import com.sun.tools.javac.comp.Annotate;
import com.sun.tools.javac.code.Scope.WriteableScope; import com.sun.tools.javac.code.Scope.WriteableScope;
import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.code.Symbol.ClassSymbol;
import com.sun.tools.javac.code.Symbol.Completer;
import com.sun.tools.javac.code.Symbol.CompletionFailure;
import com.sun.tools.javac.code.Symbol.PackageSymbol;
import com.sun.tools.javac.code.Symbol.TypeSymbol;
import com.sun.tools.javac.comp.Annotate;
import com.sun.tools.javac.file.JRTIndex;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.file.RelativePath.RelativeDirectory;
import com.sun.tools.javac.jvm.ClassReader; import com.sun.tools.javac.jvm.ClassReader;
import com.sun.tools.javac.jvm.Profile;
import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.*;
import static javax.tools.StandardLocation.*;
import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.code.Kinds.Kind.*; import static com.sun.tools.javac.code.Kinds.Kind.*;
@ -125,6 +137,18 @@ public class ClassFinder {
*/ */
protected Symbol currentOwner = null; protected Symbol currentOwner = null;
/**
* The currently selected profile.
*/
private final Profile profile;
/**
* Use direct access to the JRTIndex to access the temporary
* replacement for the info that used to be in ct.sym.
* In time, this will go away and be replaced by the module system.
*/
private final JRTIndex jrtIndex;
/** /**
* Completer that delegates to the complete-method of this class. * Completer that delegates to the complete-method of this class.
*/ */
@ -168,12 +192,72 @@ public class ClassFinder {
preferSource = "source".equals(options.get("-Xprefer")); preferSource = "source".equals(options.get("-Xprefer"));
userPathsFirst = options.isSet(XXUSERPATHSFIRST); userPathsFirst = options.isSet(XXUSERPATHSFIRST);
completionFailureName = completionFailureName =
options.isSet("failcomplete") options.isSet("failcomplete")
? names.fromString(options.get("failcomplete")) ? names.fromString(options.get("failcomplete"))
: null; : null;
// Temporary, until more info is available from the module system.
boolean useCtProps;
JavaFileManager fm = context.get(JavaFileManager.class);
if (fm instanceof JavacFileManager) {
JavacFileManager jfm = (JavacFileManager) fm;
useCtProps = jfm.isDefaultBootClassPath() && jfm.isSymbolFileEnabled();
} else if (fm.getClass().getName().equals("com.sun.tools.sjavac.comp.SmartFileManager")) {
useCtProps = !options.isSet("ignore.symbol.file");
} else {
useCtProps = false;
} }
jrtIndex = useCtProps && JRTIndex.isAvailable() ? JRTIndex.getSharedInstance() : null;
profile = Profile.instance(context);
}
/************************************************************************
* Temporary ct.sym replacement
*
* The following code is a temporary substitute for the ct.sym mechanism
* used in JDK 6 thru JDK 8.
* This mechanism will eventually be superseded by the Jigsaw module system.
***********************************************************************/
/**
* Returns any extra flags for a class symbol.
* This information used to be provided using private annotations
* in the class file in ct.sym; in time, this information will be
* available from the module system.
*/
long getSupplementaryFlags(ClassSymbol c) {
if (jrtIndex == null || !jrtIndex.isInJRT(c.classfile)) {
return 0;
}
if (supplementaryFlags == null) {
supplementaryFlags = new HashMap<>();
}
Long flags = supplementaryFlags.get(c.packge());
if (flags == null) {
long newFlags = 0;
try {
JRTIndex.CtSym ctSym = jrtIndex.getCtSym(c.packge().flatName());
Profile minProfile = Profile.DEFAULT;
if (ctSym.proprietary)
newFlags |= PROPRIETARY;
if (ctSym.minProfile != null)
minProfile = Profile.lookup(ctSym.minProfile);
if (profile != Profile.DEFAULT && minProfile.value > profile.value) {
newFlags |= NOT_IN_PROFILE;
}
} catch (IOException ignore) {
}
supplementaryFlags.put(c.packge(), flags = newFlags);
}
return flags;
}
private Map<PackageSymbol, Long> supplementaryFlags;
/************************************************************************ /************************************************************************
* Loading Classes * Loading Classes
@ -259,6 +343,7 @@ public class ClassFinder {
} }
if (classfile.getKind() == JavaFileObject.Kind.CLASS) { if (classfile.getKind() == JavaFileObject.Kind.CLASS) {
reader.readClassFile(c); reader.readClassFile(c);
c.flags_field |= getSupplementaryFlags(c);
} else { } else {
if (sourceCompleter != null) { if (sourceCompleter != null) {
sourceCompleter.complete(c); sourceCompleter.complete(c);
@ -271,13 +356,15 @@ public class ClassFinder {
currentClassFile = previousClassFile; currentClassFile = previousClassFile;
} }
} else { } else {
JCDiagnostic diag = throw classFileNotFound(c);
diagFactory.fragment("class.file.not.found", c.flatname);
throw
newCompletionFailure(c, diag);
} }
} }
// where // where
private CompletionFailure classFileNotFound(ClassSymbol c) {
JCDiagnostic diag =
diagFactory.fragment("class.file.not.found", c.flatname);
return newCompletionFailure(c, diag);
}
/** Static factory for CompletionFailure objects. /** Static factory for CompletionFailure objects.
* In practice, only one can be used at a time, so we share one * In practice, only one can be used at a time, so we share one
* to reduce the expense of allocating new exception objects. * to reduce the expense of allocating new exception objects.
@ -296,7 +383,7 @@ public class ClassFinder {
return result; return result;
} }
} }
private CompletionFailure cachedCompletionFailure = private final CompletionFailure cachedCompletionFailure =
new CompletionFailure(null, (JCDiagnostic) null); new CompletionFailure(null, (JCDiagnostic) null);
{ {
cachedCompletionFailure.setStackTrace(new StackTraceElement[0]); cachedCompletionFailure.setStackTrace(new StackTraceElement[0]);

View file

@ -0,0 +1,272 @@
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.javac.file;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.lang.ref.SoftReference;
import java.net.URI;
import java.nio.file.DirectoryStream;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.spi.FileSystemProvider;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Set;
import javax.tools.FileObject;
import com.sun.tools.javac.file.RelativePath.RelativeDirectory;
import com.sun.tools.javac.nio.PathFileObject;
import com.sun.tools.javac.util.Context;
/**
* A package-oriented index into the jrt: filesystem.
*/
public class JRTIndex {
/** Get a shared instance of the cache. */
private static JRTIndex sharedInstance;
public synchronized static JRTIndex getSharedInstance() {
if (sharedInstance == null) {
try {
sharedInstance = new JRTIndex();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
return sharedInstance;
}
/** Get a context-specific instance of a cache. */
public static JRTIndex instance(Context context) {
try {
JRTIndex instance = context.get(JRTIndex.class);
if (instance == null)
context.put(JRTIndex.class, instance = new JRTIndex());
return instance;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
public static boolean isAvailable() {
for (FileSystemProvider p: FileSystemProvider.installedProviders()) {
if (p.getScheme().equals("jrt"))
return true;
}
return false;
}
/**
* The jrt: file system.
*/
private final FileSystem jrtfs;
/**
* The set of module directories within the jrt: file system.
*/
private final Set<Path> jrtModules;
/**
* A lazily evaluated set of entries about the contents of the jrt: file system.
*/
private final Map<RelativeDirectory, SoftReference<Entry>> entries;
/**
* An entry provides cached info about a specific package directory within jrt:.
*/
class Entry {
/**
* The regular files for this package.
* For now, assume just one instance of each file across all modules.
*/
final Map<String, Path> files;
/**
* The set of subdirectories in jrt: for this package.
*/
final Set<RelativeDirectory> subdirs;
/**
* The info that used to be in ct.sym for classes in this package.
*/
final CtSym ctSym;
private Entry(Map<String, Path> files, Set<RelativeDirectory> subdirs, CtSym ctSym) {
this.files = files;
this.subdirs = subdirs;
this.ctSym = ctSym;
}
}
/**
* The info that used to be in ct.sym for classes in a package.
*/
public static class CtSym {
/**
* The classes in this package are internal and not visible.
*/
public final boolean hidden;
/**
* The classes in this package are proprietary and will generate a warning.
*/
public final boolean proprietary;
/**
* The minimum profile in which classes in this package are available.
*/
public final String minProfile;
CtSym(boolean hidden, boolean proprietary, String minProfile) {
this.hidden = hidden;
this.proprietary = proprietary;
this.minProfile = minProfile;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("CtSym[");
boolean needSep = false;
if (hidden) {
sb.append("hidden");
needSep = true;
}
if (proprietary) {
if (needSep) sb.append(",");
sb.append("proprietary");
needSep = true;
}
if (minProfile != null) {
if (needSep) sb.append(",");
sb.append(minProfile);
}
sb.append("]");
return sb.toString();
}
static final CtSym EMPTY = new CtSym(false, false, null);
}
/**
* Create and initialize the index.
*/
private JRTIndex() throws IOException {
jrtfs = FileSystems.getFileSystem(URI.create("jrt:/"));
jrtModules = new LinkedHashSet<>();
Path root = jrtfs.getPath("/");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(root)) {
for (Path entry: stream) {
if (Files.isDirectory(entry))
jrtModules.add(entry);
}
}
entries = new HashMap<>();
}
public CtSym getCtSym(CharSequence packageName) throws IOException {
return getEntry(RelativeDirectory.forPackage(packageName)).ctSym;
}
synchronized Entry getEntry(RelativeDirectory rd) throws IOException {
SoftReference<Entry> ref = entries.get(rd);
Entry e = (ref == null) ? null : ref.get();
if (e == null) {
Map<String, Path> files = new LinkedHashMap<>();
Set<RelativeDirectory> subdirs = new LinkedHashSet<>();
for (Path module: jrtModules) {
Path p = rd.getFile(module);
if (!Files.exists(p))
continue;
try (DirectoryStream<Path> stream = Files.newDirectoryStream(p)) {
for (Path entry: stream) {
String name = entry.getFileName().toString();
if (Files.isRegularFile(entry)) {
// TODO: consider issue of files with same name in different modules
files.put(name, entry);
} else if (Files.isDirectory(entry)) {
subdirs.add(new RelativeDirectory(rd, name));
}
}
}
}
e = new Entry(Collections.unmodifiableMap(files),
Collections.unmodifiableSet(subdirs),
getCtInfo(rd));
entries.put(rd, new SoftReference<>(e));
}
return e;
}
public boolean isInJRT(FileObject fo) {
if (fo instanceof PathFileObject) {
Path path = ((PathFileObject) fo).getPath();
return (path.getFileSystem() == jrtfs);
} else {
return false;
}
}
private CtSym getCtInfo(RelativeDirectory dir) {
if (dir.path.isEmpty())
return CtSym.EMPTY;
// It's a side-effect of the default build rules that ct.properties
// ends up as a resource bundle.
if (ctBundle == null) {
final String bundleName = "com.sun.tools.javac.resources.ct";
ctBundle = ResourceBundle.getBundle(bundleName);
}
try {
String attrs = ctBundle.getString(dir.path.replace('/', '.') + '*');
boolean hidden = false;
boolean proprietary = false;
String minProfile = null;
for (String attr: attrs.split(" +", 0)) {
switch (attr) {
case "hidden":
hidden = true;
break;
case "proprietary":
proprietary = true;
break;
default:
minProfile = attr;
}
}
return new CtSym(hidden, proprietary, minProfile);
} catch (MissingResourceException e) {
return CtSym.EMPTY;
}
}
private ResourceBundle ctBundle;
}

View file

@ -25,17 +25,16 @@
package com.sun.tools.javac.file; package com.sun.tools.javac.file;
import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.nio.CharBuffer; import java.nio.CharBuffer;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@ -54,8 +53,9 @@ import javax.tools.JavaFileManager;
import javax.tools.JavaFileObject; import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager; import javax.tools.StandardJavaFileManager;
import com.sun.tools.javac.file.RelativePath.RelativeFile;
import com.sun.tools.javac.file.RelativePath.RelativeDirectory; import com.sun.tools.javac.file.RelativePath.RelativeDirectory;
import com.sun.tools.javac.file.RelativePath.RelativeFile;
import com.sun.tools.javac.nio.PathFileObject;
import com.sun.tools.javac.util.BaseFileManager; import com.sun.tools.javac.util.BaseFileManager;
import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.DefinedBy; import com.sun.tools.javac.util.DefinedBy;
@ -65,6 +65,8 @@ import com.sun.tools.javac.util.ListBuffer;
import static javax.tools.StandardLocation.*; import static javax.tools.StandardLocation.*;
import static com.sun.tools.javac.util.BaseFileManager.getKind;
/** /**
* This class provides access to the source, class and other files * This class provides access to the source, class and other files
* used by the compiler and related tools. * used by the compiler and related tools.
@ -97,11 +99,13 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
protected enum SortFiles implements Comparator<File> { protected enum SortFiles implements Comparator<File> {
FORWARD { FORWARD {
@Override
public int compare(File f1, File f2) { public int compare(File f1, File f2) {
return f1.getName().compareTo(f2.getName()); return f1.getName().compareTo(f2.getName());
} }
}, },
REVERSE { REVERSE {
@Override
public int compare(File f1, File f2) { public int compare(File f1, File f2) {
return -f1.getName().compareTo(f2.getName()); return -f1.getName().compareTo(f2.getName());
} }
@ -115,6 +119,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
*/ */
public static void preRegister(Context context) { public static void preRegister(Context context) {
context.put(JavaFileManager.class, new Context.Factory<JavaFileManager>() { context.put(JavaFileManager.class, new Context.Factory<JavaFileManager>() {
@Override
public JavaFileManager make(Context c) { public JavaFileManager make(Context c) {
return new JavacFileManager(c, true, null); return new JavacFileManager(c, true, null);
} }
@ -161,6 +166,10 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
symbolFileEnabled = b; symbolFileEnabled = b;
} }
public boolean isSymbolFileEnabled() {
return symbolFileEnabled;
}
public JavaFileObject getFileForInput(String name) { public JavaFileObject getFileForInput(String name) {
return getRegularFile(new File(name)); return getRegularFile(new File(name));
} }
@ -177,7 +186,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
return getJavaFileForOutput(CLASS_OUTPUT, classname, kind, sibling); return getJavaFileForOutput(CLASS_OUTPUT, classname, kind, sibling);
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public Iterable<? extends JavaFileObject> getJavaFileObjectsFromStrings(Iterable<String> names) { public Iterable<? extends JavaFileObject> getJavaFileObjectsFromStrings(Iterable<String> names) {
ListBuffer<File> files = new ListBuffer<>(); ListBuffer<File> files = new ListBuffer<>();
for (String name : names) for (String name : names)
@ -185,7 +194,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
return getJavaFileObjectsFromFiles(files.toList()); return getJavaFileObjectsFromFiles(files.toList());
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public Iterable<? extends JavaFileObject> getJavaFileObjects(String... names) { public Iterable<? extends JavaFileObject> getJavaFileObjects(String... names) {
return getJavaFileObjectsFromStrings(Arrays.asList(nullCheck(names))); return getJavaFileObjectsFromStrings(Arrays.asList(nullCheck(names)));
} }
@ -250,6 +259,40 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
System.out.println(message); System.out.println(message);
} }
/**
* Insert all files in a subdirectory of the platform image
* which match fileKinds into resultList.
*/
private void listJRTImage(RelativeDirectory subdirectory,
Set<JavaFileObject.Kind> fileKinds,
boolean recurse,
ListBuffer<JavaFileObject> resultList) throws IOException {
JRTIndex.Entry e = getJRTIndex().getEntry(subdirectory);
if (symbolFileEnabled && e.ctSym.hidden)
return;
for (Path file: e.files.values()) {
if (fileKinds.contains(getKind(file))) {
JavaFileObject fe
= PathFileObject.createJRTPathFileObject(JavacFileManager.this, file);
resultList.append(fe);
}
}
if (recurse) {
for (RelativeDirectory rd: e.subdirs) {
listJRTImage(rd, fileKinds, recurse, resultList);
}
}
}
private synchronized JRTIndex getJRTIndex() {
if (jrtIndex == null)
jrtIndex = JRTIndex.getSharedInstance();
return jrtIndex;
}
private JRTIndex jrtIndex;
/** /**
* Insert all files in subdirectory subdirectory of directory directory * Insert all files in subdirectory subdirectory of directory directory
@ -334,7 +377,29 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
ListBuffer<JavaFileObject> resultList) { ListBuffer<JavaFileObject> resultList) {
Archive archive = archives.get(container); Archive archive = archives.get(container);
if (archive == null) { if (archive == null) {
// archives are not created for directories. // Very temporary and obnoxious interim hack
if (container.getName().equals("bootmodules.jimage")) {
System.err.println("Warning: reference to bootmodules.jimage replaced by jrt:");
container = Locations.JRT_MARKER_FILE;
} else if (container.getName().endsWith(".jimage")) {
System.err.println("Warning: reference to " + container + " ignored");
return;
}
// archives are not created for directories or jrt: images
if (container == Locations.JRT_MARKER_FILE) {
try {
listJRTImage(subdirectory,
fileKinds,
recurse,
resultList);
} catch (IOException ex) {
ex.printStackTrace(System.err);
log.error("error.reading.file", container, getMessage(ex));
}
return;
}
if (fsInfo.isDirectory(container)) { if (fsInfo.isDirectory(container)) {
listDirectory(container, listDirectory(container,
subdirectory, subdirectory,
@ -348,8 +413,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
try { try {
archive = openArchive(container); archive = openArchive(container);
} catch (IOException ex) { } catch (IOException ex) {
log.error("error.reading.file", log.error("error.reading.file", container, getMessage(ex));
container, getMessage(ex));
return; return;
} }
} }
@ -419,21 +483,26 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
public MissingArchive(File name) { public MissingArchive(File name) {
zipFileName = name; zipFileName = name;
} }
@Override
public boolean contains(RelativePath name) { public boolean contains(RelativePath name) {
return false; return false;
} }
@Override
public void close() { public void close() {
} }
@Override
public JavaFileObject getFileObject(RelativeDirectory subdirectory, String file) { public JavaFileObject getFileObject(RelativeDirectory subdirectory, String file) {
return null; return null;
} }
@Override
public List<String> getFiles(RelativeDirectory subdirectory) { public List<String> getFiles(RelativeDirectory subdirectory) {
return List.nil(); return List.nil();
} }
@Override
public Set<RelativeDirectory> getSubdirectories() { public Set<RelativeDirectory> getSubdirectories() {
return Collections.emptySet(); return Collections.emptySet();
} }
@ -448,10 +517,6 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
*/ */
Map<File, Archive> archives = new HashMap<>(); Map<File, Archive> archives = new HashMap<>();
private static final String[] symbolFileLocation = { "lib", "ct.sym" };
private static final RelativeDirectory symbolFilePrefix
= new RelativeDirectory("META-INF/sym/rt.jar/");
/* /*
* This method looks for a ZipFormatException and takes appropriate * This method looks for a ZipFormatException and takes appropriate
* evasive action. If there is a failure in the fast mode then we * evasive action. If there is a failure in the fast mode then we
@ -473,19 +538,6 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
/** Open a new zip file directory, and cache it. /** Open a new zip file directory, and cache it.
*/ */
private Archive openArchive(File zipFileName, boolean useOptimizedZip) throws IOException { private Archive openArchive(File zipFileName, boolean useOptimizedZip) throws IOException {
File origZipFileName = zipFileName;
if (symbolFileEnabled && locations.isDefaultBootClassPathRtJar(zipFileName)) {
File file = zipFileName.getParentFile().getParentFile(); // ${java.home}
if (new File(file.getName()).equals(new File("jre")))
file = file.getParentFile();
// file == ${jdk.home}
for (String name : symbolFileLocation)
file = new File(file, name);
// file == ${jdk.home}/lib/ct.sym
if (file.exists())
zipFileName = file;
}
Archive archive; Archive archive;
try { try {
@ -522,7 +574,6 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
} }
} }
if (origZipFileName == zipFileName) {
if (!useOptimizedZip) { if (!useOptimizedZip) {
archive = new ZipArchive(this, zdir); archive = new ZipArchive(this, zdir);
} else { } else {
@ -533,18 +584,6 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
preindexCacheLocation, preindexCacheLocation,
options.isSet("writezipindexfiles"))); options.isSet("writezipindexfiles")));
} }
} else {
if (!useOptimizedZip) {
archive = new SymbolArchive(this, origZipFileName, zdir, symbolFilePrefix);
} else {
archive = new ZipFileIndexArchive(this,
zipFileIndexCache.getZipFileIndex(zipFileName,
symbolFilePrefix,
usePreindexedCache,
preindexCacheLocation,
options.isSet("writezipindexfiles")));
}
}
} catch (FileNotFoundException ex) { } catch (FileNotFoundException ex) {
archive = new MissingArchive(zipFileName); archive = new MissingArchive(zipFileName);
} catch (ZipFileIndex.ZipFormatException zfe) { } catch (ZipFileIndex.ZipFormatException zfe) {
@ -555,13 +594,13 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
archive = new MissingArchive(zipFileName); archive = new MissingArchive(zipFileName);
} }
archives.put(origZipFileName, archive); archives.put(zipFileName, archive);
return archive; return archive;
} }
/** Flush any output resources. /** Flush any output resources.
*/ */
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public void flush() { public void flush() {
contentCache.clear(); contentCache.clear();
} }
@ -569,19 +608,19 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
/** /**
* Close the JavaFileManager, releasing resources. * Close the JavaFileManager, releasing resources.
*/ */
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public void close() { public void close() {
for (Iterator<Archive> i = archives.values().iterator(); i.hasNext(); ) { for (Iterator<Archive> i = archives.values().iterator(); i.hasNext(); ) {
Archive a = i.next(); Archive a = i.next();
i.remove(); i.remove();
try { try {
a.close(); a.close();
} catch (IOException e) { } catch (IOException ignore) {
} }
} }
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public ClassLoader getClassLoader(Location location) { public ClassLoader getClassLoader(Location location) {
nullCheck(location); nullCheck(location);
Iterable<? extends File> path = getLocation(location); Iterable<? extends File> path = getLocation(location);
@ -599,7 +638,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
return getClassLoader(lb.toArray(new URL[lb.size()])); return getClassLoader(lb.toArray(new URL[lb.size()]));
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public Iterable<JavaFileObject> list(Location location, public Iterable<JavaFileObject> list(Location location,
String packageName, String packageName,
Set<JavaFileObject.Kind> kinds, Set<JavaFileObject.Kind> kinds,
@ -621,7 +660,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
return results.toList(); return results.toList();
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public String inferBinaryName(Location location, JavaFileObject file) { public String inferBinaryName(Location location, JavaFileObject file) {
file.getClass(); // null check file.getClass(); // null check
location.getClass(); // null check location.getClass(); // null check
@ -633,27 +672,32 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
if (file instanceof BaseFileObject) { if (file instanceof BaseFileObject) {
return ((BaseFileObject) file).inferBinaryName(path); return ((BaseFileObject) file).inferBinaryName(path);
} else if (file instanceof PathFileObject) {
return ((PathFileObject) file).inferBinaryName(null);
} else } else
throw new IllegalArgumentException(file.getClass().getName()); throw new IllegalArgumentException(file.getClass().getName());
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public boolean isSameFile(FileObject a, FileObject b) { public boolean isSameFile(FileObject a, FileObject b) {
nullCheck(a); nullCheck(a);
nullCheck(b); nullCheck(b);
if (!(a instanceof BaseFileObject)) if (a instanceof PathFileObject && b instanceof PathFileObject)
return ((PathFileObject) a).isSameFile((PathFileObject) b);
// In time, we should phase out BaseFileObject in favor of PathFileObject
if (!(a instanceof BaseFileObject || a instanceof PathFileObject))
throw new IllegalArgumentException("Not supported: " + a); throw new IllegalArgumentException("Not supported: " + a);
if (!(b instanceof BaseFileObject)) if (!(b instanceof BaseFileObject || b instanceof PathFileObject))
throw new IllegalArgumentException("Not supported: " + b); throw new IllegalArgumentException("Not supported: " + b);
return a.equals(b); return a.equals(b);
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public boolean hasLocation(Location location) { public boolean hasLocation(Location location) {
return getLocation(location) != null; return getLocation(location) != null;
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public JavaFileObject getJavaFileForInput(Location location, public JavaFileObject getJavaFileForInput(Location location,
String className, String className,
JavaFileObject.Kind kind) JavaFileObject.Kind kind)
@ -668,7 +712,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
return getFileForInput(location, RelativeFile.forClass(className, kind)); return getFileForInput(location, RelativeFile.forClass(className, kind));
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public FileObject getFileForInput(Location location, public FileObject getFileForInput(Location location,
String packageName, String packageName,
String relativeName) String relativeName)
@ -690,17 +734,26 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
if (path == null) if (path == null)
return null; return null;
for (File dir: path) { for (File file: path) {
Archive a = archives.get(dir); Archive a = archives.get(file);
if (a == null) { if (a == null) {
if (fsInfo.isDirectory(dir)) { // archives are not created for directories or jrt: images
File f = name.getFile(dir); if (file == Locations.JRT_MARKER_FILE) {
JRTIndex.Entry e = getJRTIndex().getEntry(name.dirname());
if (symbolFileEnabled && e.ctSym.hidden)
continue;
Path p = e.files.get(name.basename());
if (p != null)
return PathFileObject.createJRTPathFileObject(this, p);
continue;
} else if (fsInfo.isDirectory(file)) {
File f = name.getFile(file);
if (f.exists()) if (f.exists())
return new RegularFileObject(this, f); return new RegularFileObject(this, f);
continue; continue;
} }
// Not a directory, create the archive // Not a directory, create the archive
a = openArchive(dir); a = openArchive(file);
} }
// Process the archive // Process the archive
if (a.contains(name)) { if (a.contains(name)) {
@ -710,7 +763,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
return null; return null;
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public JavaFileObject getJavaFileForOutput(Location location, public JavaFileObject getJavaFileForOutput(Location location,
String className, String className,
JavaFileObject.Kind kind, JavaFileObject.Kind kind,
@ -726,7 +779,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
return getFileForOutput(location, RelativeFile.forClass(className, kind), sibling); return getFileForOutput(location, RelativeFile.forClass(className, kind), sibling);
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public FileObject getFileForOutput(Location location, public FileObject getFileForOutput(Location location,
String packageName, String packageName,
String relativeName, String relativeName,
@ -776,7 +829,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public Iterable<? extends JavaFileObject> getJavaFileObjectsFromFiles( public Iterable<? extends JavaFileObject> getJavaFileObjectsFromFiles(
Iterable<? extends File> files) Iterable<? extends File> files)
{ {
@ -790,12 +843,12 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
return result; return result;
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public Iterable<? extends JavaFileObject> getJavaFileObjects(File... files) { public Iterable<? extends JavaFileObject> getJavaFileObjects(File... files) {
return getJavaFileObjectsFromFiles(Arrays.asList(nullCheck(files))); return getJavaFileObjectsFromFiles(Arrays.asList(nullCheck(files)));
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public void setLocation(Location location, public void setLocation(Location location,
Iterable<? extends File> path) Iterable<? extends File> path)
throws IOException throws IOException
@ -804,7 +857,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil
locations.setLocation(location, path); locations.setLocation(location, path);
} }
@DefinedBy(Api.COMPILER) @Override @DefinedBy(Api.COMPILER)
public Iterable<? extends File> getLocation(Location location) { public Iterable<? extends File> getLocation(Location location) {
nullCheck(location); nullCheck(location);
return locations.getLocation(location); return locations.getLocation(location);

View file

@ -27,8 +27,12 @@ package com.sun.tools.javac.file;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@ -41,6 +45,8 @@ import java.util.LinkedHashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
import javax.tools.JavaFileManager; import javax.tools.JavaFileManager;
@ -94,6 +100,12 @@ public class Locations {
*/ */
private boolean warn; private boolean warn;
// Used by Locations(for now) to indicate that the PLATFORM_CLASS_PATH
// should use the jrt: file system.
// When Locations has been converted to use java.nio.file.Path,
// Locations can use Paths.get(URI.create("jrt:"))
static final File JRT_MARKER_FILE = new File("JRT_MARKER_FILE");
public Locations() { public Locations() {
initHandlers(); initHandlers();
} }
@ -115,12 +127,6 @@ public class Locations {
return h.isDefault(); return h.isDefault();
} }
boolean isDefaultBootClassPathRtJar(File file) {
BootClassPathLocationHandler h
= (BootClassPathLocationHandler) getHandler(PLATFORM_CLASS_PATH);
return h.isDefaultRtJar(file);
}
public Collection<File> userClassPath() { public Collection<File> userClassPath() {
return getLocation(CLASS_PATH); return getLocation(CLASS_PATH);
} }
@ -283,7 +289,7 @@ public class Locations {
if (fsInfo.isFile(file)) { if (fsInfo.isFile(file)) {
/* File is an ordinary file. */ /* File is an ordinary file. */
if (!isArchive(file)) { if (!isArchive(file) && !file.getName().endsWith(".jimage")) {
/* Not a recognized extension; open it to see if /* Not a recognized extension; open it to see if
it looks like a valid zip file. */ it looks like a valid zip file. */
try { try {
@ -309,7 +315,7 @@ public class Locations {
super.add(file); super.add(file);
canonicalValues.add(canonFile); canonicalValues.add(canonFile);
if (expandJarClassPaths && fsInfo.isFile(file)) { if (expandJarClassPaths && fsInfo.isFile(file) && !file.getName().endsWith(".jimage")) {
addJarClassPath(file, warn); addJarClassPath(file, warn);
} }
} }
@ -543,15 +549,9 @@ public class Locations {
final Map<Option, String> optionValues = new EnumMap<>(Option.class); final Map<Option, String> optionValues = new EnumMap<>(Option.class);
/** /**
* rt.jar as found on the default bootclasspath. If the user specified a bootclasspath, null * Is the bootclasspath the default?
* is used.
*/ */
private File defaultBootClassPathRtJar = null; private boolean isDefault;
/**
* Is bootclasspath the default?
*/
private boolean isDefaultBootClassPath;
BootClassPathLocationHandler() { BootClassPathLocationHandler() {
super(StandardLocation.PLATFORM_CLASS_PATH, super(StandardLocation.PLATFORM_CLASS_PATH,
@ -564,12 +564,7 @@ public class Locations {
boolean isDefault() { boolean isDefault() {
lazy(); lazy();
return isDefaultBootClassPath; return isDefault;
}
boolean isDefaultRtJar(File file) {
lazy();
return file.equals(defaultBootClassPathRtJar);
} }
@Override @Override
@ -614,16 +609,16 @@ public class Locations {
if (files == null) { if (files == null) {
searchPath = null; // reset to "uninitialized" searchPath = null; // reset to "uninitialized"
} else { } else {
defaultBootClassPathRtJar = null; isDefault = false;
isDefaultBootClassPath = false;
SearchPath p = new SearchPath().addFiles(files, false); SearchPath p = new SearchPath().addFiles(files, false);
searchPath = Collections.unmodifiableCollection(p); searchPath = Collections.unmodifiableCollection(p);
optionValues.clear(); optionValues.clear();
} }
} }
SearchPath computePath() { SearchPath computePath() throws IOException {
defaultBootClassPathRtJar = null; String java_home = System.getProperty("java.home");
SearchPath path = new SearchPath(); SearchPath path = new SearchPath();
String bootclasspathOpt = optionValues.get(BOOTCLASSPATH); String bootclasspathOpt = optionValues.get(BOOTCLASSPATH);
@ -643,13 +638,13 @@ public class Locations {
path.addFiles(bootclasspathOpt); path.addFiles(bootclasspathOpt);
} else { } else {
// Standard system classes for this compiler's release. // Standard system classes for this compiler's release.
Collection<File> systemClasses = systemClasses(java_home);
if (systemClasses != null) {
path.addFiles(systemClasses, false);
} else {
// fallback to the value of sun.boot.class.path
String files = System.getProperty("sun.boot.class.path"); String files = System.getProperty("sun.boot.class.path");
path.addFiles(files, false); path.addFiles(files, false);
File rt_jar = new File("rt.jar");
for (File file : getPathEntries(files)) {
if (new File(file.getName()).equals(rt_jar)) {
defaultBootClassPathRtJar = file;
}
} }
} }
@ -661,20 +656,69 @@ public class Locations {
if (extdirsOpt != null) { if (extdirsOpt != null) {
path.addDirectories(extdirsOpt); path.addDirectories(extdirsOpt);
} else { } else {
// Add lib/jfxrt.jar to the search path
File jfxrt = new File(new File(java_home, "lib"), "jfxrt.jar");
if (jfxrt.exists()) {
path.addFile(jfxrt, false);
}
path.addDirectories(System.getProperty("java.ext.dirs"), false); path.addDirectories(System.getProperty("java.ext.dirs"), false);
} }
isDefaultBootClassPath isDefault =
= (xbootclasspathPrependOpt == null) (xbootclasspathPrependOpt == null)
&& (bootclasspathOpt == null) && (bootclasspathOpt == null)
&& (xbootclasspathAppendOpt == null); && (xbootclasspathAppendOpt == null);
return path; return path;
} }
/**
* Return a collection of files containing system classes.
* Returns {@code null} if not running on a modular image.
*
* @throws UncheckedIOException if an I/O errors occurs
*/
private Collection<File> systemClasses(String java_home) throws IOException {
// Return .jimage files if available
Path libModules = Paths.get(java_home, "lib", "modules");
if (Files.exists(libModules)) {
try (Stream<Path> files = Files.list(libModules)) {
boolean haveJImageFiles =
files.anyMatch(f -> f.getFileName().toString().endsWith(".jimage"));
if (haveJImageFiles) {
return Collections.singleton(JRT_MARKER_FILE);
}
}
}
// Temporary: if no .jimage files, return individual modules
if (Files.exists(libModules.resolve("java.base"))) {
return Files.list(libModules)
.map(d -> d.resolve("classes"))
.map(Path::toFile)
.collect(Collectors.toList());
}
// Exploded module image
Path modules = Paths.get(java_home, "modules");
if (Files.isDirectory(modules.resolve("java.base"))) {
return Files.list(modules)
.map(Path::toFile)
.collect(Collectors.toList());
}
// not a modular image that we know about
return null;
}
private void lazy() { private void lazy() {
if (searchPath == null) { if (searchPath == null) {
try {
searchPath = Collections.unmodifiableCollection(computePath()); searchPath = Collections.unmodifiableCollection(computePath());
} catch (IOException e) {
// TODO: need better handling here, e.g. javac Abort?
throw new UncheckedIOException(e);
}
} }
} }
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,8 +26,13 @@
package com.sun.tools.javac.file; package com.sun.tools.javac.file;
import java.io.File; import java.io.File;
import java.nio.file.FileSystems;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
import javax.tools.JavaFileObject; import javax.tools.JavaFileObject;
/** /**
@ -58,6 +63,16 @@ public abstract class RelativePath implements Comparable<RelativePath> {
return new File(directory, path.replace('/', File.separatorChar)); return new File(directory, path.replace('/', File.separatorChar));
} }
public Path getFile(Path directory) throws /*unchecked*/ InvalidPathException {
if (directory == null) {
String sep = FileSystems.getDefault().getSeparator();
return Paths.get(path.replace("/", sep));
} else {
String sep = directory.getFileSystem().getSeparator();
return directory.resolve(path.replace("/", sep));
}
}
public int compareTo(RelativePath other) { public int compareTo(RelativePath other) {
return path.compareTo(other.path); return path.compareTo(other.path);
} }

View file

@ -1,107 +0,0 @@
/*
* Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.javac.file;
import java.io.File;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.tools.JavaFileObject;
import com.sun.tools.javac.file.RelativePath.RelativeDirectory;
import com.sun.tools.javac.file.RelativePath.RelativeFile;
import com.sun.tools.javac.util.List;
/**
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
* This code and its internal interfaces are subject to change or
* deletion without notice.</b>
*/
public class SymbolArchive extends ZipArchive {
final File origFile;
final RelativeDirectory prefix;
public SymbolArchive(JavacFileManager fileManager, File orig, ZipFile zdir, RelativeDirectory prefix) throws IOException {
super(fileManager, zdir, false);
this.origFile = orig;
this.prefix = prefix;
initMap();
}
@Override
void addZipEntry(ZipEntry entry) {
String name = entry.getName();
if (!name.startsWith(prefix.path)) {
return;
}
name = name.substring(prefix.path.length());
int i = name.lastIndexOf('/');
RelativeDirectory dirname = new RelativeDirectory(name.substring(0, i+1));
String basename = name.substring(i + 1);
if (basename.length() == 0) {
return;
}
List<String> list = map.get(dirname);
if (list == null)
list = List.nil();
list = list.prepend(basename);
map.put(dirname, list);
}
@Override
public JavaFileObject getFileObject(RelativeDirectory subdirectory, String file) {
RelativeDirectory prefix_subdir = new RelativeDirectory(prefix, subdirectory.path);
ZipEntry ze = new RelativeFile(prefix_subdir, file).getZipEntry(zfile);
return new SymbolFileObject(this, file, ze);
}
@Override
public String toString() {
return "SymbolArchive[" + zfile.getName() + "]";
}
/**
* A subclass of JavaFileObject representing zip entries in a symbol file.
*/
public static class SymbolFileObject extends ZipFileObject {
protected SymbolFileObject(SymbolArchive zarch, String name, ZipEntry entry) {
super(zarch, name, entry);
}
@Override
protected String inferBinaryName(Iterable<? extends File> path) {
String entryName = entry.getName();
String prefix = ((SymbolArchive) zarch).prefix.path;
if (entryName.startsWith(prefix))
entryName = entryName.substring(prefix.length());
return removeExtension(entryName).replace('/', '.');
}
}
}

View file

@ -1299,20 +1299,6 @@ public class ClassReader {
ListBuffer<CompoundAnnotationProxy> proxies = new ListBuffer<>(); ListBuffer<CompoundAnnotationProxy> proxies = new ListBuffer<>();
for (int i = 0; i<numAttributes; i++) { for (int i = 0; i<numAttributes; i++) {
CompoundAnnotationProxy proxy = readCompoundAnnotation(); CompoundAnnotationProxy proxy = readCompoundAnnotation();
if (proxy.type.tsym == syms.proprietaryType.tsym)
sym.flags_field |= PROPRIETARY;
else if (proxy.type.tsym == syms.profileType.tsym) {
if (profile != Profile.DEFAULT) {
for (Pair<Name,Attribute> v: proxy.values) {
if (v.fst == names.value && v.snd instanceof Attribute.Constant) {
Attribute.Constant c = (Attribute.Constant) v.snd;
if (c.type == syms.intType && ((Integer) c.value) > profile.value) {
sym.flags_field |= NOT_IN_PROFILE;
}
}
}
}
} else
proxies.append(proxy); proxies.append(proxy);
} }
annotate.normal(new AnnotationCompleter(sym, proxies.toList())); annotate.normal(new AnnotationCompleter(sym, proxies.toList()));

View file

@ -368,7 +368,7 @@ public class JavacPathFileManager extends BaseFileManager implements PathFileMan
@Override @Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
Path name = dir.getFileName(); Path name = dir.getFileName();
if (name == null || SourceVersion.isIdentifier(name.toString())) // JSR 292? if (name == null || SourceVersion.isIdentifier(name.toString()))
return FileVisitResult.CONTINUE; return FileVisitResult.CONTINUE;
else else
return FileVisitResult.SKIP_SUBTREE; return FileVisitResult.SKIP_SUBTREE;
@ -377,6 +377,9 @@ public class JavacPathFileManager extends BaseFileManager implements PathFileMan
@Override @Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (attrs.isRegularFile() && kinds.contains(getKind(file.getFileName().toString()))) { if (attrs.isRegularFile() && kinds.contains(getKind(file.getFileName().toString()))) {
// WORKAROUND for .jimage files
if (!file.isAbsolute())
file = pathDir.resolve(file);
JavaFileObject fe = JavaFileObject fe =
PathFileObject.createDirectoryPathFileObject( PathFileObject.createDirectoryPathFileObject(
JavacPathFileManager.this, file, pathDir); JavacPathFileManager.this, file, pathDir);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -62,19 +62,19 @@ import com.sun.tools.javac.util.DefinedBy.Api;
* This code and its internal interfaces are subject to change or * This code and its internal interfaces are subject to change or
* deletion without notice.</b> * deletion without notice.</b>
*/ */
abstract class PathFileObject implements JavaFileObject { public abstract class PathFileObject implements JavaFileObject {
private JavacPathFileManager fileManager; private final BaseFileManager fileManager;
private Path path; private final Path path;
/** /**
* Create a PathFileObject within a directory, such that the binary name * Create a PathFileObject within a directory, such that the binary name
* can be inferred from the relationship to the parent directory. * can be inferred from the relationship to the parent directory.
*/ */
static PathFileObject createDirectoryPathFileObject(JavacPathFileManager fileManager, static PathFileObject createDirectoryPathFileObject(BaseFileManager fileManager,
final Path path, final Path dir) { final Path path, final Path dir) {
return new PathFileObject(fileManager, path) { return new PathFileObject(fileManager, path) {
@Override @Override
String inferBinaryName(Iterable<? extends Path> paths) { public String inferBinaryName(Iterable<? extends Path> paths) {
return toBinaryName(dir.relativize(path)); return toBinaryName(dir.relativize(path));
} }
}; };
@ -84,25 +84,40 @@ abstract class PathFileObject implements JavaFileObject {
* Create a PathFileObject in a file system such as a jar file, such that * Create a PathFileObject in a file system such as a jar file, such that
* the binary name can be inferred from its position within the filesystem. * the binary name can be inferred from its position within the filesystem.
*/ */
static PathFileObject createJarPathFileObject(JavacPathFileManager fileManager, public static PathFileObject createJarPathFileObject(BaseFileManager fileManager,
final Path path) { final Path path) {
return new PathFileObject(fileManager, path) { return new PathFileObject(fileManager, path) {
@Override @Override
String inferBinaryName(Iterable<? extends Path> paths) { public String inferBinaryName(Iterable<? extends Path> paths) {
return toBinaryName(path); return toBinaryName(path);
} }
}; };
} }
/**
* Create a PathFileObject in a modular file system, such as jrt:, such that
* the binary name can be inferred from its position within the filesystem.
*/
public static PathFileObject createJRTPathFileObject(BaseFileManager fileManager,
final Path path) {
return new PathFileObject(fileManager, path) {
@Override
public String inferBinaryName(Iterable<? extends Path> paths) {
// use subpath to ignore the leading component containing the module name
return toBinaryName(path.subpath(1, path.getNameCount()));
}
};
}
/** /**
* Create a PathFileObject whose binary name can be inferred from the * Create a PathFileObject whose binary name can be inferred from the
* relative path to a sibling. * relative path to a sibling.
*/ */
static PathFileObject createSiblingPathFileObject(JavacPathFileManager fileManager, static PathFileObject createSiblingPathFileObject(BaseFileManager fileManager,
final Path path, final String relativePath) { final Path path, final String relativePath) {
return new PathFileObject(fileManager, path) { return new PathFileObject(fileManager, path) {
@Override @Override
String inferBinaryName(Iterable<? extends Path> paths) { public String inferBinaryName(Iterable<? extends Path> paths) {
return toBinaryName(relativePath, "/"); return toBinaryName(relativePath, "/");
} }
}; };
@ -112,11 +127,11 @@ abstract class PathFileObject implements JavaFileObject {
* Create a PathFileObject whose binary name might be inferred from its * Create a PathFileObject whose binary name might be inferred from its
* position on a search path. * position on a search path.
*/ */
static PathFileObject createSimplePathFileObject(JavacPathFileManager fileManager, static PathFileObject createSimplePathFileObject(BaseFileManager fileManager,
final Path path) { final Path path) {
return new PathFileObject(fileManager, path) { return new PathFileObject(fileManager, path) {
@Override @Override
String inferBinaryName(Iterable<? extends Path> paths) { public String inferBinaryName(Iterable<? extends Path> paths) {
Path absPath = path.toAbsolutePath(); Path absPath = path.toAbsolutePath();
for (Path p: paths) { for (Path p: paths) {
Path ap = p.toAbsolutePath(); Path ap = p.toAbsolutePath();
@ -135,20 +150,20 @@ abstract class PathFileObject implements JavaFileObject {
}; };
} }
protected PathFileObject(JavacPathFileManager fileManager, Path path) { protected PathFileObject(BaseFileManager fileManager, Path path) {
fileManager.getClass(); // null check fileManager.getClass(); // null check
path.getClass(); // null check path.getClass(); // null check
this.fileManager = fileManager; this.fileManager = fileManager;
this.path = path; this.path = path;
} }
abstract String inferBinaryName(Iterable<? extends Path> paths); public abstract String inferBinaryName(Iterable<? extends Path> paths);
/** /**
* Return the Path for this object. * Return the Path for this object.
* @return the Path for this object. * @return the Path for this object.
*/ */
Path getPath() { public Path getPath() {
return path; return path;
} }

View file

@ -0,0 +1,749 @@
apple.applescript.*: hidden
apple.laf.*: hidden
apple.security.*: hidden
com.apple.concurrent.*: hidden
com.apple.eawt.*: hidden
com.apple.eawt.event.*: hidden
com.apple.eio.*: hidden
com.apple.laf.*: hidden
com.oracle.webservices.internal.api.*: hidden
com.oracle.webservices.internal.api.databinding.*: hidden
com.oracle.webservices.internal.api.message.*: hidden
com.oracle.webservices.internal.impl.encoding.*: hidden
com.oracle.webservices.internal.impl.internalspi.encoding.*: hidden
com.oracle.xmlns.internal.webservices.jaxws_databinding.*: hidden
com.sun.accessibility.internal.resources.*: proprietary
com.sun.activation.registries.*: hidden
com.sun.awt.*: proprietary
com.sun.beans.*: proprietary
com.sun.beans.decoder.*: hidden
com.sun.beans.editors.*: hidden
com.sun.beans.finder.*: hidden
com.sun.beans.infos.*: hidden
com.sun.beans.introspect.*: hidden
com.sun.beans.util.*: hidden
com.sun.corba.se.impl.activation.*: proprietary
com.sun.corba.se.impl.copyobject.*: proprietary
com.sun.corba.se.impl.corba.*: proprietary
com.sun.corba.se.impl.dynamicany.*: proprietary
com.sun.corba.se.impl.encoding.*: proprietary
com.sun.corba.se.impl.interceptors.*: proprietary
com.sun.corba.se.impl.io.*: proprietary
com.sun.corba.se.impl.ior.*: proprietary
com.sun.corba.se.impl.ior.iiop.*: proprietary
com.sun.corba.se.impl.javax.rmi.*: proprietary
com.sun.corba.se.impl.javax.rmi.CORBA.*: proprietary
com.sun.corba.se.impl.legacy.connection.*: proprietary
com.sun.corba.se.impl.logging.*: proprietary
com.sun.corba.se.impl.monitoring.*: proprietary
com.sun.corba.se.impl.naming.cosnaming.*: proprietary
com.sun.corba.se.impl.naming.namingutil.*: proprietary
com.sun.corba.se.impl.naming.pcosnaming.*: proprietary
com.sun.corba.se.impl.oa.*: proprietary
com.sun.corba.se.impl.oa.poa.*: proprietary
com.sun.corba.se.impl.oa.toa.*: proprietary
com.sun.corba.se.impl.orb.*: proprietary
com.sun.corba.se.impl.orbutil.*: proprietary
com.sun.corba.se.impl.orbutil.closure.*: proprietary
com.sun.corba.se.impl.orbutil.concurrent.*: proprietary
com.sun.corba.se.impl.orbutil.fsm.*: proprietary
com.sun.corba.se.impl.orbutil.graph.*: proprietary
com.sun.corba.se.impl.orbutil.threadpool.*: proprietary
com.sun.corba.se.impl.presentation.rmi.*: proprietary
com.sun.corba.se.impl.protocol.*: proprietary
com.sun.corba.se.impl.protocol.giopmsgheaders.*: proprietary
com.sun.corba.se.impl.resolver.*: proprietary
com.sun.corba.se.impl.transport.*: proprietary
com.sun.corba.se.impl.util.*: proprietary
com.sun.corba.se.internal.CosNaming.*: proprietary
com.sun.corba.se.internal.Interceptors.*: proprietary
com.sun.corba.se.internal.POA.*: proprietary
com.sun.corba.se.internal.corba.*: proprietary
com.sun.corba.se.internal.iiop.*: proprietary
com.sun.corba.se.org.omg.CORBA.*: proprietary
com.sun.corba.se.pept.broker.*: proprietary
com.sun.corba.se.pept.encoding.*: proprietary
com.sun.corba.se.pept.protocol.*: proprietary
com.sun.corba.se.pept.transport.*: proprietary
com.sun.corba.se.spi.activation.*: proprietary
com.sun.corba.se.spi.activation.InitialNameServicePackage.*: proprietary
com.sun.corba.se.spi.activation.LocatorPackage.*: proprietary
com.sun.corba.se.spi.activation.RepositoryPackage.*: proprietary
com.sun.corba.se.spi.copyobject.*: proprietary
com.sun.corba.se.spi.encoding.*: proprietary
com.sun.corba.se.spi.extension.*: proprietary
com.sun.corba.se.spi.ior.*: proprietary
com.sun.corba.se.spi.ior.iiop.*: proprietary
com.sun.corba.se.spi.legacy.connection.*: proprietary
com.sun.corba.se.spi.legacy.interceptor.*: proprietary
com.sun.corba.se.spi.logging.*: proprietary
com.sun.corba.se.spi.monitoring.*: proprietary
com.sun.corba.se.spi.oa.*: proprietary
com.sun.corba.se.spi.orb.*: proprietary
com.sun.corba.se.spi.orbutil.closure.*: proprietary
com.sun.corba.se.spi.orbutil.fsm.*: proprietary
com.sun.corba.se.spi.orbutil.proxy.*: proprietary
com.sun.corba.se.spi.orbutil.threadpool.*: proprietary
com.sun.corba.se.spi.presentation.rmi.*: proprietary
com.sun.corba.se.spi.protocol.*: proprietary
com.sun.corba.se.spi.resolver.*: proprietary
com.sun.corba.se.spi.servicecontext.*: proprietary
com.sun.corba.se.spi.transport.*: proprietary
com.sun.demo.jvmti.hprof.*: hidden
com.sun.imageio.plugins.bmp.*: proprietary
com.sun.imageio.plugins.common.*: proprietary
com.sun.imageio.plugins.gif.*: proprietary
com.sun.imageio.plugins.jpeg.*: proprietary
com.sun.imageio.plugins.png.*: proprietary
com.sun.imageio.plugins.wbmp.*: proprietary
com.sun.imageio.spi.*: proprietary
com.sun.imageio.stream.*: hidden
com.sun.istack.internal.*: hidden
com.sun.istack.internal.localization.*: hidden
com.sun.istack.internal.logging.*: hidden
com.sun.java.swing.*: proprietary
com.sun.java.swing.plaf.gtk.resources.*: proprietary
com.sun.java.swing.plaf.motif.resources.*: proprietary
com.sun.java.swing.plaf.nimbus.*: proprietary
com.sun.java.swing.plaf.windows.resources.*: proprietary
com.sun.java.util.jar.pack.*: proprietary compact1
com.sun.java_cup.internal.runtime.*: proprietary compact2
com.sun.jmx.defaults.*: proprietary compact3
com.sun.jmx.interceptor.*: proprietary compact3
com.sun.jmx.mbeanserver.*: proprietary compact3
com.sun.jmx.remote.internal.*: proprietary compact3
com.sun.jmx.remote.protocol.rmi.*: proprietary compact3
com.sun.jmx.remote.security.*: proprietary compact3
com.sun.jmx.remote.util.*: proprietary compact3
com.sun.jndi.cosnaming.*: proprietary
com.sun.jndi.dns.*: proprietary compact3
com.sun.jndi.ldap.*: proprietary compact3
com.sun.jndi.ldap.ext.*: proprietary compact3
com.sun.jndi.ldap.pool.*: proprietary compact3
com.sun.jndi.ldap.sasl.*: proprietary compact3
com.sun.jndi.rmi.registry.*: proprietary compact3
com.sun.jndi.toolkit.corba.*: proprietary
com.sun.jndi.toolkit.ctx.*: proprietary compact3
com.sun.jndi.toolkit.dir.*: proprietary compact3
com.sun.jndi.toolkit.url.*: proprietary compact3
com.sun.jndi.url.corbaname.*: proprietary
com.sun.jndi.url.dns.*: proprietary compact3
com.sun.jndi.url.iiop.*: proprietary
com.sun.jndi.url.iiopname.*: proprietary
com.sun.jndi.url.ldap.*: proprietary compact3
com.sun.jndi.url.ldaps.*: proprietary compact3
com.sun.jndi.url.rmi.*: proprietary compact3
com.sun.management.*: compact3
com.sun.media.sound.*: proprietary
com.sun.naming.internal.*: proprietary compact3
com.sun.net.httpserver.*: compact2
com.sun.net.httpserver.spi.*: compact2
com.sun.net.ssl.*: compact1
com.sun.net.ssl.internal.www.protocol.https.*: proprietary compact1
com.sun.nio.file.*: compact1
com.sun.nio.sctp.*: compact3
com.sun.org.apache.bcel.internal.*: proprietary compact2
com.sun.org.apache.bcel.internal.classfile.*: proprietary compact2
com.sun.org.apache.bcel.internal.generic.*: proprietary compact2
com.sun.org.apache.bcel.internal.util.*: proprietary compact2
com.sun.org.apache.regexp.internal.*: proprietary compact2
com.sun.org.apache.xalan.internal.*: proprietary compact2
com.sun.org.apache.xalan.internal.extensions.*: proprietary compact2
com.sun.org.apache.xalan.internal.lib.*: proprietary compact2
com.sun.org.apache.xalan.internal.res.*: proprietary compact2
com.sun.org.apache.xalan.internal.templates.*: proprietary compact2
com.sun.org.apache.xalan.internal.utils.*: hidden
com.sun.org.apache.xalan.internal.xslt.*: proprietary compact2
com.sun.org.apache.xalan.internal.xsltc.*: proprietary compact2
com.sun.org.apache.xalan.internal.xsltc.cmdline.*: proprietary compact2
com.sun.org.apache.xalan.internal.xsltc.cmdline.getopt.*: proprietary compact2
com.sun.org.apache.xalan.internal.xsltc.compiler.*: proprietary compact2
com.sun.org.apache.xalan.internal.xsltc.compiler.util.*: proprietary compact2
com.sun.org.apache.xalan.internal.xsltc.dom.*: proprietary compact2
com.sun.org.apache.xalan.internal.xsltc.runtime.*: proprietary compact2
com.sun.org.apache.xalan.internal.xsltc.runtime.output.*: proprietary compact2
com.sun.org.apache.xalan.internal.xsltc.trax.*: proprietary compact2
com.sun.org.apache.xalan.internal.xsltc.util.*: proprietary compact2
com.sun.org.apache.xerces.internal.dom.*: proprietary compact2
com.sun.org.apache.xerces.internal.dom.events.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.dtd.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.dtd.models.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.dv.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.dv.dtd.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.dv.util.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.dv.xs.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.io.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.msg.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.validation.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.xpath.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.xpath.regex.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.xs.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.xs.identity.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.xs.models.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.xs.opti.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.xs.traversers.*: proprietary compact2
com.sun.org.apache.xerces.internal.impl.xs.util.*: proprietary compact2
com.sun.org.apache.xerces.internal.jaxp.*: proprietary compact2
com.sun.org.apache.xerces.internal.jaxp.datatype.*: proprietary compact2
com.sun.org.apache.xerces.internal.jaxp.validation.*: proprietary compact2
com.sun.org.apache.xerces.internal.parsers.*: proprietary compact2
com.sun.org.apache.xerces.internal.util.*: proprietary compact2
com.sun.org.apache.xerces.internal.utils.*: hidden
com.sun.org.apache.xerces.internal.xinclude.*: proprietary compact2
com.sun.org.apache.xerces.internal.xni.*: proprietary compact2
com.sun.org.apache.xerces.internal.xni.grammars.*: proprietary compact2
com.sun.org.apache.xerces.internal.xni.parser.*: proprietary compact2
com.sun.org.apache.xerces.internal.xpointer.*: hidden
com.sun.org.apache.xerces.internal.xs.*: proprietary compact2
com.sun.org.apache.xerces.internal.xs.datatypes.*: hidden
com.sun.org.apache.xml.internal.dtm.*: proprietary compact2
com.sun.org.apache.xml.internal.dtm.ref.*: proprietary compact2
com.sun.org.apache.xml.internal.dtm.ref.dom2dtm.*: proprietary compact2
com.sun.org.apache.xml.internal.dtm.ref.sax2dtm.*: proprietary compact2
com.sun.org.apache.xml.internal.res.*: proprietary compact2
com.sun.org.apache.xml.internal.resolver.*: hidden
com.sun.org.apache.xml.internal.resolver.helpers.*: hidden
com.sun.org.apache.xml.internal.resolver.readers.*: hidden
com.sun.org.apache.xml.internal.resolver.tools.*: hidden
com.sun.org.apache.xml.internal.security.*: hidden
com.sun.org.apache.xml.internal.security.algorithms.*: hidden
com.sun.org.apache.xml.internal.security.algorithms.implementations.*: hidden
com.sun.org.apache.xml.internal.security.c14n.*: hidden
com.sun.org.apache.xml.internal.security.c14n.helper.*: hidden
com.sun.org.apache.xml.internal.security.c14n.implementations.*: hidden
com.sun.org.apache.xml.internal.security.encryption.*: hidden
com.sun.org.apache.xml.internal.security.exceptions.*: hidden
com.sun.org.apache.xml.internal.security.keys.*: hidden
com.sun.org.apache.xml.internal.security.keys.content.*: hidden
com.sun.org.apache.xml.internal.security.keys.content.keyvalues.*: hidden
com.sun.org.apache.xml.internal.security.keys.content.x509.*: hidden
com.sun.org.apache.xml.internal.security.keys.keyresolver.*: hidden
com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.*: hidden
com.sun.org.apache.xml.internal.security.keys.storage.*: hidden
com.sun.org.apache.xml.internal.security.keys.storage.implementations.*: hidden
com.sun.org.apache.xml.internal.security.signature.*: hidden
com.sun.org.apache.xml.internal.security.signature.reference.*: hidden
com.sun.org.apache.xml.internal.security.transforms.*: hidden
com.sun.org.apache.xml.internal.security.transforms.implementations.*: hidden
com.sun.org.apache.xml.internal.security.transforms.params.*: hidden
com.sun.org.apache.xml.internal.security.utils.*: hidden
com.sun.org.apache.xml.internal.security.utils.resolver.*: hidden
com.sun.org.apache.xml.internal.security.utils.resolver.implementations.*: hidden
com.sun.org.apache.xml.internal.serialize.*: proprietary compact2
com.sun.org.apache.xml.internal.serializer.*: proprietary compact2
com.sun.org.apache.xml.internal.serializer.dom3.*: hidden
com.sun.org.apache.xml.internal.serializer.utils.*: hidden
com.sun.org.apache.xml.internal.utils.*: proprietary compact2
com.sun.org.apache.xml.internal.utils.res.*: proprietary compact2
com.sun.org.apache.xpath.internal.*: proprietary compact2
com.sun.org.apache.xpath.internal.axes.*: proprietary compact2
com.sun.org.apache.xpath.internal.compiler.*: proprietary compact2
com.sun.org.apache.xpath.internal.domapi.*: hidden
com.sun.org.apache.xpath.internal.functions.*: proprietary compact2
com.sun.org.apache.xpath.internal.jaxp.*: proprietary compact2
com.sun.org.apache.xpath.internal.objects.*: proprietary compact2
com.sun.org.apache.xpath.internal.operations.*: proprietary compact2
com.sun.org.apache.xpath.internal.patterns.*: proprietary compact2
com.sun.org.apache.xpath.internal.res.*: proprietary compact2
com.sun.org.glassfish.external.amx.*: hidden
com.sun.org.glassfish.external.arc.*: hidden
com.sun.org.glassfish.external.probe.provider.*: hidden
com.sun.org.glassfish.external.probe.provider.annotations.*: hidden
com.sun.org.glassfish.external.statistics.*: hidden
com.sun.org.glassfish.external.statistics.annotations.*: hidden
com.sun.org.glassfish.external.statistics.impl.*: hidden
com.sun.org.glassfish.gmbal.*: hidden
com.sun.org.glassfish.gmbal.util.*: hidden
com.sun.org.omg.CORBA.*: proprietary
com.sun.org.omg.CORBA.ValueDefPackage.*: proprietary
com.sun.org.omg.CORBA.portable.*: proprietary
com.sun.org.omg.SendingContext.*: proprietary
com.sun.org.omg.SendingContext.CodeBasePackage.*: proprietary
com.sun.rmi.rmid.*: proprietary compact2
com.sun.rowset.*: proprietary compact3
com.sun.rowset.internal.*: proprietary compact3
com.sun.rowset.providers.*: proprietary compact3
com.sun.security.auth.*: compact3
com.sun.security.auth.callback.*: compact3
com.sun.security.auth.login.*: compact3
com.sun.security.auth.module.*: compact3
com.sun.security.cert.internal.x509.*: proprietary compact1
com.sun.security.jgss.*: compact3
com.sun.security.ntlm.*: hidden
com.sun.security.sasl.*: proprietary compact3
com.sun.security.sasl.digest.*: proprietary compact3
com.sun.security.sasl.gsskerb.*: proprietary compact3
com.sun.security.sasl.ntlm.*: hidden
com.sun.security.sasl.util.*: proprietary compact3
com.sun.swing.internal.plaf.basic.resources.*: proprietary
com.sun.swing.internal.plaf.metal.resources.*: proprietary
com.sun.swing.internal.plaf.synth.resources.*: proprietary
com.sun.tracing.*: proprietary compact3
com.sun.tracing.dtrace.*: proprietary compact3
com.sun.xml.internal.bind.*: hidden
com.sun.xml.internal.bind.annotation.*: hidden
com.sun.xml.internal.bind.api.*: hidden
com.sun.xml.internal.bind.api.impl.*: hidden
com.sun.xml.internal.bind.marshaller.*: hidden
com.sun.xml.internal.bind.unmarshaller.*: hidden
com.sun.xml.internal.bind.util.*: hidden
com.sun.xml.internal.bind.v2.*: hidden
com.sun.xml.internal.bind.v2.bytecode.*: hidden
com.sun.xml.internal.bind.v2.model.annotation.*: hidden
com.sun.xml.internal.bind.v2.model.core.*: hidden
com.sun.xml.internal.bind.v2.model.impl.*: hidden
com.sun.xml.internal.bind.v2.model.nav.*: hidden
com.sun.xml.internal.bind.v2.model.runtime.*: hidden
com.sun.xml.internal.bind.v2.model.util.*: hidden
com.sun.xml.internal.bind.v2.runtime.*: hidden
com.sun.xml.internal.bind.v2.runtime.output.*: hidden
com.sun.xml.internal.bind.v2.runtime.property.*: hidden
com.sun.xml.internal.bind.v2.runtime.reflect.*: hidden
com.sun.xml.internal.bind.v2.runtime.reflect.opt.*: hidden
com.sun.xml.internal.bind.v2.runtime.unmarshaller.*: hidden
com.sun.xml.internal.bind.v2.schemagen.*: hidden
com.sun.xml.internal.bind.v2.schemagen.episode.*: hidden
com.sun.xml.internal.bind.v2.schemagen.xmlschema.*: hidden
com.sun.xml.internal.bind.v2.util.*: hidden
com.sun.xml.internal.fastinfoset.*: hidden
com.sun.xml.internal.fastinfoset.algorithm.*: hidden
com.sun.xml.internal.fastinfoset.alphabet.*: hidden
com.sun.xml.internal.fastinfoset.dom.*: hidden
com.sun.xml.internal.fastinfoset.org.apache.xerces.util.*: hidden
com.sun.xml.internal.fastinfoset.sax.*: hidden
com.sun.xml.internal.fastinfoset.stax.*: hidden
com.sun.xml.internal.fastinfoset.stax.events.*: hidden
com.sun.xml.internal.fastinfoset.stax.factory.*: hidden
com.sun.xml.internal.fastinfoset.stax.util.*: hidden
com.sun.xml.internal.fastinfoset.tools.*: hidden
com.sun.xml.internal.fastinfoset.util.*: hidden
com.sun.xml.internal.fastinfoset.vocab.*: hidden
com.sun.xml.internal.messaging.saaj.*: hidden
com.sun.xml.internal.messaging.saaj.client.p2p.*: hidden
com.sun.xml.internal.messaging.saaj.packaging.mime.*: hidden
com.sun.xml.internal.messaging.saaj.packaging.mime.internet.*: hidden
com.sun.xml.internal.messaging.saaj.packaging.mime.util.*: hidden
com.sun.xml.internal.messaging.saaj.soap.*: hidden
com.sun.xml.internal.messaging.saaj.soap.dynamic.*: hidden
com.sun.xml.internal.messaging.saaj.soap.impl.*: hidden
com.sun.xml.internal.messaging.saaj.soap.name.*: hidden
com.sun.xml.internal.messaging.saaj.soap.ver1_1.*: hidden
com.sun.xml.internal.messaging.saaj.soap.ver1_2.*: hidden
com.sun.xml.internal.messaging.saaj.util.*: hidden
com.sun.xml.internal.messaging.saaj.util.stax.*: hidden
com.sun.xml.internal.messaging.saaj.util.transform.*: hidden
com.sun.xml.internal.org.jvnet.fastinfoset.*: hidden
com.sun.xml.internal.org.jvnet.fastinfoset.sax.*: hidden
com.sun.xml.internal.org.jvnet.fastinfoset.sax.helpers.*: hidden
com.sun.xml.internal.org.jvnet.fastinfoset.stax.*: hidden
com.sun.xml.internal.org.jvnet.mimepull.*: hidden
com.sun.xml.internal.org.jvnet.staxex.*: hidden
com.sun.xml.internal.org.jvnet.staxex.util.*: hidden
com.sun.xml.internal.stream.*: hidden
com.sun.xml.internal.stream.buffer.*: hidden
com.sun.xml.internal.stream.buffer.sax.*: hidden
com.sun.xml.internal.stream.buffer.stax.*: hidden
com.sun.xml.internal.stream.dtd.*: hidden
com.sun.xml.internal.stream.dtd.nonvalidating.*: hidden
com.sun.xml.internal.stream.events.*: hidden
com.sun.xml.internal.stream.util.*: hidden
com.sun.xml.internal.stream.writers.*: hidden
com.sun.xml.internal.txw2.*: hidden
com.sun.xml.internal.txw2.annotation.*: hidden
com.sun.xml.internal.txw2.output.*: hidden
com.sun.xml.internal.ws.*: hidden
com.sun.xml.internal.ws.addressing.*: hidden
com.sun.xml.internal.ws.addressing.model.*: hidden
com.sun.xml.internal.ws.addressing.policy.*: hidden
com.sun.xml.internal.ws.addressing.v200408.*: hidden
com.sun.xml.internal.ws.api.*: hidden
com.sun.xml.internal.ws.api.addressing.*: hidden
com.sun.xml.internal.ws.api.client.*: hidden
com.sun.xml.internal.ws.api.config.management.*: hidden
com.sun.xml.internal.ws.api.config.management.policy.*: hidden
com.sun.xml.internal.ws.api.databinding.*: hidden
com.sun.xml.internal.ws.api.fastinfoset.*: hidden
com.sun.xml.internal.ws.api.ha.*: hidden
com.sun.xml.internal.ws.api.handler.*: hidden
com.sun.xml.internal.ws.api.message.*: hidden
com.sun.xml.internal.ws.api.message.saaj.*: hidden
com.sun.xml.internal.ws.api.message.stream.*: hidden
com.sun.xml.internal.ws.api.model.*: hidden
com.sun.xml.internal.ws.api.model.soap.*: hidden
com.sun.xml.internal.ws.api.model.wsdl.*: hidden
com.sun.xml.internal.ws.api.model.wsdl.editable.*: hidden
com.sun.xml.internal.ws.api.pipe.*: hidden
com.sun.xml.internal.ws.api.pipe.helper.*: hidden
com.sun.xml.internal.ws.api.policy.*: hidden
com.sun.xml.internal.ws.api.policy.subject.*: hidden
com.sun.xml.internal.ws.api.server.*: hidden
com.sun.xml.internal.ws.api.streaming.*: hidden
com.sun.xml.internal.ws.api.wsdl.parser.*: hidden
com.sun.xml.internal.ws.api.wsdl.writer.*: hidden
com.sun.xml.internal.ws.assembler.*: hidden
com.sun.xml.internal.ws.assembler.dev.*: hidden
com.sun.xml.internal.ws.assembler.jaxws.*: hidden
com.sun.xml.internal.ws.binding.*: hidden
com.sun.xml.internal.ws.client.*: hidden
com.sun.xml.internal.ws.client.dispatch.*: hidden
com.sun.xml.internal.ws.client.sei.*: hidden
com.sun.xml.internal.ws.commons.xmlutil.*: hidden
com.sun.xml.internal.ws.config.management.policy.*: hidden
com.sun.xml.internal.ws.config.metro.dev.*: hidden
com.sun.xml.internal.ws.config.metro.util.*: hidden
com.sun.xml.internal.ws.db.*: hidden
com.sun.xml.internal.ws.db.glassfish.*: hidden
com.sun.xml.internal.ws.developer.*: hidden
com.sun.xml.internal.ws.dump.*: hidden
com.sun.xml.internal.ws.encoding.*: hidden
com.sun.xml.internal.ws.encoding.fastinfoset.*: hidden
com.sun.xml.internal.ws.encoding.policy.*: hidden
com.sun.xml.internal.ws.encoding.soap.*: hidden
com.sun.xml.internal.ws.encoding.soap.streaming.*: hidden
com.sun.xml.internal.ws.encoding.xml.*: hidden
com.sun.xml.internal.ws.fault.*: hidden
com.sun.xml.internal.ws.handler.*: hidden
com.sun.xml.internal.ws.message.*: hidden
com.sun.xml.internal.ws.message.jaxb.*: hidden
com.sun.xml.internal.ws.message.saaj.*: hidden
com.sun.xml.internal.ws.message.source.*: hidden
com.sun.xml.internal.ws.message.stream.*: hidden
com.sun.xml.internal.ws.model.*: hidden
com.sun.xml.internal.ws.model.soap.*: hidden
com.sun.xml.internal.ws.model.wsdl.*: hidden
com.sun.xml.internal.ws.org.objectweb.asm.*: hidden
com.sun.xml.internal.ws.policy.*: hidden
com.sun.xml.internal.ws.policy.jaxws.*: hidden
com.sun.xml.internal.ws.policy.jaxws.spi.*: hidden
com.sun.xml.internal.ws.policy.privateutil.*: hidden
com.sun.xml.internal.ws.policy.sourcemodel.*: hidden
com.sun.xml.internal.ws.policy.sourcemodel.attach.*: hidden
com.sun.xml.internal.ws.policy.sourcemodel.wspolicy.*: hidden
com.sun.xml.internal.ws.policy.spi.*: hidden
com.sun.xml.internal.ws.policy.subject.*: hidden
com.sun.xml.internal.ws.protocol.soap.*: hidden
com.sun.xml.internal.ws.protocol.xml.*: hidden
com.sun.xml.internal.ws.resources.*: hidden
com.sun.xml.internal.ws.runtime.config.*: hidden
com.sun.xml.internal.ws.server.*: hidden
com.sun.xml.internal.ws.server.provider.*: hidden
com.sun.xml.internal.ws.server.sei.*: hidden
com.sun.xml.internal.ws.spi.*: hidden
com.sun.xml.internal.ws.spi.db.*: hidden
com.sun.xml.internal.ws.streaming.*: hidden
com.sun.xml.internal.ws.transport.*: hidden
com.sun.xml.internal.ws.transport.http.*: hidden
com.sun.xml.internal.ws.transport.http.client.*: hidden
com.sun.xml.internal.ws.transport.http.server.*: hidden
com.sun.xml.internal.ws.util.*: hidden
com.sun.xml.internal.ws.util.exception.*: hidden
com.sun.xml.internal.ws.util.pipe.*: hidden
com.sun.xml.internal.ws.util.xml.*: hidden
com.sun.xml.internal.ws.wsdl.*: hidden
com.sun.xml.internal.ws.wsdl.parser.*: hidden
com.sun.xml.internal.ws.wsdl.writer.*: hidden
com.sun.xml.internal.ws.wsdl.writer.document.*: hidden
com.sun.xml.internal.ws.wsdl.writer.document.http.*: hidden
com.sun.xml.internal.ws.wsdl.writer.document.soap.*: hidden
com.sun.xml.internal.ws.wsdl.writer.document.soap12.*: hidden
com.sun.xml.internal.ws.wsdl.writer.document.xsd.*: hidden
java.awt.dnd.peer.*: proprietary
java.awt.peer.*: proprietary
java.desktop.macosx.classes.com.apple.laf.resources.*: hidden
java.desktop.macosx.classes.sun.awt.resources.*: hidden
java.desktop.windows.classes.sun.awt.windows.*: hidden
java.io.*: compact1
java.lang.*: compact1
java.lang.annotation.*: compact1
java.lang.instrument.*: compact3
java.lang.invoke.*: compact1
java.lang.management.*: compact3
java.lang.ref.*: compact1
java.lang.reflect.*: compact1
java.math.*: compact1
java.net.*: compact1
java.nio.*: compact1
java.nio.channels.*: compact1
java.nio.channels.spi.*: compact1
java.nio.charset.*: compact1
java.nio.charset.spi.*: compact1
java.nio.file.*: compact1
java.nio.file.attribute.*: compact1
java.nio.file.spi.*: compact1
java.rmi.*: compact2
java.rmi.activation.*: compact2
java.rmi.dgc.*: compact2
java.rmi.registry.*: compact2
java.rmi.server.*: compact2
java.security.*: compact1
java.security.acl.*: compact3
java.security.cert.*: compact1
java.security.interfaces.*: compact1
java.security.spec.*: compact1
java.sql.*: compact2
java.text.*: compact1
java.text.spi.*: compact1
java.time.*: compact1
java.time.chrono.*: compact1
java.time.format.*: compact1
java.time.temporal.*: compact1
java.time.zone.*: compact1
java.util.*: compact1
java.util.concurrent.*: compact1
java.util.concurrent.atomic.*: compact1
java.util.concurrent.locks.*: compact1
java.util.function.*: compact1
java.util.jar.*: compact1
java.util.logging.*: compact1
java.util.prefs.*: compact3
java.util.regex.*: compact1
java.util.spi.*: compact1
java.util.stream.*: compact1
java.util.zip.*: compact1
javax.annotation.processing.*: compact3
javax.lang.model.*: compact3
javax.lang.model.element.*: compact3
javax.lang.model.type.*: compact3
javax.lang.model.util.*: compact3
javax.management.*: compact3
javax.management.loading.*: compact3
javax.management.modelmbean.*: compact3
javax.management.monitor.*: compact3
javax.management.openmbean.*: compact3
javax.management.relation.*: compact3
javax.management.remote.*: compact3
javax.management.remote.rmi.*: compact3
javax.management.timer.*: compact3
javax.naming.*: compact3
javax.naming.directory.*: compact3
javax.naming.event.*: compact3
javax.naming.ldap.*: compact3
javax.naming.spi.*: compact3
javax.net.*: compact1
javax.net.ssl.*: compact1
javax.rmi.ssl.*: compact2
javax.script.*: compact1
javax.security.auth.*: compact1
javax.security.auth.callback.*: compact1
javax.security.auth.kerberos.*: compact3
javax.security.auth.login.*: compact1
javax.security.auth.spi.*: compact1
javax.security.auth.x500.*: compact1
javax.security.cert.*: compact1
javax.security.sasl.*: compact3
javax.smartcardio.*: compact3
javax.sql.*: compact2
javax.sql.rowset.*: compact3
javax.sql.rowset.serial.*: compact3
javax.sql.rowset.spi.*: compact3
javax.tools.*: compact3
javax.transaction.xa.*: compact2
javax.xml.*: compact2
javax.xml.crypto.*: compact3
javax.xml.crypto.dom.*: compact3
javax.xml.crypto.dsig.*: compact3
javax.xml.crypto.dsig.dom.*: compact3
javax.xml.crypto.dsig.keyinfo.*: compact3
javax.xml.crypto.dsig.spec.*: compact3
javax.xml.datatype.*: compact2
javax.xml.namespace.*: compact2
javax.xml.parsers.*: compact2
javax.xml.stream.*: compact2
javax.xml.stream.events.*: compact2
javax.xml.stream.util.*: compact2
javax.xml.transform.*: compact2
javax.xml.transform.dom.*: compact2
javax.xml.transform.sax.*: compact2
javax.xml.transform.stax.*: compact2
javax.xml.transform.stream.*: compact2
javax.xml.validation.*: compact2
javax.xml.xpath.*: compact2
jdk.*: compact1
jdk.internal.org.objectweb.asm.*: hidden
jdk.internal.org.objectweb.asm.commons.*: hidden
jdk.internal.org.objectweb.asm.signature.*: hidden
jdk.internal.org.objectweb.asm.tree.*: hidden
jdk.internal.org.objectweb.asm.tree.analysis.*: hidden
jdk.internal.org.objectweb.asm.util.*: hidden
jdk.internal.org.xml.sax.*: hidden
jdk.internal.org.xml.sax.helpers.*: hidden
jdk.internal.util.xml.*: hidden
jdk.internal.util.xml.impl.*: hidden
jdk.net.*: compact1
org.ietf.jgss.*: compact3
org.jcp.xml.dsig.internal.*: hidden
org.jcp.xml.dsig.internal.dom.*: hidden
org.w3c.dom.*: compact2
org.w3c.dom.bootstrap.*: compact2
org.w3c.dom.css.*: compact2
org.w3c.dom.events.*: compact2
org.w3c.dom.html.*: compact2
org.w3c.dom.ls.*: compact2
org.w3c.dom.ranges.*: compact2
org.w3c.dom.stylesheets.*: compact2
org.w3c.dom.traversal.*: compact2
org.w3c.dom.views.*: compact2
org.w3c.dom.xpath.*: hidden
org.xml.sax.*: compact2
org.xml.sax.ext.*: compact2
org.xml.sax.helpers.*: compact2
sun.applet.*: proprietary
sun.applet.resources.*: proprietary
sun.awt.*: proprietary
sun.awt.X11.*: proprietary
sun.awt.datatransfer.*: proprietary
sun.awt.dnd.*: proprietary
sun.awt.event.*: hidden
sun.awt.geom.*: proprietary
sun.awt.im.*: proprietary
sun.awt.image.*: proprietary
sun.awt.motif.*: proprietary
sun.awt.resources.*: proprietary
sun.awt.shell.*: proprietary
sun.awt.util.*: hidden
sun.awt.windows.*: proprietary
sun.corba.*: proprietary
sun.datatransfer.*: hidden
sun.font.*: proprietary
sun.instrument.*: proprietary compact3
sun.invoke.*: hidden
sun.invoke.anon.*: hidden
sun.invoke.empty.*: hidden
sun.invoke.util.*: hidden
sun.io.*: proprietary compact1
sun.java2d.*: proprietary
sun.java2d.cmm.*: hidden
sun.java2d.cmm.lcms.*: hidden
sun.java2d.d3d.*: hidden
sun.java2d.jules.*: hidden
sun.java2d.loops.*: proprietary
sun.java2d.opengl.*: proprietary
sun.java2d.pipe.*: proprietary
sun.java2d.pipe.hw.*: hidden
sun.java2d.pisces.*: hidden
sun.java2d.windows.*: hidden
sun.java2d.x11.*: hidden
sun.java2d.xr.*: hidden
sun.launcher.*: hidden
sun.launcher.resources.*: hidden
sun.lwawt.*: hidden
sun.lwawt.macosx.*: hidden
sun.management.*: proprietary compact3
sun.management.counter.*: proprietary compact3
sun.management.counter.perf.*: proprietary compact3
sun.management.jdp.*: hidden
sun.management.jmxremote.*: proprietary compact3
sun.management.resources.*: proprietary compact3
sun.misc.*: proprietary compact1
sun.misc.resources.*: proprietary compact1
sun.net.*: proprietary compact1
sun.net.dns.*: proprietary compact3
sun.net.ftp.*: proprietary
sun.net.ftp.impl.*: hidden
sun.net.httpserver.*: hidden
sun.net.idn.*: hidden
sun.net.sdp.*: hidden
sun.net.smtp.*: proprietary
sun.net.spi.*: proprietary compact1
sun.net.spi.nameservice.*: proprietary compact1
sun.net.util.*: proprietary compact1
sun.net.www.*: proprietary compact1
sun.net.www.content.audio.*: proprietary
sun.net.www.content.image.*: proprietary
sun.net.www.content.text.*: proprietary
sun.net.www.http.*: proprietary compact1
sun.net.www.protocol.file.*: proprietary compact1
sun.net.www.protocol.ftp.*: proprietary
sun.net.www.protocol.http.*: proprietary compact1
sun.net.www.protocol.http.logging.*: hidden
sun.net.www.protocol.http.ntlm.*: hidden
sun.net.www.protocol.http.spnego.*: hidden
sun.net.www.protocol.https.*: proprietary compact1
sun.net.www.protocol.jar.*: proprietary compact1
sun.net.www.protocol.mailto.*: proprietary
sun.net.www.protocol.netdoc.*: proprietary
sun.nio.*: proprietary compact1
sun.nio.ch.*: proprietary compact1
sun.nio.ch.sctp.*: hidden
sun.nio.cs.*: proprietary compact1
sun.nio.fs.*: hidden
sun.print.*: proprietary
sun.print.resources.*: proprietary
sun.reflect.*: proprietary compact1
sun.reflect.annotation.*: proprietary compact1
sun.reflect.generics.factory.*: proprietary compact1
sun.reflect.generics.parser.*: proprietary compact1
sun.reflect.generics.reflectiveObjects.*: proprietary compact1
sun.reflect.generics.repository.*: proprietary compact1
sun.reflect.generics.scope.*: proprietary compact1
sun.reflect.generics.tree.*: proprietary compact1
sun.reflect.generics.visitor.*: proprietary compact1
sun.reflect.misc.*: hidden
sun.rmi.log.*: proprietary compact2
sun.rmi.registry.*: proprietary compact2
sun.rmi.runtime.*: proprietary compact2
sun.rmi.server.*: proprietary compact2
sun.rmi.transport.*: proprietary compact2
sun.rmi.transport.proxy.*: proprietary compact2
sun.rmi.transport.tcp.*: proprietary compact2
sun.security.acl.*: proprietary compact3
sun.security.action.*: proprietary compact1
sun.security.jca.*: proprietary compact1
sun.security.jgss.*: proprietary compact3
sun.security.jgss.krb5.*: proprietary compact3
sun.security.jgss.spi.*: proprietary compact3
sun.security.jgss.spnego.*: hidden
sun.security.jgss.wrapper.*: hidden
sun.security.krb5.*: proprietary compact3
sun.security.krb5.internal.*: proprietary compact3
sun.security.krb5.internal.ccache.*: proprietary compact3
sun.security.krb5.internal.crypto.*: proprietary compact3
sun.security.krb5.internal.crypto.dk.*: proprietary compact3
sun.security.krb5.internal.ktab.*: proprietary compact3
sun.security.krb5.internal.rcache.*: proprietary compact3
sun.security.krb5.internal.tools.*: proprietary compact3
sun.security.krb5.internal.util.*: proprietary compact3
sun.security.pkcs.*: proprietary compact1
sun.security.pkcs10.*: hidden
sun.security.pkcs12.*: hidden
sun.security.provider.*: proprietary compact1
sun.security.provider.certpath.*: proprietary compact1
sun.security.provider.certpath.ldap.*: hidden
sun.security.provider.certpath.ssl.*: hidden
sun.security.rsa.*: proprietary compact1
sun.security.smartcardio.*: hidden
sun.security.timestamp.*: proprietary compact1
sun.security.tools.*: proprietary compact1
sun.security.tools.keytool.*: hidden
sun.security.tools.policytool.*: hidden
sun.security.util.*: proprietary compact1
sun.security.validator.*: proprietary compact1
sun.security.x509.*: proprietary compact1
sun.swing.*: proprietary
sun.swing.icon.*: hidden
sun.swing.plaf.*: hidden
sun.swing.plaf.synth.*: proprietary
sun.swing.plaf.windows.*: hidden
sun.swing.table.*: hidden
sun.swing.text.*: hidden
sun.swing.text.html.*: hidden
sun.text.*: proprietary compact1
sun.text.bidi.*: hidden
sun.text.normalizer.*: hidden
sun.text.resources.*: proprietary compact1
sun.text.resources.en.*: hidden
sun.tools.jar.*: proprietary
sun.tools.jar.resources.*: proprietary
sun.tracing.*: hidden
sun.tracing.dtrace.*: hidden
sun.util.*: proprietary compact1
sun.util.calendar.*: proprietary compact1
sun.util.cldr.*: hidden
sun.util.locale.*: proprietary compact1
sun.util.locale.provider.*: hidden
sun.util.logging.*: hidden
sun.util.logging.resources.*: proprietary compact1
sun.util.resources.*: hidden
sun.util.resources.en.*: hidden
sun.util.spi.*: hidden

View file

@ -41,6 +41,7 @@ import java.nio.charset.CoderResult;
import java.nio.charset.CodingErrorAction; import java.nio.charset.CodingErrorAction;
import java.nio.charset.IllegalCharsetNameException; import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException; import java.nio.charset.UnsupportedCharsetException;
import java.nio.file.Path;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
@ -414,6 +415,10 @@ public abstract class BaseFileManager implements JavaFileManager {
} }
// </editor-fold> // </editor-fold>
public static Kind getKind(Path path) {
return getKind(path.getFileName().toString());
}
public static Kind getKind(String name) { public static Kind getKind(String name) {
if (name.endsWith(Kind.CLASS.extension)) if (name.endsWith(Kind.CLASS.extension))
return Kind.CLASS; return Kind.CLASS;

View file

@ -681,6 +681,7 @@ public class JavapTask implements DisassemblerTool.DisassemblerTask, Messages {
final URI uri = new URI(className); final URI uri = new URI(className);
final URL url = uri.toURL(); final URL url = uri.toURL();
final URLConnection conn = url.openConnection(); final URLConnection conn = url.openConnection();
conn.setUseCaches(false);
return new JavaFileObject() { return new JavaFileObject() {
@DefinedBy(Api.COMPILER) @DefinedBy(Api.COMPILER)
public Kind getKind() { public Kind getKind() {
@ -709,7 +710,7 @@ public class JavapTask implements DisassemblerTool.DisassemblerTask, Messages {
@DefinedBy(Api.COMPILER) @DefinedBy(Api.COMPILER)
public String getName() { public String getName() {
return url.toString(); return uri.toString();
} }
@DefinedBy(Api.COMPILER) @DefinedBy(Api.COMPILER)

View file

@ -56,6 +56,7 @@ import com.sun.tools.javac.util.ListBuffer;
* This code and its internal interfaces are subject to change or * This code and its internal interfaces are subject to change or
* deletion without notice.</b> * deletion without notice.</b>
*/ */
@com.sun.tools.javac.api.ClientCodeWrapper.Trusted
public class SmartFileManager extends ForwardingJavaFileManager<JavaFileManager> { public class SmartFileManager extends ForwardingJavaFileManager<JavaFileManager> {
// Set of sources that can be seen by javac. // Set of sources that can be seen by javac.

View file

@ -28,6 +28,7 @@ import com.sun.tools.classfile.ClassFile;
import com.sun.tools.classfile.Dependency.Location; import com.sun.tools.classfile.Dependency.Location;
import java.io.IOException; import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
@ -38,8 +39,12 @@ import java.util.concurrent.ConcurrentHashMap;
* Represents the source of the class files. * Represents the source of the class files.
*/ */
public class Archive { public class Archive {
public static Archive getInstance(Path p) throws IOException { public static Archive getInstance(Path p) {
try {
return new Archive(p, ClassFileReader.newInstance(p)); return new Archive(p, ClassFileReader.newInstance(p));
} catch (IOException e) {
throw new UncheckedIOException(e);
}
} }
private final Path path; private final Path path;

View file

@ -27,7 +27,12 @@ package com.sun.tools.jdeps;
import com.sun.tools.classfile.ClassFile; import com.sun.tools.classfile.ClassFile;
import com.sun.tools.classfile.ConstantPoolException; import com.sun.tools.classfile.ConstantPoolException;
import com.sun.tools.classfile.Dependencies.ClassFileError; import com.sun.tools.classfile.Dependencies.ClassFileError;
import java.io.*; import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult; import java.nio.file.FileVisitResult;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@ -36,6 +41,8 @@ import java.nio.file.attribute.BasicFileAttributes;
import java.util.*; import java.util.*;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/** /**
* ClassFileReader reads ClassFile(s) of a given path that can be * ClassFileReader reads ClassFile(s) of a given path that can be
@ -159,14 +166,19 @@ public class ClassFileReader {
} }
private static class DirectoryReader extends ClassFileReader { private static class DirectoryReader extends ClassFileReader {
protected final String fsSep;
DirectoryReader(Path path) throws IOException { DirectoryReader(Path path) throws IOException {
this(FileSystems.getDefault(), path);
}
DirectoryReader(FileSystem fs, Path path) throws IOException {
super(path); super(path);
this.fsSep = fs.getSeparator();
} }
public ClassFile getClassFile(String name) throws IOException { public ClassFile getClassFile(String name) throws IOException {
if (name.indexOf('.') > 0) { if (name.indexOf('.') > 0) {
int i = name.lastIndexOf('.'); int i = name.lastIndexOf('.');
String pathname = name.replace('.', File.separatorChar) + ".class"; String pathname = name.replace(".", fsSep) + ".class";
Path p = path.resolve(pathname); Path p = path.resolve(pathname);
if (!Files.exists(p)) { if (!Files.exists(p)) {
p = path.resolve(pathname.substring(0, i) + "$" + p = path.resolve(pathname.substring(0, i) + "$" +
@ -193,25 +205,28 @@ public class ClassFileReader {
}; };
} }
private List<Path> walkTree(Path dir) throws IOException { private List<Path> entries;
final List<Path> files = new ArrayList<>(); protected synchronized List<Path> walkTree() throws IOException {
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() { if (entries == null) {
entries = new ArrayList<>();
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException { throws IOException {
if (file.getFileName().toString().endsWith(".class")) { if (file.getFileName().toString().endsWith(".class")) {
files.add(file); entries.add(file);
} }
return FileVisitResult.CONTINUE; return FileVisitResult.CONTINUE;
} }
}); });
return files; }
return entries;
} }
class DirectoryIterator implements Iterator<ClassFile> { class DirectoryIterator implements Iterator<ClassFile> {
private List<Path> entries; private List<Path> entries;
private int index = 0; private int index = 0;
DirectoryIterator() throws IOException { DirectoryIterator() throws IOException {
entries = walkTree(path); entries = walkTree();
index = 0; index = 0;
} }
@ -355,4 +370,29 @@ public class ClassFileReader {
throw new UnsupportedOperationException("Not supported yet."); throw new UnsupportedOperationException("Not supported yet.");
} }
} }
/**
* ClassFileReader for modules.
*/
static class ModuleClassReader extends DirectoryReader {
final String modulename;
ModuleClassReader(FileSystem fs, String mn, Path root) throws IOException {
super(fs, root);
this.modulename = mn;
}
public Set<String> packages() throws IOException {
return walkTree().stream()
.map(this::toPackageName)
.sorted()
.collect(Collectors.toSet());
}
String toPackageName(Path p) {
if (p.getParent() == null) {
return "";
}
return path.relativize(p.getParent()).toString().replace(fsSep, ".");
}
}
} }

View file

@ -551,10 +551,11 @@ class JdepsTask {
if (options.includePattern != null) { if (options.includePattern != null) {
initialArchives.addAll(classpaths); initialArchives.addAll(classpaths);
} }
classpaths.addAll(PlatformClassPath.getArchives(options.mpath)); classpaths.addAll(PlatformClassPath.getModules(options.mpath));
if (options.mpath != null) { if (options.mpath != null) {
initialArchives.addAll(PlatformClassPath.getArchives(options.mpath)); initialArchives.addAll(PlatformClassPath.getModules(options.mpath));
} }
classpaths.addAll(PlatformClassPath.getJarFiles());
// add all classpath archives to the source locations for reporting // add all classpath archives to the source locations for reporting
sourceLocations.addAll(classpaths); sourceLocations.addAll(classpaths);
} }

View file

@ -173,8 +173,8 @@ final class Module extends Archive {
return this; return this;
} }
public Builder include(String p) { public Builder packages(Set<String> pkgs) {
packages.add(p); packages.addAll(pkgs);
return this; return this;
} }
@ -184,10 +184,11 @@ final class Module extends Archive {
exports.put(p, new HashSet<>(ms)); exports.put(p, new HashSet<>(ms));
return this; return this;
} }
public Builder classes(ClassFileReader reader) { public Builder classes(ClassFileReader.ModuleClassReader reader) {
this.reader = reader; this.reader = reader;
return this; return this;
} }
public Module build() { public Module build() {
Module m = new Module(reader, name, requires, exports, packages); Module m = new Module(reader, name, requires, exports, packages);
return m; return m;

View file

@ -24,15 +24,9 @@
*/ */
package com.sun.tools.jdeps; package com.sun.tools.jdeps;
import com.sun.tools.classfile.ClassFile;
import com.sun.tools.jdeps.PlatformClassPath.LegacyImageHelper;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import javax.xml.namespace.QName; import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLEventReader;
@ -40,73 +34,15 @@ import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute; import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.XMLEvent; import javax.xml.stream.events.XMLEvent;
import com.sun.tools.jdeps.ClassFileReader.ModuleClassReader;
import com.sun.tools.jdeps.PlatformClassPath.ImageHelper;
abstract class ModulesXmlReader { final class ModulesXmlReader {
abstract ClassFileReader getClassFileReader(String modulename, Set<String> packages) public static Set<Module> load(ImageHelper helper,InputStream in)
throws IOException;
static class ImageReader extends ModulesXmlReader {
final LegacyImageHelper helper;
ImageReader(LegacyImageHelper helper) {
this.helper = helper;
}
ClassFileReader getClassFileReader(String modulename, Set<String> packages)
throws IOException
{
return helper.getClassReader(modulename, packages);
}
}
static class ModulePathReader extends ModulesXmlReader {
final Path mpath;
final ClassFileReader defaultReader;
ModulePathReader(Path mp) throws IOException {
this.mpath = mp;
this.defaultReader = new NonExistModuleReader(mpath);
}
ClassFileReader getClassFileReader(String modulename, Set<String> packages)
throws IOException
{
Path mdir = mpath.resolve(modulename);
if (Files.exists(mdir) && Files.isDirectory(mdir)) {
return ClassFileReader.newInstance(mdir);
} else {
// aggregator module or os-specific module in jdeps-modules.xml
// mdir not exist
return defaultReader;
}
}
class NonExistModuleReader extends ClassFileReader {
private final List<ClassFile> classes = Collections.emptyList();
private NonExistModuleReader(Path mpath) {
super(mpath);
}
public ClassFile getClassFile(String name) throws IOException {
return null;
}
public Iterable<ClassFile> getClassFiles() throws IOException {
return classes;
}
}
}
public static Set<Module> load(Path mpath, InputStream in)
throws IOException throws IOException
{ {
try { try {
ModulePathReader reader = new ModulePathReader(mpath); ModulesXmlReader reader = new ModulesXmlReader(helper);
return reader.load(in);
} catch (XMLStreamException e) {
throw new RuntimeException(e);
}
}
public static Set<Module> loadFromImage(LegacyImageHelper helper, InputStream in)
throws IOException
{
try {
ImageReader reader = new ImageReader(helper);
return reader.load(in); return reader.load(in);
} catch (XMLStreamException e) { } catch (XMLStreamException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
@ -119,8 +55,12 @@ abstract class ModulesXmlReader {
private static final String DEPEND = "depend"; private static final String DEPEND = "depend";
private static final String EXPORT = "export"; private static final String EXPORT = "export";
private static final String TO = "to"; private static final String TO = "to";
private static final String INCLUDE = "include";
private static final QName REEXPORTS = new QName("re-exports"); private static final QName REEXPORTS = new QName("re-exports");
private final ImageHelper helper;
ModulesXmlReader(ImageHelper helper) {
this.helper = helper;
}
public Set<Module> load(InputStream in) throws XMLStreamException, IOException { public Set<Module> load(InputStream in) throws XMLStreamException, IOException {
Set<Module> modules = new HashSet<>(); Set<Module> modules = new HashSet<>();
if (in == null) { if (in == null) {
@ -162,9 +102,6 @@ abstract class ModulesXmlReader {
} }
mb.require(getData(reader), reexports); mb.require(getData(reader), reexports);
break; break;
case INCLUDE:
mb.include(getData(reader));
break;
case EXPORT: case EXPORT:
exportedPackage = getNextTag(reader, NAME); exportedPackage = getNextTag(reader, NAME);
break; break;
@ -178,8 +115,9 @@ abstract class ModulesXmlReader {
String endTag = event.asEndElement().getName().getLocalPart(); String endTag = event.asEndElement().getName().getLocalPart();
switch (endTag) { switch (endTag) {
case MODULE: case MODULE:
ClassFileReader cfr = getClassFileReader(modulename, mb.packages); ModuleClassReader cfr = helper.getModuleClassReader(modulename);
mb.classes(cfr); mb.classes(cfr);
mb.packages(cfr.packages());
modules.add(mb.build()); modules.add(mb.build());
mb = null; mb = null;
break; break;

View file

@ -24,39 +24,48 @@
*/ */
package com.sun.tools.jdeps; package com.sun.tools.jdeps;
import com.sun.tools.classfile.Annotation;
import com.sun.tools.classfile.ClassFile; import com.sun.tools.classfile.ClassFile;
import com.sun.tools.classfile.ConstantPool; import com.sun.tools.jdeps.ClassFileReader.ModuleClassReader;
import com.sun.tools.classfile.ConstantPoolException;
import com.sun.tools.classfile.RuntimeAnnotations_attribute;
import com.sun.tools.classfile.Dependencies.ClassFileError;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.nio.file.FileVisitResult; import java.net.URI;
import java.nio.file.Files; import java.nio.file.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.util.*; import java.util.*;
import java.util.jar.*; import java.util.stream.Collectors;
import static com.sun.tools.classfile.Attribute.*;
import static com.sun.tools.jdeps.ClassFileReader.*;
/** /**
* ClassPath for Java SE and JDK * ClassPath for Java SE and JDK
*/ */
class PlatformClassPath { class PlatformClassPath {
private static List<Archive> modules; private static List<Archive> modules;
static synchronized List<Archive> getArchives(Path mpath) throws IOException { static synchronized List<Archive> getModules(Path mpath) throws IOException {
if (modules == null) { if (modules == null) {
initPlatformArchives(mpath); initPlatformModules(mpath);
} }
return modules; return modules;
} }
private static void initPlatformModules(Path mpath) throws IOException {
ImageHelper helper = ImageHelper.getInstance(mpath);
String fn = System.getProperty("jdeps.modules.xml");
if (fn != null) {
Path p = Paths.get(fn);
try (InputStream in = new BufferedInputStream(Files.newInputStream(p))) {
modules = new ArrayList<>(ModulesXmlReader.load(helper, in));
}
} else {
try (InputStream in = PlatformClassPath.class
.getResourceAsStream("resources/jdeps-modules.xml")) {
modules = new ArrayList<>(ModulesXmlReader.load(helper, in));
}
}
if (findModule("java.base") != null) {
Profile.initProfiles(modules);
}
}
/** /**
* Finds the module with the given name. Returns null * Finds the module with the given name. Returns null
* if such module doesn't exist. * if such module doesn't exist.
@ -75,237 +84,86 @@ class PlatformClassPath {
return null; return null;
} }
private static List<Archive> initPlatformArchives(Path mpath) throws IOException { /**
* Returns JAR files in $java.home/lib. This is for transition until
* all components are linked into jimage.
*/
static List<Archive> getJarFiles() throws IOException {
Path home = Paths.get(System.getProperty("java.home"), "lib");
return Files.find(home, 1, (Path p, BasicFileAttributes attr)
-> p.getFileName().toString().endsWith(".jar"))
.map(Archive::getInstance)
.collect(Collectors.toList());
}
static class ImageHelper {
static ImageHelper getInstance(Path mpath) throws IOException {
if (mpath != null) {
return new ImageHelper(mpath);
}
Path home = Paths.get(System.getProperty("java.home")); Path home = Paths.get(System.getProperty("java.home"));
if (mpath == null && !home.endsWith("jre")) { Path mlib = home.resolve("lib").resolve("modules");
// jdk build if (Files.isDirectory(mlib)) {
Path p = home.resolve("modules"); // jimage
if (Files.isDirectory(p)) { FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
mpath = p; return new ImageHelper(fs, fs.getPath("/"));
}
}
modules = mpath != null ? initModules(mpath) : initLegacyImage(home);
if (findModule("java.base") != null) {
Profile.initProfiles();
}
return modules;
}
private static List<Archive> initModules(Path mpath) throws IOException {
String fn = System.getProperty("jdeps.modules.xml");
if (fn!= null) {
Path p = Paths.get(fn);
try (InputStream in = new BufferedInputStream(Files.newInputStream(p))) {
return new ArrayList<Archive>(ModulesXmlReader.load(mpath, in));
}
} else { } else {
try (InputStream in = PlatformClassPath.class // exploded modules
.getResourceAsStream("resources/jdeps-modules.xml")) { mlib = home.resolve("modules");
return new ArrayList<Archive>(ModulesXmlReader.load(mpath, in)); if (!Files.isDirectory(mlib)) {
throw new InternalError(home + " not a modular image");
} }
return new ImageHelper(mlib);
} }
} }
private static List<Archive> initLegacyImage(Path home) throws IOException { private final FileSystem fs;
LegacyImageHelper cfr = new LegacyImageHelper(home); private final Path mpath;
List<Archive> archives = new ArrayList<>(cfr.nonPlatformArchives);
try (InputStream in = PlatformClassPath.class
.getResourceAsStream("resources/jdeps-modules.xml")) {
archives.addAll(ModulesXmlReader.loadFromImage(cfr, in));
return archives;
}
}
static class LegacyImageHelper {
private static final List<String> NON_PLATFORM_JARFILES =
Arrays.asList("alt-rt.jar", "jfxrt.jar", "ant-javafx.jar", "javafx-mx.jar");
final List<Archive> nonPlatformArchives = new ArrayList<>();
final List<JarFile> jarfiles = new ArrayList<>();
final Path home;
LegacyImageHelper(Path home) { ImageHelper(Path path) throws IOException {
this.home = home; this(FileSystems.getDefault(), path);
try {
if (home.endsWith("jre")) {
// jar files in <javahome>/jre/lib
addJarFiles(home.resolve("lib"));
if (home.getParent() != null) {
// add tools.jar and other JDK jar files
Path lib = home.getParent().resolve("lib");
if (Files.exists(lib)) {
addJarFiles(lib);
}
}
} else if (Files.exists(home.resolve("lib"))) {
// add other JAR files
addJarFiles(home.resolve("lib"));
} else {
throw new RuntimeException("\"" + home + "\" not a JDK home");
}
} catch (IOException e) {
throw new Error(e);
} }
ImageHelper(FileSystem fs, Path path) throws IOException {
this.fs = fs;
this.mpath = path;
} }
/** /**
* Returns a ClassFileReader that only reads classes for the given modulename. * Returns a ModuleClassReader that only reads classes for the given modulename.
*/ */
ClassFileReader getClassReader(String modulename, Set<String> packages) throws IOException { public ModuleClassReader getModuleClassReader(String modulename)
return new ModuleClassReader(modulename, packages);
}
private void addJarFiles(final Path root) throws IOException {
final Path ext = root.resolve("ext");
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException throws IOException
{ {
if (dir.equals(root) || dir.equals(ext)) { Path mp = mpath.resolve(modulename);
return FileVisitResult.CONTINUE; if (Files.exists(mp) && Files.isDirectory(mp)) {
return new ModuleClassReader(fs, modulename, mp);
} else { } else {
// skip other cobundled JAR files // aggregator module or os-specific module in jdeps-modules.xml
return FileVisitResult.SKIP_SUBTREE; // mdir not exist
return new NonExistModuleReader(fs, modulename, mp);
} }
} }
@Override static class NonExistModuleReader extends ModuleClassReader {
public FileVisitResult visitFile(Path p, BasicFileAttributes attrs) private final List<ClassFile> classes = Collections.emptyList();
private NonExistModuleReader(FileSystem fs, String mn, Path mpath)
throws IOException throws IOException
{ {
String fn = p.getFileName().toString(); super(fs, mn, mpath);
if (fn.endsWith(".jar")) {
// JDK may cobundle with JavaFX that doesn't belong to any profile
// Treat jfxrt.jar as regular Archive
if (NON_PLATFORM_JARFILES.contains(fn)) {
nonPlatformArchives.add(Archive.getInstance(p));
} else {
jarfiles.add(new JarFile(p.toFile()));
}
}
return FileVisitResult.CONTINUE;
}
});
} }
/**
* ModuleClassFile reads classes for the specified module from the legacy image.
*
*/
class ModuleClassReader extends JarFileReader {
private JarFile cachedJarFile = getJarFile(0);
private final Set<String> packages;
private final String module;
ModuleClassReader(String module, Set<String> packages) throws IOException {
super(home, null);
this.module = module;
this.packages = packages;
}
private boolean includes(String name) {
String cn = name.replace('/', '.');
int i = cn.lastIndexOf('.');
String pn = i > 0 ? cn.substring(0, i) : "";
return packages.contains(pn);
}
private JarEntry findJarEntry(JarFile jarfile, String entryName1, String entryName2) {
JarEntry e = jarfile.getJarEntry(entryName1);
if (e == null) {
e = jarfile.getJarEntry(entryName2);
}
return e;
}
public String toString() {
return module + " " + packages.size() + " " + packages;
}
@Override
public ClassFile getClassFile(String name) throws IOException { public ClassFile getClassFile(String name) throws IOException {
if (jarfiles.isEmpty() || !includes(name)) {
return null; return null;
} }
if (name.indexOf('.') > 0) {
int i = name.lastIndexOf('.');
String entryName = name.replace('.', '/') + ".class";
String innerClassName = entryName.substring(0, i) + "$"
+ entryName.substring(i + 1, entryName.length());
JarEntry e = findJarEntry(cachedJarFile, entryName, innerClassName);
if (e != null) {
return readClassFile(cachedJarFile, e);
}
for (JarFile jf : jarfiles) {
if (jf == cachedJarFile) {
continue;
}
System.err.format("find jar entry %s at %s%n", entryName, jf);
e = findJarEntry(jf, entryName, innerClassName);
if (e != null) {
cachedJarFile = jf;
return readClassFile(jf, e);
}
}
} else {
String entryName = name + ".class";
JarEntry e = cachedJarFile.getJarEntry(entryName);
if (e != null) {
return readClassFile(cachedJarFile, e);
}
for (JarFile jf : jarfiles) {
if (jf == cachedJarFile) {
continue;
}
e = jf.getJarEntry(entryName);
if (e != null) {
cachedJarFile = jf;
return readClassFile(jf, e);
}
}
}
return null;
}
@Override
public Iterable<ClassFile> getClassFiles() throws IOException { public Iterable<ClassFile> getClassFiles() throws IOException {
final Iterator<ClassFile> iter = new ModuleClassIterator(this); return classes;
return new Iterable<ClassFile>() {
public Iterator<ClassFile> iterator() {
return iter;
}
};
} }
private JarFile getJarFile(int index) { public Set<String> packages() {
return index < jarfiles.size() ? jarfiles.get(index) : null; return Collections.emptySet();
}
class ModuleClassIterator extends JarFileIterator {
private int index;
ModuleClassIterator(ModuleClassReader reader) {
super(reader);
this.index = 0;
this.jf = getJarFile(0);
this.entries = jf != null ? jf.entries() : null;
this.nextEntry = nextEntry();
}
@Override
protected JarEntry nextEntry() {
while (jf != null) {
while (entries.hasMoreElements()) {
JarEntry e = entries.nextElement();
String name = e.getName();
if (name.endsWith(".class") && includes(name)) {
return e;
}
}
jf = getJarFile(++index);
entries = jf != null ? jf.entries() : null;
}
return null;
}
} }
} }
} }

View file

@ -28,23 +28,28 @@ import java.io.IOException;
import java.util.*; import java.util.*;
/** /**
* Build the profile information from ct.sym if exists. * Build the profile information.
*/ */
enum Profile { enum Profile {
COMPACT1("compact1", 1, "java.compact1"), COMPACT1("compact1", 1, "java.compact1"),
COMPACT2("compact2", 2, "java.compact2"), COMPACT2("compact2", 2, "java.compact2"),
COMPACT3("compact3", 3, "java.compact3"), COMPACT3("compact3", 3, "java.compact3", "java.smartcardio", "jdk.sctp",
FULL_JRE("Full JRE", 4, "java.se"); "jdk.httpserver", "jdk.security.auth",
"jdk.naming.dns", "jdk.naming.rmi"),
FULL_JRE("Full JRE", 4, "java.se", "jdk.deploy.osx", "jdk.charsets",
"jdk.crypto.ec", "jdk.crypto.pkcs11",
"jdk.crypto.mscapi", "jdk.crypto.ucrypto", "jdk.jvmstat",
"jdk.localedata", "jdk.scripting.nashorn", "jdk.zipfs");
final String name; final String name;
final int profile; final int profile;
final String moduleName; final String[] mnames;
final Set<Module> modules = new HashSet<>(); final Set<Module> modules = new HashSet<>();
Profile(String name, int profile, String moduleName) { Profile(String name, int profile, String... mnames) {
this.name = name; this.name = name;
this.profile = profile; this.profile = profile;
this.moduleName = moduleName; this.mnames = mnames;
} }
public String profileName() { public String profileName() {
@ -53,7 +58,7 @@ enum Profile {
@Override @Override
public String toString() { public String toString() {
return moduleName; return mnames[0];
} }
public static int getProfileCount() { public static int getProfileCount() {
@ -86,27 +91,37 @@ enum Profile {
return null; return null;
} }
final static Set<Module> JDK = new HashSet<>(); private final static Set<Module> JDK = new HashSet<>();
static void initProfiles() { static void initProfiles(List<Archive> modules) {
// add all modules into JDK
modules.forEach(m -> JDK.add((Module)m));
for (Profile p : Profile.values()) { for (Profile p : Profile.values()) {
Module m = PlatformClassPath.findModule(p.moduleName); for (String mn : p.mnames) {
if (m == null) // this includes platform-dependent module that may not exist
throw new Error(p.moduleName + " doesn't exist"); Module m = PlatformClassPath.findModule(mn);
p.modules.add(m); if (m != null) {
JDK.add(m); p.addModule(m);
}
}
}
}
private void addModule(Module m) {
modules.add(m);
for (String n : m.requires().keySet()) { for (String n : m.requires().keySet()) {
Module d = PlatformClassPath.findModule(n); Module d = PlatformClassPath.findModule(n);
if (d == null) if (d == null) {
throw new Error(n + " doesn't exist"); throw new InternalError("module " + n + " required by " +
p.modules.add(d); m.name() + " doesn't exist");
JDK.add(d);
} }
modules.add(d);
} }
} }
// for debugging // for debugging
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
// find platform modules // find platform modules
PlatformClassPath.getArchives(null); PlatformClassPath.getModules(null);
if (Profile.getProfileCount() == 0) { if (Profile.getProfileCount() == 0) {
System.err.println("No profile is present in this JDK"); System.err.println("No profile is present in this JDK");
} }

View file

@ -46,8 +46,6 @@ public class TestCompletionFailure extends JavadocTester {
checkExit(Exit.OK); checkExit(Exit.OK);
checkOutput(Output.STDERR, false, checkOutput(Output.STDERR, false,
"TestCompletionFailure: error - " "sun.util.locale.provider.LocaleProviderAdapter");
+ "com.sun.tools.javac.code.Symbol$CompletionFailure: class file for "
+ "sun.util.locale.provider.LocaleProviderAdapter not found");
} }
} }

View file

@ -1,94 +0,0 @@
/*
* Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 4908512 5024825 4957203 4993280 4996963 6174696 6177059 7041249
* @summary Make sure apt is removed and doesn't come back
* @library /tools/lib
* @build ToolBox
* @run main CheckAptIsRemovedTest
*/
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
// Original test: test/tools/apt/Basics/apt.sh
public class CheckAptIsRemovedTest {
//I think this class can be let with the imports only and that should be enough for as test's purpose
private static final String NullAPFSrc =
"import com.sun.mirror.apt.*;\n" +
"import com.sun.mirror.declaration.*;\n" +
"import com.sun.mirror.type.*;\n" +
"import com.sun.mirror.util.*;\n" +
"import java.util.Collection;\n" +
"import java.util.Set;\n\n" +
"public class NullAPF implements AnnotationProcessorFactory {\n" +
" static class NullAP implements AnnotationProcessor {\n" +
" NullAP(AnnotationProcessorEnvironment ape) {}\n" +
" public void process() {return;}\n" +
" }\n\n" +
" static Collection<String> supportedTypes;\n\n" +
" static {\n" +
" String types[] = {\"*\"};\n" +
" supportedTypes = java.util.Arrays.asList(types);\n" +
" }\n\n" +
" public Collection<String> supportedOptions() {\n" +
" return java.util.Collections.emptySet();\n" +
" }\n\n" +
" public Collection<String> supportedAnnotationTypes() {\n" +
" return supportedTypes;\n" +
" }\n\n" +
" public AnnotationProcessor getProcessorFor(" +
" Set<AnnotationTypeDeclaration> atds,\n" +
" AnnotationProcessorEnvironment env) {\n" +
" return new NullAP(env);\n" +
" }\n" +
"}";
public static void main(String[] args) throws Exception {
String testJDK = System.getProperty("test.jdk");
Path aptLin = Paths.get(testJDK, "bin", "apt");
Path aptWin = Paths.get(testJDK, "bin", "apt.exe");
if (Files.exists(aptLin) || Files.exists(aptWin)) {
throw new AssertionError("apt executable should not exist");
}
Path classpath = Paths.get(testJDK, "lib", "tools.jar");
ToolBox tb = new ToolBox();
tb.new JavacTask()
.classpath(classpath.toString()) // TODO: add overload
.sourcepath(".")
.sources(NullAPFSrc)
.run(ToolBox.Expect.FAIL)
.writeAll();
}
}

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,8 +25,13 @@
* @test * @test
* @bug 8006263 * @bug 8006263
* @summary Supplementary test cases needed for doclint * @summary Supplementary test cases needed for doclint
* @library /tools/lib
* @build ToolBox
* @run main PathsTest
*/ */
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.doclint.DocLint; import com.sun.tools.doclint.DocLint;
import com.sun.tools.doclint.DocLint.BadArgs; import com.sun.tools.doclint.DocLint.BadArgs;
import java.io.File; import java.io.File;
@ -35,6 +40,8 @@ import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.tools.StandardLocation;
import javax.tools.JavaFileManager;
public class PathsTest { public class PathsTest {
public static void main(String... args) throws Exception { public static void main(String... args) throws Exception {
@ -56,9 +63,11 @@ public class PathsTest {
test("src/Test.java", "-sourcepath", "src1" + PS + "src2"); test("src/Test.java", "-sourcepath", "src1" + PS + "src2");
test("src/Test.java", "-classpath", "classes1" + PS + "classes2"); test("src/Test.java", "-classpath", "classes1" + PS + "classes2");
File testJar = createJar();
String sysBootClassPath = System.getProperty("sun.boot.class.path"); String sysBootClassPath = System.getProperty("sun.boot.class.path");
test("src/Test.java", "-bootclasspath", test("src/Test.java", "-bootclasspath",
sysBootClassPath + PS + "classes1" + PS + "classes2"); testJar + PS + "classes1" + PS + "classes2");
if (errors > 0) if (errors > 0)
throw new Exception(errors + " errors found"); throw new Exception(errors + " errors found");
@ -87,6 +96,17 @@ public class PathsTest {
} }
} }
File createJar() throws IOException {
File f = new File("test.jar");
try (JavaFileManager fm = new JavacFileManager(new Context(), false, null)) {
ToolBox tb = new ToolBox();
tb.new JarTask(f.getPath())
.files(fm, StandardLocation.PLATFORM_CLASS_PATH, "java.lang.*")
.run();
}
return f;
}
void compile(String... args) { void compile(String... args) {
for (int i = 0; i < args.length; i++) { for (int i = 0; i < args.length; i++) {
if (args[i].equals("-d")) { if (args[i].equals("-d")) {

View file

@ -49,8 +49,6 @@ import static javax.tools.StandardLocation.*;
* the impl of inferBinaryName for that file object. * the impl of inferBinaryName for that file object.
*/ */
public class TestInferBinaryName { public class TestInferBinaryName {
static final boolean IGNORE_SYMBOL_FILE = false;
static final boolean USE_SYMBOL_FILE = true;
static final boolean DONT_USE_ZIP_FILE_INDEX = false; static final boolean DONT_USE_ZIP_FILE_INDEX = false;
static final boolean USE_ZIP_FILE_INDEX = true; static final boolean USE_ZIP_FILE_INDEX = true;
@ -59,15 +57,14 @@ public class TestInferBinaryName {
} }
void run() throws Exception { void run() throws Exception {
//System.err.println(System.getProperties());
testDirectory(); testDirectory();
testSymbolArchive();
File testJar = createJar(); File testJar = createJar();
testZipArchive(testJar); testZipArchive(testJar);
testZipFileIndexArchive(testJar); testZipFileIndexArchive(testJar);
testZipFileIndexArchive2(testJar); testZipFileIndexArchive2(testJar);
if (errors > 0) if (errors > 0)
throw new Exception(errors + " error found"); throw new Exception(errors + " error found");
} }
@ -87,27 +84,17 @@ public class TestInferBinaryName {
String testClassName = "p.A"; String testClassName = "p.A";
List<File> testClasses = Arrays.asList(new File(System.getProperty("test.classes"))); List<File> testClasses = Arrays.asList(new File(System.getProperty("test.classes")));
try (JavaFileManager fm = try (JavaFileManager fm =
getFileManager(testClasses, USE_SYMBOL_FILE, USE_ZIP_FILE_INDEX)) { getFileManager(testClasses, USE_ZIP_FILE_INDEX)) {
test("testDirectory", test("testDirectory",
fm, testClassName, "com.sun.tools.javac.file.RegularFileObject"); fm, testClassName, "com.sun.tools.javac.file.RegularFileObject");
} }
} }
void testSymbolArchive() throws IOException {
String testClassName = "java.lang.String";
List<File> path = getPath(System.getProperty("sun.boot.class.path"));
try (JavaFileManager fm =
getFileManager(path, USE_SYMBOL_FILE, DONT_USE_ZIP_FILE_INDEX)) {
test("testSymbolArchive",
fm, testClassName, "com.sun.tools.javac.file.SymbolArchive$SymbolFileObject");
}
}
void testZipArchive(File testJar) throws IOException { void testZipArchive(File testJar) throws IOException {
String testClassName = "java.lang.String"; String testClassName = "java.lang.String";
List<File> path = Arrays.asList(testJar); List<File> path = Arrays.asList(testJar);
try (JavaFileManager fm = try (JavaFileManager fm =
getFileManager(path, IGNORE_SYMBOL_FILE, DONT_USE_ZIP_FILE_INDEX)) { getFileManager(path, DONT_USE_ZIP_FILE_INDEX)) {
test("testZipArchive", test("testZipArchive",
fm, testClassName, "com.sun.tools.javac.file.ZipArchive$ZipFileObject"); fm, testClassName, "com.sun.tools.javac.file.ZipArchive$ZipFileObject");
} }
@ -117,7 +104,7 @@ public class TestInferBinaryName {
String testClassName = "java.lang.String"; String testClassName = "java.lang.String";
List<File> path = Arrays.asList(testJar); List<File> path = Arrays.asList(testJar);
try (JavaFileManager fm = try (JavaFileManager fm =
getFileManager(path, USE_SYMBOL_FILE, USE_ZIP_FILE_INDEX)) { getFileManager(path, USE_ZIP_FILE_INDEX)) {
test("testZipFileIndexArchive", test("testZipFileIndexArchive",
fm, testClassName, "com.sun.tools.javac.file.ZipFileIndexArchive$ZipFileIndexFileObject"); fm, testClassName, "com.sun.tools.javac.file.ZipFileIndexArchive$ZipFileIndexFileObject");
} }
@ -127,7 +114,7 @@ public class TestInferBinaryName {
String testClassName = "java.lang.String"; String testClassName = "java.lang.String";
List<File> path = Arrays.asList(testJar); List<File> path = Arrays.asList(testJar);
try (JavaFileManager fm = try (JavaFileManager fm =
getFileManager(path, IGNORE_SYMBOL_FILE, USE_ZIP_FILE_INDEX)) { getFileManager(path, USE_ZIP_FILE_INDEX)) {
test("testZipFileIndexArchive2", test("testZipFileIndexArchive2",
fm, testClassName, "com.sun.tools.javac.file.ZipFileIndexArchive$ZipFileIndexFileObject"); fm, testClassName, "com.sun.tools.javac.file.ZipFileIndexArchive$ZipFileIndexFileObject");
} }
@ -159,7 +146,6 @@ public class TestInferBinaryName {
} }
JavaFileManager getFileManager(List<File> path, JavaFileManager getFileManager(List<File> path,
boolean symFileKind,
boolean zipFileIndexKind) boolean zipFileIndexKind)
throws IOException { throws IOException {
Context ctx = new Context(); Context ctx = new Context();
@ -167,8 +153,6 @@ public class TestInferBinaryName {
options.put("useOptimizedZip", options.put("useOptimizedZip",
Boolean.toString(zipFileIndexKind == USE_ZIP_FILE_INDEX)); Boolean.toString(zipFileIndexKind == USE_ZIP_FILE_INDEX));
if (symFileKind == IGNORE_SYMBOL_FILE)
options.put("ignore.symbol.file", "true");
JavacFileManager fm = new JavacFileManager(ctx, false, null); JavacFileManager fm = new JavacFileManager(ctx, false, null);
fm.setLocation(CLASS_PATH, path); fm.setLocation(CLASS_PATH, path);
return fm; return fm;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -37,14 +37,8 @@ public class EarlyAssertWrapper {
void run() throws Exception { void run() throws Exception {
List<String> cmd = new ArrayList<String>(); List<String> cmd = new ArrayList<String>();
File java_home = new File(System.getProperty("java.home")); File java_home = new File(System.getProperty("java.home"));
if (java_home.getName().equals("jre"))
java_home = java_home.getParentFile();
cmd.add(new File(new File(java_home, "bin"), "java").getPath()); cmd.add(new File(new File(java_home, "bin"), "java").getPath());
// ensure we run with the same bootclasspath as this test,
// in case this test is being run with -Xbootclasspath
cmd.add("-Xbootclasspath:" + System.getProperty("sun.boot.class.path"));
// propogate classpath // propogate classpath
cmd.add("-classpath"); cmd.add("-classpath");
cmd.add(System.getProperty("java.class.path")); cmd.add(System.getProperty("java.class.path"));

View file

@ -97,13 +97,13 @@ Success "$java" ${TESTVMOPTS} -cp "jars/A.jar${PS}." Main
Success "$javac" ${TESTTOOLVMOPTS} -cp "jars/B.zip" Main.java Success "$javac" ${TESTTOOLVMOPTS} -cp "jars/B.zip" Main.java
Success "$java" ${TESTVMOPTS} -cp "jars/B.zip${PS}." Main Success "$java" ${TESTVMOPTS} -cp "jars/B.zip${PS}." Main
Success "$javac" ${TESTTOOLVMOPTS} -extdirs "jars" -cp None Main.java # Success "$javac" ${TESTTOOLVMOPTS} -extdirs "jars" -cp None Main.java
Success "$javac" ${TESTTOOLVMOPTS} -Djava.ext.dirs="jars" -cp None Main.java # Success "$javac" ${TESTTOOLVMOPTS} -Djava.ext.dirs="jars" -cp None Main.java
Success "$java" ${TESTVMOPTS} -Djava.ext.dirs="jars" -cp . Main # Success "$java" ${TESTVMOPTS} -Djava.ext.dirs="jars" -cp . Main
Success "$javac" ${TESTTOOLVMOPTS} -endorseddirs "jars" -cp None Main.java # Success "$javac" ${TESTTOOLVMOPTS} -endorseddirs "jars" -cp None Main.java
Success "$javac" ${TESTTOOLVMOPTS} -Djava.endorsed.dirs="jars" -cp None Main.java # Success "$javac" ${TESTTOOLVMOPTS} -Djava.endorsed.dirs="jars" -cp None Main.java
Success "$java" ${TESTVMOPTS} -Djava.endorsed.dirs="jars" -cp . Main # Success "$java" ${TESTVMOPTS} -Djava.endorsed.dirs="jars" -cp . Main
Failure "$java" ${TESTVMOPTS} -Xbootclasspath/p:"jars/A.jar" -cp . Main Failure "$java" ${TESTVMOPTS} -Xbootclasspath/p:"jars/A.jar" -cp . Main
Failure "$java" ${TESTVMOPTS} -Xbootclasspath/a:"jars/B.zip" -cp . Main Failure "$java" ${TESTVMOPTS} -Xbootclasspath/a:"jars/B.zip" -cp . Main

View file

@ -100,11 +100,11 @@ Success "$java" ${TESTVMOPTS} -cp "jars/sub/B.zip${PS}." Main
# Test 2: Use of extension directories is incorrect # Test 2: Use of extension directories is incorrect
# #
Success "$javac" ${TESTTOOLVMOPTS} -extdirs jars -cp None Main.java # Success "$javac" ${TESTTOOLVMOPTS} -extdirs jars -cp None Main.java
Success "$java" ${TESTVMOPTS} -Djava.ext.dirs="jars" -cp . Main # Success "$java" ${TESTVMOPTS} -Djava.ext.dirs="jars" -cp . Main
Success "$javac" ${TESTTOOLVMOPTS} -extdirs jars/sub -cp None Main.java # Success "$javac" ${TESTTOOLVMOPTS} -extdirs jars/sub -cp None Main.java
Success "$java" ${TESTVMOPTS} -Djava.ext.dirs="jars/sub" -cp . Main # Success "$java" ${TESTVMOPTS} -Djava.ext.dirs="jars/sub" -cp . Main
Cleanup Cleanup

View file

@ -1,77 +0,0 @@
/*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 5071352
* @summary Make sure compiler closes all open files on Windows
* @author Martin Buchholz
*
* @run main/othervm -Xms200m -Xmx200m CompileClose
*/
// -Xms120m is sufficient to inhibit a gc during a compile.
// -Xms200m leaves room for expansion and was used by the customer.
import java.io.*;
public class CompileClose {
static void writeFile(String f, String contents) throws IOException {
PrintStream s = new PrintStream(new FileOutputStream(f));
s.println(contents);
s.close();
}
static void rm(String filename) throws Exception {
File f = new File(filename);
f.delete();
if (f.exists())
throw new Exception(filename + ": couldn't remove");
}
static void clean() throws Exception {
rm("tmpCompileClose.java");
rm("tmpCompileClose.class");
rm("tmpCompileClose.jar");
}
public static void main(String args[]) throws Exception {
try {
clean();
main1();
} finally {
clean();
}
}
static void main1() throws Exception {
writeFile("tmpCompileClose.java",
"public class tmpCompileClose {}");
// Any old jar file will do
SameJVM.jar("cf", "tmpCompileClose.jar", "tmpCompileClose.java");
System.gc(); // Inhibit gc during next compile
SameJVM.javac("-cp", "tmpCompileClose.jar", "tmpCompileClose.java");
// The following rm is the actual test!
rm("tmpCompileClose.jar");
}
}

View file

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# #
# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -37,7 +37,7 @@
set -u set -u
BCP=`DefaultBootClassPath` # BCP=`DefaultBootClassPath`
DiagnosticsInEnglishPlease DiagnosticsInEnglishPlease
@ -99,18 +99,19 @@ No Warning "$javac" ${TESTTOOLVMOPTS} -cp ".${PS}classes" Main.java
Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes" Main.java Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path -cp ".${PS}classes" Main.java
Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath/p:classes" Main.java Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath/p:classes" Main.java
Warning "$javac" ${TESTTOOLVMOPTS} -Xlint "-Xbootclasspath/a:classes" Main.java Warning "$javac" ${TESTTOOLVMOPTS} -Xlint "-Xbootclasspath/a:classes" Main.java
Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-endorseddirs" "classes" Main.java Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-endorseddirs" "classes" Main.java
Warning "$javac" ${TESTTOOLVMOPTS} -Xlint "-extdirs" "classes" Main.java Warning "$javac" ${TESTTOOLVMOPTS} -Xlint "-extdirs" "classes" Main.java
Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath:classes${PS}${BCP}" Main.java # Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath:classes${PS}${BCP}" Main.java
#---------------------------------------------------------------- #----------------------------------------------------------------
# No warning for missing elts in "system" paths # No warning for missing elts in "system" paths
#---------------------------------------------------------------- #----------------------------------------------------------------
No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Djava.endorsed.dirs=classes" Main.java # No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Djava.endorsed.dirs=classes" Main.java
No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Djava.ext.dirs=classes" Main.java # No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Djava.ext.dirs=classes" Main.java
No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath/p:classes" Main.java No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath/p:classes" Main.java
No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath/a:classes" Main.java No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath/a:classes" Main.java
No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath:classes${PS}${BCP}" Main.java # No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-J-Xbootclasspath:classes${PS}${BCP}" Main.java
#---------------------------------------------------------------- #----------------------------------------------------------------
# No warning if class path element exists # No warning if class path element exists
@ -121,7 +122,7 @@ No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-endorseddirs" "classes" Ma
No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-extdirs" "classes" Main.java No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-extdirs" "classes" Main.java
No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath/p:classes" Main.java No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath/p:classes" Main.java
No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath/a:classes" Main.java No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath/a:classes" Main.java
No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath:classes${PS}${BCP}" Main.java # No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint:path "-Xbootclasspath:classes${PS}${BCP}" Main.java
Sys "$jar" cf classes.jar Main.class Sys "$jar" cf classes.jar Main.class
Sys cp classes.jar classes.war Sys cp classes.jar classes.war

View file

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# #
# Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -55,7 +55,7 @@
set -u set -u
BCP=`DefaultBootClassPath` # BCP=`DefaultBootClassPath`
#---------------------------------------------------------------- #----------------------------------------------------------------
# Prepare the "Minefield" # Prepare the "Minefield"
@ -91,62 +91,62 @@ echo 'public class Main {public static void main(String[] a) {Lib.f();}}' > Main
#---------------------------------------------------------------- #----------------------------------------------------------------
# Verify that javac class search order is the same as java's # Verify that javac class search order is the same as java's
#---------------------------------------------------------------- #----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} \ # Failure "$javac" ${TESTTOOLVMOPTS} \
-Xbootclasspath/p:"BadClass" \ # -Xbootclasspath/p:"BadClass" \
-J-Djava.endorsed.dirs="GooJar" \ # -J-Djava.endorsed.dirs="GooJar" \
Main.java # Main.java
Success "$javac" ${TESTTOOLVMOPTS} \ # Success "$javac" ${TESTTOOLVMOPTS} \
-Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \ # -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
-J-Djava.endorsed.dirs="BadJar${PS}GooZip" \ # -J-Djava.endorsed.dirs="BadJar${PS}GooZip" \
Main.java # Main.java
Failure "$java" ${TESTVMOPTS} \ # Failure "$java" ${TESTVMOPTS} \
-Xbootclasspath/p:"BadClass" \ # -Xbootclasspath/p:"BadClass" \
-Djava.endorsed.dirs="GooJar" \ # -Djava.endorsed.dirs="GooJar" \
Main # Main
Success "$java" ${TESTVMOPTS} \ # Success "$java" ${TESTVMOPTS} \
-Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \ # -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
-Djava.endorsed.dirs="BadJar${PS}GooZip" \ # -Djava.endorsed.dirs="BadJar${PS}GooZip" \
Main # Main
#---------------------------------------------------------------- #----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} \ # Failure "$javac" ${TESTTOOLVMOPTS} \
-Xbootclasspath/p:"GooClass" \ # -Xbootclasspath/p:"GooClass" \
-bootclasspath "$BCP${PS}BadZip/Lib.zip" \ # -bootclasspath "$BCP${PS}BadZip/Lib.zip" \
Main.java # Main.java
Success "$javac" ${TESTTOOLVMOPTS} \ # Success "$javac" ${TESTTOOLVMOPTS} \
-Xbootclasspath/p:"BadClass${PS}GooClass" \ # -Xbootclasspath/p:"BadClass${PS}GooClass" \
-bootclasspath "$BCP${PS}GooZip/Lib.zip${PS}BadClass" \ # -bootclasspath "$BCP${PS}GooZip/Lib.zip${PS}BadClass" \
Main.java # Main.java
Success "$javac" ${TESTTOOLVMOPTS} \ # Success "$javac" ${TESTTOOLVMOPTS} \
-Xbootclasspath/p:"BadJar/Lib.jar" \ # -Xbootclasspath/p:"BadJar/Lib.jar" \
-Xbootclasspath:"$BCP${PS}GooClass" \ # -Xbootclasspath:"$BCP${PS}GooClass" \
Main.java # Main.java
Failure "$java" ${TESTVMOPTS} \ # Failure "$java" ${TESTVMOPTS} \
-Xbootclasspath/p:"GooClass" \ # -Xbootclasspath/p:"GooClass" \
-Xbootclasspath:"$BCP${PS}BadZip/Lib.zip" \ # -Xbootclasspath:"$BCP${PS}BadZip/Lib.zip" \
Main # Main
Success "$java" ${TESTVMOPTS} \ # Success "$java" ${TESTVMOPTS} \
-Xbootclasspath/p:"BadClass${PS}GooClass" \ # -Xbootclasspath/p:"BadClass${PS}GooClass" \
-Xbootclasspath:"$BCP${PS}GooZip/Lib.zip${PS}BadClass" \ # -Xbootclasspath:"$BCP${PS}GooZip/Lib.zip${PS}BadClass" \
Main # Main
#---------------------------------------------------------------- #----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} \ # Failure "$javac" ${TESTTOOLVMOPTS} \
-bootclasspath "$BCP${PS}GooZip/Lib.zip" \ # -bootclasspath "$BCP${PS}GooZip/Lib.zip" \
-Xbootclasspath/p:"BadClass" \ # -Xbootclasspath/p:"BadClass" \
Main.java # Main.java
Success "$javac" ${TESTTOOLVMOPTS} \ # Success "$javac" ${TESTTOOLVMOPTS} \
-bootclasspath "$BCP${PS}BadZip/Lib.zip" \ # -bootclasspath "$BCP${PS}BadZip/Lib.zip" \
-Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \ # -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
Main.java # Main.java
Failure "$java" ${TESTVMOPTS} \ # Failure "$java" ${TESTVMOPTS} \
-Xbootclasspath:"$BCP${PS}GooClass" \ # -Xbootclasspath:"$BCP${PS}GooClass" \
-Xbootclasspath/p:"BadClass" \ # -Xbootclasspath/p:"BadClass" \
Main # Main
Success "$java" ${TESTVMOPTS} \ # Success "$java" ${TESTVMOPTS} \
-Xbootclasspath:"$BCP${PS}BadClass" \ # -Xbootclasspath:"$BCP${PS}BadClass" \
-Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \ # -Xbootclasspath/p:"GooClass${PS}BadJar/Lib.jar" \
Main # Main
#---------------------------------------------------------------- #----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} \ Failure "$javac" ${TESTTOOLVMOPTS} \
@ -167,74 +167,74 @@ Success "$java" ${TESTVMOPTS} \
Main Main
#---------------------------------------------------------------- #----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} \ # Failure "$javac" ${TESTTOOLVMOPTS} \
-Xbootclasspath/p:"GooClass" \ # -Xbootclasspath/p:"GooClass" \
-J-Djava.endorsed.dirs="BadZip" \ # -J-Djava.endorsed.dirs="BadZip" \
-bootclasspath "GooClass${PS}$BCP" \ # -bootclasspath "GooClass${PS}$BCP" \
Main.java # Main.java
Success "$javac" ${TESTTOOLVMOPTS} \ # Success "$javac" ${TESTTOOLVMOPTS} \
-Xbootclasspath/p:"BadClass" \ # -Xbootclasspath/p:"BadClass" \
-J-Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \ # -J-Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
-bootclasspath "BadClass${PS}$BCP" \ # -bootclasspath "BadClass${PS}$BCP" \
Main.java # Main.java
Failure "$java" ${TESTVMOPTS} \ # Failure "$java" ${TESTVMOPTS} \
-Xbootclasspath/p:"GooClass" \ # -Xbootclasspath/p:"GooClass" \
-Djava.endorsed.dirs="BadZip" \ # -Djava.endorsed.dirs="BadZip" \
-Xbootclasspath:"GooClass${PS}$BCP" \ # -Xbootclasspath:"GooClass${PS}$BCP" \
Main # Main
Success "$java" ${TESTVMOPTS} \ # Success "$java" ${TESTVMOPTS} \
-Xbootclasspath/p:"BadClass" \ # -Xbootclasspath/p:"BadClass" \
-Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \ # -Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
-Xbootclasspath:"BadClass${PS}$BCP" \ # -Xbootclasspath:"BadClass${PS}$BCP" \
Main # Main
#---------------------------------------------------------------- #----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} \ # Failure "$javac" ${TESTTOOLVMOPTS} \
-Xbootclasspath/p:"GooClass" \ # -Xbootclasspath/p:"GooClass" \
-Xbootclasspath:"BadClass${PS}$BCP" \ # -Xbootclasspath:"BadClass${PS}$BCP" \
-Xbootclasspath/a:"GooClass" \ # -Xbootclasspath/a:"GooClass" \
Main.java # Main.java
Success "$javac" ${TESTTOOLVMOPTS} \ # Success "$javac" ${TESTTOOLVMOPTS} \
-Xbootclasspath/p:"BadClass" \ # -Xbootclasspath/p:"BadClass" \
-Xbootclasspath:"GooClass${PS}BadClass${PS}$BCP" \ # -Xbootclasspath:"GooClass${PS}BadClass${PS}$BCP" \
-Xbootclasspath/a:"BadClass" \ # -Xbootclasspath/a:"BadClass" \
Main.java # Main.java
Failure "$java" ${TESTVMOPTS} \ # Failure "$java" ${TESTVMOPTS} \
-Xbootclasspath/p:"GooClass" \ # -Xbootclasspath/p:"GooClass" \
-Xbootclasspath:"BadClass${PS}$BCP" \ # -Xbootclasspath:"BadClass${PS}$BCP" \
-Xbootclasspath/a:"GooClass" \ # -Xbootclasspath/a:"GooClass" \
Main # Main
Success "$java" ${TESTVMOPTS} \ # Success "$java" ${TESTVMOPTS} \
-Xbootclasspath/p:"BadClass" \ # -Xbootclasspath/p:"BadClass" \
-Xbootclasspath:"GooClass${PS}BadClass${PS}$BCP" \ # -Xbootclasspath:"GooClass${PS}BadClass${PS}$BCP" \
-Xbootclasspath/a:"BadClass" \ # -Xbootclasspath/a:"BadClass" \
Main # Main
#---------------------------------------------------------------- #----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} \ # Failure "$javac" ${TESTTOOLVMOPTS} \
-J-Djava.endorsed.dirs="BadZip" \ # -J-Djava.endorsed.dirs="BadZip" \
-Xbootclasspath:"GooClass${PS}$BCP" \ # -Xbootclasspath:"GooClass${PS}$BCP" \
Main.java # Main.java
Success "$javac" ${TESTTOOLVMOPTS} \ # Success "$javac" ${TESTTOOLVMOPTS} \
-endorseddirs "BadClass${PS}GooZip${PS}BadJar" \ # -endorseddirs "BadClass${PS}GooZip${PS}BadJar" \
-Xbootclasspath:"BadClass${PS}$BCP" \ # -Xbootclasspath:"BadClass${PS}$BCP" \
Main.java # Main.java
Success "$javac" ${TESTTOOLVMOPTS} \ # Success "$javac" ${TESTTOOLVMOPTS} \
-Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \ # -Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
-Xbootclasspath:"BadClass${PS}$BCP" \ # -Xbootclasspath:"BadClass${PS}$BCP" \
Main.java # Main.java
Success "$javac" ${TESTTOOLVMOPTS} \ # Success "$javac" ${TESTTOOLVMOPTS} \
-J-Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \ # -J-Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
-Xbootclasspath:"BadClass${PS}$BCP" \ # -Xbootclasspath:"BadClass${PS}$BCP" \
Main.java # Main.java
Failure "$java" ${TESTVMOPTS} \ # Failure "$java" ${TESTVMOPTS} \
-Djava.endorsed.dirs="BadZip" \ # -Djava.endorsed.dirs="BadZip" \
-Xbootclasspath:"GooClass${PS}$BCP" \ # -Xbootclasspath:"GooClass${PS}$BCP" \
Main # Main
Success "$java" ${TESTVMOPTS} \ # Success "$java" ${TESTVMOPTS} \
-Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \ # -Djava.endorsed.dirs="BadClass${PS}GooZip${PS}BadJar" \
-Xbootclasspath:"BadClass${PS}$BCP" \ # -Xbootclasspath:"BadClass${PS}$BCP" \
Main # Main
#---------------------------------------------------------------- #----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} \ Failure "$javac" ${TESTTOOLVMOPTS} \
@ -245,32 +245,32 @@ Success "$javac" ${TESTTOOLVMOPTS} \
-Xbootclasspath/a:"GooClass${PS}BadClass" \ -Xbootclasspath/a:"GooClass${PS}BadClass" \
-extdirs "BadZip" \ -extdirs "BadZip" \
Main.java Main.java
Failure "$java" ${TESTVMOPTS} \ # Failure "$java" ${TESTVMOPTS} \
-Xbootclasspath/a:"BadClass" \ # -Xbootclasspath/a:"BadClass" \
-Djava.ext.dirs="GooZip" \ # -Djava.ext.dirs="GooZip" \
Main # Main
Success "$java" ${TESTVMOPTS} \ # Success "$java" ${TESTVMOPTS} \
-Xbootclasspath/a:"GooClass${PS}BadClass" \ # -Xbootclasspath/a:"GooClass${PS}BadClass" \
-Djava.ext.dirs="BadZip" \ # -Djava.ext.dirs="BadZip" \
Main # Main
#---------------------------------------------------------------- #----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} \ # Failure "$javac" ${TESTTOOLVMOPTS} \
-bootclasspath "$BCP${PS}BadJar/Lib.jar" \ # -bootclasspath "$BCP${PS}BadJar/Lib.jar" \
-J-Djava.ext.dir="GooJar" \ # -J-Djava.ext.dir="GooJar" \
Main.java # Main.java
Success "$javac" ${TESTTOOLVMOPTS} \ # Success "$javac" ${TESTTOOLVMOPTS} \
-bootclasspath "$BCP${PS}GooJar/Lib.jar${PS}BadClass" \ # -bootclasspath "$BCP${PS}GooJar/Lib.jar${PS}BadClass" \
-J-Djava.ext.dir="BadJar" \ # -J-Djava.ext.dir="BadJar" \
Main.java # Main.java
Failure "$java" ${TESTVMOPTS} \ # Failure "$java" ${TESTVMOPTS} \
-Xbootclasspath:"$BCP${PS}BadJar/Lib.jar" \ # -Xbootclasspath:"$BCP${PS}BadJar/Lib.jar" \
-Djava.ext.dirs="GooJar" \ # -Djava.ext.dirs="GooJar" \
Main # Main
Success "$java" ${TESTVMOPTS} \ # Success "$java" ${TESTVMOPTS} \
-Xbootclasspath:"$BCP${PS}GooJar/Lib.jar${PS}BadClass" \ # -Xbootclasspath:"$BCP${PS}GooJar/Lib.jar${PS}BadClass" \
-Djava.ext.dirs="BadJar" \ # -Djava.ext.dirs="BadJar" \
Main # Main
#---------------------------------------------------------------- #----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} \ Failure "$javac" ${TESTTOOLVMOPTS} \
@ -285,18 +285,18 @@ Success "$javac" ${TESTTOOLVMOPTS} \
-Djava.ext.dirs="GooZip${PS}BadJar" \ -Djava.ext.dirs="GooZip${PS}BadJar" \
-classpath "BadZip/Lib.zip" \ -classpath "BadZip/Lib.zip" \
Main.java Main.java
Success "$javac" ${TESTTOOLVMOPTS} \ # Success "$javac" ${TESTTOOLVMOPTS} \
-J-Djava.ext.dirs="GooZip${PS}BadJar" \ # -J-Djava.ext.dirs="GooZip${PS}BadJar" \
-classpath "BadZip/Lib.zip" \ # -classpath "BadZip/Lib.zip" \
Main.java # Main.java
Failure "$java" ${TESTVMOPTS} \ # Failure "$java" ${TESTVMOPTS} \
-Djava.ext.dirs="GooClass${PS}BadZip" \ # -Djava.ext.dirs="GooClass${PS}BadZip" \
-cp "GooZip/Lib.zip${PS}." \ # -cp "GooZip/Lib.zip${PS}." \
Main # Main
Success "$java" ${TESTVMOPTS} \ # Success "$java" ${TESTVMOPTS} \
-Djava.ext.dirs="GooZip${PS}BadJar" \ # -Djava.ext.dirs="GooZip${PS}BadJar" \
-cp "BadZip/Lib.zip${PS}." \ # -cp "BadZip/Lib.zip${PS}." \
Main # Main
#---------------------------------------------------------------- #----------------------------------------------------------------
Failure "$javac" ${TESTTOOLVMOPTS} -classpath "BadClass${PS}GooClass" Main.java Failure "$javac" ${TESTTOOLVMOPTS} -classpath "BadClass${PS}GooClass" Main.java
@ -339,27 +339,27 @@ In GooClass Success "$java" ${TESTVMOPTS} -cp "..${PS}${PS}/xyzzy" Main
# All other empty path elements are ignored. # All other empty path elements are ignored.
In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -extdirs "" -cp ".." ../Main.java In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -extdirs "" -cp ".." ../Main.java
In GooJar Failure "$java" ${TESTVMOPTS} -Djava.ext.dirs="" -cp ".." Main # In GooJar Failure "$java" ${TESTVMOPTS} -Djava.ext.dirs="" -cp ".." Main
In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -extdirs "${PS}" -cp ".." ../Main.java In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -extdirs "${PS}" -cp ".." ../Main.java
In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -Djava.ext.dirs="${PS}" -cp ".." ../Main.java In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -Djava.ext.dirs="${PS}" -cp ".." ../Main.java
In GooJar Failure "$java" ${TESTVMOPTS} -Djava.ext.dirs="${PS}" -cp ".." Main # In GooJar Failure "$java" ${TESTVMOPTS} -Djava.ext.dirs="${PS}" -cp ".." Main
In GooJar Success "$javac" ${TESTTOOLVMOPTS} -extdirs "." -cp ".." ../Main.java In GooJar Success "$javac" ${TESTTOOLVMOPTS} -extdirs "." -cp ".." ../Main.java
In GooJar Success "$javac" ${TESTTOOLVMOPTS} -Djava.ext.dirs="." -cp ".." ../Main.java In GooJar Success "$javac" ${TESTTOOLVMOPTS} -Djava.ext.dirs="." -cp ".." ../Main.java
In GooJar Success "$java" ${TESTVMOPTS} -Djava.ext.dirs="." -cp ".." Main # In GooJar Success "$java" ${TESTVMOPTS} -Djava.ext.dirs="." -cp ".." Main
In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="" -cp ".." ../Main.java # In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="" -cp ".." ../Main.java
In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -Djava.endorsed.dirs="" -cp ".." ../Main.java In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -Djava.endorsed.dirs="" -cp ".." ../Main.java
In GooJar Failure "$java" ${TESTVMOPTS} -Djava.endorsed.dirs="" -cp ".." Main # In GooJar Failure "$java" ${TESTVMOPTS} -Djava.endorsed.dirs="" -cp ".." Main
In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="${PS}" -cp ".." ../Main.java # In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="${PS}" -cp ".." ../Main.java
In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -endorseddirs "${PS}" -cp ".." ../Main.java In GooJar Failure "$javac" ${TESTTOOLVMOPTS} -endorseddirs "${PS}" -cp ".." ../Main.java
In GooJar Failure "$java" ${TESTVMOPTS} -Djava.endorsed.dirs="${PS}" -cp ".." Main # In GooJar Failure "$java" ${TESTVMOPTS} -Djava.endorsed.dirs="${PS}" -cp ".." Main
In GooJar Success "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="." -cp ".." ../Main.java # In GooJar Success "$javac" ${TESTTOOLVMOPTS} -J-Djava.endorsed.dirs="." -cp ".." ../Main.java
In GooJar Success "$javac" ${TESTTOOLVMOPTS} -Djava.endorsed.dirs="." -cp ".." ../Main.java In GooJar Success "$javac" ${TESTTOOLVMOPTS} -Djava.endorsed.dirs="." -cp ".." ../Main.java
In GooJar Success "$java" ${TESTVMOPTS} -Djava.endorsed.dirs="." -cp ".." Main # In GooJar Success "$java" ${TESTVMOPTS} -Djava.endorsed.dirs="." -cp ".." Main
In GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/p: -cp ".." ../Main.java In GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/p: -cp ".." ../Main.java
In GooClass Failure "$java" ${TESTVMOPTS} -Xbootclasspath/p: -cp ".." Main In GooClass Failure "$java" ${TESTVMOPTS} -Xbootclasspath/p: -cp ".." Main
@ -367,11 +367,11 @@ In GooClass Failure "$java" ${TESTVMOPTS} -Xbootclasspath/p: -cp ".." Main
In GooClass Success "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/p:. -cp ".." ../Main.java In GooClass Success "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/p:. -cp ".." ../Main.java
In GooClass Success "$java" ${TESTVMOPTS} -Xbootclasspath/p:. -cp ".." Main In GooClass Success "$java" ${TESTVMOPTS} -Xbootclasspath/p:. -cp ".." Main
In GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath:"$BCP" -cp ".." ../Main.java # In GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath:"$BCP" -cp ".." ../Main.java
In GooClass Failure "$java" ${TESTVMOPTS} -Xbootclasspath:"$BCP" -cp ".." Main # In GooClass Failure "$java" ${TESTVMOPTS} -Xbootclasspath:"$BCP" -cp ".." Main
In GooClass Success "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath:"$BCP${PS}." -cp ".." ../Main.java # In GooClass Success "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath:"$BCP${PS}." -cp ".." ../Main.java
In GooClass Success "$java" ${TESTVMOPTS} -Xbootclasspath:"$BCP${PS}." -cp ".." Main # In GooClass Success "$java" ${TESTVMOPTS} -Xbootclasspath:"$BCP${PS}." -cp ".." Main
In GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/a: -cp ".." ../Main.java In GooClass Failure "$javac" ${TESTTOOLVMOPTS} -Xbootclasspath/a: -cp ".." ../Main.java
In GooClass Failure "$java" ${TESTVMOPTS} -Xbootclasspath/a: -cp ".." Main In GooClass Failure "$java" ${TESTVMOPTS} -Xbootclasspath/a: -cp ".." Main

View file

@ -1,66 +0,0 @@
/*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* Support routines to allow running `javac' or `jar' within the same JVM.
*/
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
class SameJVM {
private static ClassLoader toolsClassLoader() {
File javaHome = new File(System.getProperty("java.home"));
File classesDir = new File(javaHome, "classes");
File libDir = new File(javaHome.getParentFile(), "lib");
File toolsJar = new File(libDir, "tools.jar");
try {
return new URLClassLoader(
new URL[] {classesDir.toURL(), toolsJar.toURL()});
} catch (MalformedURLException e) { throw new AssertionError(e); }
}
private static final ClassLoader cl = toolsClassLoader();
static void javac(String... args) throws Exception {
Class c = Class.forName("com.sun.tools.javac.Main", true, cl);
int status = (Integer)
c.getMethod("compile", new Class[] {String[].class})
.invoke(c.newInstance(), new Object[] {args});
if (status != 0)
throw new Exception("javac failed: status=" + status);
}
static void jar(String... args) throws Exception {
Class c = Class.forName("sun.tools.jar.Main", true, cl);
Object instance = c.getConstructor(
new Class[] {PrintStream.class, PrintStream.class, String.class})
.newInstance(System.out, System.err, "jar");
boolean result = (Boolean)
c.getMethod("run", new Class[] {String[].class})
.invoke(instance, new Object[] {args});
if (! result)
throw new Exception("jar failed");
}
}

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -105,21 +105,21 @@ BadJarFile() {
for jarfilename in "$@"; do pwd > "$jarfilename"; done for jarfilename in "$@"; do pwd > "$jarfilename"; done
} }
#---------------------------------------------------------------- # #----------------------------------------------------------------
# Usage: BCP=`DefaultBootClassPath` # # Usage: BCP=`DefaultBootClassPath`
# Returns default bootclasspath, discarding non-existent entries # # Returns default bootclasspath, discarding non-existent entries
#---------------------------------------------------------------- # #----------------------------------------------------------------
DefaultBootClassPath() { # DefaultBootClassPath() {
echo 'public class B {public static void main(String[] a) { # echo 'public class B {public static void main(String[] a) {
System.out.println(System.getProperty("sun.boot.class.path"));}}' > B.java # System.out.println(System.getProperty("sun.boot.class.path"));}}' > B.java
"$javac" ${TESTTOOLVMOPTS} B.java # "$javac" ${TESTTOOLVMOPTS} B.java
_BCP_="" # _BCP_=""
for elt in `"$java" ${TESTVMOPTS} B | tr "${PS}" " "`; do # for elt in `"$java" ${TESTVMOPTS} B | tr "${PS}" " "`; do
test -r "$elt" -a -n "$elt" && _BCP_="${_BCP_:+${_BCP_}${PS}}${elt}" # test -r "$elt" -a -n "$elt" && _BCP_="${_BCP_:+${_BCP_}${PS}}${elt}"
done # done
rm -f B.java B.class # rm -f B.java B.class
printf "%s" "$_BCP_" # Don't use echo -- unsafe on Windows # printf "%s" "$_BCP_" # Don't use echo -- unsafe on Windows
} # }
#---------------------------------------------------------------- #----------------------------------------------------------------
# Foil message localization # Foil message localization

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -44,13 +44,12 @@ import javax.tools.ToolProvider;
public class T6654037 { public class T6654037 {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
final String bootPath = System.getProperty("sun.boot.class.path"); //NOI18N
final JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
assert tool != null; assert tool != null;
String code = "package test; public class Test {private void test() {Object o = null; boolean b = o != null && o instanceof String;} private Test() {}}"; String code = "package test; public class Test {private void test() {Object o = null; boolean b = o != null && o instanceof String;} private Test() {}}";
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, Arrays.asList("-bootclasspath", bootPath, "-Xjcov"), null, Arrays.asList(new MyFileObject(code))); JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, null, null, Arrays.asList("-Xjcov"), null, Arrays.asList(new MyFileObject(code)));
CompilationUnitTree cut = ct.parse().iterator().next(); CompilationUnitTree cut = ct.parse().iterator().next();
ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0); ClassTree clazz = (ClassTree) cut.getTypeDecls().get(0);
MethodTree method = (MethodTree) clazz.getMembers().get(0); MethodTree method = (MethodTree) clazz.getMembers().get(0);

View file

@ -41,8 +41,6 @@ public class T6705935 {
public void run() throws Exception { public void run() throws Exception {
File java_home = new File(System.getProperty("java.home")); File java_home = new File(System.getProperty("java.home"));
if (java_home.getName().equals("jre"))
java_home = java_home.getParentFile();
JavaCompiler c = ToolProvider.getSystemJavaCompiler(); JavaCompiler c = ToolProvider.getSystemJavaCompiler();
try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) { try (StandardJavaFileManager fm = c.getStandardFileManager(null, null, null)) {

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,13 +26,17 @@
* @bug 6725036 8016760 * @bug 6725036 8016760
* @summary javac returns incorrect value for lastModifiedTime() when * @summary javac returns incorrect value for lastModifiedTime() when
* source is a zip file archive * source is a zip file archive
* @library /tools/lib
* @build ToolBox
* @run main T6725036
*/ */
import java.io.File; import java.io.File;
import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import javax.tools.JavaFileObject; import javax.tools.*;
import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.file.RelativePath.RelativeFile; import com.sun.tools.javac.file.RelativePath.RelativeFile;
@ -49,17 +53,14 @@ public class T6725036 {
void run() throws Exception { void run() throws Exception {
RelativeFile TEST_ENTRY_NAME = new RelativeFile("java/lang/String.class"); RelativeFile TEST_ENTRY_NAME = new RelativeFile("java/lang/String.class");
File f = new File(System.getProperty("java.home")); File testJar = createJar("test.jar", "java.lang.*");
if (!f.getName().equals("jre"))
f = new File(f, "jre");
File rt_jar = new File(new File(f, "lib"), "rt.jar");
JarFile j = new JarFile(rt_jar); try (JarFile j = new JarFile(testJar)) {
JarEntry je = j.getJarEntry(TEST_ENTRY_NAME.getPath()); JarEntry je = j.getJarEntry(TEST_ENTRY_NAME.getPath());
long jarEntryTime = je.getTime(); long jarEntryTime = je.getTime();
ZipFileIndexCache zfic = ZipFileIndexCache.getSharedInstance(); ZipFileIndexCache zfic = ZipFileIndexCache.getSharedInstance();
ZipFileIndex zfi = zfic.getZipFileIndex(rt_jar, null, false, null, false); ZipFileIndex zfi = zfic.getZipFileIndex(testJar, null, false, null, false);
long zfiTime = zfi.getLastModified(TEST_ENTRY_NAME); long zfiTime = zfi.getLastModified(TEST_ENTRY_NAME);
check(je, jarEntryTime, zfi + ":" + TEST_ENTRY_NAME.getPath(), zfiTime); check(je, jarEntryTime, zfi + ":" + TEST_ENTRY_NAME.getPath(), zfiTime);
@ -77,6 +78,19 @@ public class T6725036 {
if (errors > 0) if (errors > 0)
throw new Exception(errors + " occurred"); throw new Exception(errors + " occurred");
} }
}
File createJar(String name, String... paths) throws IOException {
JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
try (JavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
File f = new File(name);
ToolBox tb = new ToolBox();
tb.new JarTask(f.getPath())
.files(fm, StandardLocation.PLATFORM_CLASS_PATH, paths)
.run();
return f;
}
}
void check(Object ref, long refTime, Object test, long testTime) { void check(Object ref, long refTime, Object test, long testTime) {
if (refTime == testTime) if (refTime == testTime)

View file

@ -1,14 +1,14 @@
import java.io.*;
import java.util.*;
import sun.misc.*;
/* /*
* @test /nodynamiccopyright/ * @test /nodynamiccopyright/
* @bug 6873845 * @bug 6873845
* @summary refine access to symbol file * @summary refine access to symbol file
*/ */
import java.io.*;
import java.util.*;
import sun.misc.*;
public class T6873845 { public class T6873845 {
public static void main(String... args) throws Exception { public static void main(String... args) throws Exception {
new T6873845().run(); new T6873845().run();

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -51,7 +51,6 @@ public class TestAnnotationPackageInfo {
} }
public void run() throws Exception { public void run() throws Exception {
final String bootPath = System.getProperty("sun.boot.class.path");
final JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
assert tool != null; assert tool != null;
@ -65,9 +64,8 @@ public class TestAnnotationPackageInfo {
DiagnosticCollector<JavaFileObject> coll = new DiagnosticCollector<JavaFileObject>(); DiagnosticCollector<JavaFileObject> coll = new DiagnosticCollector<JavaFileObject>();
List<String> options = Arrays.asList("-bootclasspath", bootPath);
List<? extends JavaFileObject> files = Arrays.asList(test_java, package_info_java); List<? extends JavaFileObject> files = Arrays.asList(test_java, package_info_java);
JavacTask ct = (JavacTask)tool.getTask(null, null, coll, options, null, files); JavacTask ct = (JavacTask)tool.getTask(null, null, coll, null, null, files);
ct.analyze(); ct.analyze();
String expectedCode = "compiler.err.annotation.missing.default.value"; String expectedCode = "compiler.err.annotation.missing.default.value";

View file

@ -1,232 +0,0 @@
/*
* Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 6410367 6411310
* @summary FileObject should support user-friendly names via getName()
*/
import java.io.*;
import java.util.*;
import java.util.jar.*;
import java.util.zip.*;
import javax.tools.*;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.Options;
// Test FileObject.getName returned from JavacFileManager and its support classes.
public class Test {
public static void main(String... args) throws Exception {
new Test().run();
}
Set<String> foundClasses = new TreeSet<String>();
Set<String> foundJars = new TreeSet<String>();
void run() throws Exception {
File rt_jar = findRtJar();
// names for entries to be created in directories and jar files
String[] entries = { "p/A.java", "p/A.class", "p/resources/A-1.html" };
// test various combinations of directories and jar files, intended to
// cover all sources of file objects within JavacFileManager's support classes
test(createFileManager(), createDir("dir", entries), "p", entries);
test(createFileManager(), createDir("a b/dir", entries), "p", entries);
for (boolean useOptimizedZip: new boolean[] { false, true }) {
test(createFileManager(useOptimizedZip), createJar("jar", entries), "p", entries);
test(createFileManager(useOptimizedZip), createJar("jar jar", entries), "p", entries);
for (boolean useSymbolFile: new boolean[] { false, true }) {
test(createFileManager(useOptimizedZip, useSymbolFile), rt_jar, "java.lang.ref", null);
}
}
if (errors > 0)
throw new Exception(errors + " errors found");
// Verify that we hit all the impl classes we intended
checkCoverage("classes", foundClasses,
"RegularFileObject", "SymbolFileObject", "ZipFileIndexFileObject", "ZipFileObject");
// Verify that we hit the jar files we intended, specifically ct.sym as well as rt.jar
checkCoverage("jar files", foundJars,
"ct.sym", "jar", "jar jar", "rt.jar");
}
// use a new file manager for each test
void test(StandardJavaFileManager fm, File f, String pkg, String[] entries) throws Exception {
System.err.println("Test " + f);
try {
if (f.isDirectory()) {
for (File dir: new File[] { f, f.getAbsoluteFile() }) {
for (String e: entries) {
JavaFileObject fo = fm.getJavaFileObjects(new File(dir, e)).iterator().next();
test(fo, dir, e);
}
}
}
fm.setLocation(StandardLocation.CLASS_PATH, Collections.singleton(f));
fm.setLocation(StandardLocation.SOURCE_PATH, Collections.singleton(f.getAbsoluteFile()));
for (StandardLocation l: EnumSet.of(StandardLocation.CLASS_PATH, StandardLocation.SOURCE_PATH)) {
for (JavaFileObject fo: fm.list(l, pkg, EnumSet.allOf(JavaFileObject.Kind.class), true)) {
// we could use fm.getLocation but the following guarantees we preserve the original filename
File dir = (l == StandardLocation.CLASS_PATH ? f : f.getAbsoluteFile());
char sep = (dir.isDirectory() ? File.separatorChar : '/');
String b = fm.inferBinaryName(l, fo);
String e = fo.getKind().extension;
test(fo, dir, b.replace('.', sep) + e);
}
}
} finally {
fm.close();
}
}
void test(JavaFileObject fo, File dir, String p) {
System.err.println("Test: " + fo);
String expect = dir.isDirectory() ? new File(dir, p).getPath() : (dir.getPath() + "(" + p + ")");
String found = fo.getName();
// if ct.sym is found, replace it with the equivalent rt.jar
String found2 = found.replaceAll("lib([\\\\/])ct.sym\\(META-INF/sym/rt.jar/", "jre$1lib$1rt.jar(");
if (!expect.equals(found2)) {
System.err.println("expected: " + expect);
System.err.println(" found: " + found);
if (!found.equals(found2))
System.err.println(" found2: " + found2);
error("Failed: " + fo);
}
// record the file object class name for coverage checks later
foundClasses.add(fo.getClass().getSimpleName());
if (found.contains("(")) {
// record access to the jar file for coverage checks later
foundJars.add(new File(found.substring(0, found.indexOf("("))).getName());
}
}
void checkCoverage(String label, Set<String> found, String... expect) throws Exception {
Set<String> e = new TreeSet<String>(Arrays.asList(expect));
if (!found.equals(e)) {
e.removeAll(found);
throw new Exception("expected " + label + " not used: " + e);
}
}
JavacFileManager createFileManager() {
return createFileManager(false, false);
}
JavacFileManager createFileManager(boolean useOptimizedZip) {
return createFileManager(useOptimizedZip, false);
}
JavacFileManager createFileManager(boolean useOptimizedZip, boolean useSymbolFile) {
Context c = new Context();
Options options = Options.instance(c);
options.put("useOptimizedZip", Boolean.toString(useOptimizedZip));
if (!useSymbolFile) {
options.put("ignore.symbol.file", "true");
}
return new JavacFileManager(c, false, null);
}
File createDir(String name, String... entries) throws Exception {
File dir = new File(name);
if (!dir.mkdirs())
throw new Exception("cannot create directories " + dir);
for (String e: entries) {
writeFile(new File(dir, e), e);
}
return dir;
}
File createJar(String name, String... entries) throws IOException {
File jar = new File(name);
OutputStream out = new FileOutputStream(jar);
try {
JarOutputStream jos = new JarOutputStream(out);
for (String e: entries) {
jos.putNextEntry(new ZipEntry(e));
jos.write(e.getBytes());
}
jos.close();
} finally {
out.close();
}
return jar;
}
File findRtJar() throws Exception {
File java_home = new File(System.getProperty("java.home"));
if (java_home.getName().equals("jre"))
java_home = java_home.getParentFile();
File rt_jar = new File(new File(new File(java_home, "jre"), "lib"), "rt.jar");
if (!rt_jar.exists())
throw new Exception("can't find rt.jar");
return rt_jar;
}
byte[] read(InputStream in) throws IOException {
byte[] data = new byte[1024];
int offset = 0;
try {
int n;
while ((n = in.read(data, offset, data.length - offset)) != -1) {
offset += n;
if (offset == data.length)
data = Arrays.copyOf(data, 2 * data.length);
}
} finally {
in.close();
}
return Arrays.copyOf(data, offset);
}
void writeFile(File f, String s) throws IOException {
f.getParentFile().mkdirs();
FileWriter out = new FileWriter(f);
try {
out.write(s);
} finally {
out.close();
}
}
void error(String msg) {
System.err.println(msg);
errors++;
}
int errors;
}

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -43,10 +43,9 @@ import javax.tools.ToolProvider;
public class T6598108 { public class T6598108 {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
final String bootPath = System.getProperty("sun.boot.class.path"); //NOI18N
final JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); final JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
assert tool != null; assert tool != null;
final JavacTask ct = (JavacTask)tool.getTask(null, null, null, Arrays.asList("-bootclasspath", bootPath), null, Arrays.asList(new MyFileObject())); final JavacTask ct = (JavacTask)tool.getTask(null, null, null, null, null, Arrays.asList(new MyFileObject()));
CompilationUnitTree cut = ct.parse().iterator().next(); CompilationUnitTree cut = ct.parse().iterator().next();
TreePath tp = new TreePath(new TreePath(cut), cut.getTypeDecls().get(0)); TreePath tp = new TreePath(new TreePath(cut), cut.getTypeDecls().get(0));

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -47,8 +47,7 @@ public class T6608214 {
} }
}; };
List<? extends JavaFileObject> files = Arrays.asList(sfo); List<? extends JavaFileObject> files = Arrays.asList(sfo);
String bootPath = System.getProperty("sun.boot.class.path"); List<String> opts = Arrays.asList("-Xjcov");
List<String> opts = Arrays.asList("-bootclasspath", bootPath, "-Xjcov");
JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
JavacTask ct = (JavacTask)tool.getTask(null, null, null,opts,null,files); JavacTask ct = (JavacTask)tool.getTask(null, null, null,opts,null,files);
ct.analyze(); ct.analyze();

View file

@ -44,28 +44,9 @@ public class T6412669 extends AbstractProcessor {
File testSrc = new File(System.getProperty("test.src", ".")); File testSrc = new File(System.getProperty("test.src", "."));
File testClasses = new File(System.getProperty("test.classes", ".")); File testClasses = new File(System.getProperty("test.classes", "."));
// Determine location of necessary tools classes. Assume all in one place.
// Likely candidates are typically tools.jar (when testing JDK build)
// or build/classes or dist/javac.jar (when testing langtools, using -Xbootclasspath/p:)
File toolsClasses;
URL u = T6412669.class.getClassLoader().getResource("com/sun/source/util/JavacTask.class");
switch (u.getProtocol()) {
case "file":
toolsClasses = new File(u.toURI());
break;
case "jar":
String s = u.getFile(); // will be file:path!/entry
int sep = s.indexOf("!");
toolsClasses = new File(new URI(s.substring(0, sep)));
break;
default:
throw new AssertionError("Cannot locate tools classes");
}
//System.err.println("toolsClasses: " + toolsClasses);
JavacTool tool = JavacTool.create(); JavacTool tool = JavacTool.create();
try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(testClasses, toolsClasses)); fm.setLocation(StandardLocation.CLASS_PATH, Arrays.asList(testClasses));
Iterable<? extends JavaFileObject> files = Iterable<? extends JavaFileObject> files =
fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6412669.class.getName()+".java"))); fm.getJavaFileObjectsFromFiles(Arrays.asList(new File(testSrc, T6412669.class.getName()+".java")));
String[] opts = { "-proc:only", "-processor", T6412669.class.getName()}; String[] opts = { "-proc:only", "-processor", T6412669.class.getName()};

View file

@ -25,14 +25,20 @@
* @test * @test
* @bug 6430241 * @bug 6430241
* @summary Hard to disable symbol file feature through API * @summary Hard to disable symbol file feature through API
* @library /tools/lib
* @build ToolBox
* @run main T6430241
*/ */
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import javax.tools.*; import javax.tools.*;
import com.sun.source.util.JavacTask; import com.sun.source.util.JavacTask;
import com.sun.tools.javac.api.JavacTool; import com.sun.tools.javac.api.JavacTool;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.util.Context;
public class T6430241 { public class T6430241 {
public static void main(String... args) throws Exception { public static void main(String... args) throws Exception {
@ -56,7 +62,7 @@
emptyDir = new File("empty"); emptyDir = new File("empty");
emptyDir.mkdirs(); emptyDir.mkdirs();
bootClassPath = System.getProperty("sun.boot.class.path"); bootClassPath = createJar().getPath();
File srcDir = new File("src"); File srcDir = new File("src");
String test = "import sun.misc.Unsafe; class Test { }"; String test = "import sun.misc.Unsafe; class Test { }";
@ -67,9 +73,9 @@
void testCommandLine() throws Exception { void testCommandLine() throws Exception {
testCommandLine(true); testCommandLine(true);
testCommandLine(true, "-Xbootclasspath/p:" + emptyDir); testCommandLine(false, "-Xbootclasspath/p:" + emptyDir);
testCommandLine(false, "-Xbootclasspath:" + bootClassPath); testCommandLine(false, "-Xbootclasspath:" + bootClassPath);
testCommandLine(true, "-Xbootclasspath/a:" + emptyDir); testCommandLine(false, "-Xbootclasspath/a:" + emptyDir);
testCommandLine(false, "-XDignore.symbol.file"); testCommandLine(false, "-XDignore.symbol.file");
System.err.println(); System.err.println();
} }
@ -92,9 +98,9 @@
void testSimpleAPI() { void testSimpleAPI() {
testSimpleAPI(true); testSimpleAPI(true);
testSimpleAPI(true, "-Xbootclasspath/p:" + emptyDir); testSimpleAPI(false, "-Xbootclasspath/p:" + emptyDir);
testSimpleAPI(false, "-Xbootclasspath:" + bootClassPath); testSimpleAPI(false, "-Xbootclasspath:" + bootClassPath);
testSimpleAPI(true, "-Xbootclasspath/a:" + emptyDir); testSimpleAPI(false, "-Xbootclasspath/a:" + emptyDir);
testSimpleAPI(false, "-XDignore.symbol.file"); testSimpleAPI(false, "-XDignore.symbol.file");
System.err.println(); System.err.println();
} }
@ -154,6 +160,17 @@
//----- utility methods //----- utility methods
File createJar() throws IOException {
File f = new File("test.jar");
try (JavaFileManager fm = new JavacFileManager(new Context(), false, null)) {
ToolBox tb = new ToolBox();
tb.new JarTask(f.getPath())
.files(fm, StandardLocation.PLATFORM_CLASS_PATH, "java.lang.*", "sun.misc.*")
.run();
}
return f;
}
/** /**
* Create a file with given content. * Create a file with given content.
*/ */
@ -192,7 +209,7 @@
} }
/** /**
* Verify compilation succeeeded. * Verify compilation succeeded.
*/ */
void checkCompilationOK(boolean ok) { void checkCompilationOK(boolean ok) {
if (!ok) if (!ok)
@ -200,7 +217,7 @@
} }
/** /**
* Verify compilation succeeeded. * Verify compilation succeeded.
*/ */
void checkCompilationOK(int rc) { void checkCompilationOK(int rc) {
if (rc != 0) if (rc != 0)

View file

@ -52,8 +52,6 @@ public class T6877206 {
Set<String> foundJars = new TreeSet<String>(); Set<String> foundJars = new TreeSet<String>();
void run() throws Exception { void run() throws Exception {
File rt_jar = findRtJar();
// names for entries to be created in directories and jar files // names for entries to be created in directories and jar files
String[] entries = { "p/A.class", "p/resources/A-1.jpg" }; String[] entries = { "p/A.class", "p/resources/A-1.jpg" };
@ -66,19 +64,14 @@ public class T6877206 {
for (boolean useOptimizedZip: new boolean[] { false, true }) { for (boolean useOptimizedZip: new boolean[] { false, true }) {
test(createFileManager(useOptimizedZip), createJar("jar", entries), "p", entries.length); test(createFileManager(useOptimizedZip), createJar("jar", entries), "p", entries.length);
test(createFileManager(useOptimizedZip), createJar("jar jar", entries), "p", entries.length); test(createFileManager(useOptimizedZip), createJar("jar jar", entries), "p", entries.length);
for (boolean useSymbolFile: new boolean[] { false, true }) {
test(createFileManager(useOptimizedZip, useSymbolFile), rt_jar, "java.lang.ref", -1);
}
} }
// Verify that we hit all the impl classes we intended // Verify that we hit the files we intended
checkCoverage("classes", foundClasses, checkCoverage("classes", foundClasses,
"RegularFileObject", "SymbolFileObject", "ZipFileIndexFileObject", "ZipFileObject"); "RegularFileObject", "ZipFileIndexFileObject", "ZipFileObject");
// Verify that we hit the jar files we intended, specifically ct.sym as well as rt.jar // Verify that we hit the jar files we intended
checkCoverage("jar files", foundJars, checkCoverage("jar files", foundJars, "jar", "jar jar");
"ct.sym", "jar", "jar jar", "rt.jar");
} }
// use a new file manager for each test // use a new file manager for each test
@ -201,16 +194,6 @@ public class T6877206 {
return jar; return jar;
} }
File findRtJar() throws Exception {
File java_home = new File(System.getProperty("java.home"));
if (java_home.getName().equals("jre"))
java_home = java_home.getParentFile();
File rt_jar = new File(new File(new File(java_home, "jre"), "lib"), "rt.jar");
if (!rt_jar.exists())
throw new Exception("can't find rt.jar");
return rt_jar;
}
byte[] read(InputStream in) throws IOException { byte[] read(InputStream in) throws IOException {
byte[] data = new byte[1024]; byte[] data = new byte[1024];
int offset = 0; int offset = 0;

View file

@ -89,7 +89,7 @@ public class TestJavacTaskScanner extends ToolTester {
System.out.println("#parseTypeElements: " + numParseTypeElements); System.out.println("#parseTypeElements: " + numParseTypeElements);
System.out.println("#allMembers: " + numAllMembers); System.out.println("#allMembers: " + numAllMembers);
check(numTokens, "#Tokens", 1222); check(numTokens, "#Tokens", 1054);
check(numParseTypeElements, "#parseTypeElements", 158); check(numParseTypeElements, "#parseTypeElements", 158);
check(numAllMembers, "#allMembers", 52); check(numAllMembers, "#allMembers", 52);
} }
@ -138,30 +138,10 @@ public class TestJavacTaskScanner extends ToolTester {
public StandardJavaFileManager getLocalFileManager(JavaCompiler tool, public StandardJavaFileManager getLocalFileManager(JavaCompiler tool,
DiagnosticListener<JavaFileObject> dl, DiagnosticListener<JavaFileObject> dl,
Charset encoding) { Charset encoding) {
File javac_classes;
try {
final String javacMainClass = "com/sun/tools/javac/Main.class";
URL url = getClass().getClassLoader().getResource(javacMainClass);
if (url == null)
throw new Error("can't locate javac classes");
URI uri = url.toURI();
String scheme = uri.getScheme();
String ssp = uri.getSchemeSpecificPart();
if (scheme.equals("jar")) {
javac_classes = new File(new URI(ssp.substring(0, ssp.indexOf("!/"))));
} else if (scheme.equals("file")) {
javac_classes = new File(ssp.substring(0, ssp.indexOf(javacMainClass)));
} else
throw new Error("unknown URL: " + url);
} catch (URISyntaxException e) {
throw new Error(e);
}
System.err.println("javac_classes: " + javac_classes);
StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, encoding); StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, encoding);
try { try {
fm.setLocation(SOURCE_PATH, Arrays.asList(test_src)); fm.setLocation(SOURCE_PATH, Arrays.asList(test_src));
fm.setLocation(CLASS_PATH, join(test_class_path, Arrays.asList(javac_classes))); fm.setLocation(CLASS_PATH, test_class_path);
fm.setLocation(CLASS_OUTPUT, Arrays.asList(test_classes)); fm.setLocation(CLASS_OUTPUT, Arrays.asList(test_classes));
} catch (IOException e) { } catch (IOException e) {
throw new AssertionError(e); throw new AssertionError(e);

View file

@ -108,6 +108,7 @@ public class TestSearchPaths {
void testClassOutput() throws IOException { void testClassOutput() throws IOException {
String test = "testClassOutput"; String test = "testClassOutput";
System.err.println("test: " + test);
for (int i = 1; i <= 5; i++) { for (int i = 1; i <= 5; i++) {
File classes = createDir(test + "/" + i + "/classes"); File classes = createDir(test + "/" + i + "/classes");
@ -133,6 +134,7 @@ public class TestSearchPaths {
void testClassPath() throws IOException { void testClassPath() throws IOException {
String test = "testClassPath"; String test = "testClassPath";
System.err.println("test: " + test);
for (int i = 1; i <= 5; i++) { for (int i = 1; i <= 5; i++) {
File classes = createDir(test + "/" + i + "/classes"); File classes = createDir(test + "/" + i + "/classes");
@ -159,10 +161,12 @@ public class TestSearchPaths {
} }
tested.add(CLASS_PATH); tested.add(CLASS_PATH);
System.err.println();
} }
void testSourcePath() throws IOException { void testSourcePath() throws IOException {
String test = "testSourcePath"; String test = "testSourcePath";
System.err.println("test: " + test);
setLocation(CLASS_PATH); // empty setLocation(CLASS_PATH); // empty
for (int i = 1; i <= 5; i++) { for (int i = 1; i <= 5; i++) {
@ -188,10 +192,12 @@ public class TestSearchPaths {
} }
tested.add(SOURCE_PATH); tested.add(SOURCE_PATH);
System.err.println();
} }
void testPlatformClassPath() throws IOException { void testPlatformClassPath() throws IOException {
String test = "testPlatformClassPath"; String test = "testPlatformClassPath";
System.err.println("test: " + test);
List<File> defaultPath = getLocation(PLATFORM_CLASS_PATH); List<File> defaultPath = getLocation(PLATFORM_CLASS_PATH);
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@ -205,7 +211,10 @@ public class TestSearchPaths {
setLocation(CLASS_PATH); // empty setLocation(CLASS_PATH); // empty
setLocation(SOURCE_PATH); // empty setLocation(SOURCE_PATH); // empty
for (int i = 1; i <= 10; i++) { // FIXME: temporarily exclude cases referring to default bootclasspath
// for (int i = 1; i <= 10; i++) {
int[] cases = new int[] { 1, 2, 4, 5, 6, 7 };
for (int i : cases) {
File classes = createDir(test + "/" + i + "/classes"); File classes = createDir(test + "/" + i + "/classes");
File testJars = createDir(test + "/" + i + "/testJars"); File testJars = createDir(test + "/" + i + "/testJars");
File testClasses = createDir(test + "/" + i + "/testClasses"); File testClasses = createDir(test + "/" + i + "/testClasses");
@ -302,10 +311,14 @@ public class TestSearchPaths {
} }
tested.add(PLATFORM_CLASS_PATH); tested.add(PLATFORM_CLASS_PATH);
System.err.println();
} }
void testAnnotationProcessorPath() throws IOException { void testAnnotationProcessorPath() throws IOException {
String test = "testAnnotationProcessorPath"; String test = "testAnnotationProcessorPath";
System.err.println("test: " + test);
fileManager.setLocation(PLATFORM_CLASS_PATH, null);
String template = String template =
"import java.util.*;\n" "import java.util.*;\n"
@ -348,10 +361,12 @@ public class TestSearchPaths {
} }
tested.add(ANNOTATION_PROCESSOR_PATH); tested.add(ANNOTATION_PROCESSOR_PATH);
System.err.println();
} }
void testSourceOutput() throws IOException { void testSourceOutput() throws IOException {
String test = "testAnnotationProcessorPath"; String test = "testAnnotationProcessorPath";
System.err.println("test: " + test);
String source = String source =
"import java.io.*;\n" "import java.io.*;\n"
@ -407,10 +422,12 @@ public class TestSearchPaths {
checkFile(CLASS_OUTPUT, "G" + i + ".class"); checkFile(CLASS_OUTPUT, "G" + i + ".class");
} }
tested.add(SOURCE_OUTPUT); tested.add(SOURCE_OUTPUT);
System.err.println();
} }
void testNativeHeaderOutput() throws IOException { void testNativeHeaderOutput() throws IOException {
String test = "testNativeHeaderOutput"; String test = "testNativeHeaderOutput";
System.err.println("test: " + test);
for (int i = 1; i <= 5; i++) { for (int i = 1; i <= 5; i++) {
File classes = createDir(test + "/" + i + "/classes"); File classes = createDir(test + "/" + i + "/classes");
@ -433,6 +450,7 @@ public class TestSearchPaths {
} }
tested.add(StandardLocation.NATIVE_HEADER_OUTPUT); tested.add(StandardLocation.NATIVE_HEADER_OUTPUT);
System.err.println();
} }
List<String> getOptions(String... args) { List<String> getOptions(String... args) {

View file

@ -282,7 +282,8 @@ public class CheckResourceKeys {
// file names // file names
"ct.sym", "ct.sym",
"rt.jar", "rt.jar",
"tools.jar", "jfxrt.jar",
"bootmodules.jimage",
// -XD option names // -XD option names
"process.packages", "process.packages",
"ignore.symbol.file", "ignore.symbol.file",

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -37,7 +37,6 @@ public class CompileFail {
List<String> javacArgs = new ArrayList<>(); List<String> javacArgs = new ArrayList<>();
javacArgs.addAll(Arrays.asList( javacArgs.addAll(Arrays.asList(
"-bootclasspath", System.getProperty("sun.boot.class.path"),
"-d", "." "-d", "."
)); ));

View file

@ -1,169 +0,0 @@
/*
* Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 6906175 6915476 6915497 7006564
* @summary Path-based JavaFileManager
* @compile -g CompileTest.java HelloPathWorld.java
* @run main CompileTest
*/
import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.jar.*;
import javax.tools.*;
import com.sun.tools.javac.nio.*;
import com.sun.tools.javac.util.Context;
import java.nio.file.spi.FileSystemProvider;
public class CompileTest {
public static void main(String[] args) throws Exception {
new CompileTest().run();
}
public void run() throws Exception {
File rtDir = new File("rt.dir");
File javaHome = new File(System.getProperty("java.home"));
if (javaHome.getName().equals("jre"))
javaHome = javaHome.getParentFile();
File rtJar = new File(new File(new File(javaHome, "jre"), "lib"), "rt.jar");
expand(rtJar, rtDir);
String[] rtDir_opts = {
"-bootclasspath", rtDir.toString(),
"-classpath", "",
"-sourcepath", "",
"-extdirs", ""
};
test(rtDir_opts, "HelloPathWorld");
if (isJarFileSystemAvailable()) {
String[] rtJar_opts = {
"-bootclasspath", rtJar.toString(),
"-classpath", "",
"-sourcepath", "",
"-extdirs", ""
};
test(rtJar_opts, "HelloPathWorld");
String[] default_opts = { };
test(default_opts, "HelloPathWorld");
// finally, a non-trivial program
test(default_opts, "CompileTest");
} else
System.err.println("jar file system not available: test skipped");
}
void test(String[] opts, String className) throws Exception {
count++;
System.err.println("Test " + count + " " + Arrays.asList(opts) + " " + className);
Path testSrcDir = Paths.get(System.getProperty("test.src"));
Path testClassesDir = Paths.get(System.getProperty("test.classes"));
Path classes = Files.createDirectory(Paths.get("classes." + count));
Context ctx = new Context();
PathFileManager fm = new JavacPathFileManager(ctx, true, null);
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
List<String> options = new ArrayList<String>();
options.addAll(Arrays.asList(opts));
options.addAll(Arrays.asList(
"-verbose", "-XDverboseCompilePolicy",
"-d", classes.toString(),
"-g"
));
Iterable<? extends JavaFileObject> compilationUnits =
fm.getJavaFileObjects(testSrcDir.resolve(className + ".java"));
StringWriter sw = new StringWriter();
PrintWriter out = new PrintWriter(sw);
JavaCompiler.CompilationTask t =
compiler.getTask(out, fm, null, options, null, compilationUnits);
boolean ok = t.call();
System.err.println(sw.toString());
if (!ok) {
throw new Exception("compilation failed");
}
File expect = new File("classes." + count + "/" + className + ".class");
if (!expect.exists())
throw new Exception("expected file not found: " + expect);
// Note that we explicitly specify -g for compiling both the actual class and the expected class.
// This isolates the expected class from javac options that might be given to jtreg.
long expectedSize = new File(testClassesDir.toString(), className + ".class").length();
long actualSize = expect.length();
if (expectedSize != actualSize)
throw new Exception("wrong size found: " + actualSize + "; expected: " + expectedSize);
}
boolean isJarFileSystemAvailable() {
boolean result = false;
for (FileSystemProvider fsp: FileSystemProvider.installedProviders()) {
String scheme = fsp.getScheme();
System.err.println("Provider: " + scheme + " " + fsp);
if (scheme.equalsIgnoreCase("jar") || scheme.equalsIgnoreCase("zip"))
result = true;
}
return result;
}
void expand(File jar, File dir) throws IOException {
JarFile jarFile = new JarFile(jar);
try {
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry je = entries.nextElement();
if (!je.isDirectory()) {
copy(jarFile.getInputStream(je), new File(dir, je.getName()));
}
}
} finally {
jarFile.close();
}
}
void copy(InputStream in, File dest) throws IOException {
dest.getParentFile().mkdirs();
OutputStream out = new BufferedOutputStream(new FileOutputStream(dest));
try {
byte[] data = new byte[8192];
int n;
while ((n = in.read(data, 0, data.length)) > 0)
out.write(data, 0, n);
} finally {
out.close();
in.close();
}
}
void error(String message) {
System.err.println("Error: " + message);
errors++;
}
int errors;
int count;
}

View file

@ -1,28 +0,0 @@
/*
* Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
class HelloPathWorld {
public static void main(String... args) {
System.out.println("Hello World!");
}
}

View file

@ -59,10 +59,6 @@ public class Main {
static Elements elements; static Elements elements;
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
if (haveAltRt()) {
System.out.println("Warning: alt-rt.jar detected, test skipped");
return;
}
JavaCompiler tool = ToolProvider.getSystemJavaCompiler(); JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) {
fm.setLocation(CLASS_PATH, Collections.<File>emptyList()); fm.setLocation(CLASS_PATH, Collections.<File>emptyList());
@ -126,23 +122,4 @@ public class Main {
throw new AssertionError("Too few nested classes in PLATFORM_CLASS_PATH ;-)"); throw new AssertionError("Too few nested classes in PLATFORM_CLASS_PATH ;-)");
} }
} }
/*
* If -XX:+AggressiveOpts has been used to test, the option currently
* instructs the VM to prepend alt-rt.jar onto the bootclasspath. This
* overrides the default TreeMap implemation in rt.jar causing symbol
* resolution problems (caused by inconsistent inner class), although
* alt-rt.jar is being eliminated, we have this sanity check to detect this
* case and skip the test.
*/
static boolean haveAltRt() {
String bootClassPath = System.getProperty("sun.boot.class.path");
for (String cp : bootClassPath.split(File.pathSeparator)) {
if (cp.endsWith("alt-rt.jar")) {
System.err.println("Warning: detected alt-rt.jar in "
+ "sun.boot.class.path");
return true;
}
}
return false;
}
} }

View file

@ -56,8 +56,6 @@ public class TestWithXstdout {
static void run_javac(String... args) throws IOException, InterruptedException { static void run_javac(String... args) throws IOException, InterruptedException {
File javaHome = new File(System.getProperty("java.home")); File javaHome = new File(System.getProperty("java.home"));
if (javaHome.getName().equals("jre"))
javaHome = javaHome.getParentFile();
File javac = new File(new File(javaHome, "bin"), "javac"); File javac = new File(new File(javaHome, "bin"), "javac");
List<String> opts = new ArrayList<>(); List<String> opts = new ArrayList<>();

View file

@ -105,14 +105,18 @@ public class ProfileOptionTest {
JavaFileObject fo = new StringJavaFileObject("Test.java", "class Test { }"); JavaFileObject fo = new StringJavaFileObject("Test.java", "class Test { }");
for (Target t: Target.values()) { for (Target t: Target.values()) {
switch (t) { switch (t) {
case JDK1_1: case JDK1_2: // no equivalent -source case JDK1_1:
case JDK1_2:
case JDK1_3:
case JDK1_4:
case JDK1_5: // not supported
continue; continue;
} }
for (Profile p: Profile.values()) { for (Profile p: Profile.values()) {
List<String> opts = new ArrayList<>(); List<String> opts = new ArrayList<>();
opts.addAll(Arrays.asList("-source", t.name, "-target", t.name)); opts.addAll(Arrays.asList("-source", t.name, "-target", t.name));
opts.add("-Xlint:-options"); // dont warn about no -bootclasspath opts.add("-Xlint:-options"); // don't warn about no -bootclasspath
if (p != Profile.DEFAULT) if (p != Profile.DEFAULT)
opts.addAll(Arrays.asList("-profile", p.name)); opts.addAll(Arrays.asList("-profile", p.name));

View file

@ -76,14 +76,6 @@ public class T6942366 {
args.add("."); args.add(".");
} }
// use a very simple bootclasspath to avoid stuff jtreg might have put on path
File javaHome = new File(System.getProperty("java.home"));
File rt_jar = new File(javaHome, "lib/rt.jar");
if (!rt_jar.exists())
throw new Exception("rt.jar not found");
args.add("-bootclasspath");
args.add(rt_jar.getPath());
args.add(new File(testSrc, "Test.java").getPath()); args.add(new File(testSrc, "Test.java").getPath());
System.out.println("javadoc: " + args); System.out.println("javadoc: " + args);

View file

@ -47,8 +47,6 @@ public class TestUserDoclet extends Doclet {
/** Main test method. */ /** Main test method. */
void run() throws Exception { void run() throws Exception {
File javaHome = new File(System.getProperty("java.home")); File javaHome = new File(System.getProperty("java.home"));
if (javaHome.getName().equals("jre"))
javaHome = javaHome.getParentFile();
File javadoc = new File(new File(javaHome, "bin"), "javadoc"); File javadoc = new File(new File(javaHome, "bin"), "javadoc");
File testSrc = new File(System.getProperty("test.src")); File testSrc = new File(System.getProperty("test.src"));
File testClasses = new File(System.getProperty("test.classes")); File testClasses = new File(System.getProperty("test.classes"));

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -29,6 +29,7 @@
* @run main GetTask_FileManagerTest * @run main GetTask_FileManagerTest
*/ */
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Arrays; import java.util.Arrays;
@ -36,10 +37,14 @@ import java.util.Set;
import javax.tools.DocumentationTool; import javax.tools.DocumentationTool;
import javax.tools.DocumentationTool.DocumentationTask; import javax.tools.DocumentationTool.DocumentationTask;
import javax.tools.FileObject;
import javax.tools.ForwardingJavaFileManager;
import javax.tools.JavaFileObject; import javax.tools.JavaFileObject;
import javax.tools.JavaFileObject.Kind; import javax.tools.JavaFileObject.Kind;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider; import javax.tools.ToolProvider;
import com.sun.tools.javac.file.JavacFileManager;
import com.sun.tools.javac.nio.JavacPathFileManager; import com.sun.tools.javac.nio.JavacPathFileManager;
import com.sun.tools.javac.nio.PathFileManager; import com.sun.tools.javac.nio.PathFileManager;
import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.Context;
@ -60,11 +65,11 @@ public class GetTask_FileManagerTest extends APITest {
public void testFileManager() throws Exception { public void testFileManager() throws Exception {
JavaFileObject srcFile = createSimpleJavaFileObject(); JavaFileObject srcFile = createSimpleJavaFileObject();
DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
PathFileManager fm = new JavacPathFileManager(new Context(), false, null); StandardJavaFileManager fm = new TestFileManager();
Path outDir = getOutDir().toPath(); File outDir = getOutDir();
fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile); Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
DocumentationTask t = tool.getTask(null, fm, null, null, null, files); DocumentationTask t = tool.getTask(null, fm, null, null, Arrays.asList("-verbose"), files);
if (t.call()) { if (t.call()) {
System.err.println("task succeeded"); System.err.println("task succeeded");
checkFiles(outDir, standardExpectFiles); checkFiles(outDir, standardExpectFiles);
@ -80,7 +85,7 @@ public class GetTask_FileManagerTest extends APITest {
public void testBadFileManager() throws Exception { public void testBadFileManager() throws Exception {
JavaFileObject srcFile = createSimpleJavaFileObject(); JavaFileObject srcFile = createSimpleJavaFileObject();
DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); DocumentationTool tool = ToolProvider.getSystemDocumentationTool();
PathFileManager fm = new JavacPathFileManager(new Context(), false, null) { StandardJavaFileManager fm = new TestFileManager() {
@Override @Override
public Iterable<JavaFileObject> list(Location location, public Iterable<JavaFileObject> list(Location location,
String packageName, String packageName,
@ -90,8 +95,7 @@ public class GetTask_FileManagerTest extends APITest {
throw new UnexpectedError(); throw new UnexpectedError();
} }
}; };
Path outDir = getOutDir().toPath(); fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(getOutDir()));
fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir));
Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile); Iterable<? extends JavaFileObject> files = Arrays.asList(srcFile);
DocumentationTask t = tool.getTask(null, fm, null, null, null, files); DocumentationTask t = tool.getTask(null, fm, null, null, null, files);
try { try {
@ -108,4 +112,45 @@ public class GetTask_FileManagerTest extends APITest {
public static class UnexpectedError extends Error { } public static class UnexpectedError extends Error { }
/*
* A JavaFileManager which is not a JavacFileManager, even though it uses one internally for
* convenience.
*/
static class TestFileManager extends ForwardingJavaFileManager<StandardJavaFileManager>
implements StandardJavaFileManager {
TestFileManager() {
super(new JavacFileManager(new Context(), false, null));
}
@Override
public Iterable<? extends JavaFileObject> getJavaFileObjectsFromFiles(Iterable<? extends File> files) {
return fileManager.getJavaFileObjectsFromFiles(files);
}
@Override
public Iterable<? extends JavaFileObject> getJavaFileObjects(File... files) {
return fileManager.getJavaFileObjects(files);
}
@Override
public Iterable<? extends JavaFileObject> getJavaFileObjectsFromStrings(Iterable<String> names) {
return fileManager.getJavaFileObjectsFromStrings(names);
}
@Override
public Iterable<? extends JavaFileObject> getJavaFileObjects(String... names) {
return fileManager.getJavaFileObjects(names);
}
@Override
public void setLocation(Location location, Iterable<? extends File> path) throws IOException {
fileManager.setLocation(location, path);
}
@Override
public Iterable<? extends File> getLocation(Location location) {
return fileManager.getLocation(location);
}
}
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -73,14 +73,8 @@ public class T5070898
int runJavah() throws Exception { int runJavah() throws Exception {
List<String> cmd = new ArrayList<String>(); List<String> cmd = new ArrayList<String>();
File java_home = new File(System.getProperty("java.home")); File java_home = new File(System.getProperty("java.home"));
if (java_home.getName().equals("jre"))
java_home = java_home.getParentFile();
cmd.add(new File(new File(java_home, "bin"), "javah").getPath()); cmd.add(new File(new File(java_home, "bin"), "javah").getPath());
// ensure we run with the same bootclasspath as this test,
// in case this test is being run with -Xbootclasspath
cmd.add("-J-Xbootclasspath:" + System.getProperty("sun.boot.class.path"));
cmd.add("JavahTest"); cmd.add("JavahTest");
ProcessBuilder pb = new ProcessBuilder(cmd); ProcessBuilder pb = new ProcessBuilder(cmd);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -58,12 +58,8 @@ public class T6893943 {
void testCommand(String[] args, int expect_rc) throws Exception { void testCommand(String[] args, int expect_rc) throws Exception {
System.err.println("Test command: " + Arrays.asList(args)); System.err.println("Test command: " + Arrays.asList(args));
File javaHome = new File(System.getProperty("java.home")); File javaHome = new File(System.getProperty("java.home"));
if (javaHome.getName().equals("jre"))
javaHome = javaHome.getParentFile();
List<String> command = new ArrayList<String>(); List<String> command = new ArrayList<String>();
command.add(new File(new File(javaHome, "bin"), "javah").getPath()); command.add(new File(new File(javaHome, "bin"), "javah").getPath());
command.add("-J-Xbootclasspath:" + System.getProperty("sun.boot.class.path"));
command.addAll(Arrays.asList(args)); command.addAll(Arrays.asList(args));
//System.err.println("command: " + command); //System.err.println("command: " + command);

View file

@ -1,265 +0,0 @@
/*
* Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import com.sun.tools.classfile.AccessFlags;
import com.sun.tools.classfile.ClassFile;
import com.sun.tools.classfile.ConstantPoolException;
import com.sun.tools.classfile.Method;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.LinkedHashSet;
public class CompareTest {
String[][] testCases = {
{ },
{ "-jni" },
// { "-llni" },
};
public static void main(String... args) throws Exception {
new CompareTest().run(args);
}
public void run(String... args) throws Exception {
old_javah_cmd = new File(args[0]);
rt_jar = new File(args[1]);
Set<String> testClasses;
if (args.length > 2) {
testClasses = new LinkedHashSet<String>(Arrays.asList(Arrays.copyOfRange(args, 2, args.length)));
} else
testClasses = getNativeClasses(new JarFile(rt_jar));
for (String[] options: testCases) {
for (String name: testClasses) {
test(Arrays.asList(options), rt_jar, name);
}
}
if (errors == 0)
System.out.println(count + " tests passed");
else
throw new Exception(errors + "/" + count + " tests failed");
}
public void test(List<String> options, File bootclasspath, String className)
throws IOException, InterruptedException {
System.err.println("test: " + options + " " + className);
count++;
testOptions = options;
testClassName = className;
File oldOutDir = initDir(file(new File("old"), className));
int old_rc = old_javah(options, oldOutDir, bootclasspath, className);
File newOutDir = initDir(file(new File("new"), className));
int new_rc = new_javah(options, newOutDir, bootclasspath, className);
if (old_rc != new_rc)
error("return codes differ; old: " + old_rc + ", new: " + new_rc);
compare(oldOutDir, newOutDir);
}
int old_javah(List<String> options, File outDir, File bootclasspath, String className)
throws IOException, InterruptedException {
List<String> cmd = new ArrayList<String>();
cmd.add(old_javah_cmd.getPath());
cmd.addAll(options);
cmd.add("-d");
cmd.add(outDir.getPath());
cmd.add("-bootclasspath");
cmd.add(bootclasspath.getPath());
cmd.add(className);
System.err.println("old_javah: " + cmd);
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
StringBuilder sb = new StringBuilder();
while ((line = in.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
System.err.println("old javah out: " + sb.toString());
return p.waitFor();
}
int new_javah(List<String> options, File outDir, File bootclasspath, String className) {
List<String> args = new ArrayList<String>();
args.addAll(options);
args.add("-d");
args.add(outDir.getPath());
args.add("-bootclasspath");
args.add(bootclasspath.getPath());
args.add(className);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
int rc = com.sun.tools.javah.Main.run(args.toArray(new String[args.size()]), pw);
pw.close();
System.err.println("new javah out: " + sw.toString());
return rc;
}
Set<String> getNativeClasses(JarFile jar) throws IOException, ConstantPoolException {
System.err.println("getNativeClasses: " + jar.getName());
Set<String> results = new TreeSet<String>();
Enumeration<JarEntry> e = jar.entries();
while (e.hasMoreElements()) {
JarEntry je = e.nextElement();
if (isNativeClass(jar, je)) {
String name = je.getName();
results.add(name.substring(0, name.length() - 6).replace("/", "."));
}
}
return results;
}
boolean isNativeClass(JarFile jar, JarEntry entry) throws IOException, ConstantPoolException {
String name = entry.getName();
if (name.startsWith("META-INF") || !name.endsWith(".class"))
return false;
//String className = name.substring(0, name.length() - 6).replace("/", ".");
//System.err.println("check " + className);
InputStream in = jar.getInputStream(entry);
ClassFile cf = ClassFile.read(in);
for (int i = 0; i < cf.methods.length; i++) {
Method m = cf.methods[i];
if (m.access_flags.is(AccessFlags.ACC_NATIVE)) {
// System.err.println(className);
return true;
}
}
return false;
}
void compare(File f1, File f2) throws IOException {
if (f1.isFile() && f2.isFile())
compareFiles(f1, f2);
else if (f1.isDirectory() && f2.isDirectory())
compareDirectories(f1, f2);
else
error("files differ: "
+ f1 + " (" + getFileType(f1) + "), "
+ f2 + " (" + getFileType(f2) + ")");
}
void compareDirectories(File d1, File d2) throws IOException {
Set<String> list = new TreeSet<String>();
list.addAll(Arrays.asList(d1.list()));
list.addAll(Arrays.asList(d2.list()));
for (String c: list)
compare(new File(d1, c), new File(d2, c));
}
void compareFiles(File f1, File f2) throws IOException {
byte[] c1 = readFile(f1);
byte[] c2 = readFile(f2);
if (!Arrays.equals(c1, c2))
error("files differ: " + f1 + ", " + f2);
}
byte[] readFile(File file) throws IOException {
int size = (int) file.length();
byte[] data = new byte[size];
DataInputStream in = new DataInputStream(new FileInputStream(file));
try {
in.readFully(data);
} finally {
in.close();
}
return data;
}
String getFileType(File f) {
return f.isDirectory() ? "directory"
: f.isFile() ? "file"
: f.exists() ? "other"
: "not found";
}
/**
* Set up an empty directory.
*/
public File initDir(File dir) {
if (dir.exists())
deleteAll(dir);
dir.mkdirs();
return dir;
}
/**
* Delete a file or a directory (including all its contents).
*/
boolean deleteAll(File file) {
if (file.isDirectory()) {
for (File f: file.listFiles())
deleteAll(f);
}
return file.delete();
}
File file(File dir, String... path) {
File f = dir;
for (String p: path)
f = new File(f, p);
return f;
}
/**
* Report an error.
*/
void error(String msg, String... more) {
System.err.println("test: " + testOptions + " " + testClassName);
System.err.println("error: " + msg);
for (String s: more)
System.err.println(s);
errors++;
System.exit(1);
}
File old_javah_cmd;
File rt_jar;
List<String> testOptions;
String testClassName;
int count;
int errors;
}

View file

@ -1,86 +0,0 @@
/*
* Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import com.sun.tools.classfile.AccessFlags;
import com.sun.tools.classfile.ClassFile;
import com.sun.tools.classfile.ConstantPoolException;
import com.sun.tools.classfile.Method;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class FindNativeFiles {
public static void main(String[] args) throws IOException, ConstantPoolException {
new FindNativeFiles().run(args);
}
public void run(String[] args) throws IOException, ConstantPoolException {
JarFile jar = new JarFile(args[0]);
Set<JarEntry> entries = getNativeClasses(jar);
for (JarEntry e: entries) {
String name = e.getName();
String className = name.substring(0, name.length() - 6).replace("/", ".");
System.out.println(className);
}
}
Set<JarEntry> getNativeClasses(JarFile jar) throws IOException, ConstantPoolException {
Set<JarEntry> results = new TreeSet<JarEntry>(new Comparator<JarEntry>() {
public int compare(JarEntry o1, JarEntry o2) {
return o1.getName().compareTo(o2.getName());
}
});
Enumeration<JarEntry> e = jar.entries();
while (e.hasMoreElements()) {
JarEntry je = e.nextElement();
if (isNativeClass(jar, je))
results.add(je);
}
return results;
}
boolean isNativeClass(JarFile jar, JarEntry entry) throws IOException, ConstantPoolException {
String name = entry.getName();
if (name.startsWith("META-INF") || !name.endsWith(".class"))
return false;
//String className = name.substring(0, name.length() - 6).replace("/", ".");
//System.err.println("check " + className);
InputStream in = jar.getInputStream(entry);
ClassFile cf = ClassFile.read(in);
in.close();
for (int i = 0; i < cf.methods.length; i++) {
Method m = cf.methods[i];
if (m.access_flags.is(AccessFlags.ACC_NATIVE)) {
// System.err.println(className);
return true;
}
}
return false;
}
}

View file

@ -1,16 +0,0 @@
test/tools/javah/compareTest/README
This directory contains a program for comparing the output of new javah against the
output of JDK 6 or other older versions of javah.
It cannot be run automatically because of the need for the older version of javah
to compare against.
The test works by scanning a jar file, such as rt.jar, looking for all files with
native methods. It then runs both the old and new versions of javah on those
classes with native methods, and verifies that the results are character-for-character
identical.
To run the test, build langtools, then execute the script in the root langtools
directory, providing the location of the JDK to be tested. The default is
/opt/jdk/1.6.0.

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,19 +26,23 @@
* @test * @test
* @bug 6729471 * @bug 6729471
* @summary javap does not output inner interfaces of an interface * @summary javap does not output inner interfaces of an interface
* @library /tools/lib
* @build ToolBox
* @run main T6729471
*/ */
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
import java.util.*; import java.util.*;
import javax.tools.*;
public class T6729471 public class T6729471
{ {
public static void main(String... args) { public static void main(String... args) throws IOException {
new T6729471().run(); new T6729471().run();
} }
void run() { void run() throws IOException {
File testClasses = new File(System.getProperty("test.classes")); File testClasses = new File(System.getProperty("test.classes"));
// simple class // simple class
@ -57,34 +61,31 @@ public class T6729471
verify(new File(testClasses, "T6729471.class").toURI().toString(), verify(new File(testClasses, "T6729471.class").toURI().toString(),
"public static void main(java.lang.String...)"); "public static void main(java.lang.String...)");
// jar url: rt.jar // jar url
File java_home = new File(System.getProperty("java.home")); File testJar = createJar("test.jar", "java.util.*");
if (java_home.getName().equals("jre"))
java_home = java_home.getParentFile();
File rt_jar = new File(new File(new File(java_home, "jre"), "lib"), "rt.jar");
try { try {
verify("jar:" + rt_jar.toURL() + "!/java/util/Map.class", verify("jar:" + testJar.toURL() + "!/java/util/Map.class",
"public abstract boolean containsKey(java.lang.Object)"); "public abstract boolean containsKey(java.lang.Object)");
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
error(e.toString()); error(e.toString());
} }
// jar url: ct.sym, if it exists
File ct_sym = new File(new File(java_home, "lib"), "ct.sym");
if (ct_sym.exists()) {
try {
verify("jar:" + ct_sym.toURL() + "!/META-INF/sym/rt.jar/java/util/Map.class",
"public abstract boolean containsKey(java.lang.Object)");
} catch (MalformedURLException e) {
error(e.toString());
}
} else
System.err.println("warning: ct.sym not found");
if (errors > 0) if (errors > 0)
throw new Error(errors + " found."); throw new Error(errors + " found.");
} }
File createJar(String name, String... paths) throws IOException {
JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
try (JavaFileManager fm = comp.getStandardFileManager(null, null, null)) {
File f = new File(name);
ToolBox tb = new ToolBox();
tb.new JarTask(f.getPath())
.files(fm, StandardLocation.PLATFORM_CLASS_PATH, paths)
.run();
return f;
}
}
void verify(String className, String... expects) { void verify(String className, String... expects) {
String output = javap(className); String output = javap(className);
for (String expect: expects) { for (String expect: expects) {

View file

@ -57,8 +57,11 @@ public class WhitespaceTest {
if (line.endsWith(" ")) if (line.endsWith(" "))
error("line has trailing whitespace: " + line); error("line has trailing whitespace: " + line);
int comment = line.indexOf(doubleSlash); int comment = line.indexOf(doubleSlash);
if (comment > 0 && line.charAt(comment - 1) != ' ') if (comment > 0 && line.charAt(comment - 1) != ' ') {
// make allowance for URLs
if (!line.matches(".*\\bfile:/{3}.*"))
error("no space before comment: " + line); error("no space before comment: " + line);
}
if (line.matches(" +}")) if (line.matches(" +}"))
error("bad indentation: " + line); error("bad indentation: " + line);
} }

View file

@ -39,27 +39,6 @@ import java.util.*;
import java.util.regex.*; import java.util.regex.*;
public class APIDeps { public class APIDeps {
private static boolean symbolFileExist = initProfiles();
private static boolean initProfiles() {
// check if ct.sym exists; if not use the profiles.properties file
Path home = Paths.get(System.getProperty("java.home"));
if (home.endsWith("jre")) {
home = home.getParent();
}
Path ctsym = home.resolve("lib").resolve("ct.sym");
boolean symbolExists = ctsym.toFile().exists();
if (!symbolExists) {
Path testSrcProfiles =
Paths.get(System.getProperty("test.src", "."), "profiles.properties");
if (!testSrcProfiles.toFile().exists())
throw new Error(testSrcProfiles + " does not exist");
System.out.format("%s doesn't exist.%nUse %s to initialize profiles info%n",
ctsym, testSrcProfiles);
System.setProperty("jdeps.profiles", testSrcProfiles.toString());
}
return symbolExists;
}
public static void main(String... args) throws Exception { public static void main(String... args) throws Exception {
int errors = 0; int errors = 0;
errors += new APIDeps().run(); errors += new APIDeps().run();

View file

@ -41,27 +41,6 @@ import java.util.regex.*;
import static java.nio.file.StandardCopyOption.*; import static java.nio.file.StandardCopyOption.*;
public class Basic { public class Basic {
private static boolean symbolFileExist = initProfiles();
private static boolean initProfiles() {
// check if ct.sym exists; if not use the profiles.properties file
Path home = Paths.get(System.getProperty("java.home"));
if (home.endsWith("jre")) {
home = home.getParent();
}
Path ctsym = home.resolve("lib").resolve("ct.sym");
boolean symbolExists = ctsym.toFile().exists();
if (!symbolExists) {
Path testSrcProfiles =
Paths.get(System.getProperty("test.src", "."), "profiles.properties");
if (!testSrcProfiles.toFile().exists())
throw new Error(testSrcProfiles + " does not exist");
System.out.format("%s doesn't exist.%nUse %s to initialize profiles info%n",
ctsym, testSrcProfiles);
System.setProperty("jdeps.profiles", testSrcProfiles.toString());
}
return symbolExists;
}
public static void main(String... args) throws Exception { public static void main(String... args) throws Exception {
int errors = 0; int errors = 0;
errors += new Basic().run(); errors += new Basic().run();

View file

@ -41,27 +41,6 @@ import java.util.*;
import java.util.regex.*; import java.util.regex.*;
public class DotFileTest { public class DotFileTest {
private static boolean symbolFileExist = initProfiles();
private static boolean initProfiles() {
// check if ct.sym exists; if not use the profiles.properties file
Path home = Paths.get(System.getProperty("java.home"));
if (home.endsWith("jre")) {
home = home.getParent();
}
Path ctsym = home.resolve("lib").resolve("ct.sym");
boolean symbolExists = ctsym.toFile().exists();
if (!symbolExists) {
Path testSrcProfiles =
Paths.get(System.getProperty("test.src", "."), "profiles.properties");
if (!testSrcProfiles.toFile().exists())
throw new Error(testSrcProfiles + " does not exist");
System.out.format("%s doesn't exist.%nUse %s to initialize profiles info%n",
ctsym, testSrcProfiles);
System.setProperty("jdeps.profiles", testSrcProfiles.toString());
}
return symbolExists;
}
public static void main(String... args) throws Exception { public static void main(String... args) throws Exception {
int errors = 0; int errors = 0;
errors += new DotFileTest().run(); errors += new DotFileTest().run();

View file

@ -1,263 +0,0 @@
# This properties file is used for testing a JDK development build.
# No need to keep this properties file up to date as long as it covers
# the APIs used by the jdeps regression test.
profile.1.name = compact1
profile.1.packages = \
java.io \
java.lang \
java.lang.annotation \
java.lang.invoke \
java.lang.ref \
java.lang.reflect \
java.math \
java.net \
java.nio \
java.nio.channels \
java.nio.channels.spi \
java.nio.charset \
java.nio.charset.spi \
java.nio.file \
java.nio.file.attribute \
java.nio.file.spi \
java.security \
java.security.cert \
java.security.interfaces \
java.security.spec \
java.text \
java.text.spi \
java.util \
java.util.concurrent \
java.util.concurrent.atomic \
java.util.concurrent.locks \
java.util.jar \
java.util.logging \
java.util.regex \
java.util.spi \
java.util.zip \
javax.crypto \
javax.crypto.interfaces \
javax.crypto.spec \
javax.security.auth \
javax.security.auth.callback \
javax.security.auth.login \
javax.security.auth.spi \
javax.security.auth.x500 \
javax.net \
javax.net.ssl \
javax.security.cert \
\
com.sun.net.ssl \
com.sun.nio.file \
com.sun.nio.sctp \
com.sun.security.auth \
com.sun.security.auth.login
profile.2.name = compact2
profile.2.packages = \
java.sql \
javax.sql \
javax.xml \
javax.xml.datatype \
javax.xml.namespace \
javax.xml.parsers \
javax.xml.stream \
javax.xml.stream.events \
javax.xml.stream.util \
javax.xml.transform \
javax.xml.transform.dom \
javax.xml.transform.sax \
javax.xml.transform.stax \
javax.xml.transform.stream \
javax.xml.validation \
javax.xml.xpath \
org.w3c.dom \
org.w3c.dom.bootstrap \
org.w3c.dom.events \
org.w3c.dom.ls \
org.xml.sax \
org.xml.sax.ext \
org.xml.sax.helpers \
java.rmi \
java.rmi.activation \
java.rmi.dgc \
java.rmi.registry \
java.rmi.server \
javax.rmi.ssl \
javax.transaction \
javax.transaction.xa \
\
com.sun.net.httpserver \
com.sun.net.httpserver.spi
profile.3.name = compact3
profile.3.packages = \
java.lang.instrument \
java.lang.management \
java.security.acl \
java.util.prefs \
javax.management \
javax.management.loading \
javax.management.modelmbean \
javax.management.monitor \
javax.management.openmbean \
javax.management.relation \
javax.management.remote \
javax.management.remote.rmi \
javax.management.timer \
javax.naming \
javax.naming.directory \
javax.naming.event \
javax.naming.ldap \
javax.naming.spi \
javax.sql.rowset \
javax.sql.rowset.serial \
javax.sql.rowset.spi \
javax.security.auth.kerberos \
javax.security.sasl \
javax.script \
javax.smartcardio \
javax.xml.crypto \
javax.xml.crypto.dom \
javax.xml.crypto.dsig \
javax.xml.crypto.dsig.dom \
javax.xml.crypto.dsig.keyinfo \
javax.xml.crypto.dsig.spec \
javax.annotation.processing \
javax.lang.model \
javax.lang.model.element \
javax.lang.model.type \
javax.lang.model.util \
javax.tools \
javax.tools.annotation \
org.ietf.jgss \
\
com.sun.management \
com.sun.security.auth.callback \
com.sun.security.auth.module \
com.sun.security.jgss
profile.4.name = Full JRE
profile.4.packages = \
java.applet \
java.awt \
java.awt.color \
java.awt.datatransfer \
java.awt.dnd \
java.awt.dnd.peer \
java.awt.event \
java.awt.font \
java.awt.geom \
java.awt.im \
java.awt.im.spi \
java.awt.image \
java.awt.image.renderable \
java.awt.peer \
java.awt.print \
java.beans \
java.beans.beancontext \
javax.accessibility \
javax.imageio \
javax.imageio.event \
javax.imageio.metadata \
javax.imageio.plugins.bmp \
javax.imageio.plugins.jpeg \
javax.imageio.spi \
javax.imageio.stream \
javax.print \
javax.print.attribute \
javax.print.attribute.standard \
javax.print.event \
javax.sound.midi \
javax.sound.midi.spi \
javax.sound.sampled \
javax.sound.sampled.spi \
javax.swing \
javax.swing.border \
javax.swing.colorchooser \
javax.swing.event \
javax.swing.filechooser \
javax.swing.plaf \
javax.swing.plaf.basic \
javax.swing.plaf.metal \
javax.swing.plaf.multi \
javax.swing.plaf.nimbus \
javax.swing.plaf.synth \
javax.swing.table \
javax.swing.text \
javax.swing.text.html \
javax.swing.text.html.parser \
javax.swing.text.rtf \
javax.swing.tree \
javax.swing.undo \
javax.activation \
javax.jws \
javax.jws.soap \
javax.rmi \
javax.rmi.CORBA \
javax.xml.bind \
javax.xml.bind.annotation \
javax.xml.bind.annotation.adapters \
javax.xml.bind.attachment \
javax.xml.bind.helpers \
javax.xml.bind.util \
javax.xml.soap \
javax.xml.ws \
javax.xml.ws.handler \
javax.xml.ws.handler.soap \
javax.xml.ws.http \
javax.xml.ws.soap \
javax.xml.ws.spi \
javax.xml.ws.spi.http \
javax.xml.ws.wsaddressing \
javax.annotation \
org.omg.CORBA \
org.omg.CORBA.DynAnyPackage \
org.omg.CORBA.ORBPackage \
org.omg.CORBA.TypeCodePackage \
org.omg.CORBA.portable \
org.omg.CORBA_2_3 \
org.omg.CORBA_2_3.portable \
org.omg.CosNaming \
org.omg.CosNaming.NamingContextExtPackage \
org.omg.CosNaming.NamingContextPackage \
org.omg.Dynamic \
org.omg.DynamicAny \
org.omg.DynamicAny.DynAnyFactoryPackage \
org.omg.DynamicAny.DynAnyPackage \
org.omg.IOP \
org.omg.IOP.CodecFactoryPackage \
org.omg.IOP.CodecPackage \
org.omg.Messaging \
org.omg.PortableInterceptor \
org.omg.PortableInterceptor.ORBInitInfoPackage \
org.omg.PortableServer \
org.omg.PortableServer.CurrentPackage \
org.omg.PortableServer.POAManagerPackage \
org.omg.PortableServer.POAPackage \
org.omg.PortableServer.ServantLocatorPackage \
org.omg.PortableServer.portable \
org.omg.SendingContext \
org.omg.stub.java.rmi \
org.omg.stub.javax.management.remote.rmi
# Remaining JDK supported API
profile.5.name = JDK tools
profile.5.packages = \
com.sun.jdi \
com.sun.jdi.connect \
com.sun.jdi.connect.spi \
com.sun.jdi.event \
com.sun.jdi.request \
com.sun.javadoc \
com.sun.tools.doclets \
com.sun.tools.doctree \
com.sun.source.tree \
com.sun.source.util \
com.sun.tools.attach \
com.sun.tools.attach.spi \
com.sun.tools.jconsole \
com.sun.tools.javac \
com.sun.tools.javah \
com.sun.tools.javap \
com.sun.tools.javadoc \
com.sun.servicetag

View file

@ -1599,17 +1599,30 @@ public class ToolBox {
*/ */
private final Pattern jarEntry = Pattern.compile(".*!/(?:META-INF/sym/[^/]+/)?(.*)"); private final Pattern jarEntry = Pattern.compile(".*!/(?:META-INF/sym/[^/]+/)?(.*)");
/*
* A jrt: URL is of the form jrt:/module/package/file
*/
private final Pattern jrtEntry = Pattern.compile("/([^/]+)/(.*)");
private String guessPath(FileObject fo) { private String guessPath(FileObject fo) {
URI u = fo.toUri(); URI u = fo.toUri();
switch (u.getScheme()) { switch (u.getScheme()) {
case "jar": case "jar": {
Matcher m = jarEntry.matcher(u.getSchemeSpecificPart()); Matcher m = jarEntry.matcher(u.getSchemeSpecificPart());
if (m.matches()) { if (m.matches()) {
return m.group(1); return m.group(1);
} }
break; break;
} }
throw new IllegalArgumentException(fo.getName()); case "jrt": {
Matcher m = jrtEntry.matcher(u.getSchemeSpecificPart());
if (m.matches()) {
return m.group(2);
}
break;
}
}
throw new IllegalArgumentException(fo.getName() + "--" + fo.toUri());
} }
private void error(String message, Throwable t) { private void error(String message, Throwable t) {

View file

@ -35,6 +35,7 @@
import static util.OptionTestUtil.assertEquals; import static util.OptionTestUtil.assertEquals;
import static util.OptionTestUtil.checkFilesFound; import static util.OptionTestUtil.checkFilesFound;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@ -218,20 +219,20 @@ public class OptionDecoding {
// Test input paths // Test input paths
static void testSearchPaths() { static void testSearchPaths() {
List<String> i, x, iF, xF; List<String> i, x, iF, xF;
i = x = iF = xF = new ArrayList<>(); i = x = iF = xF = new ArrayList<>();
SourceLocation dir1 = new SourceLocation(Paths.get("dir1"), i, x, iF, xF); SourceLocation dir1 = new SourceLocation(Paths.get("dir1"), i, x, iF, xF);
SourceLocation dir2 = new SourceLocation(Paths.get("dir2"), i, x, iF, xF); SourceLocation dir2 = new SourceLocation(Paths.get("dir2"), i, x, iF, xF);
String dir1_PS_dir2 = "dir1" + File.pathSeparator + "dir2";
Options options = Options.parseArgs("-sourcepath", "dir1:dir2"); Options options = Options.parseArgs("-sourcepath", dir1_PS_dir2);
assertEquals(options.getSourceSearchPaths(), Arrays.asList(dir1, dir2)); assertEquals(options.getSourceSearchPaths(), Arrays.asList(dir1, dir2));
options = Options.parseArgs("-modulepath", "dir1:dir2"); options = Options.parseArgs("-modulepath", dir1_PS_dir2);
assertEquals(options.getModuleSearchPaths(), Arrays.asList(dir1, dir2)); assertEquals(options.getModuleSearchPaths(), Arrays.asList(dir1, dir2));
options = Options.parseArgs("-classpath", "dir1:dir2"); options = Options.parseArgs("-classpath", dir1_PS_dir2);
assertEquals(options.getClassSearchPath(), Arrays.asList(dir1, dir2)); assertEquals(options.getClassSearchPath(), Arrays.asList(dir1, dir2));
} }