# HG changeset patch # User jlaskey # Date 1466078993 10800 # Node ID 52db877f18db725f0a36ae5069ab0bef82da795f # Parent 347b1b47ce21672628b4b5462e88498deacb1946 8159206: All jlink or jmod tests failing Reviewed-by: alanb, mchung diff -r 347b1b47ce21 -r 52db877f18db jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtUtils.java --- a/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtUtils.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtUtils.java Thu Jun 16 09:09:53 2016 -0300 @@ -45,7 +45,7 @@ private static boolean isGlobMeta(char c) { return globMetaChars.indexOf(c) != -1; } - private static final char EOL = 0; //TBD + private static final char EOL = 0; private static char next(String glob, int i) { if (i < glob.length()) { return glob.charAt(i); diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Utils.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Utils.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/Utils.java Thu Jun 16 09:09:53 2016 -0300 @@ -28,77 +28,85 @@ import java.net.URI; import java.nio.file.FileSystem; import java.nio.file.FileSystems; +import java.nio.file.Path; import java.nio.file.PathMatcher; import java.util.ArrayList; +import java.util.Arrays; import java.util.Comparator; import java.util.List; -import java.util.function.Function; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; import jdk.tools.jlink.plugin.Plugin; +import jdk.tools.jlink.plugin.Plugin.Category; public class Utils { private Utils() {} + // jrt-fs file system + private static FileSystem JRT_FILE_SYSTEM; + // current module private static final Module THIS_MODULE = Utils.class.getModule(); - public static final Function listParser = (argument) -> { - String[] arguments = null; - if (argument != null) { - arguments = argument.split(","); - for (int i = 0; i < arguments.length; i++) { - arguments[i] = arguments[i].trim(); - } - } - return arguments; - }; + public static List parseList(String arguments) { + return Arrays.stream(arguments.split(",")) + .map((p) -> p.trim()) + .filter((p) -> !p.isEmpty()) + .collect(Collectors.toList()); + } - public static boolean isPostProcessor(Plugin.Category category) { - return category.equals(Plugin.Category.VERIFIER) - || category.equals(Plugin.Category.PROCESSOR) - || category.equals(Plugin.Category.PACKAGER); + public static boolean isPostProcessor(Category category) { + return category.equals(Category.VERIFIER) + || category.equals(Category.PROCESSOR) + || category.equals(Category.PACKAGER); } - public static boolean isPreProcessor(Plugin.Category category) { - return category.equals(Plugin.Category.COMPRESSOR) - || category.equals(Plugin.Category.FILTER) - || category.equals(Plugin.Category.MODULEINFO_TRANSFORMER) - || category.equals(Plugin.Category.SORTER) - || category.equals(Plugin.Category.TRANSFORMER) - || category.equals(Plugin.Category.METAINFO_ADDER); + public static boolean isPreProcessor(Category category) { + return category.equals(Category.COMPRESSOR) + || category.equals(Category.FILTER) + || category.equals(Category.MODULEINFO_TRANSFORMER) + || category.equals(Category.SORTER) + || category.equals(Category.TRANSFORMER) + || category.equals(Category.METAINFO_ADDER); } - public static boolean isPostProcessor(Plugin prov) { - if (prov.getType() != null) { - for (Plugin.Category pt : prov.getType()) { - if (pt instanceof Plugin.Category) { - return isPostProcessor(pt); - } - } + public static boolean isPostProcessor(Plugin provider) { + Set types = provider.getType(); + Objects.requireNonNull(types); + for (Category pt : types) { + return isPostProcessor(pt); } return false; } - public static boolean isPreProcessor(Plugin prov) { - if (prov.getType() != null) { - for (Plugin.Category pt : prov.getType()) { - if (pt instanceof Plugin.Category) { - return isPreProcessor(pt); - } - } + public static boolean isPreProcessor(Plugin provider) { + Set types = provider.getType(); + Objects.requireNonNull(types); + for (Category pt : types) { + return isPreProcessor(pt); } return false; } - public static Plugin.Category getCategory(Plugin provider) { - if (provider.getType() != null) { - for (Plugin.Category t : provider.getType()) { - if (t instanceof Plugin.Category) { - return t; - } + public static Category getCategory(Plugin provider) { + Set types = provider.getType(); + Objects.requireNonNull(types); + for (Category t : types) { + return t; + } + return null; + } + + public static List getPreProcessors(List plugins) { + List res = new ArrayList<>(); + for (Plugin p : plugins) { + if (isPreProcessor(p)) { + res.add(p); } } - return null; + return res; } public static List getPostProcessors(List plugins) { @@ -133,16 +141,6 @@ return res; } - public static List getPreProcessors(List plugins) { - List res = new ArrayList<>(); - for (Plugin p : plugins) { - if (isPreProcessor(p)) { - res.add(p); - } - } - return res; - } - public static boolean isFunctional(Plugin prov) { return prov.getState().contains(Plugin.State.FUNCTIONAL); } @@ -161,7 +159,11 @@ } public static FileSystem jrtFileSystem() { - return FileSystems.getFileSystem(URI.create("jrt:/")); + if (JRT_FILE_SYSTEM == null) { + JRT_FILE_SYSTEM = FileSystems.getFileSystem(URI.create("jrt:/")); + } + + return JRT_FILE_SYSTEM; } public static PathMatcher getPathMatcher(FileSystem fs, String pattern) { @@ -172,7 +174,11 @@ return fs.getPathMatcher(pattern); } - public static PathMatcher getPathMatcher(String pattern) { + public static PathMatcher getJRTFSPathMatcher(String pattern) { return getPathMatcher(jrtFileSystem(), pattern); } + + public static Path getJRTFSPath(String first, String... more) { + return jrtFileSystem().getPath(first, more); + } } diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultCompressPlugin.java Thu Jun 16 09:09:53 2016 -0300 @@ -24,8 +24,6 @@ */ package jdk.tools.jlink.internal.plugins; -import java.io.IOException; -import java.io.UncheckedIOException; import java.util.Collections; import java.util.HashSet; import java.util.Map; @@ -37,7 +35,6 @@ import jdk.tools.jlink.internal.ImagePluginStack; import jdk.tools.jlink.internal.ResourcePrevisitor; import jdk.tools.jlink.internal.StringTable; -import jdk.tools.jlink.internal.Utils; /** * @@ -103,33 +100,26 @@ @Override public void configure(Map config) { - try { - String filter = config.get(FILTER); - String[] patterns = filter == null ? null - : Utils.listParser.apply(filter); - ResourceFilter resFilter = new ResourceFilter(patterns); - String level = config.get(NAME); - if (level != null) { - switch (level) { - case LEVEL_0: - ss = new StringSharingPlugin(resFilter); - break; - case LEVEL_1: - zip = new ZipPlugin(resFilter); - break; - case LEVEL_2: - ss = new StringSharingPlugin(resFilter); - zip = new ZipPlugin(resFilter); - break; - default: - throw new IllegalArgumentException("Invalid compression level " + level); - } - } else { - ss = new StringSharingPlugin(resFilter); - zip = new ZipPlugin(resFilter); + ResourceFilter resFilter = ResourceFilter.includeFilter(config.get(FILTER)); + String level = config.get(NAME); + if (level != null) { + switch (level) { + case LEVEL_0: + ss = new StringSharingPlugin(resFilter); + break; + case LEVEL_1: + zip = new ZipPlugin(resFilter); + break; + case LEVEL_2: + ss = new StringSharingPlugin(resFilter); + zip = new ZipPlugin(resFilter); + break; + default: + throw new IllegalArgumentException("Invalid compression level " + level); } - } catch (IOException ex) { - throw new UncheckedIOException(ex); + } else { + ss = new StringSharingPlugin(resFilter); + zip = new ZipPlugin(resFilter); } } } diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin.java Thu Jun 16 09:09:53 2016 -0300 @@ -24,7 +24,6 @@ */ package jdk.tools.jlink.internal.plugins; -import java.io.IOException; import java.io.UncheckedIOException; import java.util.Collections; import java.util.HashSet; @@ -84,11 +83,6 @@ @Override public void configure(Map config) { - try { - String value = config.get(NAME); - predicate = new ResourceFilter(Utils.listParser.apply(value), true); - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } + predicate = ResourceFilter.excludeFilter(config.get(NAME)); } } diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludePlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludePlugin.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludePlugin.java Thu Jun 16 09:09:53 2016 -0300 @@ -24,17 +24,14 @@ */ package jdk.tools.jlink.internal.plugins; -import java.io.IOException; import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.function.Predicate; -import jdk.tools.jlink.plugin.PluginException; import jdk.tools.jlink.plugin.TransformerPlugin; import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.ModulePool; -import jdk.tools.jlink.internal.Utils; /** * @@ -84,11 +81,6 @@ @Override public void configure(Map config) { - try { - String val = config.get(NAME); - predicate = new ResourceFilter(Utils.listParser.apply(val), true); - } catch (IOException ex) { - throw new PluginException(ex); - } + predicate = ResourceFilter.excludeFilter(config.get(NAME)); } } diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ExcludeVMPlugin.java Thu Jun 16 09:09:53 2016 -0300 @@ -40,9 +40,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import jdk.tools.jlink.plugin.TransformerPlugin; -import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.ModulePool; -import jdk.tools.jlink.internal.Utils; import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.PluginException; @@ -184,38 +182,34 @@ @Override public void configure(Map config) { - try { - String value = config.get(NAME); - String exclude = ""; - switch (value) { - case ALL: { - // no filter. - keepAll = true; - break; - } - case CLIENT: { - target = Jvm.CLIENT; - exclude = "/java.base/native*server/*,/java.base/native*minimal/*"; - break; - } - case SERVER: { - target = Jvm.SERVER; - exclude = "/java.base/native*client/*,/java.base/native*minimal/*"; - break; - } - case MINIMAL: { - target = Jvm.MINIMAL; - exclude = "/java.base/native*server/*,/java.base/native*client/*"; - break; - } - default: { - throw new IllegalArgumentException("Unknown exclude VM option: " + value); - } + String value = config.get(NAME); + String exclude = ""; + switch (value) { + case ALL: { + // no filter. + keepAll = true; + break; + } + case CLIENT: { + target = Jvm.CLIENT; + exclude = "/java.base/native**server/**,/java.base/native**minimal/**"; + break; } - predicate = new ResourceFilter(Utils.listParser.apply(exclude), true); - } catch (IOException ex) { - throw new UncheckedIOException(ex); + case SERVER: { + target = Jvm.SERVER; + exclude = "/java.base/native**client/**,/java.base/native**minimal/**"; + break; + } + case MINIMAL: { + target = Jvm.MINIMAL; + exclude = "/java.base/native**server/**,/java.base/native**client/**"; + break; + } + default: { + throw new IllegalArgumentException("Unknown exclude VM option: " + value); + } } + predicate = ResourceFilter.excludeFilter(exclude); } private ModuleEntry handleJvmCfgFile(ModuleEntry orig, diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/FileCopierPlugin.java Thu Jun 16 09:09:53 2016 -0300 @@ -196,14 +196,13 @@ @Override public void configure(Map config) { - String val = config.get(NAME); - String[] argument = Utils.listParser.apply(val); - if (argument == null || argument.length == 0) { + List arguments = Utils.parseList(config.get(NAME)); + if (arguments.isEmpty()) { throw new RuntimeException("Invalid argument for " + NAME); } String javahome = System.getProperty("java.home"); - for (String a : argument) { + for (String a : arguments) { int i = a.indexOf("="); CopiedFile cf = new CopiedFile(); if (i == -1) { diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java Thu Jun 16 09:09:53 2016 -0300 @@ -25,8 +25,6 @@ package jdk.tools.jlink.internal.plugins; import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.UncheckedIOException; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -44,7 +42,6 @@ import jdk.internal.org.objectweb.asm.ClassReader; import jdk.tools.jlink.internal.ResourcePrevisitor; import jdk.tools.jlink.internal.StringTable; -import jdk.tools.jlink.internal.Utils; import jdk.tools.jlink.plugin.LinkModule; import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.PluginException; @@ -209,14 +206,10 @@ String.format(PluginsResourceBundle.getMessage(NAME + ".nomatchinglocales"), userParam)); } - try { - String value = META_FILES + filtered.stream() - .map(s -> includeLocaleFilePatterns(s)) - .collect(Collectors.joining(",")); - predicate = new ResourceFilter(Utils.listParser.apply(value), false); - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } + String value = META_FILES + filtered.stream() + .map(s -> includeLocaleFilePatterns(s)) + .collect(Collectors.joining(",")); + predicate = ResourceFilter.includeFilter(value); } private String includeLocaleFilePatterns(String tag) { diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OrderResourcesPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OrderResourcesPlugin.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/OrderResourcesPlugin.java Thu Jun 16 09:09:53 2016 -0300 @@ -167,8 +167,7 @@ @Override public void configure(Map config) { - String val = config.get(NAME); - String[] patterns = Utils.listParser.apply(val); + List patterns = Utils.parseList(config.get(NAME)); int ordinal = 0; for (String pattern : patterns) { diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin.java Thu Jun 16 09:09:53 2016 -0300 @@ -97,10 +97,9 @@ case "del": { // --release-info del:keys=openjdk,java_version - String[] keys = Utils.listParser.apply(config.get(KEYS)); - for (String k : keys) { + Utils.parseList(config.get(KEYS)).stream().forEach((k) -> { release.remove(k); - } + }); } break; diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ResourceFilter.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ResourceFilter.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ResourceFilter.java Thu Jun 16 09:09:53 2016 -0300 @@ -26,12 +26,13 @@ import java.io.File; import java.io.IOException; -import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.PathMatcher; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.function.Predicate; import jdk.tools.jlink.internal.Utils; import jdk.tools.jlink.plugin.PluginException; @@ -41,17 +42,14 @@ * Filter resource resources using path matcher. */ public class ResourceFilter implements Predicate { - private static final FileSystem JRT_FILE_SYSTEM = Utils.jrtFileSystem(); - - final boolean negate; - final List matchers; + private final static List EMPTY_LIST = Collections.emptyList(); - public ResourceFilter(String[] patterns) throws IOException { - this(patterns, false); - } + private final List matchers; + private final boolean include; + private final boolean otherwise; - public ResourceFilter(String[] patterns, boolean negate) throws IOException { - this.negate = negate; + private ResourceFilter(List patterns, boolean exclude) { + Objects.requireNonNull(patterns); this.matchers = new ArrayList<>(); for (String pattern : patterns) { @@ -67,28 +65,59 @@ throw new PluginException(ex); } - for (String line : lines) { - PathMatcher matcher = Utils.getPathMatcher(JRT_FILE_SYSTEM, line); - matchers.add(matcher); - } + lines.stream().forEach((line) -> { + matchers.add(Utils.getJRTFSPathMatcher(line.trim())); + }); + } else { + System.err.println("warning - the filter file " + file + + " is empty or not present."); } } else { - PathMatcher matcher = Utils.getPathMatcher(JRT_FILE_SYSTEM, pattern); - matchers.add(matcher); + matchers.add(Utils.getJRTFSPathMatcher(pattern)); } } + + this.include = !exclude; + this.otherwise = exclude || this.matchers.isEmpty(); + } + + public static ResourceFilter includeFilter(List patterns) { + Objects.requireNonNull(patterns); + return new ResourceFilter(patterns, false); + } + + public static ResourceFilter includeFilter(String patterns) { + if (patterns == null) { + return includeFilter(EMPTY_LIST); + } + + return includeFilter(Utils.parseList(patterns)); + } + + public static ResourceFilter excludeFilter(List patterns) { + Objects.requireNonNull(patterns); + return new ResourceFilter(patterns, true); + } + + public static ResourceFilter excludeFilter(String patterns) { + if (patterns == null) { + return excludeFilter(EMPTY_LIST); + } + + return excludeFilter(Utils.parseList(patterns)); } @Override public boolean test(String name) { - Path path = JRT_FILE_SYSTEM.getPath(name); + Objects.requireNonNull(name); + Path path = Utils.getJRTFSPath(name); for (PathMatcher matcher : matchers) { if (matcher.matches(path)) { - return !negate; + return include; } } - return negate; + return otherwise; } } diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StringSharingPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StringSharingPlugin.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StringSharingPlugin.java Thu Jun 16 09:09:53 2016 -0300 @@ -63,7 +63,6 @@ import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.internal.ResourcePrevisitor; import jdk.tools.jlink.internal.StringTable; -import jdk.tools.jlink.internal.Utils; /** * @@ -335,12 +334,8 @@ private Predicate predicate; - public StringSharingPlugin() throws IOException { - this(new String[0]); - } - - StringSharingPlugin(String[] patterns) throws IOException { - this(new ResourceFilter(patterns)); + public StringSharingPlugin() { + this((path) -> true); } StringSharingPlugin(Predicate predicate) { @@ -396,12 +391,7 @@ @Override public void configure(Map config) { - try { - String val = config.get(NAME); - predicate = new ResourceFilter(Utils.listParser.apply(val)); - } catch (IOException ex) { - throw new PluginException(ex); - } + predicate = ResourceFilter.includeFilter(config.get(NAME)); } @Override diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripDebugPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripDebugPlugin.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/StripDebugPlugin.java Thu Jun 16 09:09:53 2016 -0300 @@ -25,8 +25,7 @@ package jdk.tools.jlink.internal.plugins; import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.UncheckedIOException; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -42,15 +41,15 @@ * Strip debug attributes plugin */ public final class StripDebugPlugin implements TransformerPlugin { - private static final String[] PATTERNS = {"*.diz"}; public static final String NAME = "strip-debug"; private final Predicate predicate; + public StripDebugPlugin() { - try { - predicate = new ResourceFilter(PATTERNS); - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } + this((path) -> false); + } + + StripDebugPlugin(Predicate predicate) { + this.predicate = predicate; } @Override diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ZipPlugin.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ZipPlugin.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/ZipPlugin.java Thu Jun 16 09:09:53 2016 -0300 @@ -27,18 +27,17 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.function.Predicate; import java.util.zip.Deflater; -import jdk.tools.jlink.plugin.PluginException; import jdk.tools.jlink.internal.ModulePoolImpl; import jdk.tools.jlink.plugin.ModuleEntry; import jdk.tools.jlink.plugin.ModulePool; import jdk.tools.jlink.plugin.TransformerPlugin; -import jdk.tools.jlink.internal.Utils; /** * @@ -53,8 +52,8 @@ } - ZipPlugin(String[] patterns) throws IOException { - this(new ResourceFilter(patterns)); + ZipPlugin(String[] patterns) { + this(ResourceFilter.includeFilter(Arrays.asList(patterns))); } ZipPlugin(Predicate predicate) { @@ -90,12 +89,7 @@ @Override public void configure(Map config) { - try { - String val = config.get(NAME); - predicate = new ResourceFilter(Utils.listParser.apply(val)); - } catch (IOException ex) { - throw new PluginException(ex); - } + predicate = ResourceFilter.includeFilter(config.get(NAME)); } static byte[] compress(byte[] bytesIn) { diff -r 347b1b47ce21 -r 52db877f18db jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java Thu Jun 16 09:09:53 2016 -0300 @@ -103,6 +103,7 @@ import jdk.internal.module.ConfigurableModuleFinder.Phase; import jdk.internal.module.ModuleHashes; import jdk.internal.module.ModuleInfoExtender; +import jdk.tools.jlink.internal.Utils; import static java.util.stream.Collectors.joining; @@ -1091,13 +1092,7 @@ @Override public PathMatcher convert(String pattern) { try { - if (!pattern.startsWith("glob:") && - !pattern.startsWith("regex:")) { - pattern = "glob:" + pattern; - } - - return FileSystems.getDefault() - .getPathMatcher("glob:" + pattern); + return Utils.getPathMatcher(FileSystems.getDefault(), pattern); } catch (PatternSyntaxException e) { throw new CommandException("err.bad.pattern", pattern); } diff -r 347b1b47ce21 -r 52db877f18db jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/test/ProblemList.txt Thu Jun 16 09:09:53 2016 -0300 @@ -393,28 +393,6 @@ tools/jlink/plugins/IncludeLocalesPluginTest.java 8158272 generic-all -tools/jlink/basic/BasicTest.java 8159206 generic-all - -tools/jlink/IntegrationTest.java 8159206 generic-all - -tools/jlink/JLinkOptimTest.java 8159206 generic-all - -tools/jlink/JLinkTest.java 8159206 generic-all - -tools/jlink/plugins/CompressorPluginTest.java 8159206 generic-all - -tools/jlink/plugins/ExcludeFilesPluginTest.java 8159206 generic-all - -tools/jlink/plugins/ExcludePluginTest.java 8159206 generic-all - -tools/jlink/plugins/ExcludeVMPluginTest.java 8159206 generic-all - -tools/jlink/plugins/OrderResourcesPluginTest.java 8159206 generic-all - -tools/jlink/plugins/ResourceFilterTest.java 8159206 generic-all - -tools/jlink/plugins/StringSharingPluginTest.java 8159206 generic-all - -tools/jmod/JmodTest.java 8159206 generic-all +tools/jlink/JLinkOptimTest.java 8159264 generic-all ############################################################################ diff -r 347b1b47ce21 -r 52db877f18db jdk/test/tools/jlink/JLinkOptimTest.java --- a/jdk/test/tools/jlink/JLinkOptimTest.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/test/tools/jlink/JLinkOptimTest.java Thu Jun 16 09:09:53 2016 -0300 @@ -332,17 +332,6 @@ helper.checkImage(imageDir, "optim1", null, null); } - /*{ - Path dir = Paths.get("dir.log"); - Files.createDirectory(dir); - String[] userOptions = {"--class-optim=all:log=" + dir.toString()}; - helper.generateDefaultImage(userOptions, "optim1") - .assertFailure("java.io.FileNotFoundException: dir.log (Is a directory)"); - }*/ - /*{ - String[] userOptions = {"--class-optim", "UNKNOWN"}; - helper.generateDefaultImage(userOptions, "optim1").assertFailure("Unknown optimization"); - }*/ { String[] userOptions = {"--class-optim=forName-folding:log=./class-optim-log.txt"}; Path imageDir = helper.generateDefaultImage(userOptions, "optim1").assertSuccess(); diff -r 347b1b47ce21 -r 52db877f18db jdk/test/tools/jlink/plugins/CompressorPluginTest.java --- a/jdk/test/tools/jlink/plugins/CompressorPluginTest.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/test/tools/jlink/plugins/CompressorPluginTest.java Thu Jun 16 09:09:53 2016 -0300 @@ -103,13 +103,12 @@ // compress == ZIP + String sharing + filter options.setProperty(DefaultCompressPlugin.FILTER, - "*Exception.class,^*IOException.class"); + "**Exception.class"); checkCompress(classes, new DefaultCompressPlugin(), options, new ResourceDecompressorFactory[]{ new ZipDecompressorFactory(), new StringSharingDecompressorFactory() - }, Collections.singletonList(".*Exception.class"), - Collections.singletonList(".*IOException.class")); + }, Collections.singletonList(".*Exception.class")); // compress level 1 == ZIP Properties options1 = new Properties(); @@ -123,13 +122,12 @@ // compress level 1 == ZIP options1.setProperty(DefaultCompressPlugin.FILTER, - "*Exception.class,^*IOException.class"); + "**Exception.class"); checkCompress(classes, new DefaultCompressPlugin(), options1, new ResourceDecompressorFactory[]{ new ZipDecompressorFactory() - }, Collections.singletonList(".*Exception.class"), - Collections.singletonList(".*IOException.class")); + }, Collections.singletonList(".*Exception.class")); // compress level 2 == ZIP + String sharing Properties options2 = new Properties(); @@ -144,14 +142,13 @@ // compress level 2 == ZIP + String sharing + filter options2.setProperty(DefaultCompressPlugin.FILTER, - "*Exception.class,^*IOException.class"); + "**Exception.class"); checkCompress(classes, new DefaultCompressPlugin(), options2, new ResourceDecompressorFactory[]{ new ZipDecompressorFactory(), new StringSharingDecompressorFactory() - }, Collections.singletonList(".*Exception.class"), - Collections.singletonList(".*IOException.class")); + }, Collections.singletonList(".*Exception.class")); // compress level 0 == String sharing Properties options0 = new Properties(); @@ -164,13 +161,12 @@ // compress level 0 == String sharing + filter options0.setProperty(DefaultCompressPlugin.FILTER, - "*Exception.class,^*IOException.class"); + "**Exception.class"); checkCompress(classes, new DefaultCompressPlugin(), options0, new ResourceDecompressorFactory[]{ new StringSharingDecompressorFactory() - }, Collections.singletonList(".*Exception.class"), - Collections.singletonList(".*IOException.class")); + }, Collections.singletonList(".*Exception.class")); } private ModulePool gatherResources(Path module) throws Exception { @@ -226,23 +222,19 @@ private void checkCompress(ModulePool resources, Plugin prov, Properties config, ResourceDecompressorFactory[] factories) throws Exception { - checkCompress(resources, prov, config, factories, Collections.emptyList(), Collections.emptyList()); + checkCompress(resources, prov, config, factories, Collections.emptyList()); } private void checkCompress(ModulePool resources, Plugin prov, Properties config, ResourceDecompressorFactory[] factories, - List includes, - List excludes) throws Exception { + List includes) throws Exception { long[] original = new long[1]; long[] compressed = new long[1]; resources.entries().forEach(resource -> { List includesPatterns = includes.stream() .map(Pattern::compile) .collect(Collectors.toList()); - List excludesPatterns = excludes.stream() - .map(Pattern::compile) - .collect(Collectors.toList()); Map props = new HashMap<>(); if (config != null) { @@ -267,10 +259,10 @@ } }); inputResources.add(resource); - ModulePool compressedResources = applyCompressor(prov, inputResources, resource, includesPatterns, excludesPatterns); + ModulePool compressedResources = applyCompressor(prov, inputResources, resource, includesPatterns); original[0] += resource.getLength(); compressed[0] += compressedResources.findEntry(resource.getPath()).get().getLength(); - applyDecompressors(factories, inputResources, compressedResources, strings, includesPatterns, excludesPatterns); + applyDecompressors(factories, inputResources, compressedResources, strings, includesPatterns); }); String compressors = Stream.of(factories) .map(Object::getClass) @@ -286,8 +278,7 @@ private ModulePool applyCompressor(Plugin plugin, ModulePoolImpl inputResources, ModuleEntry res, - List includesPatterns, - List excludesPatterns) { + List includesPatterns) { TransformerPlugin compressor = (TransformerPlugin) plugin; ModulePool compressedModulePool = new ModulePoolImpl(ByteOrder.nativeOrder(), inputResources.getStringTable()); compressor.visit(inputResources, compressedModulePool); @@ -295,7 +286,7 @@ ModuleEntry compressed = compressedModulePool.findEntry(path).get(); CompressedResourceHeader header = CompressedResourceHeader.readFromResource(ByteOrder.nativeOrder(), compressed.getBytes()); - if (isIncluded(includesPatterns, excludesPatterns, path)) { + if (isIncluded(includesPatterns, path)) { if (header == null) { throw new AssertionError("Path should be compressed: " + path); } @@ -317,14 +308,13 @@ ModulePool inputResources, ModulePool compressedResources, Map strings, - List includesPatterns, - List excludesPatterns) { + List includesPatterns) { compressedResources.entries().forEach(compressed -> { CompressedResourceHeader header = CompressedResourceHeader.readFromResource( ByteOrder.nativeOrder(), compressed.getBytes()); String path = compressed.getPath(); ModuleEntry orig = inputResources.findEntry(path).get(); - if (!isIncluded(includesPatterns, excludesPatterns, path)) { + if (!isIncluded(includesPatterns, path)) { return; } byte[] decompressed = compressed.getBytes(); @@ -352,9 +342,8 @@ }); } - private boolean isIncluded(List includesPatterns, List excludesPatterns, String path) { - return !excludesPatterns.stream().anyMatch((pattern) -> pattern.matcher(path).matches()) - && (includesPatterns.isEmpty() - || includesPatterns.stream().anyMatch((pattern) -> pattern.matcher(path).matches())); + private boolean isIncluded(List includesPatterns, String path) { + return includesPatterns.isEmpty() || + includesPatterns.stream().anyMatch((pattern) -> pattern.matcher(path).matches()); } } diff -r 347b1b47ce21 -r 52db877f18db jdk/test/tools/jlink/plugins/ExcludeFilesPluginTest.java --- a/jdk/test/tools/jlink/plugins/ExcludeFilesPluginTest.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/test/tools/jlink/plugins/ExcludeFilesPluginTest.java Thu Jun 16 09:09:53 2016 -0300 @@ -48,23 +48,23 @@ } public void test() throws Exception { - checkFiles("*.jcov", "num/toto.jcov", "", true); - checkFiles("*.jcov", "/toto.jcov", "", true); - checkFiles("*.jcov", "toto.jcov/tutu/tata", "", false); + checkFiles("**.jcov", "num/toto.jcov", "", true); + checkFiles("**.jcov", "/toto.jcov", "", true); + checkFiles("**.jcov", "toto.jcov/tutu/tata", "", false); checkFiles("/java.base/*.jcov", "toto.jcov", "java.base", true); checkFiles("/java.base/toto.jcov", "iti.jcov", "t/java.base", false); checkFiles("/java.base/*/toto.jcov", "toto.jcov", "java.base", false); checkFiles("/java.base/*/toto.jcov", "tutu/toto.jcov", "java.base", true); - checkFiles("*/java.base/*/toto.jcov", "java.base/tutu/toto.jcov", "/tutu", true); + checkFiles("**/java.base/*/toto.jcov", "java.base/tutu/toto.jcov", "/tutu", true); - checkFiles("/*$*.properties", "tutu/Toto$Titi.properties", "java.base", true); - checkFiles("*$*.properties", "tutu/Toto$Titi.properties", "java.base", true); + checkFiles("/**$*.properties", "tutu/Toto$Titi.properties", "java.base", true); + checkFiles("**$*.properties", "tutu/Toto$Titi.properties", "java.base", true); // Excluded files list in a file File order = new File("files.exc"); order.createNewFile(); - Files.write(order.toPath(), "*.jcov".getBytes()); - checkFiles(order.getAbsolutePath(), "/num/toto.jcov", "", true); + Files.write(order.toPath(), "**.jcov".getBytes()); + checkFiles("@" + order.getAbsolutePath(), "/num/toto.jcov", "", true); } public void checkFiles(String s, String sample, String module, boolean exclude) throws Exception { diff -r 347b1b47ce21 -r 52db877f18db jdk/test/tools/jlink/plugins/ExcludePluginTest.java --- a/jdk/test/tools/jlink/plugins/ExcludePluginTest.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/test/tools/jlink/plugins/ExcludePluginTest.java Thu Jun 16 09:09:53 2016 -0300 @@ -47,27 +47,27 @@ } public void test() throws Exception { - check("*.jcov", "/num/toto.jcov", true); - check("*.jcov", "//toto.jcov", true); - check("*.jcov", "/toto.jcov/tutu/tata", false); + check("**.jcov", "/num/toto.jcov", true); + check("**.jcov", "//toto.jcov", true); + check("**.jcov", "/toto.jcov/tutu/tata", false); check("/java.base/*.jcov", "/java.base/toto.jcov", true); check("/java.base/toto.jcov", "t/java.base/iti.jcov", false); check("/java.base/*/toto.jcov", "/java.base/toto.jcov", false); check("/java.base/*/toto.jcov", "/java.base/tutu/toto.jcov", true); - check("*/java.base/*/toto.jcov", "/tutu/java.base/tutu/toto.jcov", true); - check("*/META-INF/*", "/META-INF/services/ MyProvider ", false); - check("*/META-INF/*", "/META-INF/services/MyProvider", false); - check("*/META-INF", " /META-INF/services/MyProvider", false); - check("*/META-INF/*", "/java.base//META-INF/services/MyProvider", true); + check("**/java.base/*/toto.jcov", "/tutu/java.base/tutu/toto.jcov", true); + check("/META-INF/**", "/META-INF/services/ MyProvider ", true); + check("/META-INF/**", "/META-INF/services/MyProvider", true); + check("**/META-INF", " /META-INF/services/MyProvider", false); + check("**/META-INF/**", "/java.base//META-INF/services/MyProvider", true); check("/java.base/*/Toto$Titi.class", "/java.base/tutu/Toto$Titi.class", true); - check("/*$*.class", "/java.base/tutu/Toto$Titi.class", true); - check("*$*.class", "/java.base/tutu/Toto$Titi.class", true); + check("/**$**.class", "/java.base/tutu/Toto$Titi.class", true); + check("**$**.class", "/java.base/tutu/Toto$Titi.class", true); // Excluded resource list in a file File order = new File("resources.exc"); order.createNewFile(); - Files.write(order.toPath(), "*.jcov".getBytes()); - check(order.getAbsolutePath(), "/num/toto.jcov", true); + Files.write(order.toPath(), "**.jcov".getBytes()); + check("@" + order.getAbsolutePath(), "/num/toto.jcov", true); } public void check(String s, String sample, boolean exclude) throws Exception { diff -r 347b1b47ce21 -r 52db877f18db jdk/test/tools/jlink/plugins/OrderResourcesPluginTest.java --- a/jdk/test/tools/jlink/plugins/OrderResourcesPluginTest.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/test/tools/jlink/plugins/OrderResourcesPluginTest.java Thu Jun 16 09:09:53 2016 -0300 @@ -92,7 +92,7 @@ { ModulePool out = new ModulePoolImpl(); Map config = new HashMap<>(); - config.put(OrderResourcesPlugin.NAME, "/zazou/*,*/module-info.class"); + config.put(OrderResourcesPlugin.NAME, "/zazou/**,**/module-info.class"); TransformerPlugin p = new OrderResourcesPlugin(); p.configure(config); p.visit(resources, out); diff -r 347b1b47ce21 -r 52db877f18db jdk/test/tools/jlink/plugins/ResourceFilterTest.java --- a/jdk/test/tools/jlink/plugins/ResourceFilterTest.java Wed Jun 15 23:24:08 2016 +0000 +++ b/jdk/test/tools/jlink/plugins/ResourceFilterTest.java Thu Jun 16 09:09:53 2016 -0300 @@ -24,13 +24,13 @@ /* * @test * @summary Test ResourceFilter class - * @author Jean-Francois Denise * @modules jdk.jlink/jdk.tools.jlink.internal.plugins * @run main ResourceFilterTest */ import java.io.File; import java.nio.file.Files; +import java.util.Arrays; import jdk.tools.jlink.internal.plugins.ResourceFilter; public class ResourceFilterTest { @@ -41,14 +41,16 @@ public void test() throws Exception { String[] samples = {"toto.jcov", "/module/META-INF/services/MyProvider"}; - String[] patterns = {"*.jcov", "*/META-INF/*"}; - ResourceFilter rf = new ResourceFilter(patterns); + String[] patterns = {"*.jcov", "**/META-INF/**", + "glob:*.jcov", "glob:**/META-INF/**", + "regex:.*\\.jcov", "regex:.*/META-INF/.*"}; + ResourceFilter rf = ResourceFilter.includeFilter(Arrays.asList(patterns)); for (String s : samples) { if (!rf.test(s)) { throw new Exception("Sample " + s + "not accepted"); } } - ResourceFilter rf2 = new ResourceFilter(patterns, true); + ResourceFilter rf2 = ResourceFilter.excludeFilter(Arrays.asList(patterns)); for (String s : samples) { if (rf2.test(s)) { throw new Exception("Sample " + s + " accepted"); @@ -64,14 +66,14 @@ } Files.write(resources.toPath(), builder.toString().getBytes()); - String[] input = {resources.getAbsolutePath()}; - ResourceFilter rf3 = new ResourceFilter(input); + String[] input = {"@" + resources.getAbsolutePath()}; + ResourceFilter rf3 = ResourceFilter.includeFilter(Arrays.asList(input)); for (String s : samples) { if (!rf3.test(s)) { throw new Exception("Sample " + s + "not accepted"); } } - ResourceFilter rf4 = new ResourceFilter(input, true); + ResourceFilter rf4 = ResourceFilter.excludeFilter(Arrays.asList(input)); for (String s : samples) { if (rf4.test(s)) { throw new Exception("Sample " + s + " accepted");