Skip to content

Commit 2b18eff

Browse files
committed
Consolidate RuntimeResourceAccess API to bare minimum
1 parent 3ed3cc5 commit 2b18eff

File tree

10 files changed

+82
-63
lines changed

10 files changed

+82
-63
lines changed

sdk/src/org.graalvm.nativeimage/snapshot.sigtest

+3-4
Original file line numberDiff line numberDiff line change
@@ -1016,10 +1016,9 @@ meth public !varargs static void register(java.lang.Class<?>[])
10161016
supr java.lang.Object
10171017

10181018
CLSS public final org.graalvm.nativeimage.hosted.RuntimeResourceAccess
1019-
meth public static void includeResources(java.lang.String)
1020-
meth public static void excludeResources(java.lang.String)
1021-
meth public static void addResourceBundles(java.lang.String,java.util.Locale[])
1022-
meth public static void addResourceBundles(java.lang.String)
1019+
meth public static void addResource(java.lang.Module,java.lang.String)
1020+
meth public static void addResourceBundle(java.lang.Module,java.lang.String,java.util.Locale[])
1021+
meth public static void addResourceBundle(java.lang.Module,java.lang.String)
10231022
supr java.lang.Object
10241023

10251024
CLSS public abstract interface org.graalvm.nativeimage.impl.InternalPlatform

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java

+24-26
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242

4343
import java.util.Arrays;
4444
import java.util.Locale;
45+
import java.util.Objects;
46+
import java.util.regex.Pattern;
4547

4648
import org.graalvm.nativeimage.ImageSingletons;
4749
import org.graalvm.nativeimage.Platform;
@@ -59,49 +61,45 @@
5961
public final class RuntimeResourceAccess {
6062

6163
/**
62-
* Make Java resources that are matched by a {@code pattern} available at run time. If the given
63-
* {@code pattern} starts with {@code <module-name>:} then the pattern that follows will only
64-
* match resources from Java module named {@code <module-name>}.
64+
* Make Java resource {@code resourcePath} from {@code module} available at run time. If the
65+
* given {@code module} is unnamed, the resource is looked up on the classpath instead.
6566
*
6667
* @since 22.3
6768
*/
68-
public static void includeResources(String pattern) {
69-
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(), pattern);
69+
public static void addResource(Module module, String resourcePath) {
70+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(),
71+
withModuleName(module, Pattern.quote(resourcePath)));
7072
}
7173

7274
/**
73-
* Ensure Java resources that are matched by a {@code pattern} will never be available at run
74-
* time. If the given {@code pattern} starts with {@code <module-name>:} then the pattern that
75-
* follows will only match resources from Java module named {@code <module-name>}.
75+
* Make Java ResourceBundle that is specified by a {@code baseBundleName} and {@code locales}
76+
* from module {@code module} available at run time. If the given {@code module} is unnamed, the
77+
* ResourceBundle is looked up on the classpath instead.
7678
*
7779
* @since 22.3
7880
*/
79-
public static void excludeResources(String pattern) {
80-
ImageSingletons.lookup(RuntimeResourceSupport.class).ignoreResources(ConfigurationCondition.alwaysTrue(), pattern);
81+
public static void addResourceBundle(Module module, String baseBundleName, Locale[] locales) {
82+
Objects.requireNonNull(locales);
83+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResourceBundles(ConfigurationCondition.alwaysTrue(),
84+
withModuleName(module, baseBundleName), Arrays.asList(locales));
8185
}
8286

8387
/**
84-
* Make Java ResourceBundles that are specified by a {@code baseBundleName} and {@code locales}
85-
* available at run time. If the given {@code baseBundleName} starts with {@code <module-name>:}
86-
* then only the ResourceBundles from Java module named {@code <module-name>} will be added
87-
* (i.e. ResourceBundles with the same name from other modules will not be added).
88+
* Make Java ResourceBundle that is specified by a {@code bundleName} from module {@code module}
89+
* available at run time. If the given {@code module} is unnamed, the ResourceBundle is looked
90+
* up on the classpath instead.
8891
*
8992
* @since 22.3
9093
*/
91-
public static void addResourceBundles(String baseBundleName, Locale[] locales) {
92-
ImageSingletons.lookup(RuntimeResourceSupport.class).addResourceBundles(ConfigurationCondition.alwaysTrue(), baseBundleName, Arrays.asList(locales));
94+
public static void addResourceBundle(Module module, String bundleName) {
95+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResourceBundles(ConfigurationCondition.alwaysTrue(),
96+
withModuleName(module, bundleName));
9397
}
9498

95-
/**
96-
* Make Java ResourceBundles that are specified by a {@code bundleName} available at run time.
97-
* If the given {@code bundleName} starts with {@code <module-name>:} then only the
98-
* ResourceBundles from Java module named {@code <module-name>} will be added (i.e.
99-
* ResourceBundles with the same name from other modules will not be added).
100-
*
101-
* @since 22.3
102-
*/
103-
public static void addResourceBundles(String bundleName) {
104-
ImageSingletons.lookup(RuntimeResourceSupport.class).addResourceBundles(ConfigurationCondition.alwaysTrue(), bundleName);
99+
private static String withModuleName(Module module, String str) {
100+
Objects.requireNonNull(module);
101+
Objects.requireNonNull(str);
102+
return (module.isNamed() ? module.getName() : "ALL-UNNAMED") + ":" + str;
105103
}
106104

107105
private RuntimeResourceAccess() {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/ResourcesRegistry.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -27,30 +27,29 @@
2727
import java.util.Collection;
2828
import java.util.Locale;
2929

30-
import org.graalvm.nativeimage.hosted.RuntimeResourceAccess;
3130
import org.graalvm.nativeimage.impl.ConfigurationCondition;
3231
import org.graalvm.nativeimage.impl.RuntimeResourceSupport;
3332

3433
public interface ResourcesRegistry extends RuntimeResourceSupport {
3534

3635
/**
37-
* @deprecated Use {@link RuntimeResourceAccess#includeResources(String)} instead.
36+
* @deprecated Use {@link RuntimeResourceSupport#addResources(ConfigurationCondition, String)} instead.
3837
*/
3938
@Deprecated
4039
default void addResources(String pattern) {
4140
addResources(ConfigurationCondition.alwaysTrue(), pattern);
4241
}
4342

4443
/**
45-
* @deprecated Use {@link RuntimeResourceAccess#excludeResources(String)} instead.
44+
* @deprecated Use {@link RuntimeResourceSupport#ignoreResources(ConfigurationCondition, String)} instead.
4645
*/
4746
@Deprecated
4847
default void ignoreResources(String pattern) {
4948
ignoreResources(ConfigurationCondition.alwaysTrue(), pattern);
5049
}
5150

5251
/**
53-
* @deprecated Use {@link RuntimeResourceAccess#addResourceBundles(String, Locale...)} instead.
52+
* @deprecated Use {@link RuntimeResourceSupport#addResourceBundles(ConfigurationCondition, String)} instead.
5453
*/
5554
@Deprecated
5655
default void addResourceBundles(String name) {

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@
3636
import java.util.stream.Collectors;
3737

3838
import org.graalvm.compiler.debug.GraalError;
39+
import org.graalvm.nativeimage.ImageSingletons;
3940
import org.graalvm.nativeimage.Platform;
4041
import org.graalvm.nativeimage.Platforms;
4142
import org.graalvm.nativeimage.hosted.RuntimeReflection;
42-
import org.graalvm.nativeimage.hosted.RuntimeResourceAccess;
43+
import org.graalvm.nativeimage.impl.ConfigurationCondition;
44+
import org.graalvm.nativeimage.impl.RuntimeResourceSupport;
4345

4446
import com.oracle.svm.core.util.VMError;
4547

@@ -95,7 +97,7 @@ public Map<String, Object> getBundleContentOf(Object bundle) {
9597
public void prepareBundle(String bundleName, ResourceBundle bundle, Locale locale) {
9698
if (bundle instanceof PropertyResourceBundle) {
9799
String withLocale = control.toBundleName(bundleName, locale);
98-
RuntimeResourceAccess.includeResources(withLocale.replace('.', '/') + "\\.properties");
100+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(), withLocale.replace('.', '/') + "\\.properties");
99101
} else {
100102
RuntimeReflection.register(bundle.getClass());
101103
RuntimeReflection.registerForReflectiveInstantiation(bundle.getClass());

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,9 @@ public List<ResourceBundle> getResourceBundle(String bundleSpec, Locale locale)
227227
}
228228
String packageName = packageName(bundleName);
229229
Set<Module> modules;
230-
if (moduleName != null) {
230+
if (ResourcesFeature.MODULE_NAME_ALL_UNNAMED.equals(moduleName)) {
231+
modules = Collections.emptySet();
232+
} else if (moduleName != null) {
231233
modules = classLoaderSupport.findModule(moduleName).stream().collect(Collectors.toSet());
232234
} else {
233235
modules = packageToModules.getOrDefault(packageName, Collections.emptySet());

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

+21-7
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import java.util.Collections;
3434
import java.util.HashSet;
3535
import java.util.Locale;
36-
import java.util.Optional;
3736
import java.util.Set;
3837
import java.util.concurrent.ConcurrentHashMap;
3938
import java.util.regex.Pattern;
@@ -98,6 +97,8 @@
9897
@AutomaticFeature
9998
public final class ResourcesFeature implements Feature {
10099

100+
static final String MODULE_NAME_ALL_UNNAMED = "ALL-UNNAMED";
101+
101102
public static class Options {
102103
@Option(help = "Regexp to match names of resources to be included in the image.", type = OptionType.User)//
103104
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> IncludeResources = new HostedOptionKey<>(new LocatableMultiOptionValue.Strings());
@@ -212,7 +213,7 @@ public boolean isIncluded(String moduleName, String resourceName) {
212213
String relativePathWithTrailingSlash = resourceName + RESOURCES_INTERNAL_PATH_SEPARATOR;
213214

214215
for (ResourcePattern rp : excludePatterns) {
215-
if (rp.moduleName != null && !rp.moduleName.equals(moduleName)) {
216+
if (!rp.moduleNameMatches(moduleName)) {
216217
continue;
217218
}
218219
if (rp.pattern.matcher(resourceName).matches() || rp.pattern.matcher(relativePathWithTrailingSlash).matches()) {
@@ -221,7 +222,7 @@ public boolean isIncluded(String moduleName, String resourceName) {
221222
}
222223

223224
for (ResourcePattern rp : includePatterns) {
224-
if (rp.moduleName != null && !rp.moduleName.equals(moduleName)) {
225+
if (!rp.moduleNameMatches(moduleName)) {
225226
continue;
226227
}
227228
if (rp.pattern.matcher(resourceName).matches() || rp.pattern.matcher(relativePathWithTrailingSlash).matches()) {
@@ -283,11 +284,12 @@ private ResourcePattern makeResourcePattern(String rawPattern) {
283284
if (moduleNameWithPattern.length < 2) {
284285
return new ResourcePattern(null, Pattern.compile(moduleNameWithPattern[0]));
285286
} else {
286-
Optional<?> optModule = imageClassLoader.findModule(moduleNameWithPattern[0]);
287-
if (optModule.isPresent()) {
288-
return new ResourcePattern(moduleNameWithPattern[0], Pattern.compile(moduleNameWithPattern[1]));
287+
String moduleName = moduleNameWithPattern[0];
288+
boolean acceptModuleName = MODULE_NAME_ALL_UNNAMED.equals(moduleName) ? true : imageClassLoader.findModule(moduleName).isPresent();
289+
if (acceptModuleName) {
290+
return new ResourcePattern(moduleName, Pattern.compile(moduleNameWithPattern[1]));
289291
} else {
290-
throw UserError.abort("Resource pattern \"" + rawPattern + "\"s specifies unknown module " + moduleNameWithPattern[0]);
292+
throw UserError.abort("Resource pattern \"" + rawPattern + "\"s specifies unknown module " + moduleName);
291293
}
292294
}
293295
}
@@ -300,6 +302,18 @@ private ResourcePattern(String moduleName, Pattern pattern) {
300302
this.moduleName = moduleName;
301303
this.pattern = pattern;
302304
}
305+
306+
boolean moduleNameMatches(String resourceContainerModuleName) {
307+
if (moduleName == null) {
308+
// Accept everything
309+
return true;
310+
}
311+
if (moduleName.equals(MODULE_NAME_ALL_UNNAMED)) {
312+
// Only accept if resource is from classpath
313+
return resourceContainerModuleName == null;
314+
}
315+
return moduleName.equals(resourceContainerModuleName);
316+
}
303317
}
304318

305319
@Override

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationAwt.java

+11-9
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,16 @@
2424
*/
2525
package com.oracle.svm.hosted.jdk;
2626

27-
import java.awt.GraphicsEnvironment;
27+
import java.awt.*;
2828

29+
import org.graalvm.nativeimage.ImageSingletons;
2930
import org.graalvm.nativeimage.Platform;
3031
import org.graalvm.nativeimage.Platforms;
3132
import org.graalvm.nativeimage.hosted.Feature;
3233
import org.graalvm.nativeimage.hosted.RuntimeJNIAccess;
33-
import org.graalvm.nativeimage.hosted.RuntimeResourceAccess;
34+
import org.graalvm.nativeimage.impl.ConfigurationCondition;
3435
import org.graalvm.nativeimage.impl.InternalPlatform;
36+
import org.graalvm.nativeimage.impl.RuntimeResourceSupport;
3537

3638
import com.oracle.svm.core.SubstrateOptions;
3739
import com.oracle.svm.core.annotate.AutomaticFeature;
@@ -173,28 +175,28 @@ private static void registerFreeType(DuringAnalysisAccess access) {
173175
}
174176

175177
private static void registerColorProfiles(DuringAnalysisAccess duringAnalysisAccess) {
176-
RuntimeResourceAccess.includeResources("sun.java2d.cmm.profiles.*");
178+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(), "sun.java2d.cmm.profiles.*");
177179
}
178180

179181
private static void registerFlavorMapProps(DuringAnalysisAccess duringAnalysisAccess) {
180-
RuntimeResourceAccess.includeResources("sun.datatransfer.resources.flavormap.properties");
182+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(), "sun.datatransfer.resources.flavormap.properties");
181183
}
182184

183185
private static void registerRTFReaderCharsets(DuringAnalysisAccess duringAnalysisAccess) {
184-
RuntimeResourceAccess.includeResources("javax.swing.text.rtf.charsets.*");
186+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(), "javax.swing.text.rtf.charsets.*");
185187
}
186188

187189
private static void registerOceanThemeIcons(DuringAnalysisAccess duringAnalysisAccess) {
188-
RuntimeResourceAccess.includeResources("javax.swing.plaf.metal.icons.*");
189-
RuntimeResourceAccess.includeResources("javax.swing.plaf.basic.icons.*");
190+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(), "javax.swing.plaf.metal.icons.*");
191+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(), "javax.swing.plaf.basic.icons.*");
190192
}
191193

192194
private static void registerHtml32bdtd(DuringAnalysisAccess duringAnalysisAccess) {
193-
RuntimeResourceAccess.includeResources("javax.swing.text.html.parser.html32.bdtd");
195+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(), "javax.swing.text.html.parser.html32.bdtd");
194196
}
195197

196198
private static void registerDefaultCSS(DuringAnalysisAccess duringAnalysisAccess) {
197-
RuntimeResourceAccess.includeResources("javax.swing.text.html.default.css");
199+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(), "javax.swing.text.html.default.css");
198200
}
199201

200202
private static NativeLibraries getNativeLibraries(DuringAnalysisAccess access) {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@
3232
import org.graalvm.nativeimage.ImageSingletons;
3333
import org.graalvm.nativeimage.hosted.Feature;
3434
import org.graalvm.nativeimage.hosted.RuntimeReflection;
35-
import org.graalvm.nativeimage.hosted.RuntimeResourceAccess;
35+
import org.graalvm.nativeimage.impl.ConfigurationCondition;
3636
import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport;
37+
import org.graalvm.nativeimage.impl.RuntimeResourceSupport;
3738

3839
import com.oracle.svm.core.jdk.JNIRegistrationUtil;
3940
import com.oracle.svm.hosted.FeatureImpl;
@@ -132,9 +133,9 @@ void registerResources() {
132133
ClassInitializationSupport classInitializationSupport = (ClassInitializationSupport) ImageSingletons.lookup(RuntimeClassInitializationSupport.class);
133134
classInitializationSupport.setConfigurationSealed(false);
134135

135-
RuntimeResourceAccess.addResourceBundles("com.sun.org.apache.xml.internal.serializer.utils.SerializerMessages");
136-
RuntimeResourceAccess.addResourceBundles("com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMessages");
137-
RuntimeResourceAccess.includeResources("com.sun.*.properties");
136+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.utils.SerializerMessages");
137+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMessages");
138+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(), "com.sun.*.properties");
138139

139140
classInitializationSupport.setConfigurationSealed(true);
140141
}

substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/NativeImageResourceUtils.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,14 @@ public static final class TestFeature implements Feature {
4949
@Override
5050
public void beforeAnalysis(BeforeAnalysisAccess access) {
5151
// Remove leading / for the resource patterns
52-
RuntimeResourceAccess.includeResources(RESOURCE_DIR.substring(1));
53-
RuntimeResourceAccess.includeResources(RESOURCE_FILE_1.substring(1));
54-
RuntimeResourceAccess.includeResources(RESOURCE_FILE_2.substring(1));
52+
Module resourceModule = TestFeature.class.getModule();
53+
RuntimeResourceAccess.addResource(resourceModule, RESOURCE_DIR.substring(1));
54+
RuntimeResourceAccess.addResource(resourceModule, RESOURCE_FILE_1.substring(1));
55+
RuntimeResourceAccess.addResource(resourceModule, RESOURCE_FILE_2.substring(1));
5556

5657
/** Needed for {@link #testURLExternalFormEquivalence()} */
5758
for (Module module : ModuleLayer.boot().modules()) {
58-
RuntimeResourceAccess.includeResources(module.getName() + ":" + "module-info.class");
59+
RuntimeResourceAccess.addResource(module, "module-info.class");
5960
}
6061
}
6162
}

substratevm/src/com.oracle.svm.truffle/src/com/oracle/svm/truffle/TruffleBaseFeature.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@
6363
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
6464
import org.graalvm.nativeimage.hosted.RuntimeClassInitialization;
6565
import org.graalvm.nativeimage.hosted.RuntimeReflection;
66-
import org.graalvm.nativeimage.hosted.RuntimeResourceAccess;
66+
import org.graalvm.nativeimage.impl.ConfigurationCondition;
67+
import org.graalvm.nativeimage.impl.RuntimeResourceSupport;
6768

6869
import com.oracle.graal.pointsto.infrastructure.OriginalClassProvider;
6970
import com.oracle.graal.pointsto.meta.AnalysisMetaAccess;
@@ -343,7 +344,7 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
343344
LibraryExport.class);
344345

345346
if (needsAllEncodings) {
346-
RuntimeResourceAccess.includeResources("org/graalvm/shadowed/org/jcodings/tables/.*bin$");
347+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResources(ConfigurationCondition.alwaysTrue(), "org/graalvm/shadowed/org/jcodings/tables/.*bin$");
347348
}
348349

349350
access.registerFieldValueTransformer(ReflectionUtil.lookupField(ArrayBasedShapeGeneratorOffsetTransformer.SHAPE_GENERATOR, "byteArrayOffset"),

0 commit comments

Comments
 (0)