Skip to content

Commit 54b5f72

Browse files
author
Christian Wimmer
committed
[GR-57384] Preserve origin why resources are included in an image.
PullRequest: graal/18613
2 parents dc09603 + b9af871 commit 54b5f72

File tree

23 files changed

+322
-225
lines changed

23 files changed

+322
-225
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{
2+
"$schema": "https://json-schema.org/draft/2019-09/schema",
3+
"$id": "https://github.com/oracle/graal/blob/master/docs/reference-manual/native-image/assets/embedded-resources-schema-v1.0.0.json",
4+
"default": [],
5+
"items": {
6+
"properties": {
7+
"name": {
8+
"type": "string",
9+
"title": "Name of the resource that was registered"
10+
},
11+
"module": {
12+
"type": "string",
13+
"title": "Module of the resource that was registered"
14+
},
15+
"is_directory": {
16+
"type": "boolean",
17+
"default": false,
18+
"title": "Describes whether the registered resource is a directory or not"
19+
},
20+
"is_missing": {
21+
"type": "boolean",
22+
"default": false,
23+
"title": "Describes whether the resource is missing on the system or not"
24+
},
25+
"entries": {
26+
"default": [],
27+
"items": {
28+
"properties": {
29+
"origin": {
30+
"type": "string",
31+
"title": "Resource path"
32+
},
33+
"registration_origin": {
34+
"type": "string",
35+
"title": "Configuration file or other registration origin that is responsible for including this resource in the native image"
36+
},
37+
"size": {
38+
"type": "integer",
39+
"title": "Size of the resource expressed in bytes"
40+
}
41+
},
42+
"additionalProperties": false,
43+
"type": "object",
44+
"title": "Source of the resource defined with name and module properties"
45+
},
46+
"type": "array",
47+
"title": "List of sources for the resource defined with name and module properties"
48+
}
49+
},
50+
"required": [
51+
"name",
52+
"entries"
53+
],
54+
"additionalProperties": false,
55+
"type": "object",
56+
"title": "Resource that was registered"
57+
},
58+
"type": "array",
59+
"title": "JSON schema for the embedded-resources.json that shows all resources that were registered."
60+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public final class RuntimeResourceAccess {
6868
public static void addResource(Module module, String resourcePath) {
6969
Objects.requireNonNull(module);
7070
Objects.requireNonNull(resourcePath);
71-
ImageSingletons.lookup(RuntimeResourceSupport.class).addResource(module, resourcePath);
71+
ImageSingletons.lookup(RuntimeResourceSupport.class).addResource(module, resourcePath, "Manually added via RuntimeResourceAccess");
7272
}
7373

7474
/**
@@ -83,7 +83,7 @@ public static void addResource(Module module, String resourcePath, byte[] resour
8383
Objects.requireNonNull(module);
8484
Objects.requireNonNull(resourcePath);
8585
Objects.requireNonNull(resourceContent);
86-
ImageSingletons.lookup(RuntimeResourceSupport.class).injectResource(module, resourcePath, resourceContent);
86+
ImageSingletons.lookup(RuntimeResourceSupport.class).injectResource(module, resourcePath, resourceContent, "Manually added via RuntimeResourceAccess");
8787
ImageSingletons.lookup(RuntimeResourceSupport.class).addCondition(ConfigurationCondition.alwaysTrue(), module, resourcePath);
8888
}
8989

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ static RuntimeResourceSupport<ConfigurationCondition> singleton() {
5252
return ImageSingletons.lookup(RuntimeResourceSupport.class);
5353
}
5454

55-
void addResources(C condition, String pattern);
55+
void addResources(C condition, String pattern, Object origin);
5656

57-
void addGlob(C condition, String module, String glob);
57+
void addGlob(C condition, String module, String glob, Object origin);
5858

5959
void ignoreResources(C condition, String pattern);
6060

@@ -65,16 +65,16 @@ static RuntimeResourceSupport<ConfigurationCondition> singleton() {
6565
/* Following functions are used only from features */
6666
void addCondition(ConfigurationCondition configurationCondition, Module module, String resourcePath);
6767

68-
void addResourceEntry(Module module, String resourcePath);
68+
void addResourceEntry(Module module, String resourcePath, Object origin);
6969

70-
default void addResource(Module module, String resourcePath) {
71-
addResource(ConfigurationCondition.alwaysTrue(), module, resourcePath);
70+
default void addResource(Module module, String resourcePath, Object origin) {
71+
addResource(ConfigurationCondition.alwaysTrue(), module, resourcePath, origin);
7272
}
7373

74-
default void addResource(ConfigurationCondition condition, Module module, String resourcePath) {
75-
addResourceEntry(module, resourcePath);
74+
default void addResource(ConfigurationCondition condition, Module module, String resourcePath, Object origin) {
75+
addResourceEntry(module, resourcePath, origin);
7676
addCondition(condition, module, resourcePath);
7777
}
7878

79-
void injectResource(Module module, String resourcePath, byte[] resourceContent);
79+
void injectResource(Module module, String resourcePath, byte[] resourceContent, Object origin);
8080
}

substratevm/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ This changelog summarizes major changes to GraalVM Native Image.
77
The warning is planned to be replaced by an error in GraalVM for JDK 25.
88
* (GR-48384) Added a GDB Python script (`gdb-debughelpers.py`) to improve the Native Image debugging experience.
99
* (GR-49517) Add support for emitting Windows x64 unwind info. This enables stack walking in native tooling such as debuggers and profilers.
10+
* (GR-57384) Preserve the origin of a resource included in a native image. The information is included in the report produced by -H:+GenerateEmbeddedResourcesFile.
1011

1112
## GraalVM for JDK 23 (Internal Version 24.1.0)
1213
* (GR-51520) The old class initialization strategy, which was deprecated in GraalVM for JDK 22, is removed. The option `StrictImageHeap` no longer has any effect.

substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,22 +93,22 @@ public void printJson() {
9393
ResourcesRegistry<UnresolvedConfigurationCondition> registry = new ResourcesRegistry<>() {
9494

9595
@Override
96-
public void addResources(UnresolvedConfigurationCondition condition, String pattern) {
96+
public void addResources(UnresolvedConfigurationCondition condition, String pattern, Object origin) {
9797
addedResources.add(pattern);
9898
}
9999

100100
@Override
101-
public void addGlob(UnresolvedConfigurationCondition condition, String module, String glob) {
101+
public void addGlob(UnresolvedConfigurationCondition condition, String module, String glob, Object origin) {
102102
throw VMError.shouldNotReachHere("Unused function.");
103103
}
104104

105105
@Override
106-
public void addResourceEntry(Module module, String resourcePath) {
106+
public void addResourceEntry(Module module, String resourcePath, Object origin) {
107107
throw VMError.shouldNotReachHere("Unused function.");
108108
}
109109

110110
@Override
111-
public void injectResource(Module module, String resourcePath, byte[] resourceContent) {
111+
public void injectResource(Module module, String resourcePath, byte[] resourceContent, Object origin) {
112112
}
113113

114114
@Override

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,17 @@ public static class ParserAdapter implements ResourcesRegistry<UnresolvedConfigu
6666
}
6767

6868
@Override
69-
public void addResources(UnresolvedConfigurationCondition condition, String pattern) {
69+
public void addResources(UnresolvedConfigurationCondition condition, String pattern, Object origin) {
7070
configuration.classifyAndAddPattern(new ConditionalElement<>(condition, pattern));
7171
}
7272

7373
@Override
74-
public void addGlob(UnresolvedConfigurationCondition condition, String module, String glob) {
74+
public void addGlob(UnresolvedConfigurationCondition condition, String module, String glob, Object origin) {
7575
configuration.addedGlobs.add(new ConditionalElement<>(condition, new ResourceEntry(glob, module)));
7676
}
7777

7878
@Override
79-
public void addResourceEntry(Module module, String resourcePath) {
79+
public void addResourceEntry(Module module, String resourcePath, Object origin) {
8080
throw VMError.shouldNotReachHere("Unused function.");
8181
}
8282

@@ -86,7 +86,7 @@ public void addCondition(ConfigurationCondition condition, Module module, String
8686
}
8787

8888
@Override
89-
public void injectResource(Module module, String resourcePath, byte[] resourceContent) {
89+
public void injectResource(Module module, String resourcePath, byte[] resourceContent, Object origin) {
9090
VMError.shouldNotReachHere("Resource injection is only supported via Feature implementation");
9191
}
9292

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,15 @@ public boolean isNativeImageClassLoader(ClassLoader classLoader) {
5252

5353
protected abstract boolean isNativeImageClassLoaderImpl(ClassLoader classLoader);
5454

55+
public record ConditionWithOrigin(ConfigurationCondition condition, Object origin) {
56+
}
57+
5558
public interface ResourceCollector {
56-
List<ConfigurationCondition> isIncluded(Module module, String resourceName, URI resourceURI);
59+
List<ConditionWithOrigin> isIncluded(Module module, String resourceName, URI resourceURI);
5760

58-
void addResourceEntry(Module module, String resourceName);
61+
void addResourceEntry(Module module, String resourceName, Object origin);
5962

60-
void addResourceConditionally(Module module, String resourceName, ConfigurationCondition condition);
63+
void addResourceConditionally(Module module, String resourceName, ConfigurationCondition condition, Object origin);
6164

6265
void registerNegativeQuery(Module module, String resourceName);
6366

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ final class LegacyResourceConfigurationParser<C> extends ResourceConfigurationPa
3636

3737
@Override
3838
public void parseAndRegister(Object json, URI origin) {
39-
parseTopLevelObject(asMap(json, "first level of document must be an object"));
39+
parseTopLevelObject(asMap(json, "first level of document must be an object"), origin);
4040
}
4141

42-
private void parseTopLevelObject(EconomicMap<String, Object> obj) {
42+
private void parseTopLevelObject(EconomicMap<String, Object> obj, Object origin) {
4343
Object resourcesObject = null;
4444
Object bundlesObject = null;
4545
Object globsObject = null;
@@ -55,13 +55,13 @@ private void parseTopLevelObject(EconomicMap<String, Object> obj) {
5555
}
5656

5757
if (resourcesObject != null) {
58-
parseResourcesObject(resourcesObject);
58+
parseResourcesObject(resourcesObject, origin);
5959
}
6060
if (bundlesObject != null) {
6161
parseBundlesObject(bundlesObject);
6262
}
6363
if (globsObject != null) {
64-
parseGlobsObject(globsObject);
64+
parseGlobsObject(globsObject, origin);
6565
}
6666
}
6767
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ protected void parseBundlesObject(Object bundlesObject) {
6565
}
6666

6767
@SuppressWarnings("unchecked")
68-
protected void parseResourcesObject(Object resourcesObject) {
68+
protected void parseResourcesObject(Object resourcesObject, Object origin) {
6969
if (resourcesObject instanceof EconomicMap) { // New format
7070
EconomicMap<String, Object> resourcesObjectMap = (EconomicMap<String, Object>) resourcesObject;
7171
checkAttributes(resourcesObjectMap, "resource descriptor object", Collections.singleton("includes"), Collections.singleton("excludes"));
@@ -74,7 +74,7 @@ protected void parseResourcesObject(Object resourcesObject) {
7474

7575
List<Object> includes = asList(includesObject, "Attribute 'includes' must be a list of resources");
7676
for (Object object : includes) {
77-
parsePatternEntry(object, registry::addResources, "'includes' list");
77+
parsePatternEntry(object, (condition, pattern) -> registry.addResources(condition, pattern, origin), "'includes' list");
7878
}
7979

8080
if (excludesObject != null) {
@@ -86,7 +86,7 @@ protected void parseResourcesObject(Object resourcesObject) {
8686
} else { // Old format: may be deprecated in future versions
8787
List<Object> resources = asList(resourcesObject, "Attribute 'resources' must be a list of resources");
8888
for (Object object : resources) {
89-
parsePatternEntry(object, registry::addResources, "'resources' list");
89+
parsePatternEntry(object, (condition, pattern) -> registry.addResources(condition, pattern, origin), "'resources' list");
9090
}
9191
}
9292
}
@@ -146,10 +146,10 @@ private void parsePatternEntry(Object data, BiConsumer<C, String> resourceRegist
146146
resourceRegistry.accept(resolvedConfigurationCondition.get(), value);
147147
}
148148

149-
protected void parseGlobsObject(Object globsObject) {
149+
protected void parseGlobsObject(Object globsObject, Object origin) {
150150
List<Object> globs = asList(globsObject, "Attribute 'globs' must be a list of glob patterns");
151151
for (Object object : globs) {
152-
parseGlobEntry(object, registry::addGlob);
152+
parseGlobEntry(object, (condition, module, glob) -> registry.addGlob(condition, module, glob, origin));
153153
}
154154
}
155155

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ final class ResourceMetadataParser<C> extends ResourceConfigurationParser<C> {
3535
public void parseAndRegister(Object json, URI origin) {
3636
Object resourcesJson = getFromGlobalFile(json, RESOURCES_KEY);
3737
if (resourcesJson != null) {
38-
parseGlobsObject(resourcesJson);
38+
parseGlobsObject(resourcesJson, origin);
3939
}
4040
Object bundlesJson = getFromGlobalFile(json, BUNDLES_KEY);
4141
if (bundlesJson != null) {

0 commit comments

Comments
 (0)