Skip to content

Commit a32ddb9

Browse files
committed
All registrations go through ConditionalConfigurationRegistry.
1 parent aad8fcc commit a32ddb9

File tree

12 files changed

+105
-48
lines changed

12 files changed

+105
-48
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -44,7 +44,7 @@
4444
import org.graalvm.nativeimage.Platform;
4545
import org.graalvm.nativeimage.Platforms;
4646
import org.graalvm.nativeimage.impl.ConfigurationCondition;
47-
import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport;
47+
import org.graalvm.nativeimage.impl.RuntimeProxyRegistrySupport;
4848

4949
/**
5050
* This class can be used to make creating dynamic proxy classes at run time valid.
@@ -62,7 +62,7 @@ public final class RuntimeProxyCreation {
6262
* @since 22.3
6363
*/
6464
public static void register(Class<?>... interfaces) {
65-
ImageSingletons.lookup(RuntimeProxyCreationSupport.class).addProxyClass(ConfigurationCondition.alwaysTrue(), interfaces);
65+
ImageSingletons.lookup(RuntimeProxyRegistrySupport.class).registerProxy(ConfigurationCondition.alwaysTrue(), interfaces);
6666
}
6767

6868
private RuntimeProxyCreation() {
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
package org.graalvm.nativeimage.impl;
42+
43+
public interface RuntimeProxyRegistrySupport {
44+
Class<?> registerProxy(ConfigurationCondition condition, Class<?>... interfaces);
45+
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,15 @@ public void addCondition(ConfigurationCondition condition, Module module, String
208208
}
209209
}
210210

211+
@Override
212+
public void addResource(ConfigurationCondition condition, Module module, String resourcePath, Object origin) {
213+
abortIfSealed();
214+
registerConditionalConfiguration(condition, cnd -> {
215+
addResourceEntry(module, resourcePath, origin);
216+
addCondition(condition, module, resourcePath);
217+
});
218+
}
219+
211220
/* Adds single resource defined with its module and name */
212221
@Override
213222
public void addResourceEntry(Module module, String resourcePath, Object origin) {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import org.graalvm.nativeimage.impl.ConfigurationCondition;
4747
import org.graalvm.nativeimage.impl.ReflectionRegistry;
4848
import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport;
49-
import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport;
49+
import org.graalvm.nativeimage.impl.RuntimeProxyRegistrySupport;
5050
import org.graalvm.nativeimage.impl.RuntimeSerializationSupport;
5151

5252
import com.oracle.svm.configure.ConfigurationFile;
@@ -64,7 +64,7 @@
6464
public final class ConfigurationParserUtils {
6565

6666
public static ReflectionConfigurationParser<ConfigurationCondition, Class<?>> create(ConfigurationFile configurationKind, boolean combinedFileSchema,
67-
ConfigurationConditionResolver<ConfigurationCondition> conditionResolver, ReflectionRegistry registry, RuntimeProxyCreationSupport proxyRegistry,
67+
ConfigurationConditionResolver<ConfigurationCondition> conditionResolver, ReflectionRegistry registry, RuntimeProxyRegistrySupport proxyRegistry,
6868
RuntimeSerializationSupport<ConfigurationCondition> serializationSupport, RuntimeJNIAccessSupport jniSupport, ImageClassLoader imageClassLoader) {
6969
var additionalParserOptions = configurationKind == ConfigurationFile.JNI ? EnumSet.of(JNI_PARSER) : null;
7070
return ReflectionConfigurationParser.create(combinedFileSchema, conditionResolver, RegistryAdapter.create(registry, proxyRegistry, serializationSupport, jniSupport, imageClassLoader),

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ReflectionRegistryAdapter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
import org.graalvm.nativeimage.impl.ConfigurationCondition;
3535
import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport;
36-
import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport;
36+
import org.graalvm.nativeimage.impl.RuntimeProxyRegistrySupport;
3737
import org.graalvm.nativeimage.impl.RuntimeReflectionSupport;
3838
import org.graalvm.nativeimage.impl.RuntimeSerializationSupport;
3939

@@ -46,11 +46,11 @@
4646

4747
public class ReflectionRegistryAdapter extends RegistryAdapter {
4848
private final RuntimeReflectionSupport reflectionSupport;
49-
private final RuntimeProxyCreationSupport proxyRegistry;
49+
private final RuntimeProxyRegistrySupport proxyRegistry;
5050
private final RuntimeSerializationSupport<ConfigurationCondition> serializationSupport;
5151
private final RuntimeJNIAccessSupport jniSupport;
5252

53-
ReflectionRegistryAdapter(RuntimeReflectionSupport reflectionSupport, RuntimeProxyCreationSupport proxyRegistry, RuntimeSerializationSupport<ConfigurationCondition> serializationSupport,
53+
ReflectionRegistryAdapter(RuntimeReflectionSupport reflectionSupport, RuntimeProxyRegistrySupport proxyRegistry, RuntimeSerializationSupport<ConfigurationCondition> serializationSupport,
5454
RuntimeJNIAccessSupport jniSupport, ImageClassLoader classLoader) {
5555
super(reflectionSupport, classLoader);
5656
this.reflectionSupport = reflectionSupport;
@@ -63,7 +63,7 @@ public class ReflectionRegistryAdapter extends RegistryAdapter {
6363
public void registerType(ConfigurationCondition condition, Class<?> type) {
6464
super.registerType(condition, type);
6565
if (Proxy.isProxyClass(type)) {
66-
proxyRegistry.addProxyClass(condition, type.getInterfaces());
66+
proxyRegistry.registerProxy(condition, type.getInterfaces());
6767
}
6868
}
6969

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/RegistryAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
import org.graalvm.nativeimage.impl.ConfigurationCondition;
3939
import org.graalvm.nativeimage.impl.ReflectionRegistry;
4040
import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport;
41-
import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport;
41+
import org.graalvm.nativeimage.impl.RuntimeProxyRegistrySupport;
4242
import org.graalvm.nativeimage.impl.RuntimeReflectionSupport;
4343
import org.graalvm.nativeimage.impl.RuntimeSerializationSupport;
4444

@@ -60,7 +60,7 @@ public class RegistryAdapter implements ReflectionConfigurationParserDelegate<Co
6060
protected final ReflectionRegistry registry;
6161
private final ImageClassLoader classLoader;
6262

63-
public static RegistryAdapter create(ReflectionRegistry registry, RuntimeProxyCreationSupport proxyRegistry, RuntimeSerializationSupport<ConfigurationCondition> serializationSupport,
63+
public static RegistryAdapter create(ReflectionRegistry registry, RuntimeProxyRegistrySupport proxyRegistry, RuntimeSerializationSupport<ConfigurationCondition> serializationSupport,
6464
RuntimeJNIAccessSupport jniSupport, ImageClassLoader classLoader) {
6565
if (registry instanceof RuntimeReflectionSupport) {
6666
return new ReflectionRegistryAdapter((RuntimeReflectionSupport) registry, proxyRegistry, serializationSupport, jniSupport, classLoader);

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/PreserveOptionsSupport.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
import org.graalvm.nativeimage.ImageSingletons;
5151
import org.graalvm.nativeimage.impl.ConfigurationCondition;
5252
import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport;
53-
import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport;
53+
import org.graalvm.nativeimage.impl.RuntimeProxyRegistrySupport;
5454
import org.graalvm.nativeimage.impl.RuntimeReflectionSupport;
5555
import org.graalvm.nativeimage.impl.RuntimeResourceSupport;
5656
import org.graalvm.nativeimage.impl.RuntimeSerializationSupport;
@@ -198,7 +198,7 @@ public static void registerPreservedClasses(BigBang bb, MetaAccessProvider origi
198198

199199
final RuntimeReflectionSupport reflection = ImageSingletons.lookup(RuntimeReflectionSupport.class);
200200
final RuntimeResourceSupport<ConfigurationCondition> resources = RuntimeResourceSupport.singleton();
201-
final RuntimeProxyCreationSupport proxy = ImageSingletons.lookup(RuntimeProxyCreationSupport.class);
201+
final RuntimeProxyRegistrySupport proxy = ImageSingletons.lookup(RuntimeProxyRegistrySupport.class);
202202
final RuntimeSerializationSupport<ConfigurationCondition> serialization = RuntimeSerializationSupport.singleton();
203203
final ConfigurationCondition always = ConfigurationCondition.alwaysTrue();
204204

@@ -217,7 +217,7 @@ public static void registerPreservedClasses(BigBang bb, MetaAccessProvider origi
217217
/* Register every single-interface proxy */
218218
// GR-62293 can't register proxies from jdk modules.
219219
if (c.getModule() == null && c.isInterface()) {
220-
proxy.addProxyClass(always, c);
220+
proxy.registerProxy(always, c);
221221
}
222222

223223
try {

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
import com.oracle.svm.core.VMInspectionOptions;
3636
import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature;
3737
import com.oracle.svm.core.feature.InternalFeature;
38-
import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry;
38+
import com.oracle.svm.hosted.reflect.proxy.ProxyRegistry;
3939
import com.oracle.svm.core.jni.JNIRuntimeAccess;
4040
import com.oracle.svm.util.ReflectionUtil;
4141
import org.graalvm.nativeimage.impl.ConfigurationCondition;
@@ -157,28 +157,28 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
157157
* </p>
158158
*/
159159
private static void configureProxy(BeforeAnalysisAccess access) {
160-
DynamicProxyRegistry dynamicProxySupport = ImageSingletons.lookup(DynamicProxyRegistry.class);
161-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.GarbageCollectorMXBean"),
160+
ProxyRegistry proxyRegistry = ImageSingletons.lookup(ProxyRegistry.class);
161+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.GarbageCollectorMXBean"),
162162
access.findClassByName("javax.management.NotificationEmitter"));
163-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.OperatingSystemMXBean"));
164-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.ThreadMXBean"));
165-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.UnixOperatingSystemMXBean"));
166-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.BufferPoolMXBean"));
167-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.ClassLoadingMXBean"));
168-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.CompilationMXBean"));
169-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.GarbageCollectorMXBean"),
163+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.OperatingSystemMXBean"));
164+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.ThreadMXBean"));
165+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.UnixOperatingSystemMXBean"));
166+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.BufferPoolMXBean"));
167+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.ClassLoadingMXBean"));
168+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.CompilationMXBean"));
169+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.GarbageCollectorMXBean"),
170170
access.findClassByName("javax.management.NotificationEmitter"));
171-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryManagerMXBean"),
171+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryManagerMXBean"),
172172
access.findClassByName("javax.management.NotificationEmitter"));
173-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryManagerMXBean"));
174-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryPoolMXBean"),
173+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryManagerMXBean"));
174+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryPoolMXBean"),
175175
access.findClassByName("javax.management.NotificationEmitter"));
176-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryMXBean"),
176+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryMXBean"),
177177
access.findClassByName("javax.management.NotificationEmitter"));
178-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.OperatingSystemMXBean"));
179-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.RuntimeMXBean"));
180-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.ThreadMXBean"));
181-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("jdk.management.jfr.FlightRecorderMXBean"),
178+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.OperatingSystemMXBean"));
179+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.RuntimeMXBean"));
180+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.ThreadMXBean"));
181+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("jdk.management.jfr.FlightRecorderMXBean"),
182182
access.findClassByName("javax.management.NotificationEmitter"));
183183
}
184184

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
import com.oracle.svm.core.jdk.RuntimeSupport;
4747
import com.oracle.svm.core.jdk.management.ManagementAgentStartupHook;
4848
import com.oracle.svm.core.jdk.management.ManagementSupport;
49-
import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry;
49+
import com.oracle.svm.hosted.reflect.proxy.ProxyRegistry;
5050
import com.oracle.svm.hosted.FeatureImpl.BeforeAnalysisAccessImpl;
5151

5252
@AutomaticallyRegisteredFeature
@@ -87,12 +87,12 @@ private static void registerJMXAgentResources() {
8787
}
8888

8989
private static void configureProxy(BeforeAnalysisAccess access) {
90-
DynamicProxyRegistry dynamicProxySupport = ImageSingletons.lookup(DynamicProxyRegistry.class);
90+
ProxyRegistry proxyRegistry = ImageSingletons.lookup(ProxyRegistry.class);
9191

92-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.rmi.Remote"),
92+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.rmi.Remote"),
9393
access.findClassByName("java.rmi.registry.Registry"));
9494

95-
dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("javax.management.remote.rmi.RMIServer"));
95+
proxyRegistry.registerProxy(ConfigurationCondition.alwaysTrue(), access.findClassByName("javax.management.remote.rmi.RMIServer"));
9696
}
9797

9898
/**

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
import org.graalvm.nativeimage.impl.AnnotationExtractor;
4545
import org.graalvm.nativeimage.impl.ConfigurationCondition;
4646
import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport;
47-
import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport;
47+
import org.graalvm.nativeimage.impl.RuntimeProxyRegistrySupport;
4848
import org.graalvm.nativeimage.impl.RuntimeReflectionSupport;
4949
import org.graalvm.nativeimage.impl.RuntimeSerializationSupport;
5050

@@ -315,7 +315,7 @@ public void duringSetup(DuringSetupAccess a) {
315315
aUniverse = access.getUniverse();
316316
var conditionResolver = new NativeImageConditionResolver(access.getImageClassLoader(), ClassInitializationSupport.singleton());
317317
reflectionData.duringSetup(access.getMetaAccess(), aUniverse);
318-
RuntimeProxyCreationSupport proxyRegistry = ImageSingletons.lookup(RuntimeProxyCreationSupport.class);
318+
RuntimeProxyRegistrySupport proxyRegistry = ImageSingletons.lookup(RuntimeProxyRegistrySupport.class);
319319
RuntimeSerializationSupport<ConfigurationCondition> serializationSupport = RuntimeSerializationSupport.singleton();
320320
RuntimeJNIAccessSupport jniSupport = SubstrateOptions.JNI.getValue() ? ImageSingletons.lookup(RuntimeJNIAccessSupport.class) : null;
321321
ReflectionConfigurationParser<ConfigurationCondition, Class<?>> parser = ConfigurationParserUtils.create(ConfigurationFile.REFLECTION, true, conditionResolver, reflectionData, proxyRegistry,

0 commit comments

Comments
 (0)