< prev index next >

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin.java

Print this page
rev 14873 : imported patch 8159781

@@ -23,10 +23,11 @@
  * questions.
  */
 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;
 import java.util.Locale;
 import java.util.List;

@@ -79,19 +80,19 @@
         "sun.util.resources.cldr.ext",
         "sun.util.resources.cldr.provider",
         "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<String> META_FILES = List.of(
+        ".+module-info.class",
+        ".+LocaleDataProvider.class",
+        ".+" + METAINFONAME + ".class");
+    private static final List<String> 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<String> predicate;
     private String userParam;
     private List<Locale.LanguageRange> priorityList;
     private List<Locale> available;
     private List<String> filtered;

@@ -201,33 +202,35 @@
         if (filtered.isEmpty()) {
             throw new PluginException(
                 String.format(PluginsResourceBundle.getMessage(NAME + ".nomatchinglocales"), userParam));
         }
 
-        String value = META_FILES + filtered.stream()
-            .map(s -> includeLocaleFilePatterns(s))
-            .collect(Collectors.joining(","));
+        List<String> 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<String> includeLocaleFilePatterns(String tag) {
+        List<String> files = new ArrayList<>();
         String pTag = tag.replaceAll("-", "_");
-        String files = "";
         int lastDelimiter = tag.length();
         String isoSpecial = pTag.matches("^(he|yi|id).*") ?
                             pTag.replaceFirst("he", "iw")
                                 .replaceFirst("yi", "ji")
                                 .replaceFirst("id", "in") : "";
 
         // 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('_');
             if (lastDelimiter == -1) {
                 break;

@@ -235,35 +238,41 @@
         }
 
         final String lang = pTag;
 
         // Add possible special locales of the COMPAT provider
-        files += Set.of(jaJPJPTag, noNONYTag, thTHTHTag).stream()
+        files.addAll(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(","));
+            .flatMap(t -> includeLocaleFiles(t.replaceAll("-", "_")).stream())
+            .collect(Collectors.toList()));
 
         // 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<String> 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];
 
         IntStream.range(1, cr.getItemCount())
< prev index next >