Skip to content

Commit 8063d3d

Browse files
committed
typeReached for resource bundles
1 parent 57dd966 commit 8063d3d

File tree

3 files changed

+44
-33
lines changed

3 files changed

+44
-33
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/localization/LocalizationSupport.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
import java.util.function.Function;
4646
import java.util.stream.Collectors;
4747

48-
import org.graalvm.collections.EconomicSet;
48+
import org.graalvm.collections.EconomicMap;
4949
import org.graalvm.nativeimage.ImageSingletons;
5050
import org.graalvm.nativeimage.Platform;
5151
import org.graalvm.nativeimage.Platforms;
@@ -56,6 +56,7 @@
5656

5757
import com.oracle.svm.core.ClassLoaderSupport;
5858
import com.oracle.svm.core.SubstrateUtil;
59+
import com.oracle.svm.core.configure.RuntimeConditionSet;
5960
import com.oracle.svm.core.jdk.Resources;
6061
import com.oracle.svm.core.util.VMError;
6162
import com.oracle.svm.util.ReflectionUtil;
@@ -87,7 +88,7 @@ public class LocalizationSupport {
8788

8889
public final Charset defaultCharset;
8990

90-
private final EconomicSet<String> registeredBundles = EconomicSet.create();
91+
private final EconomicMap<String, RuntimeConditionSet> registeredBundles = EconomicMap.create();
9192

9293
public LocalizationSupport(Locale defaultLocale, Set<Locale> locales, Charset defaultCharset) {
9394
this.defaultLocale = defaultLocale;
@@ -322,15 +323,17 @@ private static void registerNullaryConstructor(Class<?> bundleClass) {
322323
}
323324

324325
@Platforms(Platform.HOSTED_ONLY.class)
325-
public void registerBundleLookup(String baseName) {
326-
registeredBundles.add(baseName);
326+
public void registerBundleLookup(ConfigurationCondition condition, String baseName) {
327+
RuntimeConditionSet conditionSet = RuntimeConditionSet.emptySet();
328+
var registered = registeredBundles.putIfAbsent(baseName, conditionSet);
329+
(registered == null ? conditionSet : registered).addCondition(condition);
327330
}
328331

329332
public boolean isRegisteredBundleLookup(String baseName, Locale locale, Object controlOrStrategy) {
330333
if (baseName == null || locale == null || controlOrStrategy == null) {
331334
/* Those cases will throw a NullPointerException before any lookup */
332335
return true;
333336
}
334-
return registeredBundles.contains(baseName);
337+
return registeredBundles.containsKey(baseName) && registeredBundles.get(baseName).satisfied();
335338
}
336339
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,9 @@ public void addGlob(ConfigurationCondition condition, String module, String glob
197197

198198
public void addCondition(ConfigurationCondition condition, Module module, String resourcePath) {
199199
var conditionalResource = Resources.singleton().getResourceStorage().get(createStorageKey(module, resourcePath));
200-
conditionalResource.getConditions().addCondition(condition);
200+
if (conditionalResource != null) {
201+
conditionalResource.getConditions().addCondition(condition);
202+
}
201203
}
202204

203205
/* Adds single resource defined with its module and name */
@@ -231,7 +233,7 @@ public void ignoreResources(ConfigurationCondition condition, String pattern) {
231233

232234
@Override
233235
public void addResourceBundles(ConfigurationCondition condition, String name) {
234-
registerConditionalConfiguration(condition, (cnd) -> ImageSingletons.lookup(LocalizationFeature.class).prepareBundle(name));
236+
registerConditionalConfiguration(condition, (cnd) -> ImageSingletons.lookup(LocalizationFeature.class).prepareBundle(cnd, name));
235237
}
236238

237239
@Override
@@ -241,7 +243,7 @@ public void addClassBasedResourceBundle(ConfigurationCondition condition, String
241243

242244
@Override
243245
public void addResourceBundles(ConfigurationCondition condition, String basename, Collection<Locale> locales) {
244-
registerConditionalConfiguration(condition, (cnd) -> ImageSingletons.lookup(LocalizationFeature.class).prepareBundle(basename, locales));
246+
registerConditionalConfiguration(condition, (cnd) -> ImageSingletons.lookup(LocalizationFeature.class).prepareBundle(cnd, basename, locales));
245247
}
246248

247249
/*
@@ -451,6 +453,11 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
451453
resourceRegistryImpl().flushConditionalConfiguration(access);
452454
}
453455

456+
@Override
457+
public void duringAnalysis(DuringAnalysisAccess access) {
458+
resourceRegistryImpl().flushConditionalConfiguration(access);
459+
}
460+
454461
private static final class ResourceCollectorImpl extends ConditionalConfigurationRegistry implements ResourceCollector {
455462
private final Set<CompiledConditionalPattern> includePatterns;
456463
private final ResourcePattern[] excludePatterns;

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/localization/LocalizationFeature.java

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import org.graalvm.nativeimage.ImageSingletons;
6565
import org.graalvm.nativeimage.Platform;
6666
import org.graalvm.nativeimage.Platforms;
67+
import org.graalvm.nativeimage.impl.ConfigurationCondition;
6768
import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport;
6869

6970
import com.oracle.graal.pointsto.ObjectScanner;
@@ -512,7 +513,7 @@ protected void addResourceBundles() {
512513
* Locale data bundle class names do not contain underscores
513514
*/
514515
String baseName = e.getClassName().split("_")[0];
515-
prepareNegativeBundle(baseName, locale, true);
516+
prepareNegativeBundle(ConfigurationCondition.alwaysTrue(), baseName, locale, true);
516517
continue; /* No bundle for this `locale`. */
517518
}
518519
if (bundle instanceof ParallelListResourceBundle) {
@@ -529,14 +530,14 @@ protected void addResourceBundles() {
529530
* No eager loading of bundle content, so we need to include the
530531
* `sun.text.resources.FormatData` bundle supplement as well.
531532
*/
532-
prepareBundle("sun.text.resources.JavaTimeSupplementary");
533+
prepareBundle(ConfigurationCondition.alwaysTrue(), "sun.text.resources.JavaTimeSupplementary");
533534
}
534535

535536
final String[] alwaysRegisteredResourceBundles = new String[]{
536537
"sun.util.logging.resources.logging"
537538
};
538539
for (String bundleName : alwaysRegisteredResourceBundles) {
539-
prepareBundle(bundleName);
540+
prepareBundle(ConfigurationCondition.alwaysTrue(), bundleName);
540541
}
541542

542543
for (String bundleName : Options.IncludeResourceBundles.getValue().values()) {
@@ -549,7 +550,7 @@ private void processRequestedBundle(String input) {
549550
int splitIndex = input.indexOf('_');
550551
boolean specificLocaleRequested = splitIndex != -1;
551552
if (!specificLocaleRequested) {
552-
prepareBundle(input, allLocales);
553+
prepareBundle(ConfigurationCondition.alwaysTrue(), input, allLocales);
553554
return;
554555
}
555556
Locale locale = splitIndex + 1 < input.length() ? LocalizationSupport.parseLocaleFromTag(input.substring(splitIndex + 1)) : Locale.ROOT;
@@ -559,7 +560,7 @@ private void processRequestedBundle(String input) {
559560
}
560561
/*- Get rid of locale specific suffix. */
561562
String baseName = input.substring(0, splitIndex);
562-
prepareBundle(baseName, Collections.singletonList(locale));
563+
prepareBundle(ConfigurationCondition.alwaysTrue(), baseName, Collections.singletonList(locale));
563564
}
564565

565566
@Platforms(Platform.HOSTED_ONLY.class)
@@ -572,8 +573,8 @@ public void prepareClassResourceBundle(String basename, String className) {
572573
}
573574

574575
@Platforms(Platform.HOSTED_ONLY.class)
575-
public void prepareBundle(String baseName) {
576-
prepareBundle(baseName, allLocales);
576+
public void prepareBundle(ConfigurationCondition condition, String baseName) {
577+
prepareBundle(condition, baseName, allLocales);
577578
}
578579

579580
private static final String[] RESOURCE_EXTENSION_PREFIXES = new String[]{
@@ -584,37 +585,37 @@ public void prepareBundle(String baseName) {
584585
};
585586

586587
@Platforms(Platform.HOSTED_ONLY.class)
587-
public void prepareBundle(String baseName, Collection<Locale> wantedLocales) {
588-
prepareBundleInternal(baseName, wantedLocales);
588+
public void prepareBundle(ConfigurationCondition condition, String baseName, Collection<Locale> wantedLocales) {
589+
prepareBundleInternal(condition, baseName, wantedLocales);
589590

590591
String alternativeBundleName = null;
591-
for (String resourceExtentionPrefix : RESOURCE_EXTENSION_PREFIXES) {
592-
if (baseName.startsWith(resourceExtentionPrefix) && !baseName.startsWith(resourceExtentionPrefix + ".ext")) {
593-
alternativeBundleName = baseName.replace(resourceExtentionPrefix, resourceExtentionPrefix + ".ext");
592+
for (String resourceExtensionPrefix : RESOURCE_EXTENSION_PREFIXES) {
593+
if (baseName.startsWith(resourceExtensionPrefix) && !baseName.startsWith(resourceExtensionPrefix + ".ext")) {
594+
alternativeBundleName = baseName.replace(resourceExtensionPrefix, resourceExtensionPrefix + ".ext");
594595
break;
595596
}
596597
}
597598
if (alternativeBundleName != null) {
598-
prepareBundleInternal(alternativeBundleName, wantedLocales);
599+
prepareBundleInternal(condition, alternativeBundleName, wantedLocales);
599600
}
600601
}
601602

602-
private void prepareBundleInternal(String baseName, Collection<Locale> wantedLocales) {
603+
private void prepareBundleInternal(ConfigurationCondition condition, String baseName, Collection<Locale> wantedLocales) {
603604
boolean somethingFound = false;
604605
for (Locale locale : wantedLocales) {
605-
support.registerBundleLookup(baseName);
606+
support.registerBundleLookup(condition, baseName);
606607
List<ResourceBundle> resourceBundle;
607608
try {
608609
resourceBundle = ImageSingletons.lookup(ClassLoaderSupport.class).getResourceBundle(baseName, locale);
609610
} catch (MissingResourceException mre) {
610611
for (Locale candidateLocale : support.control.getCandidateLocales(baseName, locale)) {
611-
prepareNegativeBundle(baseName, candidateLocale, false);
612+
prepareNegativeBundle(condition, baseName, candidateLocale, false);
612613
}
613614
continue;
614615
}
615616
somethingFound |= !resourceBundle.isEmpty();
616617
for (ResourceBundle bundle : resourceBundle) {
617-
prepareBundle(baseName, bundle, locale, false);
618+
prepareBundle(condition, baseName, bundle, locale, false);
618619
}
619620
}
620621

@@ -643,33 +644,33 @@ private void prepareBundleInternal(String baseName, Collection<Locale> wantedLoc
643644
"If the bundle is part of a module, verify the bundle name is a fully qualified class name. Otherwise " +
644645
"verify the bundle path is accessible in the classpath.";
645646
trace(errorMessage);
646-
prepareNegativeBundle(baseName, Locale.ROOT, false);
647+
prepareNegativeBundle(condition, baseName, Locale.ROOT, false);
647648
for (String language : wantedLocales.stream().map(Locale::getLanguage).collect(Collectors.toSet())) {
648-
prepareNegativeBundle(baseName, Locale.of(language), false);
649+
prepareNegativeBundle(condition, baseName, Locale.of(language), false);
649650
}
650651
for (Locale locale : wantedLocales) {
651652
if (!locale.getCountry().isEmpty()) {
652-
prepareNegativeBundle(baseName, locale, false);
653+
prepareNegativeBundle(condition, baseName, locale, false);
653654
}
654655
}
655656
}
656657
}
657658

658659
@Platforms(Platform.HOSTED_ONLY.class)
659-
protected void prepareNegativeBundle(String baseName, Locale locale, boolean jdkBundle) {
660-
support.registerBundleLookup(baseName);
660+
protected void prepareNegativeBundle(ConfigurationCondition condition, String baseName, Locale locale, boolean jdkBundle) {
661+
support.registerBundleLookup(condition, baseName);
661662
support.registerRequiredReflectionAndResourcesForBundleAndLocale(baseName, locale, jdkBundle);
662663
}
663664

664665
@Platforms(Platform.HOSTED_ONLY.class)
665666
protected void prepareJDKBundle(ResourceBundle bundle, Locale locale) {
666667
String baseName = bundle.getBaseBundleName();
667-
prepareBundle(baseName, bundle, locale, true);
668+
prepareBundle(ConfigurationCondition.alwaysTrue(), baseName, bundle, locale, true);
668669
}
669670

670671
@Platforms(Platform.HOSTED_ONLY.class)
671-
private void prepareBundle(String bundleName, ResourceBundle bundle, Locale locale, boolean jdkBundle) {
672-
trace("Adding bundle " + bundleName + ", locale " + locale);
672+
private void prepareBundle(ConfigurationCondition condition, String bundleName, ResourceBundle bundle, Locale locale, boolean jdkBundle) {
673+
trace("Adding bundle " + bundleName + ", locale " + locale + " with condition " + condition);
673674
/*
674675
* Ensure that the bundle contents are loaded. We need to walk the whole bundle parent chain
675676
* down to the root.

0 commit comments

Comments
 (0)