diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/BundleContentSubstitutedLocalizationSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/BundleContentSubstitutedLocalizationSupport.java index 5a23e72535bf..ea7742149315 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/BundleContentSubstitutedLocalizationSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/BundleContentSubstitutedLocalizationSupport.java @@ -24,6 +24,7 @@ */ package com.oracle.svm.core.jdk.localization; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.ListResourceBundle; @@ -65,8 +66,8 @@ public class BundleContentSubstitutedLocalizationSupport extends LocalizationSup private final Map, StoredBundle> storedBundles = new ConcurrentHashMap<>(); - public BundleContentSubstitutedLocalizationSupport(Locale defaultLocale, Set locales, List requestedPatterns, ForkJoinPool pool) { - super(defaultLocale, locales); + public BundleContentSubstitutedLocalizationSupport(Locale defaultLocale, Set locales, Charset defaultCharset, List requestedPatterns, ForkJoinPool pool) { + super(defaultLocale, locales, defaultCharset); this.pool = pool; this.compressBundlesPatterns = parseCompressBundlePatterns(requestedPatterns); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationFeature.java index 61473859ebaf..2243cc09d93e 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationFeature.java @@ -28,6 +28,8 @@ import java.lang.reflect.Field; import java.nio.charset.Charset; +import java.nio.charset.IllegalCharsetNameException; +import java.nio.charset.StandardCharsets; import java.nio.charset.UnsupportedCharsetException; import java.text.spi.BreakIteratorProvider; import java.text.spi.CollatorProvider; @@ -134,6 +136,8 @@ public abstract class LocalizationFeature implements Feature { */ protected Locale defaultLocale = Locale.getDefault(); + private Charset defaultCharset; + protected Set allLocales; protected LocalizationSupport support; @@ -150,6 +154,9 @@ public static class Options { @Option(help = "Default locale of the image, by the default it is the same as the default locale of the image builder.", type = OptionType.User)// public static final HostedOptionKey DefaultLocale = new HostedOptionKey<>(Locale.getDefault().toLanguageTag()); + @Option(help = "Default charset of the image, by the default it is the same as the default charset of the image builder.", type = OptionType.User)// + public static final HostedOptionKey DefaultCharset = new HostedOptionKey<>(Charset.defaultCharset().name()); + @Option(help = "Comma separated list of locales to be included into the image. The default locale is included in the list automatically if not present.", type = OptionType.User)// public static final HostedOptionKey IncludeLocales = new HostedOptionKey<>(new LocatableMultiOptionValue.Strings()); @@ -228,6 +235,13 @@ public void afterRegistration(AfterRegistrationAccess access) { allLocales = processLocalesOption(); defaultLocale = parseLocaleFromTag(Options.DefaultLocale.getValue()); UserError.guarantee(defaultLocale != null, "Invalid default locale %s", Options.DefaultLocale.getValue()); + try { + defaultCharset = Charset.forName(Options.DefaultCharset.getValue()); + VMError.guarantee(defaultCharset.name().equals(Options.DefaultCharset.getValue()), + "Failed to locate charset " + Options.DefaultCharset.getValue() + ", instead " + defaultCharset.name() + " was provided"); + } catch (IllegalCharsetNameException | UnsupportedCharsetException ex) { + throw UserError.abort(ex, "Invalid default charset %s", Options.DefaultCharset.getValue()); + } allLocales.add(defaultLocale); support = selectLocalizationSupport(); ImageSingletons.add(LocalizationSupport.class, support); @@ -245,12 +259,12 @@ public void afterRegistration(AfterRegistrationAccess access) { @Platforms(Platform.HOSTED_ONLY.class) private LocalizationSupport selectLocalizationSupport() { if (optimizedMode) { - return new OptimizedLocalizationSupport(defaultLocale, allLocales); + return new OptimizedLocalizationSupport(defaultLocale, allLocales, defaultCharset); } else if (substituteLoadLookup) { List requestedPatterns = Options.LocalizationCompressBundles.getValue().values(); - return new BundleContentSubstitutedLocalizationSupport(defaultLocale, allLocales, requestedPatterns, compressionPool); + return new BundleContentSubstitutedLocalizationSupport(defaultLocale, allLocales, defaultCharset, requestedPatterns, compressionPool); } - return new LocalizationSupport(defaultLocale, allLocales); + return new LocalizationSupport(defaultLocale, allLocales, defaultCharset); } @Override @@ -317,19 +331,19 @@ private static Set processLocalesOption() { * more than this can add additional charsets. */ @Platforms(Platform.HOSTED_ONLY.class) - private static void addCharsets() { + private void addCharsets() { if (Options.AddAllCharsets.getValue()) { for (Charset c : Charset.availableCharsets().values()) { addCharset(c); } } else { - addCharset(Charset.defaultCharset()); - addCharset(Charset.forName("US-ASCII")); - addCharset(Charset.forName("ISO-8859-1")); - addCharset(Charset.forName("UTF-8")); - addCharset(Charset.forName("UTF-16BE")); - addCharset(Charset.forName("UTF-16LE")); - addCharset(Charset.forName("UTF-16")); + addCharset(defaultCharset); + addCharset(StandardCharsets.US_ASCII); + addCharset(StandardCharsets.ISO_8859_1); + addCharset(StandardCharsets.UTF_8); + addCharset(StandardCharsets.UTF_16BE); + addCharset(StandardCharsets.UTF_16LE); + addCharset(StandardCharsets.UTF_16); } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationSupport.java index cd601c0dcc46..f5a95b1cd59d 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationSupport.java @@ -63,9 +63,12 @@ public class LocalizationSupport { public final ResourceBundle.Control control = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT); - public LocalizationSupport(Locale defaultLocale, Set locales) { + public final Charset defaultCharset; + + public LocalizationSupport(Locale defaultLocale, Set locales, Charset defaultCharset) { this.defaultLocale = defaultLocale; this.allLocales = locales.toArray(new Locale[0]); + this.defaultCharset = defaultCharset; this.supportedLanguageTags = locales.stream().map(Locale::toString).collect(Collectors.toSet()); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/OptimizedLocalizationSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/OptimizedLocalizationSupport.java index 0ce86b49d2ea..d064ac0cf0c3 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/OptimizedLocalizationSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/OptimizedLocalizationSupport.java @@ -27,6 +27,7 @@ import com.oracle.svm.core.option.SubstrateOptionsParser; import org.graalvm.collections.Pair; +import java.nio.charset.Charset; import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -50,8 +51,8 @@ public class OptimizedLocalizationSupport extends LocalizationSupport { private final String includeResourceBundlesOption = SubstrateOptionsParser.commandArgument(LocalizationFeature.Options.IncludeResourceBundles, ""); - public OptimizedLocalizationSupport(Locale defaultLocale, Set locales) { - super(defaultLocale, locales); + public OptimizedLocalizationSupport(Locale defaultLocale, Set locales, Charset defaultCharset) { + super(defaultLocale, locales, defaultCharset); } /** diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/substitutions/Target_java_nio_charset_Charset.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/substitutions/Target_java_nio_charset_Charset.java index 1f3b52c8ddbd..47ee22a10192 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/substitutions/Target_java_nio_charset_Charset.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/substitutions/Target_java_nio_charset_Charset.java @@ -42,15 +42,9 @@ @SuppressWarnings({"unused"}) final class Target_java_nio_charset_Charset { - @Alias private static Charset defaultCharset; - @Substitute private static Charset defaultCharset() { - /* - * The default charset is initialized during native image generation and therefore always - * available without any checks. - */ - return defaultCharset; + return ImageSingletons.lookup(LocalizationSupport.class).defaultCharset; } @Substitute