# HG changeset patch # User naoto # Date 1466610692 25200 # Node ID 8c8f2162a4bcbbfa42b088e00636c9aa52ffbda9 # Parent 1e1d98dbb44b0b4009159733d4f03b675632ef49 8159781: jlink --include-locales fails with java.util.regex.PatternSyntaxException Reviewed-by: mchung, okutsu diff -r 1e1d98dbb44b -r 8c8f2162a4bc 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 22 09:21:06 2016 +0100 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java Wed Jun 22 08:51:32 2016 -0700 @@ -25,6 +25,7 @@ package jdk.tools.jlink.internal.plugins; import java.io.ByteArrayInputStream; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.IllformedLocaleException; @@ -81,15 +82,15 @@ "sun.util.resources.ext", "sun.util.resources.provider"); private static final String METAINFONAME = "LocaleDataMetaInfo"; - private static final String META_FILES = - "*module-info.class," + - "*LocaleDataProvider.class," + - "*" + METAINFONAME + ".class,"; - private static final String INCLUDE_LOCALE_FILES = - "*sun/text/resources/ext/[^\\/]+_%%.class," + - "*sun/util/resources/ext/[^\\/]+_%%.class," + - "*sun/text/resources/cldr/ext/[^\\/]+_%%.class," + - "*sun/util/resources/cldr/ext/[^\\/]+_%%.class,"; + private static final List META_FILES = List.of( + ".+module-info.class", + ".+LocaleDataProvider.class", + ".+" + METAINFONAME + ".class"); + private static final List INCLUDE_LOCALE_FILES = List.of( + ".+sun/text/resources/ext/[^_]+_", + ".+sun/util/resources/ext/[^_]+_", + ".+sun/text/resources/cldr/ext/[^_]+_", + ".+sun/util/resources/cldr/ext/[^_]+_"); private Predicate predicate; private String userParam; private List priorityList; @@ -203,15 +204,17 @@ String.format(PluginsResourceBundle.getMessage(NAME + ".nomatchinglocales"), userParam)); } - String value = META_FILES + filtered.stream() - .map(s -> includeLocaleFilePatterns(s)) - .collect(Collectors.joining(",")); + List value = Stream.concat( + META_FILES.stream(), + filtered.stream().flatMap(s -> includeLocaleFilePatterns(s).stream())) + .map(s -> "regex:" + s) + .collect(Collectors.toList()); predicate = ResourceFilter.includeFilter(value); } - private String includeLocaleFilePatterns(String tag) { + private List includeLocaleFilePatterns(String tag) { + List files = new ArrayList<>(); String pTag = tag.replaceAll("-", "_"); - String files = ""; int lastDelimiter = tag.length(); String isoSpecial = pTag.matches("^(he|yi|id).*") ? pTag.replaceFirst("he", "iw") @@ -221,11 +224,11 @@ // Add tag patterns including parents while (true) { pTag = pTag.substring(0, lastDelimiter); - files += INCLUDE_LOCALE_FILES.replaceAll("%%", pTag); + files.addAll(includeLocaleFiles(pTag)); if (!isoSpecial.isEmpty()) { isoSpecial = isoSpecial.substring(0, lastDelimiter); - files += INCLUDE_LOCALE_FILES.replaceAll("%%", isoSpecial); + files.addAll(includeLocaleFiles(isoSpecial)); } lastDelimiter = pTag.lastIndexOf('_'); @@ -237,31 +240,37 @@ final String lang = pTag; // Add possible special locales of the COMPAT provider - files += Set.of(jaJPJPTag, noNONYTag, thTHTHTag).stream() + Set.of(jaJPJPTag, noNONYTag, thTHTHTag).stream() .filter(stag -> lang.equals(stag.substring(0,2))) - .map(t -> INCLUDE_LOCALE_FILES.replaceAll("%%", t.replaceAll("-", "_"))) - .collect(Collectors.joining(",")); + .map(t -> includeLocaleFiles(t.replaceAll("-", "_"))) + .forEach(files::addAll); // Add possible UN.M49 files (unconditional for now) for each language - files += INCLUDE_LOCALE_FILES.replaceAll("%%", lang + "_[0-9]{3}"); + files.addAll(includeLocaleFiles(lang + "_[0-9]{3}")); if (!isoSpecial.isEmpty()) { - files += INCLUDE_LOCALE_FILES.replaceAll("%%", isoSpecial + "_[0-9]{3}"); + files.addAll(includeLocaleFiles(isoSpecial + "_[0-9]{3}")); } // Add Thai BreakIterator related data files if (lang.equals("th")) { - files += "*sun/text/resources/thai_dict," + - "*sun/text/resources/[^\\/]+BreakIteratorData_th,"; + files.add(".+sun/text/resources/thai_dict"); + files.add(".+sun/text/resources/[^_]+BreakIteratorData_th"); } // Add Taiwan resource bundles for Hong Kong if (tag.startsWith("zh-HK")) { - files += INCLUDE_LOCALE_FILES.replaceAll("%%", "zh_TW"); + files.addAll(includeLocaleFiles("zh_TW")); } return files; } + private List includeLocaleFiles(String localeStr) { + return INCLUDE_LOCALE_FILES.stream() + .map(s -> s + localeStr + ".class") + .collect(Collectors.toList()); + } + private boolean stripUnsupportedLocales(byte[] bytes, ClassReader cr) { char[] buf = new char[cr.getMaxStringLength()]; boolean[] modified = new boolean[1]; diff -r 1e1d98dbb44b -r 8c8f2162a4bc jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Wed Jun 22 09:21:06 2016 +0100 +++ b/jdk/test/ProblemList.txt Wed Jun 22 08:51:32 2016 -0700 @@ -387,8 +387,6 @@ # core_tools -tools/jlink/plugins/IncludeLocalesPluginTest.java 8159781 generic-all - tools/jlink/JLinkOptimTest.java 8159264 generic-all ############################################################################