diff --git a/sdk/src/org.graalvm.nativeimage/snapshot.sigtest b/sdk/src/org.graalvm.nativeimage/snapshot.sigtest index 5c15c4d96208..f5c3c2647728 100644 --- a/sdk/src/org.graalvm.nativeimage/snapshot.sigtest +++ b/sdk/src/org.graalvm.nativeimage/snapshot.sigtest @@ -1082,6 +1082,10 @@ CLSS public abstract interface org.graalvm.nativeimage.hosted.FieldValueTransfor meth public abstract java.lang.Object transform(java.lang.Object,java.lang.Object) meth public boolean isAvailable() +CLSS public abstract interface org.graalvm.nativeimage.hosted.RegistrationCondition +meth public static org.graalvm.nativeimage.hosted.RegistrationCondition alwaysInclude() +meth public static org.graalvm.nativeimage.hosted.RegistrationCondition typeReached(java.lang.Class) + CLSS public final org.graalvm.nativeimage.hosted.RuntimeClassInitialization meth public !varargs static void initializeAtBuildTime(java.lang.Class[]) meth public !varargs static void initializeAtBuildTime(java.lang.String[]) diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RegistrationCondition.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RegistrationCondition.java new file mode 100644 index 000000000000..80c90c2f270d --- /dev/null +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RegistrationCondition.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.graalvm.nativeimage.hosted; + +import org.graalvm.nativeimage.impl.TypeReachabilityCondition; + +/** + * Condition that must be satisfied for inclusion of elements for dynamic access (e.g., runtime + * reflection, serialization, JNI access, and resource access at runtime). + * {@link RegistrationCondition} is used together with {@link Feature} for programmatic registration + * of metadata. + *

+ * Currently, there are two types of conditions: + *

+ *

+ * + * Conditions can be created via the {@link #always} and {@link #typeReached} factory methods. + */ +public interface RegistrationCondition { + + /** + * Creates the condition that is always satisfied. Any element that is predicated with this + * condition will always be included. + * + * @return instance of the condition + */ + static RegistrationCondition always() { + return TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED; + } + + /** + * Creates the {@code typeReached} condition, that is satisfied when the type is reached at + * runtime. A type is reached at run time, right before the class-initialization routine starts + * for that type, or any of the type's subtypes are reached. + * + * @param type that has to be reached for this condition to be satisfied + * @return instance of the condition + */ + static RegistrationCondition typeReached(Class type) { + return TypeReachabilityCondition.create(type, true); + } +} diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java index 2b5aa887f6ce..887773256695 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeForeignAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,7 +46,6 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeForeignAccessSupport; @Platforms(Platform.HOSTED_ONLY.class) @@ -68,7 +67,7 @@ public final class RuntimeForeignAccess { * @since 23.1 */ public static void registerForDowncall(Object desc, Object... options) { - ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDowncall(ConfigurationCondition.alwaysTrue(), desc, options); + ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDowncall(RegistrationCondition.always(), desc, options); } /** @@ -86,7 +85,7 @@ public static void registerForDowncall(Object desc, Object... options) { * @since 24.1 */ public static void registerForUpcall(Object desc, Object... options) { - ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForUpcall(ConfigurationCondition.alwaysTrue(), desc, options); + ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForUpcall(RegistrationCondition.always(), desc, options); } /** @@ -114,7 +113,7 @@ public static void registerForUpcall(Object desc, Object... options) { * @since 24.2 */ public static void registerForDirectUpcall(MethodHandle target, Object desc, Object... options) { - ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDirectUpcall(ConfigurationCondition.alwaysTrue(), target, desc, options); + ImageSingletons.lookup(RuntimeForeignAccessSupport.class).registerForDirectUpcall(RegistrationCondition.always(), target, desc, options); } private RuntimeForeignAccess() { diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java index e5c044517406..39043285e069 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeJNIAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -46,7 +46,6 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport; /** @@ -66,7 +65,7 @@ public final class RuntimeJNIAccess { * @since 22.3 */ public static void register(Class... classes) { - ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), classes); + ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(RegistrationCondition.always(), classes); } /** @@ -79,7 +78,7 @@ public static void register(Class... classes) { * @since 22.3 */ public static void register(Executable... methods) { - ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), false, methods); + ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(RegistrationCondition.always(), false, methods); } /** @@ -92,7 +91,7 @@ public static void register(Executable... methods) { * @since 22.3 */ public static void register(Field... fields) { - ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), false, fields); + ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(RegistrationCondition.always(), false, fields); } private RuntimeJNIAccess() { diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java index a2f4f7bb781e..dfc9c678d8b3 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeProxyCreation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -43,7 +43,6 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport; /** @@ -62,7 +61,7 @@ public final class RuntimeProxyCreation { * @since 22.3 */ public static void register(Class... interfaces) { - ImageSingletons.lookup(RuntimeProxyCreationSupport.class).addProxyClass(ConfigurationCondition.alwaysTrue(), interfaces); + ImageSingletons.lookup(RuntimeProxyCreationSupport.class).addProxyClass(RegistrationCondition.always(), interfaces); } private RuntimeProxyCreation() { diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java index a4b5adb949f3..641ce3af1287 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeReflection.java @@ -48,7 +48,6 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeReflectionSupport; //Checkstyle: allow reflection @@ -69,7 +68,7 @@ public final class RuntimeReflection { * @since 19.0 */ public static void register(Class... classes) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), classes); + ImageSingletons.lookup(RuntimeReflectionSupport.class).register(RegistrationCondition.always(), classes); } /** @@ -80,7 +79,7 @@ public static void register(Class... classes) { * @since 23.0 */ public static void registerClassLookup(String className) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerClassLookup(ConfigurationCondition.alwaysTrue(), className); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerClassLookup(RegistrationCondition.always(), className); } /** @@ -91,7 +90,7 @@ public static void registerClassLookup(String className) { * @since 19.0 */ public static void register(Executable... methods) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), false, methods); + ImageSingletons.lookup(RuntimeReflectionSupport.class).register(RegistrationCondition.always(), false, methods); } /** @@ -103,7 +102,7 @@ public static void register(Executable... methods) { * @since 21.3 */ public static void registerAsQueried(Executable... methods) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), true, methods); + ImageSingletons.lookup(RuntimeReflectionSupport.class).register(RegistrationCondition.always(), true, methods); } /** @@ -116,7 +115,7 @@ public static void registerAsQueried(Executable... methods) { * @since 23.0 */ public static void registerMethodLookup(Class declaringClass, String methodName, Class... parameterTypes) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerMethodLookup(ConfigurationCondition.alwaysTrue(), declaringClass, methodName, parameterTypes); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerMethodLookup(RegistrationCondition.always(), declaringClass, methodName, parameterTypes); } /** @@ -130,7 +129,7 @@ public static void registerMethodLookup(Class declaringClass, String methodNa * @since 23.0 */ public static void registerConstructorLookup(Class declaringClass, Class... parameterTypes) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerConstructorLookup(ConfigurationCondition.alwaysTrue(), declaringClass, parameterTypes); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerConstructorLookup(RegistrationCondition.always(), declaringClass, parameterTypes); } /** @@ -141,7 +140,7 @@ public static void registerConstructorLookup(Class declaringClass, Class.. * @since 19.0 */ public static void register(Field... fields) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), false, fields); + ImageSingletons.lookup(RuntimeReflectionSupport.class).register(RegistrationCondition.always(), false, fields); } /** @@ -153,7 +152,7 @@ public static void register(Field... fields) { * @since 19.0 */ public static void registerFieldLookup(Class declaringClass, String fieldName) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerFieldLookup(ConfigurationCondition.alwaysTrue(), declaringClass, fieldName); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerFieldLookup(RegistrationCondition.always(), declaringClass, fieldName); } /** @@ -162,7 +161,7 @@ public static void registerFieldLookup(Class declaringClass, String fieldName * @since 23.0 */ public static void registerAllClasses(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllClassesQuery(ConfigurationCondition.alwaysTrue(), declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllClassesQuery(RegistrationCondition.always(), declaringClass); } /** @@ -171,7 +170,7 @@ public static void registerAllClasses(Class declaringClass) { * @since 23.0 */ public static void registerAllDeclaredClasses(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredClassesQuery(ConfigurationCondition.alwaysTrue(), declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredClassesQuery(RegistrationCondition.always(), declaringClass); } /** @@ -181,7 +180,7 @@ public static void registerAllDeclaredClasses(Class declaringClass) { * @since 23.0 */ public static void registerAllMethods(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllMethodsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllMethodsQuery(RegistrationCondition.always(), true, declaringClass); } /** @@ -191,7 +190,7 @@ public static void registerAllMethods(Class declaringClass) { * @since 23.0 */ public static void registerAllDeclaredMethods(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredMethodsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredMethodsQuery(RegistrationCondition.always(), true, declaringClass); } /** @@ -201,7 +200,7 @@ public static void registerAllDeclaredMethods(Class declaringClass) { * @since 23.0 */ public static void registerAllConstructors(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllConstructorsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllConstructorsQuery(RegistrationCondition.always(), true, declaringClass); } /** @@ -211,7 +210,7 @@ public static void registerAllConstructors(Class declaringClass) { * @since 23.0 */ public static void registerAllDeclaredConstructors(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredConstructorsQuery(ConfigurationCondition.alwaysTrue(), true, declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredConstructorsQuery(RegistrationCondition.always(), true, declaringClass); } /** @@ -221,7 +220,7 @@ public static void registerAllDeclaredConstructors(Class declaringClass) { * @since 23.0 */ public static void registerAllFields(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllFields(ConfigurationCondition.alwaysTrue(), declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllFields(RegistrationCondition.always(), declaringClass); } /** @@ -231,7 +230,7 @@ public static void registerAllFields(Class declaringClass) { * @since 23.0 */ public static void registerAllDeclaredFields(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredFields(ConfigurationCondition.alwaysTrue(), declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredFields(RegistrationCondition.always(), declaringClass); } /** @@ -240,7 +239,7 @@ public static void registerAllDeclaredFields(Class declaringClass) { * @since 23.0 */ public static void registerAllNestMembers(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllNestMembersQuery(ConfigurationCondition.alwaysTrue(), declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllNestMembersQuery(RegistrationCondition.always(), declaringClass); } /** @@ -249,7 +248,7 @@ public static void registerAllNestMembers(Class declaringClass) { * @since 23.0 */ public static void registerAllPermittedSubclasses(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllPermittedSubclassesQuery(ConfigurationCondition.alwaysTrue(), declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllPermittedSubclassesQuery(RegistrationCondition.always(), declaringClass); } /** @@ -258,7 +257,7 @@ public static void registerAllPermittedSubclasses(Class declaringClass) { * @since 23.0 */ public static void registerAllRecordComponents(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllRecordComponentsQuery(ConfigurationCondition.alwaysTrue(), declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllRecordComponentsQuery(RegistrationCondition.always(), declaringClass); } /** @@ -267,7 +266,7 @@ public static void registerAllRecordComponents(Class declaringClass) { * @since 23.0 */ public static void registerAllSigners(Class declaringClass) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllSignersQuery(ConfigurationCondition.alwaysTrue(), declaringClass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllSignersQuery(RegistrationCondition.always(), declaringClass); } /** diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java index 6d7b6cd60398..bc7f30a5962d 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeResourceAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -47,7 +47,6 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeResourceSupport; /** @@ -84,7 +83,7 @@ public static void addResource(Module module, String resourcePath, byte[] resour Objects.requireNonNull(resourcePath); Objects.requireNonNull(resourceContent); ImageSingletons.lookup(RuntimeResourceSupport.class).injectResource(module, resourcePath, resourceContent, "Manually added via RuntimeResourceAccess"); - ImageSingletons.lookup(RuntimeResourceSupport.class).addCondition(ConfigurationCondition.alwaysTrue(), module, resourcePath); + ImageSingletons.lookup(RuntimeResourceSupport.class).addCondition(RegistrationCondition.always(), module, resourcePath); } /** @@ -96,7 +95,7 @@ public static void addResource(Module module, String resourcePath, byte[] resour */ public static void addResourceBundle(Module module, String baseBundleName, Locale[] locales) { Objects.requireNonNull(locales); - RuntimeResourceSupport.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), + RuntimeResourceSupport.singleton().addResourceBundles(RegistrationCondition.always(), withModuleName(module, baseBundleName), Arrays.asList(locales)); } @@ -108,7 +107,7 @@ public static void addResourceBundle(Module module, String baseBundleName, Local * @since 22.3 */ public static void addResourceBundle(Module module, String bundleName) { - RuntimeResourceSupport.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), + RuntimeResourceSupport.singleton().addResourceBundles(RegistrationCondition.always(), withModuleName(module, bundleName)); } diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java index 8de8de2ea716..4c5700dde8cf 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/hosted/RuntimeSerialization.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,7 +42,6 @@ import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; /** @@ -72,7 +71,7 @@ public final class RuntimeSerialization { * @since 21.3 */ public static void registerIncludingAssociatedClasses(Class clazz) { - RuntimeSerializationSupport.singleton().registerIncludingAssociatedClasses(ConfigurationCondition.alwaysTrue(), clazz); + RuntimeSerializationSupport.singleton().registerIncludingAssociatedClasses(RegistrationCondition.always(), clazz); } /** @@ -82,7 +81,7 @@ public static void registerIncludingAssociatedClasses(Class clazz) { */ public static void register(Class... classes) { for (Class clazz : classes) { - RuntimeSerializationSupport.singleton().register(ConfigurationCondition.alwaysTrue(), clazz); + RuntimeSerializationSupport.singleton().register(RegistrationCondition.always(), clazz); } } @@ -103,7 +102,7 @@ public static void register(Class... classes) { @Deprecated(since = "24.2") @SuppressWarnings("unused") public static void registerWithTargetConstructorClass(Class clazz, Class customTargetConstructorClazz) { - RuntimeSerializationSupport.singleton().register(ConfigurationCondition.alwaysTrue(), clazz); + RuntimeSerializationSupport.singleton().register(RegistrationCondition.always(), clazz); } /** @@ -114,7 +113,7 @@ public static void registerWithTargetConstructorClass(Class clazz, Class c * @since 22.3 */ public static void registerLambdaCapturingClass(Class lambdaCapturingClass) { - RuntimeSerializationSupport.singleton().registerLambdaCapturingClass(ConfigurationCondition.alwaysTrue(), lambdaCapturingClass); + RuntimeSerializationSupport.singleton().registerLambdaCapturingClass(RegistrationCondition.always(), lambdaCapturingClass); } /** @@ -125,7 +124,7 @@ public static void registerLambdaCapturingClass(Class lambdaCapturingClass) { * @since 22.3 */ public static void registerProxyClass(Class... implementedInterfaces) { - RuntimeSerializationSupport.singleton().registerProxyClass(ConfigurationCondition.alwaysTrue(), implementedInterfaces); + RuntimeSerializationSupport.singleton().registerProxyClass(RegistrationCondition.always(), implementedInterfaces); } private RuntimeSerialization() { diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java index 9d0534347cfb..4c57afb52bde 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ReflectionRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,22 +44,24 @@ import java.lang.reflect.Field; import java.util.Arrays; +import org.graalvm.nativeimage.hosted.RegistrationCondition; + public interface ReflectionRegistry { - default void register(ConfigurationCondition condition, Class... classes) { + default void register(RegistrationCondition condition, Class... classes) { Arrays.stream(classes).forEach(clazz -> register(condition, false, clazz)); } - void register(ConfigurationCondition condition, boolean unsafeAllocated, Class clazz); + void register(RegistrationCondition condition, boolean unsafeAllocated, Class clazz); - void register(ConfigurationCondition condition, boolean queriedOnly, Executable... methods); + void register(RegistrationCondition condition, boolean queriedOnly, Executable... methods); - void register(ConfigurationCondition condition, boolean finalIsWritable, Field... fields); + void register(RegistrationCondition condition, boolean finalIsWritable, Field... fields); - void registerClassLookup(ConfigurationCondition condition, String typeName); + void registerClassLookup(RegistrationCondition condition, String typeName); - void registerFieldLookup(ConfigurationCondition condition, Class declaringClass, String fieldName); + void registerFieldLookup(RegistrationCondition condition, Class declaringClass, String fieldName); - void registerMethodLookup(ConfigurationCondition condition, Class declaringClass, String methodName, Class... parameterTypes); + void registerMethodLookup(RegistrationCondition condition, Class declaringClass, String methodName, Class... parameterTypes); - void registerConstructorLookup(ConfigurationCondition condition, Class declaringClass, Class... parameterTypes); + void registerConstructorLookup(RegistrationCondition condition, Class declaringClass, Class... parameterTypes); } diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java index dd0537c496fc..e870ff0f42f5 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeForeignAccessSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,10 +42,12 @@ import java.lang.invoke.MethodHandle; +import org.graalvm.nativeimage.hosted.RegistrationCondition; + public interface RuntimeForeignAccessSupport { - void registerForDowncall(ConfigurationCondition condition, Object desc, Object... options); + void registerForDowncall(RegistrationCondition condition, Object desc, Object... options); - void registerForUpcall(ConfigurationCondition condition, Object desc, Object... options); + void registerForUpcall(RegistrationCondition condition, Object desc, Object... options); - void registerForDirectUpcall(ConfigurationCondition condition, MethodHandle target, Object desc, Object... options); + void registerForDirectUpcall(RegistrationCondition condition, MethodHandle target, Object desc, Object... options); } diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java index f7ca149c3c3f..2d3ab47cd541 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeProxyCreationSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -40,6 +40,8 @@ */ package org.graalvm.nativeimage.impl; +import org.graalvm.nativeimage.hosted.RegistrationCondition; + public interface RuntimeProxyCreationSupport { - void addProxyClass(ConfigurationCondition condition, Class... interfaces); + void addProxyClass(RegistrationCondition condition, Class... interfaces); } diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java index 8d1d11c169e3..1a79a43dced7 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeReflectionSupport.java @@ -44,38 +44,39 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeJNIAccess; import org.graalvm.nativeimage.hosted.RuntimeProxyCreation; public interface RuntimeReflectionSupport extends ReflectionRegistry { // needed as reflection-specific ImageSingletons key - void registerAllMethodsQuery(ConfigurationCondition condition, boolean queriedOnly, Class clazz); + void registerAllMethodsQuery(RegistrationCondition condition, boolean queriedOnly, Class clazz); - void registerAllDeclaredMethodsQuery(ConfigurationCondition condition, boolean queriedOnly, Class clazz); + void registerAllDeclaredMethodsQuery(RegistrationCondition condition, boolean queriedOnly, Class clazz); - void registerAllFields(ConfigurationCondition condition, Class clazz); + void registerAllConstructorsQuery(RegistrationCondition condition, boolean queriedOnly, Class clazz); - void registerAllDeclaredFields(ConfigurationCondition condition, Class clazz); + void registerAllDeclaredConstructorsQuery(RegistrationCondition condition, boolean queriedOnly, Class clazz); - void registerAllConstructorsQuery(ConfigurationCondition condition, boolean queriedOnly, Class clazz); + void registerAllClassesQuery(RegistrationCondition condition, Class clazz); - void registerAllDeclaredConstructorsQuery(ConfigurationCondition condition, boolean queriedOnly, Class clazz); + void registerAllDeclaredClassesQuery(RegistrationCondition condition, Class clazz); - void registerAllClassesQuery(ConfigurationCondition condition, Class clazz); + void registerAllFields(RegistrationCondition condition, Class clazz); - void registerAllDeclaredClassesQuery(ConfigurationCondition condition, Class clazz); + void registerAllDeclaredFields(RegistrationCondition condition, Class clazz); - void registerAllRecordComponentsQuery(ConfigurationCondition condition, Class clazz); + void registerAllRecordComponentsQuery(RegistrationCondition condition, Class clazz); - void registerAllPermittedSubclassesQuery(ConfigurationCondition condition, Class clazz); + void registerAllPermittedSubclassesQuery(RegistrationCondition condition, Class clazz); - void registerAllNestMembersQuery(ConfigurationCondition condition, Class clazz); + void registerAllNestMembersQuery(RegistrationCondition condition, Class clazz); - void registerAllSignersQuery(ConfigurationCondition condition, Class clazz); + void registerAllSignersQuery(RegistrationCondition condition, Class clazz); - void registerClassLookupException(ConfigurationCondition condition, String typeName, Throwable t); + void registerClassLookupException(RegistrationCondition condition, String typeName, Throwable t); - default void registerClassFully(ConfigurationCondition condition, Class clazz) { + default void registerClassFully(RegistrationCondition condition, Class clazz) { register(condition, false, clazz); // GR-62143 Register all fields is very slow. diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java index f0c2273cbf95..24982e4faa7b 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeResourceSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,11 +44,12 @@ import java.util.Locale; import org.graalvm.nativeimage.ImageSingletons; +import org.graalvm.nativeimage.hosted.RegistrationCondition; public interface RuntimeResourceSupport { @SuppressWarnings("unchecked") - static RuntimeResourceSupport singleton() { + static RuntimeResourceSupport singleton() { return ImageSingletons.lookup(RuntimeResourceSupport.class); } @@ -63,15 +64,15 @@ static RuntimeResourceSupport singleton() { void addResourceBundles(C condition, String basename, Collection locales); /* Following functions are used only from features */ - void addCondition(ConfigurationCondition configurationCondition, Module module, String resourcePath); + void addCondition(RegistrationCondition condition, Module module, String resourcePath); void addResourceEntry(Module module, String resourcePath, Object origin); default void addResource(Module module, String resourcePath, Object origin) { - addResource(ConfigurationCondition.alwaysTrue(), module, resourcePath, origin); + addResource(RegistrationCondition.always(), module, resourcePath, origin); } - default void addResource(ConfigurationCondition condition, Module module, String resourcePath, Object origin) { + default void addResource(RegistrationCondition condition, Module module, String resourcePath, Object origin) { addResourceEntry(module, resourcePath, origin); addCondition(condition, module, resourcePath); } diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java index 3237047e86d8..07b056d6bb7e 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/RuntimeSerializationSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -45,11 +45,12 @@ import java.util.stream.Collectors; import org.graalvm.nativeimage.ImageSingletons; +import org.graalvm.nativeimage.hosted.RegistrationCondition; public interface RuntimeSerializationSupport { @SuppressWarnings("unchecked") - static RuntimeSerializationSupport singleton() { + static RuntimeSerializationSupport singleton() { return ImageSingletons.lookup(RuntimeSerializationSupport.class); } diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ConfigurationCondition.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/TypeReachabilityCondition.java similarity index 62% rename from sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ConfigurationCondition.java rename to sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/TypeReachabilityCondition.java index d7c56dc0dd98..514e82b5813f 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/ConfigurationCondition.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/TypeReachabilityCondition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,44 +42,20 @@ import java.util.Objects; +import org.graalvm.nativeimage.hosted.RegistrationCondition; + /** - * A condition that describes if a reflectively-accessed element in Native Image is visible by the - * user at run time. - *

- * Currently, there is only two types of condition: - *

  • typeReached (the default) that signifies that the type must be both reachable by - * static analysis at build time, and reached at run time. A type is reached at run time, right - * before the class-initialization routine starts for that type, or any of the type's subtypes are - * reached.
  • - *
  • typeReachable (legacy) that signifies that the type must be reachable by static - * analysis at build time.
  • - *

    - * When {@link ConfigurationCondition#runtimeChecked} is true denotes that this is a + * Type that represents both type-reached and type-reachable condition. When + * {@link TypeReachabilityCondition#runtimeChecked} is true denotes that this is a * typeReached condition. */ -public final class ConfigurationCondition { +public class TypeReachabilityCondition implements RegistrationCondition { /* Cached to save space: it is used as a marker for all non-conditional elements */ - private static final ConfigurationCondition JAVA_LANG_OBJECT_REACHED = new ConfigurationCondition(Object.class, true); - - public static ConfigurationCondition alwaysTrue() { - return JAVA_LANG_OBJECT_REACHED; - } - + public static final TypeReachabilityCondition JAVA_LANG_OBJECT_REACHED = new TypeReachabilityCondition(Object.class, true); private final Class type; - private final boolean runtimeChecked; - - /** - * Creates the default type-reached condition that is satisfied when the type is reached at - * runtime. - * - * @param type that has to be reached for this condition to be satisfied - * @return instance of the condition - */ - public static ConfigurationCondition create(Class type) { - return create(type, true); - } + public final boolean runtimeChecked; /** * Creates either a type-reached condition ({@code runtimeChecked = true}) or a type-reachable @@ -89,31 +65,27 @@ public static ConfigurationCondition create(Class type) { * @param runtimeChecked makes this a type-reachable condition when false * @return instance of the condition */ - public static ConfigurationCondition create(Class type, boolean runtimeChecked) { + public static TypeReachabilityCondition create(Class type, boolean runtimeChecked) { Objects.requireNonNull(type); - if (JAVA_LANG_OBJECT_REACHED.getType().equals(type)) { - return JAVA_LANG_OBJECT_REACHED; + if (TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED.getKey().equals(type)) { + return TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED; } - return new ConfigurationCondition(type, runtimeChecked); + return new TypeReachabilityCondition(type, runtimeChecked); } public boolean isAlwaysTrue() { - return ConfigurationCondition.alwaysTrue().equals(this); + return RegistrationCondition.always().equals(this); } - private ConfigurationCondition(Class type, boolean runtimeChecked) { + public TypeReachabilityCondition(Class type, boolean runtimeChecked) { this.runtimeChecked = runtimeChecked; this.type = type; } - public Class getType() { + public Class getKey() { return type; } - public boolean isRuntimeChecked() { - return runtimeChecked; - } - @Override public boolean equals(Object o) { if (this == o) { @@ -122,7 +94,7 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { return false; } - ConfigurationCondition that = (ConfigurationCondition) o; + TypeReachabilityCondition that = (TypeReachabilityCondition) o; return runtimeChecked == that.runtimeChecked && Objects.equals(type, that.type); } @@ -133,9 +105,13 @@ public int hashCode() { @Override public String toString() { - return "ConfigurationCondition(" + + return "TypeReachabilityCondition(" + "type=" + type + ", runtimeChecked=" + runtimeChecked + ')'; } + + public boolean isRuntimeChecked() { + return runtimeChecked; + } } diff --git a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java index fb7a182cda99..5ada532c3ca6 100644 --- a/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java +++ b/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/impl/UnresolvedConfigurationCondition.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,8 +42,10 @@ import java.util.Objects; +import org.graalvm.nativeimage.hosted.RegistrationCondition; + /** - * Represents a {@link ConfigurationCondition} during parsing before it is resolved in a context of + * Represents a {@link RegistrationCondition} during parsing before it is resolved in a context of * the classpath. */ public final class UnresolvedConfigurationCondition implements Comparable { diff --git a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java index 7af57c99b3f6..e5e4f16a4d4e 100644 --- a/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java +++ b/substratevm/src/com.oracle.svm.configure.test/src/com/oracle/svm/configure/test/config/ResourceConfigurationTest.java @@ -34,7 +34,7 @@ import java.util.List; import java.util.Locale; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; import org.junit.Assert; import org.junit.Test; @@ -127,7 +127,7 @@ public void addResourceBundles(UnresolvedConfigurationCondition condition, Strin } @Override - public void addCondition(ConfigurationCondition configurationCondition, Module module, String resourcePath) { + public void addCondition(RegistrationCondition configurationCondition, Module module, String resourcePath) { } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java index 5fbdb3418524..308cfd899b06 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ResourcesRegistry.java @@ -28,13 +28,13 @@ import java.util.Locale; import org.graalvm.nativeimage.ImageSingletons; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.RuntimeResourceSupport; public interface ResourcesRegistry extends RuntimeResourceSupport { @SuppressWarnings("unchecked") - static ResourcesRegistry singleton() { + static ResourcesRegistry singleton() { return ImageSingletons.lookup(ResourcesRegistry.class); } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java index 61c884918041..67dc5737f6bc 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/ResourceConfiguration.java @@ -40,7 +40,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.regex.Pattern; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; import com.oracle.svm.configure.ConditionalElement; @@ -82,7 +82,7 @@ public void addResourceEntry(Module module, String resourcePath, Object origin) } @Override - public void addCondition(ConfigurationCondition condition, Module module, String resourcePath) { + public void addCondition(RegistrationCondition condition, Module module, String resourcePath) { throw new UnsupportedOperationException("Unused function."); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java index 3f3a411b3a13..03a52d61b325 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/ClassLoaderSupport.java @@ -34,7 +34,7 @@ import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; @Platforms(Platform.HOSTED_ONLY.class) public abstract class ClassLoaderSupport { @@ -52,7 +52,7 @@ public boolean isNativeImageClassLoader(ClassLoader classLoader) { protected abstract boolean isNativeImageClassLoaderImpl(ClassLoader classLoader); - public record ConditionWithOrigin(ConfigurationCondition condition, Object origin) { + public record ConditionWithOrigin(RegistrationCondition condition, Object origin) { } public interface ResourceCollector { @@ -60,7 +60,7 @@ public interface ResourceCollector { void addResourceEntry(Module module, String resourceName, Object origin); - void addResourceConditionally(Module module, String resourceName, ConfigurationCondition condition, Object origin); + void addResourceConditionally(Module module, String resourceName, RegistrationCondition condition, Object origin); void registerNegativeQuery(Module module, String resourceName); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java index d403da2152bc..498690fe8654 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/configure/RuntimeConditionSet.java @@ -33,7 +33,8 @@ import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; +import org.graalvm.nativeimage.impl.TypeReachabilityCondition; import com.oracle.svm.core.hub.DynamicHub; import com.oracle.svm.core.util.VMError; @@ -44,7 +45,7 @@ *

    * If any of the {@link #conditions} is satisfied then the whole set becomes also * {@link #satisfied}. {@link RuntimeConditionSet}s can be created at build time - * {@link #createHosted(ConfigurationCondition)} and stored to the image heap, or it can be encoded + * {@link #createHosted(RegistrationCondition)} and stored to the image heap, or it can be encoded * ({@link #getTypesForEncoding()} and later decoded at run time ({@link #createDecoded(Object[])}. * The current implementation does not cache {@link #conditions}, although this will be implemented * in the future (GR-49526) @@ -60,18 +61,18 @@ public static RuntimeConditionSet emptySet() { } @Platforms(Platform.HOSTED_ONLY.class) - public static RuntimeConditionSet createHosted(ConfigurationCondition condition) { + public static RuntimeConditionSet createHosted(RegistrationCondition condition) { var conditionSet = new RuntimeConditionSet(new Object[0]); conditionSet.addCondition(condition); return conditionSet; } @Platforms(Platform.HOSTED_ONLY.class) - public synchronized void addCondition(ConfigurationCondition cnd) { - VMError.guarantee(cnd.isRuntimeChecked(), "Only runtime conditions can be added to the ConditionalRuntimeValue."); + public synchronized void addCondition(RegistrationCondition cnd) { + VMError.guarantee(((TypeReachabilityCondition) cnd).isRuntimeChecked(), "Only runtime conditions can be added to the ConditionalRuntimeValue."); if (satisfied) { return; - } else if (cnd.isAlwaysTrue()) { + } else if (((TypeReachabilityCondition) cnd).isAlwaysTrue()) { conditions = null; satisfied = true; return; @@ -159,11 +160,11 @@ private void setConditions(Object[] conditions) { satisfied = false; } - private static Object createRuntimeCondition(ConfigurationCondition cnd) { - if (cnd.isAlwaysTrue() || !cnd.isRuntimeChecked()) { + private static Object createRuntimeCondition(RegistrationCondition cnd) { + if (((TypeReachabilityCondition) cnd).isAlwaysTrue() || !((TypeReachabilityCondition) cnd).isRuntimeChecked()) { throw VMError.shouldNotReachHere("We should never create run-time conditions from conditions that are always true at build time. Condition: " + cnd); } - return cnd.getType(); + return ((TypeReachabilityCondition) cnd).getKey(); } private static boolean isSatisfied(Object condition) { @@ -190,7 +191,7 @@ private UnmodifiableRuntimeConditionSet(Object[] conditions) { } @Override - public synchronized void addCondition(ConfigurationCondition cnd) { + public synchronized void addCondition(RegistrationCondition cnd) { throw new UnsupportedOperationException("Can't add conditions to an unmodifiable set of conditions."); } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java index a7818355e12e..61fb7cbb6e8e 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/ClassForNameSupport.java @@ -34,7 +34,7 @@ import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platform.HOSTED_ONLY; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import com.oracle.svm.core.configure.ConditionalRuntimeValue; import com.oracle.svm.core.configure.RuntimeConditionSet; @@ -78,11 +78,11 @@ private static ClassForNameSupport[] layeredSingletons() { @Platforms(Platform.HOSTED_ONLY.class) public void registerClass(Class clazz) { - registerClass(ConfigurationCondition.alwaysTrue(), clazz); + registerClass(RegistrationCondition.always(), clazz); } @Platforms(Platform.HOSTED_ONLY.class) - public void registerClass(ConfigurationCondition condition, Class clazz) { + public void registerClass(RegistrationCondition condition, Class clazz) { assert !clazz.isPrimitive() : "primitive classes cannot be looked up by name"; if (PredefinedClassesSupport.isPredefined(clazz)) { return; // must be defined at runtime before it can be looked up @@ -134,7 +134,7 @@ private boolean isLibGraalClass(Class clazz) { } public static ConditionalRuntimeValue updateConditionalValue(ConditionalRuntimeValue existingConditionalValue, Object newValue, - ConfigurationCondition additionalCondition) { + RegistrationCondition additionalCondition) { if (existingConditionalValue == null) { return new ConditionalRuntimeValue<>(RuntimeConditionSet.createHosted(additionalCondition), newValue); } else { @@ -145,12 +145,12 @@ public static ConditionalRuntimeValue updateConditionalValue(Conditional } @Platforms(Platform.HOSTED_ONLY.class) - public void registerExceptionForClass(ConfigurationCondition condition, String className, Throwable t) { + public void registerExceptionForClass(RegistrationCondition condition, String className, Throwable t) { updateCondition(condition, className, t); } @Platforms(Platform.HOSTED_ONLY.class) - public void registerNegativeQuery(ConfigurationCondition condition, String className) { + public void registerNegativeQuery(RegistrationCondition condition, String className) { /* * If the class is not accessible by the builder class loader, but was already registered * through registerClass(Class), we don't overwrite the actual class or exception. @@ -159,7 +159,7 @@ public void registerNegativeQuery(ConfigurationCondition condition, String class } @Platforms(Platform.HOSTED_ONLY.class) - public void registerUnsafeAllocated(ConfigurationCondition condition, Class clazz) { + public void registerUnsafeAllocated(RegistrationCondition condition, Class clazz) { if (!clazz.isArray() && !clazz.isInterface() && !Modifier.isAbstract(clazz.getModifiers())) { /* Otherwise, UNSAFE.allocateInstance results in InstantiationException */ var conditionSet = unsafeInstantiatedClasses.putIfAbsent(clazz, RuntimeConditionSet.createHosted(condition)); @@ -169,7 +169,7 @@ public void registerUnsafeAllocated(ConfigurationCondition condition, Class c } } - private void updateCondition(ConfigurationCondition condition, String className, Object value) { + private void updateCondition(RegistrationCondition condition, String className, Object value) { synchronized (knownClasses) { var runtimeConditions = knownClasses.putIfAbsent(className, new ConditionalRuntimeValue<>(RuntimeConditionSet.createHosted(condition), value)); if (runtimeConditions != null) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaNetHttpFeature.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaNetHttpFeature.java index a36b46ba346c..44e5768c3d2c 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaNetHttpFeature.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/JavaNetHttpFeature.java @@ -27,8 +27,8 @@ import java.util.Optional; import org.graalvm.nativeimage.ImageSingletons; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeReflection; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; import com.oracle.svm.configure.ResourcesRegistry; @@ -94,7 +94,7 @@ public void afterRegistration(AfterRegistrationAccess access) { @Override public void beforeAnalysis(BeforeAnalysisAccess access) { access.registerReachabilityHandler(a -> { - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "sun.net.httpserver.simpleserver.resources.simpleserver"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "sun.net.httpserver.simpleserver.resources.simpleserver"); }, access.findClassByName("sun.net.httpserver.simpleserver.SimpleFileServerImpl")); } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java index 3c1c5e164616..51efa3330249 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/Resources.java @@ -48,7 +48,7 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import com.oracle.svm.core.BuildPhaseProvider; import com.oracle.svm.core.ClassLoaderSupport.ConditionWithOrigin; @@ -305,7 +305,7 @@ public void registerNegativeQuery(Module module, String resourceName) { } @Platforms(Platform.HOSTED_ONLY.class) - public void registerIncludePattern(ConfigurationCondition condition, String module, String pattern) { + public void registerIncludePattern(RegistrationCondition condition, String module, String pattern) { assert MissingRegistrationUtils.throwMissingRegistrationErrors(); synchronized (requestedPatterns) { updateTimeStamp(); 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 36d8bb4e6e21..06288c42649f 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 @@ -48,8 +48,8 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeReflection; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeReflectionSupport; import org.graalvm.nativeimage.impl.RuntimeResourceSupport; @@ -181,7 +181,7 @@ public void registerRequiredReflectionAndResourcesForBundle(String baseName, Col if (i > 0) { String name = baseName.substring(i + 1) + "Provider"; String providerName = baseName.substring(0, i) + ".spi." + name; - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerClassLookup(ConfigurationCondition.alwaysTrue(), providerName); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerClassLookup(RegistrationCondition.always(), providerName); } } @@ -282,7 +282,7 @@ private static void registerNullaryConstructor(Class bundleClass) { } @Platforms(Platform.HOSTED_ONLY.class) - public void registerBundleLookup(ConfigurationCondition condition, String baseName) { + public void registerBundleLookup(RegistrationCondition condition, String baseName) { RuntimeConditionSet conditionSet = RuntimeConditionSet.emptySet(); var registered = registeredBundles.putIfAbsent(baseName, conditionSet); (registered == null ? conditionSet : registered).addCondition(condition); diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIRuntimeAccess.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIRuntimeAccess.java index 4e4080b7667e..446006b68ca2 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIRuntimeAccess.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jni/JNIRuntimeAccess.java @@ -30,8 +30,8 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeJNIAccess; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport; /** @@ -56,6 +56,6 @@ public static void register(Field... fields) { } public static void register(boolean finalIsWritable, Field... fields) { - ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(ConfigurationCondition.alwaysTrue(), finalIsWritable, fields); + ImageSingletons.lookup(RuntimeJNIAccessSupport.class).register(RegistrationCondition.always(), finalIsWritable, fields); } } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/proxy/DynamicProxySupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/proxy/DynamicProxySupport.java index 75ff23639307..6b674baeb5cb 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/proxy/DynamicProxySupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/proxy/DynamicProxySupport.java @@ -32,9 +32,10 @@ import org.graalvm.collections.EconomicMap; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeClassInitialization; import org.graalvm.nativeimage.hosted.RuntimeReflection; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.impl.TypeReachabilityCondition; import com.oracle.svm.core.configure.ConditionalRuntimeValue; import com.oracle.svm.core.configure.RuntimeConditionSet; @@ -101,8 +102,8 @@ public DynamicProxySupport() { @Override @Platforms(Platform.HOSTED_ONLY.class) - public synchronized void addProxyClass(ConfigurationCondition condition, Class... interfaces) { - VMError.guarantee(condition.isRuntimeChecked(), "The condition used must be a runtime condition."); + public synchronized void addProxyClass(RegistrationCondition condition, Class... interfaces) { + VMError.guarantee(((TypeReachabilityCondition) condition).isRuntimeChecked(), "The condition used must be a runtime condition."); /* * Make a defensive copy of the interfaces array to protect against the caller modifying the * array. diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/serialize/SerializationSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/serialize/SerializationSupport.java index d20b8382277a..31e765321ad8 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/serialize/SerializationSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/serialize/SerializationSupport.java @@ -38,7 +38,7 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import com.oracle.svm.core.configure.RuntimeConditionSet; import com.oracle.svm.core.reflect.SubstrateConstructorAccessor; @@ -191,7 +191,7 @@ public String getClassLoaderSerializationLookupKey(ClassLoader classLoader) { private final EconomicMap lambdaCapturingClasses = EconomicMap.create(); @Platforms(Platform.HOSTED_ONLY.class) - public void registerSerializationTargetClass(ConfigurationCondition cnd, Class serializationTargetClass) { + public void registerSerializationTargetClass(RegistrationCondition cnd, Class serializationTargetClass) { synchronized (classes) { var previous = classes.putIfAbsent(serializationTargetClass, RuntimeConditionSet.createHosted(cnd)); if (previous != null) { @@ -201,7 +201,7 @@ public void registerSerializationTargetClass(ConfigurationCondition cnd, Class x instanceof DirectMethodHandleDesc dmh && dmh.kind() == Kind.STATIC) diff --git a/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/StronglyTypedRuntimeForeignAccessSupport.java b/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/StronglyTypedRuntimeForeignAccessSupport.java index 34f86a202923..2b74bc58ff21 100644 --- a/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/StronglyTypedRuntimeForeignAccessSupport.java +++ b/substratevm/src/com.oracle.svm.hosted.foreign/src/com/oracle/svm/hosted/foreign/StronglyTypedRuntimeForeignAccessSupport.java @@ -28,7 +28,7 @@ import java.lang.foreign.Linker; import java.lang.invoke.MethodHandle; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.RuntimeForeignAccessSupport; /** @@ -55,50 +55,50 @@ private static Linker.Option[] castOptions(Object... optionsO) { @FunctionalInterface interface Recorder { - void apply(ConfigurationCondition condition, FunctionDescriptor desc, Linker.Option... options); + void apply(RegistrationCondition condition, FunctionDescriptor desc, Linker.Option... options); } @FunctionalInterface interface DirectUpcallRecorder { - void apply(ConfigurationCondition condition, MethodHandle target, FunctionDescriptor desc, Linker.Option... options); + void apply(RegistrationCondition condition, MethodHandle target, FunctionDescriptor desc, Linker.Option... options); } static StronglyTypedRuntimeForeignAccessSupport make(Recorder forDowncalls, Recorder forUpcalls, DirectUpcallRecorder forDirectUpcalls) { return new StronglyTypedRuntimeForeignAccessSupport() { @Override - public void registerForDowncall(ConfigurationCondition condition, FunctionDescriptor desc, Linker.Option... options) { + public void registerForDowncall(RegistrationCondition condition, FunctionDescriptor desc, Linker.Option... options) { forDowncalls.apply(condition, desc, options); } @Override - public void registerForUpcall(ConfigurationCondition condition, FunctionDescriptor desc, Linker.Option... options) { + public void registerForUpcall(RegistrationCondition condition, FunctionDescriptor desc, Linker.Option... options) { forUpcalls.apply(condition, desc, options); } @Override - public void registerForDirectUpcall(ConfigurationCondition condition, MethodHandle target, FunctionDescriptor fd, Linker.Option... options) { + public void registerForDirectUpcall(RegistrationCondition condition, MethodHandle target, FunctionDescriptor fd, Linker.Option... options) { forDirectUpcalls.apply(condition, target, fd, options); } }; } @Override - default void registerForDowncall(ConfigurationCondition condition, Object descO, Object... optionsO) { + default void registerForDowncall(RegistrationCondition condition, Object descO, Object... optionsO) { registerForDowncall(condition, castDesc(descO), castOptions(optionsO)); } - void registerForDowncall(ConfigurationCondition condition, FunctionDescriptor desc, Linker.Option... options); + void registerForDowncall(RegistrationCondition condition, FunctionDescriptor desc, Linker.Option... options); @Override - default void registerForUpcall(ConfigurationCondition condition, Object descO, Object... optionsO) { + default void registerForUpcall(RegistrationCondition condition, Object descO, Object... optionsO) { registerForUpcall(condition, castDesc(descO), castOptions(optionsO)); } - void registerForUpcall(ConfigurationCondition condition, FunctionDescriptor desc, Linker.Option... options); + void registerForUpcall(RegistrationCondition condition, FunctionDescriptor desc, Linker.Option... options); - default void registerForDirectUpcall(ConfigurationCondition condition, MethodHandle target, Object desc, Object... options) { + default void registerForDirectUpcall(RegistrationCondition condition, MethodHandle target, Object desc, Object... options) { registerForDirectUpcall(condition, target, castDesc(desc), castOptions(options)); } - void registerForDirectUpcall(ConfigurationCondition condition, MethodHandle target, FunctionDescriptor desc, Linker.Option... options); + void registerForDirectUpcall(RegistrationCondition condition, MethodHandle target, FunctionDescriptor desc, Linker.Option... options); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassLoaderSupportImpl.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassLoaderSupportImpl.java index c8dff0897002..c3339155705e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassLoaderSupportImpl.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ClassLoaderSupportImpl.java @@ -54,7 +54,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import com.oracle.svm.core.ClassLoaderSupport; import com.oracle.svm.core.util.ClasspathUtils; @@ -72,7 +72,7 @@ public class ClassLoaderSupportImpl extends ClassLoaderSupport { private final Map> packageToModules; - private record ConditionalResource(ConfigurationCondition condition, String resourceName, Object origin) { + private record ConditionalResource(RegistrationCondition condition, String resourceName, Object origin) { } public ClassLoaderSupportImpl(NativeImageClassLoaderSupport classLoaderSupport) { @@ -220,13 +220,13 @@ private static void scanJar(Path jarPath, ResourceCollector collector, boolean i } } - private static void includeResource(ResourceCollector collector, Module module, String name, ConfigurationCondition condition, Object origin) { + private static void includeResource(ResourceCollector collector, Module module, String name, RegistrationCondition condition, Object origin) { collector.addResourceConditionally(module, name, condition, origin); } private static List shouldIncludeEntry(Module module, ResourceCollector collector, String fileName, URI uri, boolean includeCurrent) { if (includeCurrent && !(fileName.endsWith(".class") || fileName.endsWith(".jar"))) { - return Collections.singletonList(new ConditionWithOrigin(ConfigurationCondition.alwaysTrue(), "Include all")); + return Collections.singletonList(new ConditionWithOrigin(RegistrationCondition.always(), "Include all")); } return collector.isIncluded(module, fileName, uri); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ConditionalConfigurationRegistry.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ConditionalConfigurationRegistry.java index df72aa376f5d..c628b01063ea 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ConditionalConfigurationRegistry.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ConditionalConfigurationRegistry.java @@ -32,7 +32,8 @@ import java.util.function.Consumer; import org.graalvm.nativeimage.hosted.Feature; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; +import org.graalvm.nativeimage.impl.TypeReachabilityCondition; import com.oracle.svm.core.util.VMError; import com.oracle.svm.hosted.classinitialization.ClassInitializationSupport; @@ -41,32 +42,32 @@ public abstract class ConditionalConfigurationRegistry { private Feature.BeforeAnalysisAccess beforeAnalysisAccess; private final Map, Collection> pendingReachabilityHandlers = new ConcurrentHashMap<>(); - protected void registerConditionalConfiguration(ConfigurationCondition condition, Consumer consumer) { + protected void registerConditionalConfiguration(RegistrationCondition condition, Consumer consumer) { Objects.requireNonNull(condition, "Cannot use null value as condition for conditional configuration. Please ensure that you register a non-null condition."); Objects.requireNonNull(consumer, "Cannot use null value as runnable for conditional configuration. Please ensure that you register a non-null runnable."); - if (condition.isRuntimeChecked() && !condition.isAlwaysTrue()) { + if (((TypeReachabilityCondition) condition).isRuntimeChecked() && !((TypeReachabilityCondition) condition).isAlwaysTrue()) { /* * We do this before the type is reached as the handler runs during analysis when it is * too late to register types for reached tracking. If the type is never reached, there * is no damage as subtypes will also never be reached. */ - ClassInitializationSupport.singleton().addForTypeReachedTracking(condition.getType()); + ClassInitializationSupport.singleton().addForTypeReachedTracking(((TypeReachabilityCondition) condition).getKey()); } - if (ConfigurationCondition.alwaysTrue().equals(condition)) { + if (RegistrationCondition.always().equals(condition)) { /* analysis optimization to include new types as early as possible */ - consumer.accept(ConfigurationCondition.alwaysTrue()); + consumer.accept(RegistrationCondition.always()); } else { - ConfigurationCondition runtimeCondition; - if (condition.isRuntimeChecked()) { + RegistrationCondition runtimeCondition; + if (((TypeReachabilityCondition) condition).isRuntimeChecked()) { runtimeCondition = condition; } else { - runtimeCondition = ConfigurationCondition.alwaysTrue(); + runtimeCondition = RegistrationCondition.always(); } if (beforeAnalysisAccess == null) { - Collection handlers = pendingReachabilityHandlers.computeIfAbsent(condition.getType(), key -> new ConcurrentLinkedQueue<>()); + Collection handlers = pendingReachabilityHandlers.computeIfAbsent(((TypeReachabilityCondition) condition).getKey(), key -> new ConcurrentLinkedQueue<>()); handlers.add(() -> consumer.accept(runtimeCondition)); } else { - beforeAnalysisAccess.registerReachabilityHandler(access -> consumer.accept(runtimeCondition), condition.getType()); + beforeAnalysisAccess.registerReachabilityHandler(access -> consumer.accept(runtimeCondition), ((TypeReachabilityCondition) condition).getKey()); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureImpl.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureImpl.java index 8db5e3110ad2..365a04cd7452 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureImpl.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/FeatureImpl.java @@ -50,8 +50,8 @@ import org.graalvm.nativeimage.hosted.Feature; import org.graalvm.nativeimage.hosted.Feature.DuringAnalysisAccess; import org.graalvm.nativeimage.hosted.FieldValueTransformer; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeReflection; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import com.oracle.graal.pointsto.BigBang; import com.oracle.graal.pointsto.ObjectScanner; @@ -413,7 +413,7 @@ public void registerAsUnsafeAllocated(AnalysisType aType) { throw UserError.abort("Cannot register an abstract class as instantiated: " + aType.toJavaName(true)); } aType.registerAsUnsafeAllocated("From feature"); - classForNameSupport.registerUnsafeAllocated(ConfigurationCondition.alwaysTrue(), aType.getJavaClass()); + classForNameSupport.registerUnsafeAllocated(RegistrationCondition.always(), aType.getJavaClass()); } @Override diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java index 71e8b882582e..7b3234efe781 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java @@ -71,10 +71,10 @@ import org.graalvm.nativeimage.c.struct.RawStructure; import org.graalvm.nativeimage.hosted.Feature; import org.graalvm.nativeimage.hosted.Feature.OnAnalysisExitAccess; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeReflection; import org.graalvm.nativeimage.impl.AnnotationExtractor; import org.graalvm.nativeimage.impl.CConstantValueSupport; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; import org.graalvm.nativeimage.impl.RuntimeReflectionSupport; import org.graalvm.nativeimage.impl.SizeOfSupport; @@ -1108,7 +1108,7 @@ protected void setupNativeImage(String imageName, OptionValues options, Map !(classesOrPackagesToIgnore.contains(c.getPackageName()) || classesOrPackagesToIgnore.contains(c.getName()))) - .forEach(c -> runtimeReflection.registerClassFully(ConfigurationCondition.alwaysTrue(), c)); + .forEach(c -> runtimeReflection.registerClassFully(RegistrationCondition.always(), c)); for (String className : loader.classLoaderSupport.getClassNamesToPreserve()) { RuntimeReflection.registerClassLookup(className); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java index 2f11afd2fc5e..11a9bbbd5c81 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java @@ -56,9 +56,10 @@ import java.util.stream.Collectors; import org.graalvm.nativeimage.ImageSingletons; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeResourceAccess; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeResourceSupport; +import org.graalvm.nativeimage.impl.TypeReachabilityCondition; import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.configure.ResourceConfigurationParser; @@ -161,10 +162,10 @@ public static class Options { private boolean sealed = false; - private record ConditionalPattern(ConfigurationCondition condition, String pattern, Object origin) { + private record ConditionalPattern(RegistrationCondition condition, String pattern, Object origin) { } - private record CompiledConditionalPattern(ConfigurationCondition condition, ResourcePattern compiledPattern, Object origin) { + private record CompiledConditionalPattern(RegistrationCondition condition, ResourcePattern compiledPattern, Object origin) { } private Set resourcePatternWorkSet = Collections.newSetFromMap(new ConcurrentHashMap<>()); @@ -174,7 +175,7 @@ private record CompiledConditionalPattern(ConfigurationCondition condition, Reso private int loadedConfigurations; private ImageClassLoader imageClassLoader; - private class ResourcesRegistryImpl extends ConditionalConfigurationRegistry implements ResourcesRegistry { + private class ResourcesRegistryImpl extends ConditionalConfigurationRegistry implements ResourcesRegistry { private final ClassInitializationSupport classInitializationSupport = ClassInitializationSupport.singleton(); private final Set alreadyAddedResources = new HashSet<>(); @@ -183,7 +184,7 @@ private class ResourcesRegistryImpl extends ConditionalConfigurationRegistry imp } @Override - public void addResources(ConfigurationCondition condition, String pattern, Object origin) { + public void addResources(RegistrationCondition condition, String pattern, Object origin) { try { resourcePatternWorkSet.add(new ConditionalPattern(condition, pattern, origin)); } catch (UnsupportedOperationException e) { @@ -192,17 +193,17 @@ public void addResources(ConfigurationCondition condition, String pattern, Objec } @Override - public void addGlob(ConfigurationCondition condition, String module, String glob, Object origin) { + public void addGlob(RegistrationCondition condition, String module, String glob, Object origin) { String canonicalGlob = NativeImageResourcePathRepresentation.toCanonicalForm(glob); String resolvedGlob = GlobUtils.transformToTriePath(canonicalGlob, module); globWorkSet.add(new ConditionalPattern(condition, resolvedGlob, origin)); } @Override - public void addCondition(ConfigurationCondition condition, Module module, String resourcePath) { + public void addCondition(RegistrationCondition condition, Module module, String resourcePath) { var conditionalResource = Resources.currentLayer().getResource(createStorageKey(module, resourcePath)); if (conditionalResource != null) { - classInitializationSupport.addForTypeReachedTracking(condition.getType()); + classInitializationSupport.addForTypeReachedTracking(((TypeReachabilityCondition) condition).getKey()); conditionalResource.getConditions().addCondition(condition); } } @@ -233,7 +234,7 @@ public void injectResource(Module module, String resourcePath, byte[] resourceCo } @Override - public void ignoreResources(ConfigurationCondition condition, String pattern) { + public void ignoreResources(RegistrationCondition condition, String pattern) { registerConditionalConfiguration(condition, (cnd) -> { UserError.guarantee(!sealed, "Resources ignored too late: %s", pattern); @@ -242,17 +243,17 @@ public void ignoreResources(ConfigurationCondition condition, String pattern) { } @Override - public void addResourceBundles(ConfigurationCondition condition, String name) { + public void addResourceBundles(RegistrationCondition condition, String name) { registerConditionalConfiguration(condition, (cnd) -> ImageSingletons.lookup(LocalizationFeature.class).prepareBundle(cnd, name)); } @Override - public void addClassBasedResourceBundle(ConfigurationCondition condition, String basename, String className) { + public void addClassBasedResourceBundle(RegistrationCondition condition, String basename, String className) { registerConditionalConfiguration(condition, (cnd) -> ImageSingletons.lookup(LocalizationFeature.class).prepareClassResourceBundle(basename, className)); } @Override - public void addResourceBundles(ConfigurationCondition condition, String basename, Collection locales) { + public void addResourceBundles(RegistrationCondition condition, String basename, Collection locales) { registerConditionalConfiguration(condition, (cnd) -> ImageSingletons.lookup(LocalizationFeature.class).prepareBundle(cnd, basename, locales)); } @@ -406,14 +407,14 @@ protected boolean collectEmbeddedResourcesInfo() { public void beforeAnalysis(BeforeAnalysisAccess a) { FeatureImpl.BeforeAnalysisAccessImpl access = (FeatureImpl.BeforeAnalysisAccessImpl) a; /* load and parse resource configuration files */ - ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(access.getImageClassLoader(), + ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(access.getImageClassLoader(), ClassInitializationSupport.singleton()); - ResourceConfigurationParser parser = ResourceConfigurationParser.create(true, conditionResolver, ResourcesRegistry.singleton(), + ResourceConfigurationParser parser = ResourceConfigurationParser.create(true, conditionResolver, ResourcesRegistry.singleton(), ConfigurationFiles.Options.getConfigurationParserOptions()); loadedConfigurations = ConfigurationParserUtils.parseAndRegisterConfigurationsFromCombinedFile(parser, imageClassLoader, "resource"); - ResourceConfigurationParser legacyParser = ResourceConfigurationParser.create(false, conditionResolver, ResourcesRegistry.singleton(), + ResourceConfigurationParser legacyParser = ResourceConfigurationParser.create(false, conditionResolver, ResourcesRegistry.singleton(), ConfigurationFiles.Options.getConfigurationParserOptions()); loadedConfigurations += ConfigurationParserUtils.parseAndRegisterConfigurations(legacyParser, imageClassLoader, "resource", ConfigurationFiles.Options.ResourceConfigurationFiles, ConfigurationFiles.Options.ResourceConfigurationResources, @@ -444,7 +445,7 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { /* prepare regex patterns for resource registration */ resourcePatternWorkSet.addAll(Options.IncludeResources.getValue() .getValuesWithOrigins() - .map(e -> new ConditionalPattern(ConfigurationCondition.alwaysTrue(), e.value(), e.origin())) + .map(e -> new ConditionalPattern(RegistrationCondition.always(), e.value(), e.origin())) .toList()); Set includePatterns = resourcePatternWorkSet .stream() @@ -583,7 +584,7 @@ public void addResourceEntry(Module module, String resourceName, Object origin) } @Override - public void addResourceConditionally(Module module, String resourceName, ConfigurationCondition condition, Object origin) { + public void addResourceConditionally(Module module, String resourceName, RegistrationCondition condition, Object origin) { registerConditionalConfiguration(condition, cnd -> { addResourceEntry(module, resourceName, origin); ImageSingletons.lookup(RuntimeResourceSupport.class).addCondition(cnd, module, resourceName); @@ -601,7 +602,7 @@ public void registerNegativeQuery(Module module, String resourceName) { Resources.currentLayer().registerNegativeQuery(module, resourceName); } - public void registerIncludePattern(ConfigurationCondition condition, String module, String pattern) { + public void registerIncludePattern(RegistrationCondition condition, String module, String pattern) { registerConditionalConfiguration(condition, cnd -> Resources.currentLayer().registerIncludePattern(cnd, module, pattern)); } } @@ -655,7 +656,7 @@ public void afterAnalysis(AfterAnalysisAccess access) { /* prepare resources GlobTrie for runtime */ GlobTrieNode root = Resources.currentLayer().getResourcesTrieRoot(); - CompressedGlobTrie.removeNodes(root, (conditionWithOrigin) -> !access.isReachable(conditionWithOrigin.condition().getType())); + CompressedGlobTrie.removeNodes(root, (conditionWithOrigin) -> !access.isReachable(((TypeReachabilityCondition) conditionWithOrigin.condition()).getKey())); CompressedGlobTrie.finalize(root); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java index bd9801dfbba5..08d754075d4f 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ConfigurationParserUtils.java @@ -41,7 +41,7 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.ReflectionRegistry; import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; @@ -60,9 +60,9 @@ public final class ConfigurationParserUtils { - public static ReflectionConfigurationParser> create(String combinedFileKey, boolean combinedFileSchema, - ConfigurationConditionResolver conditionResolver, ReflectionRegistry registry, ProxyRegistry proxyRegistry, - RuntimeSerializationSupport serializationSupport, ImageClassLoader imageClassLoader) { + public static ReflectionConfigurationParser> create(String combinedFileKey, boolean combinedFileSchema, + ConfigurationConditionResolver conditionResolver, ReflectionRegistry registry, ProxyRegistry proxyRegistry, + RuntimeSerializationSupport serializationSupport, ImageClassLoader imageClassLoader) { return ReflectionConfigurationParser.create(combinedFileKey, combinedFileSchema, conditionResolver, RegistryAdapter.create(registry, proxyRegistry, serializationSupport, imageClassLoader), ConfigurationFiles.Options.getConfigurationParserOptions()); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ReflectionRegistryAdapter.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ReflectionRegistryAdapter.java index f0679425fc82..3481ae8c67bd 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ReflectionRegistryAdapter.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/ReflectionRegistryAdapter.java @@ -27,7 +27,7 @@ import java.lang.reflect.Proxy; import java.util.Arrays; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.RuntimeReflectionSupport; import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; @@ -41,9 +41,9 @@ public class ReflectionRegistryAdapter extends RegistryAdapter { private final RuntimeReflectionSupport reflectionSupport; private final ProxyRegistry proxyRegistry; - private final RuntimeSerializationSupport serializationSupport; + private final RuntimeSerializationSupport serializationSupport; - ReflectionRegistryAdapter(RuntimeReflectionSupport reflectionSupport, ProxyRegistry proxyRegistry, RuntimeSerializationSupport serializationSupport, + ReflectionRegistryAdapter(RuntimeReflectionSupport reflectionSupport, ProxyRegistry proxyRegistry, RuntimeSerializationSupport serializationSupport, ImageClassLoader classLoader) { super(reflectionSupport, classLoader); this.reflectionSupport = reflectionSupport; @@ -52,7 +52,7 @@ public class ReflectionRegistryAdapter extends RegistryAdapter { } @Override - public void registerType(ConfigurationCondition condition, Class type) { + public void registerType(RegistrationCondition condition, Class type) { super.registerType(condition, type); if (Proxy.isProxyClass(type)) { proxyRegistry.accept(condition, Arrays.stream(type.getInterfaces()).map(Class::getTypeName).toList()); @@ -60,7 +60,7 @@ public void registerType(ConfigurationCondition condition, Class type) { } @Override - public TypeResult> resolveType(ConfigurationCondition condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives) { + public TypeResult> resolveType(RegistrationCondition condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives) { TypeResult> result = super.resolveType(condition, typeDescriptor, allowPrimitives); if (!result.isPresent() && typeDescriptor instanceof NamedConfigurationTypeDescriptor namedDescriptor) { Throwable classLookupException = result.getException(); @@ -72,67 +72,67 @@ public TypeResult> resolveType(ConfigurationCondition condition, Config } @Override - public void registerPublicClasses(ConfigurationCondition condition, Class type) { + public void registerPublicClasses(RegistrationCondition condition, Class type) { reflectionSupport.registerAllClassesQuery(condition, type); } @Override - public void registerDeclaredClasses(ConfigurationCondition condition, Class type) { + public void registerDeclaredClasses(RegistrationCondition condition, Class type) { reflectionSupport.registerAllDeclaredClassesQuery(condition, type); } @Override - public void registerRecordComponents(ConfigurationCondition condition, Class type) { + public void registerRecordComponents(RegistrationCondition condition, Class type) { reflectionSupport.registerAllRecordComponentsQuery(condition, type); } @Override - public void registerPermittedSubclasses(ConfigurationCondition condition, Class type) { + public void registerPermittedSubclasses(RegistrationCondition condition, Class type) { reflectionSupport.registerAllPermittedSubclassesQuery(condition, type); } @Override - public void registerNestMembers(ConfigurationCondition condition, Class type) { + public void registerNestMembers(RegistrationCondition condition, Class type) { reflectionSupport.registerAllNestMembersQuery(condition, type); } @Override - public void registerSigners(ConfigurationCondition condition, Class type) { + public void registerSigners(RegistrationCondition condition, Class type) { reflectionSupport.registerAllSignersQuery(condition, type); } @Override - public void registerPublicFields(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerPublicFields(RegistrationCondition condition, boolean queriedOnly, Class type) { ((ReflectionDataBuilder) reflectionSupport).registerAllFieldsQuery(condition, queriedOnly, type); } @Override - public void registerDeclaredFields(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerDeclaredFields(RegistrationCondition condition, boolean queriedOnly, Class type) { ((ReflectionDataBuilder) reflectionSupport).registerAllDeclaredFieldsQuery(condition, queriedOnly, type); } @Override - public void registerPublicMethods(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerPublicMethods(RegistrationCondition condition, boolean queriedOnly, Class type) { reflectionSupport.registerAllMethodsQuery(condition, queriedOnly, type); } @Override - public void registerDeclaredMethods(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerDeclaredMethods(RegistrationCondition condition, boolean queriedOnly, Class type) { reflectionSupport.registerAllDeclaredMethodsQuery(condition, queriedOnly, type); } @Override - public void registerPublicConstructors(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerPublicConstructors(RegistrationCondition condition, boolean queriedOnly, Class type) { reflectionSupport.registerAllConstructorsQuery(condition, queriedOnly, type); } @Override - public void registerDeclaredConstructors(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerDeclaredConstructors(RegistrationCondition condition, boolean queriedOnly, Class type) { reflectionSupport.registerAllDeclaredConstructorsQuery(condition, queriedOnly, type); } @Override - public void registerAsSerializable(ConfigurationCondition condition, Class clazz) { + public void registerAsSerializable(RegistrationCondition condition, Class clazz) { serializationSupport.register(condition, clazz); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/RegistryAdapter.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/RegistryAdapter.java index abf03ac5e410..0f2b4f11fa96 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/RegistryAdapter.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/config/RegistryAdapter.java @@ -33,7 +33,7 @@ import java.util.List; import org.graalvm.nativeimage.ImageSingletons; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.ReflectionRegistry; import org.graalvm.nativeimage.impl.RuntimeReflectionSupport; import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; @@ -49,11 +49,11 @@ import com.oracle.svm.util.ClassUtil; import com.oracle.svm.util.TypeResult; -public class RegistryAdapter implements ReflectionConfigurationParserDelegate> { +public class RegistryAdapter implements ReflectionConfigurationParserDelegate> { private final ReflectionRegistry registry; private final ImageClassLoader classLoader; - public static RegistryAdapter create(ReflectionRegistry registry, ProxyRegistry proxyRegistry, RuntimeSerializationSupport serializationSupport, + public static RegistryAdapter create(ReflectionRegistry registry, ProxyRegistry proxyRegistry, RuntimeSerializationSupport serializationSupport, ImageClassLoader classLoader) { if (registry instanceof RuntimeReflectionSupport) { return new ReflectionRegistryAdapter((RuntimeReflectionSupport) registry, proxyRegistry, serializationSupport, classLoader); @@ -68,12 +68,12 @@ public static RegistryAdapter create(ReflectionRegistry registry, ProxyRegistry } @Override - public void registerType(ConfigurationCondition condition, Class type) { + public void registerType(RegistrationCondition condition, Class type) { registry.register(condition, type); } @Override - public TypeResult> resolveType(ConfigurationCondition condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives) { + public TypeResult> resolveType(RegistrationCondition condition, ConfigurationTypeDescriptor typeDescriptor, boolean allowPrimitives) { switch (typeDescriptor.getDescriptorType()) { case NAMED -> { NamedConfigurationTypeDescriptor namedDescriptor = (NamedConfigurationTypeDescriptor) typeDescriptor; @@ -133,67 +133,67 @@ private TypeResult> resolveProxyType(ProxyConfigurationTypeDescriptor t } @Override - public void registerPublicClasses(ConfigurationCondition condition, Class type) { + public void registerPublicClasses(RegistrationCondition condition, Class type) { registry.register(condition, type.getClasses()); } @Override - public void registerDeclaredClasses(ConfigurationCondition condition, Class type) { + public void registerDeclaredClasses(RegistrationCondition condition, Class type) { registry.register(condition, type.getDeclaredClasses()); } @Override - public void registerRecordComponents(ConfigurationCondition condition, Class type) { + public void registerRecordComponents(RegistrationCondition condition, Class type) { } @Override - public void registerPermittedSubclasses(ConfigurationCondition condition, Class type) { + public void registerPermittedSubclasses(RegistrationCondition condition, Class type) { } @Override - public void registerNestMembers(ConfigurationCondition condition, Class type) { + public void registerNestMembers(RegistrationCondition condition, Class type) { } @Override - public void registerSigners(ConfigurationCondition condition, Class type) { + public void registerSigners(RegistrationCondition condition, Class type) { } @Override - public void registerPublicFields(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerPublicFields(RegistrationCondition condition, boolean queriedOnly, Class type) { if (!queriedOnly) { registry.register(condition, false, type.getFields()); } } @Override - public void registerDeclaredFields(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerDeclaredFields(RegistrationCondition condition, boolean queriedOnly, Class type) { if (!queriedOnly) { registry.register(condition, false, type.getDeclaredFields()); } } @Override - public void registerPublicMethods(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerPublicMethods(RegistrationCondition condition, boolean queriedOnly, Class type) { registry.register(condition, queriedOnly, type.getMethods()); } @Override - public void registerDeclaredMethods(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerDeclaredMethods(RegistrationCondition condition, boolean queriedOnly, Class type) { registry.register(condition, queriedOnly, type.getDeclaredMethods()); } @Override - public void registerPublicConstructors(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerPublicConstructors(RegistrationCondition condition, boolean queriedOnly, Class type) { registry.register(condition, queriedOnly, type.getConstructors()); } @Override - public void registerDeclaredConstructors(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public void registerDeclaredConstructors(RegistrationCondition condition, boolean queriedOnly, Class type) { registry.register(condition, queriedOnly, type.getDeclaredConstructors()); } @Override - public void registerField(ConfigurationCondition condition, Class type, String fieldName, boolean allowWrite) throws NoSuchFieldException { + public void registerField(RegistrationCondition condition, Class type, String fieldName, boolean allowWrite) throws NoSuchFieldException { try { registry.register(condition, allowWrite, type.getDeclaredField(fieldName)); } catch (NoSuchFieldException e) { @@ -206,7 +206,7 @@ public void registerField(ConfigurationCondition condition, Class type, Strin } @Override - public boolean registerAllMethodsWithName(ConfigurationCondition condition, boolean queriedOnly, Class type, String methodName) { + public boolean registerAllMethodsWithName(RegistrationCondition condition, boolean queriedOnly, Class type, String methodName) { boolean found = false; Executable[] methods = type.getDeclaredMethods(); for (Executable method : methods) { @@ -219,14 +219,14 @@ public boolean registerAllMethodsWithName(ConfigurationCondition condition, bool } @Override - public boolean registerAllConstructors(ConfigurationCondition condition, boolean queriedOnly, Class type) { + public boolean registerAllConstructors(RegistrationCondition condition, boolean queriedOnly, Class type) { Executable[] methods = type.getDeclaredConstructors(); registerExecutable(condition, queriedOnly, methods); return methods.length > 0; } @Override - public void registerUnsafeAllocated(ConfigurationCondition condition, Class clazz) { + public void registerUnsafeAllocated(RegistrationCondition condition, Class clazz) { if (!clazz.isArray() && !clazz.isInterface() && !Modifier.isAbstract(clazz.getModifiers())) { registry.register(condition, true, clazz); /* @@ -237,7 +237,7 @@ public void registerUnsafeAllocated(ConfigurationCondition condition, Class c } @Override - public void registerMethod(ConfigurationCondition condition, boolean queriedOnly, Class type, String methodName, List> methodParameterTypes) throws NoSuchMethodException { + public void registerMethod(RegistrationCondition condition, boolean queriedOnly, Class type, String methodName, List> methodParameterTypes) throws NoSuchMethodException { try { Class[] parameterTypesArray = getParameterTypes(methodParameterTypes); Method method; @@ -270,7 +270,7 @@ public void registerMethod(ConfigurationCondition condition, boolean queriedOnly } @Override - public void registerConstructor(ConfigurationCondition condition, boolean queriedOnly, Class type, List> methodParameterTypes) throws NoSuchMethodException { + public void registerConstructor(RegistrationCondition condition, boolean queriedOnly, Class type, List> methodParameterTypes) throws NoSuchMethodException { Class[] parameterTypesArray = getParameterTypes(methodParameterTypes); try { registerExecutable(condition, queriedOnly, type.getDeclaredConstructor(parameterTypesArray)); @@ -287,12 +287,12 @@ static Class[] getParameterTypes(List> methodParameterTypes) { return methodParameterTypes.toArray(Class[]::new); } - private void registerExecutable(ConfigurationCondition condition, boolean queriedOnly, Executable... executable) { + private void registerExecutable(RegistrationCondition condition, boolean queriedOnly, Executable... executable) { registry.register(condition, queriedOnly, executable); } @Override - public void registerAsSerializable(ConfigurationCondition condition, Class clazz) { + public void registerAsSerializable(RegistrationCondition condition, Class clazz) { /* Serializable has no effect on JNI registrations */ } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxCommonFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxCommonFeature.java index 53e199bf8281..ae0e5104bbcd 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxCommonFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxCommonFeature.java @@ -29,6 +29,7 @@ import java.util.Arrays; import org.graalvm.nativeimage.ImageSingletons; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeReflection; import org.graalvm.nativeimage.hosted.RuntimeSerialization; @@ -38,7 +39,6 @@ import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry; import com.oracle.svm.core.jni.JNIRuntimeAccess; import com.oracle.svm.util.ReflectionUtil; -import org.graalvm.nativeimage.impl.ConfigurationCondition; @AutomaticallyRegisteredFeature public class JmxCommonFeature implements InternalFeature { @@ -158,27 +158,27 @@ public void beforeAnalysis(BeforeAnalysisAccess access) { */ private static void configureProxy(BeforeAnalysisAccess access) { DynamicProxyRegistry dynamicProxySupport = ImageSingletons.lookup(DynamicProxyRegistry.class); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.GarbageCollectorMXBean"), + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("com.sun.management.GarbageCollectorMXBean"), access.findClassByName("javax.management.NotificationEmitter")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.OperatingSystemMXBean")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.ThreadMXBean")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("com.sun.management.UnixOperatingSystemMXBean")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.BufferPoolMXBean")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.ClassLoadingMXBean")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.CompilationMXBean")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.GarbageCollectorMXBean"), + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("com.sun.management.OperatingSystemMXBean")); + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("com.sun.management.ThreadMXBean")); + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("com.sun.management.UnixOperatingSystemMXBean")); + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.lang.management.BufferPoolMXBean")); + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.lang.management.ClassLoadingMXBean")); + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.lang.management.CompilationMXBean")); + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.lang.management.GarbageCollectorMXBean"), access.findClassByName("javax.management.NotificationEmitter")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryManagerMXBean"), + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.lang.management.MemoryManagerMXBean"), access.findClassByName("javax.management.NotificationEmitter")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryManagerMXBean")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryPoolMXBean"), + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.lang.management.MemoryManagerMXBean")); + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.lang.management.MemoryPoolMXBean"), access.findClassByName("javax.management.NotificationEmitter")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.MemoryMXBean"), + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.lang.management.MemoryMXBean"), access.findClassByName("javax.management.NotificationEmitter")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.OperatingSystemMXBean")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.RuntimeMXBean")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.lang.management.ThreadMXBean")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("jdk.management.jfr.FlightRecorderMXBean"), + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.lang.management.OperatingSystemMXBean")); + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.lang.management.RuntimeMXBean")); + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.lang.management.ThreadMXBean")); + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("jdk.management.jfr.FlightRecorderMXBean"), access.findClassByName("javax.management.NotificationEmitter")); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxServerFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxServerFeature.java index 50367d43c976..b19d3d2c1082 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxServerFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JmxServerFeature.java @@ -34,11 +34,11 @@ import javax.management.remote.JMXServiceURL; import org.graalvm.nativeimage.ImageSingletons; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeReflection; -import org.graalvm.nativeimage.impl.ConfigurationCondition; -import com.oracle.svm.core.VMInspectionOptions; import com.oracle.svm.configure.ResourcesRegistry; +import com.oracle.svm.core.VMInspectionOptions; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.jdk.NativeLibrarySupport; @@ -77,22 +77,22 @@ public void beforeAnalysis(BeforeAnalysisAccess access) { } private static void registerJMXAgentResources() { - ResourcesRegistry resourcesRegistry = ResourcesRegistry.singleton(); + ResourcesRegistry resourcesRegistry = ResourcesRegistry.singleton(); - resourcesRegistry.addResourceBundles(ConfigurationCondition.alwaysTrue(), + resourcesRegistry.addResourceBundles(RegistrationCondition.always(), "jdk.internal.agent.resources.agent"); - resourcesRegistry.addResourceBundles(ConfigurationCondition.alwaysTrue(), + resourcesRegistry.addResourceBundles(RegistrationCondition.always(), "sun.security.util.Resources"); // required for password auth } private static void configureProxy(BeforeAnalysisAccess access) { DynamicProxyRegistry dynamicProxySupport = ImageSingletons.lookup(DynamicProxyRegistry.class); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("java.rmi.Remote"), + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("java.rmi.Remote"), access.findClassByName("java.rmi.registry.Registry")); - dynamicProxySupport.addProxyClass(ConfigurationCondition.alwaysTrue(), access.findClassByName("javax.management.remote.rmi.RMIServer")); + dynamicProxySupport.addProxyClass(RegistrationCondition.always(), access.findClassByName("javax.management.remote.rmi.RMIServer")); } /** diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/localization/LocalizationFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/localization/LocalizationFeature.java index b9750af8e9bd..265df2c5c01e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/localization/LocalizationFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/localization/LocalizationFeature.java @@ -63,7 +63,7 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; import com.oracle.graal.pointsto.ObjectScanner; @@ -512,7 +512,7 @@ protected void addResourceBundles() { * Locale data bundle class names do not contain underscores */ String baseName = e.getClassName().split("_")[0]; - prepareNegativeBundle(ConfigurationCondition.alwaysTrue(), baseName, locale, true); + prepareNegativeBundle(RegistrationCondition.always(), baseName, locale, true); continue; /* No bundle for this `locale`. */ } if (bundle instanceof ParallelListResourceBundle) { @@ -529,14 +529,14 @@ protected void addResourceBundles() { * No eager loading of bundle content, so we need to include the * `sun.text.resources.FormatData` bundle supplement as well. */ - prepareBundle(ConfigurationCondition.alwaysTrue(), "sun.text.resources.JavaTimeSupplementary"); + prepareBundle(RegistrationCondition.always(), "sun.text.resources.JavaTimeSupplementary"); } final String[] alwaysRegisteredResourceBundles = new String[]{ "sun.util.logging.resources.logging" }; for (String bundleName : alwaysRegisteredResourceBundles) { - prepareBundle(ConfigurationCondition.alwaysTrue(), bundleName); + prepareBundle(RegistrationCondition.always(), bundleName); } for (String bundleName : Options.IncludeResourceBundles.getValue().values()) { @@ -553,13 +553,13 @@ private void processRequestedBundle(String input) { if (locale != null) { /* Get rid of locale specific suffix. */ String baseName = input.substring(0, splitIndex); - prepareBundle(ConfigurationCondition.alwaysTrue(), baseName, Collections.singletonList(locale)); + prepareBundle(RegistrationCondition.always(), baseName, Collections.singletonList(locale)); return; } else { trace("Cannot parse wanted locale " + input.substring(splitIndex + 1) + ", default will be used instead."); } } - prepareBundle(ConfigurationCondition.alwaysTrue(), input, allLocales); + prepareBundle(RegistrationCondition.always(), input, allLocales); } @Platforms(Platform.HOSTED_ONLY.class) @@ -576,7 +576,7 @@ public void prepareClassResourceBundle(String basename, String className) { } @Platforms(Platform.HOSTED_ONLY.class) - public void prepareBundle(ConfigurationCondition condition, String baseName) { + public void prepareBundle(RegistrationCondition condition, String baseName) { prepareBundle(condition, baseName, allLocales); } @@ -588,7 +588,7 @@ public void prepareBundle(ConfigurationCondition condition, String baseName) { }; @Platforms(Platform.HOSTED_ONLY.class) - public void prepareBundle(ConfigurationCondition condition, String baseName, Collection wantedLocales) { + public void prepareBundle(RegistrationCondition condition, String baseName, Collection wantedLocales) { prepareBundleInternal(condition, baseName, wantedLocales); String alternativeBundleName = null; @@ -603,7 +603,7 @@ public void prepareBundle(ConfigurationCondition condition, String baseName, Col } } - private void prepareBundleInternal(ConfigurationCondition condition, String baseName, Collection wantedLocales) { + private void prepareBundleInternal(RegistrationCondition condition, String baseName, Collection wantedLocales) { boolean somethingFound = false; for (Locale locale : wantedLocales) { support.registerBundleLookup(condition, baseName); @@ -660,7 +660,7 @@ private void prepareBundleInternal(ConfigurationCondition condition, String base } @Platforms(Platform.HOSTED_ONLY.class) - protected void prepareNegativeBundle(ConfigurationCondition condition, String baseName, Locale locale, boolean jdkBundle) { + protected void prepareNegativeBundle(RegistrationCondition condition, String baseName, Locale locale, boolean jdkBundle) { support.registerBundleLookup(condition, baseName); support.registerRequiredReflectionAndResourcesForBundleAndLocale(baseName, locale, jdkBundle); } @@ -668,11 +668,11 @@ protected void prepareNegativeBundle(ConfigurationCondition condition, String ba @Platforms(Platform.HOSTED_ONLY.class) protected void prepareJDKBundle(ResourceBundle bundle, Locale locale) { String baseName = bundle.getBaseBundleName(); - prepareBundle(ConfigurationCondition.alwaysTrue(), baseName, bundle, locale, true); + prepareBundle(RegistrationCondition.always(), baseName, bundle, locale, true); } @Platforms(Platform.HOSTED_ONLY.class) - private void prepareBundle(ConfigurationCondition condition, String bundleName, ResourceBundle bundle, Locale locale, boolean jdkBundle) { + private void prepareBundle(RegistrationCondition condition, String bundleName, ResourceBundle bundle, Locale locale, boolean jdkBundle) { trace("Adding bundle " + bundleName + ", locale " + locale + " with condition " + condition); /* * Ensure that the bundle contents are loaded. We need to walk the whole bundle parent chain diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java index 6db907d0b1b6..f21a6c33986c 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jni/JNIAccessFeature.java @@ -50,7 +50,7 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.c.function.CodePointer; import org.graalvm.nativeimage.hosted.Feature; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport; import org.graalvm.word.PointerBase; @@ -207,12 +207,12 @@ public void afterRegistration(AfterRegistrationAccess arg) { runtimeSupport = new JNIRuntimeAccessibilitySupportImpl(); ImageSingletons.add(RuntimeJNIAccessSupport.class, runtimeSupport); - ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(access.getImageClassLoader(), + ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(access.getImageClassLoader(), ClassInitializationSupport.singleton()); - ReflectionConfigurationParser> parser = ConfigurationParserUtils.create(JNI_KEY, true, conditionResolver, runtimeSupport, null, null, + ReflectionConfigurationParser> parser = ConfigurationParserUtils.create(JNI_KEY, true, conditionResolver, runtimeSupport, null, null, access.getImageClassLoader()); loadedConfigurations = ConfigurationParserUtils.parseAndRegisterConfigurationsFromCombinedFile(parser, access.getImageClassLoader(), "JNI"); - ReflectionConfigurationParser> legacyParser = ConfigurationParserUtils.create(null, false, conditionResolver, runtimeSupport, null, null, + ReflectionConfigurationParser> legacyParser = ConfigurationParserUtils.create(null, false, conditionResolver, runtimeSupport, null, null, access.getImageClassLoader()); loadedConfigurations += ConfigurationParserUtils.parseAndRegisterConfigurations(legacyParser, access.getImageClassLoader(), "JNI", ConfigurationFiles.Options.JNIConfigurationFiles, ConfigurationFiles.Options.JNIConfigurationResources, ConfigurationFile.JNI.getFileName()); @@ -222,7 +222,7 @@ private final class JNIRuntimeAccessibilitySupportImpl extends ConditionalConfig implements RuntimeJNIAccessSupport { @Override - public void register(ConfigurationCondition condition, boolean unsafeAllocated, Class clazz) { + public void register(RegistrationCondition condition, boolean unsafeAllocated, Class clazz) { assert !unsafeAllocated : "unsafeAllocated can be only set via Unsafe.allocateInstance, not via JNI."; Objects.requireNonNull(clazz, () -> nullErrorMessage("class")); abortIfSealed(); @@ -230,7 +230,7 @@ public void register(ConfigurationCondition condition, boolean unsafeAllocated, } @Override - public void register(ConfigurationCondition condition, boolean queriedOnly, Executable... executables) { + public void register(RegistrationCondition condition, boolean queriedOnly, Executable... executables) { requireNonNull(executables, "executable"); abortIfSealed(); if (!queriedOnly) { @@ -239,7 +239,7 @@ public void register(ConfigurationCondition condition, boolean queriedOnly, Exec } @Override - public void register(ConfigurationCondition condition, boolean finalIsWritable, Field... fields) { + public void register(RegistrationCondition condition, boolean finalIsWritable, Field... fields) { requireNonNull(fields, "field"); abortIfSealed(); registerConditionalConfiguration(condition, (cnd) -> registerFields(finalIsWritable, fields)); @@ -253,7 +253,7 @@ private void registerFields(boolean finalIsWritable, Field[] fields) { } @Override - public void registerClassLookup(ConfigurationCondition condition, String typeName) { + public void registerClassLookup(RegistrationCondition condition, String typeName) { try { register(condition, false, Class.forName(typeName)); } catch (ClassNotFoundException e) { @@ -262,7 +262,7 @@ public void registerClassLookup(ConfigurationCondition condition, String typeNam } @Override - public void registerFieldLookup(ConfigurationCondition condition, Class declaringClass, String fieldName) { + public void registerFieldLookup(RegistrationCondition condition, Class declaringClass, String fieldName) { try { register(condition, false, declaringClass.getDeclaredField(fieldName)); } catch (NoSuchFieldException e) { @@ -271,7 +271,7 @@ public void registerFieldLookup(ConfigurationCondition condition, Class decla } @Override - public void registerMethodLookup(ConfigurationCondition condition, Class declaringClass, String methodName, Class... parameterTypes) { + public void registerMethodLookup(RegistrationCondition condition, Class declaringClass, String methodName, Class... parameterTypes) { try { register(condition, false, declaringClass.getDeclaredMethod(methodName, parameterTypes)); } catch (NoSuchMethodException e) { @@ -280,7 +280,7 @@ public void registerMethodLookup(ConfigurationCondition condition, Class decl } @Override - public void registerConstructorLookup(ConfigurationCondition condition, Class declaringClass, Class... parameterTypes) { + public void registerConstructorLookup(RegistrationCondition condition, Class declaringClass, Class... parameterTypes) { try { register(condition, false, declaringClass.getDeclaredConstructor(parameterTypes)); } catch (NoSuchMethodException e) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/NativeImageConditionResolver.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/NativeImageConditionResolver.java index 2912bd94558c..08fcdfebbd5d 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/NativeImageConditionResolver.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/NativeImageConditionResolver.java @@ -24,7 +24,8 @@ */ package com.oracle.svm.hosted.reflect; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; +import org.graalvm.nativeimage.impl.TypeReachabilityCondition; import org.graalvm.nativeimage.impl.UnresolvedConfigurationCondition; import com.oracle.svm.configure.ConfigurationTypeDescriptor; @@ -33,7 +34,7 @@ import com.oracle.svm.hosted.classinitialization.ClassInitializationSupport; import com.oracle.svm.util.TypeResult; -public class NativeImageConditionResolver implements ConfigurationConditionResolver { +public class NativeImageConditionResolver implements ConfigurationConditionResolver { private final ImageClassLoader classLoader; @SuppressWarnings({"FieldCanBeLocal", "unused"}) private final ClassInitializationSupport classInitializationSupport; @@ -43,7 +44,7 @@ public NativeImageConditionResolver(ImageClassLoader classLoader, ClassInitializ } @Override - public TypeResult resolveCondition(UnresolvedConfigurationCondition unresolvedCondition) { + public TypeResult resolveCondition(UnresolvedConfigurationCondition unresolvedCondition) { String canonicalizedName = ConfigurationTypeDescriptor.canonicalizeTypeName(unresolvedCondition.getTypeName()); TypeResult> clazz = classLoader.findClass(canonicalizedName); return clazz.map(type -> { @@ -52,12 +53,15 @@ public TypeResult resolveCondition(UnresolvedConfigurati * reachability checks. */ var runtimeChecked = !classInitializationSupport.isAlwaysReached(type) && unresolvedCondition.isRuntimeChecked(); - return ConfigurationCondition.create(type, runtimeChecked); + /* + * GR-62516, this should be deleted + */ + return TypeReachabilityCondition.create(type, runtimeChecked); }); } @Override - public ConfigurationCondition alwaysTrue() { - return ConfigurationCondition.alwaysTrue(); + public RegistrationCondition alwaysTrue() { + return RegistrationCondition.always(); } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java index 204208ab871c..e72ed1abbb4f 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java @@ -68,10 +68,11 @@ import java.util.stream.Collectors; import org.graalvm.nativeimage.ImageSingletons; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeProxyCreation; import org.graalvm.nativeimage.hosted.RuntimeReflection; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeReflectionSupport; +import org.graalvm.nativeimage.impl.TypeReachabilityCondition; import com.oracle.graal.pointsto.ObjectScanner.ScanReason; import com.oracle.graal.pointsto.constraints.UnsupportedFeatureException; @@ -148,7 +149,7 @@ public class ReflectionDataBuilder extends ConditionalConfigurationRegistry impl private final Map> processedTypes = new ConcurrentHashMap<>(); private final Map, Set> pendingRecordClasses; - record ConditionalTask(ConfigurationCondition condition, Consumer task) { + record ConditionalTask(RegistrationCondition condition, Consumer task) { } private final Set pendingConditionalTasks = ConcurrentHashMap.newKeySet(); @@ -177,7 +178,7 @@ public void beforeAnalysis(BeforeAnalysisAccessImpl beforeAnalysisAccess) { this.analysisAccess = beforeAnalysisAccess; } - private void runConditionalInAnalysisTask(ConfigurationCondition condition, Consumer task) { + private void runConditionalInAnalysisTask(RegistrationCondition condition, Consumer task) { if (sealed) { throw new UnsupportedFeatureException("Too late to add classes, methods, and fields for reflective access. Registration must happen in a Feature before the analysis has finished."); } @@ -199,13 +200,13 @@ private boolean isQueryFlagSet(Class clazz, int flag) { } @Override - public void register(ConfigurationCondition condition, boolean unsafeInstantiated, Class clazz) { + public void register(RegistrationCondition condition, boolean unsafeInstantiated, Class clazz) { Objects.requireNonNull(clazz, () -> nullErrorMessage("class")); runConditionalInAnalysisTask(condition, (cnd) -> registerClass(cnd, clazz, unsafeInstantiated, true)); } @Override - public void registerAllClassesQuery(ConfigurationCondition condition, Class clazz) { + public void registerAllClassesQuery(RegistrationCondition condition, Class clazz) { guaranteeNotRuntimeConditionForQueries(condition, true); runConditionalInAnalysisTask(condition, (cnd) -> { setQueryFlag(clazz, ALL_CLASSES_FLAG); @@ -227,14 +228,15 @@ public void registerAllClassesQuery(ConfigurationCondition condition, Class c * Runtime conditions can only be used with type, so they are not valid here. */ @SuppressWarnings("unused") - private static void guaranteeNotRuntimeConditionForQueries(ConfigurationCondition cnd, boolean queriedOnly) { + private static void guaranteeNotRuntimeConditionForQueries(RegistrationCondition cnd, boolean queriedOnly) { if (!TreatAllTypeReachableConditionsAsTypeReached.getValue()) { - VMError.guarantee(!queriedOnly || cnd.isAlwaysTrue() || !cnd.isRuntimeChecked(), "Bulk queries can only be set with 'name' which does not allow run-time conditions."); + VMError.guarantee(!queriedOnly || ((TypeReachabilityCondition) cnd).isAlwaysTrue() || !((TypeReachabilityCondition) cnd).isRuntimeChecked(), + "Bulk queries can only be set with 'name' which does not allow run-time conditions."); } } @Override - public void registerAllDeclaredClassesQuery(ConfigurationCondition condition, Class clazz) { + public void registerAllDeclaredClassesQuery(RegistrationCondition condition, Class clazz) { guaranteeNotRuntimeConditionForQueries(condition, true); runConditionalInAnalysisTask(condition, (cnd) -> { setQueryFlag(clazz, ALL_DECLARED_CLASSES_FLAG); @@ -249,7 +251,7 @@ public void registerAllDeclaredClassesQuery(ConfigurationCondition condition, Cl }); } - private void registerClass(ConfigurationCondition condition, Class clazz, boolean unsafeInstantiated, boolean allowForName) { + private void registerClass(RegistrationCondition condition, Class clazz, boolean unsafeInstantiated, boolean allowForName) { if (shouldExcludeClass(clazz)) { return; } @@ -285,12 +287,12 @@ private void registerClass(ConfigurationCondition condition, Class clazz, boo } @Override - public void registerClassLookupException(ConfigurationCondition condition, String typeName, Throwable t) { + public void registerClassLookupException(RegistrationCondition condition, String typeName, Throwable t) { runConditionalInAnalysisTask(condition, (cnd) -> classForNameSupport.registerExceptionForClass(cnd, typeName, t)); } @Override - public void registerClassLookup(ConfigurationCondition condition, String typeName) { + public void registerClassLookup(RegistrationCondition condition, String typeName) { runConditionalInAnalysisTask(condition, (cnd) -> { try { registerClass(cnd, Class.forName(typeName, false, ClassLoader.getSystemClassLoader()), false, true); @@ -303,7 +305,7 @@ public void registerClassLookup(ConfigurationCondition condition, String typeNam } @Override - public void registerAllRecordComponentsQuery(ConfigurationCondition condition, Class clazz) { + public void registerAllRecordComponentsQuery(RegistrationCondition condition, Class clazz) { guaranteeNotRuntimeConditionForQueries(condition, true); runConditionalInAnalysisTask(condition, (cnd) -> { setQueryFlag(clazz, ALL_RECORD_COMPONENTS_FLAG); @@ -312,7 +314,7 @@ public void registerAllRecordComponentsQuery(ConfigurationCondition condition, C } @Override - public void registerAllPermittedSubclassesQuery(ConfigurationCondition condition, Class clazz) { + public void registerAllPermittedSubclassesQuery(RegistrationCondition condition, Class clazz) { guaranteeNotRuntimeConditionForQueries(condition, true); runConditionalInAnalysisTask(condition, (cnd) -> { setQueryFlag(clazz, ALL_PERMITTED_SUBCLASSES_FLAG); @@ -325,7 +327,7 @@ public void registerAllPermittedSubclassesQuery(ConfigurationCondition condition } @Override - public void registerAllNestMembersQuery(ConfigurationCondition condition, Class clazz) { + public void registerAllNestMembersQuery(RegistrationCondition condition, Class clazz) { guaranteeNotRuntimeConditionForQueries(condition, true); runConditionalInAnalysisTask(condition, (cnd) -> { setQueryFlag(clazz, ALL_NEST_MEMBERS_FLAG); @@ -338,7 +340,7 @@ public void registerAllNestMembersQuery(ConfigurationCondition condition, Class< } @Override - public void registerAllSignersQuery(ConfigurationCondition condition, Class clazz) { + public void registerAllSignersQuery(RegistrationCondition condition, Class clazz) { guaranteeNotRuntimeConditionForQueries(condition, true); runConditionalInAnalysisTask(condition, (cnd) -> { setQueryFlag(clazz, ALL_SIGNERS_FLAG); @@ -352,13 +354,13 @@ public void registerAllSignersQuery(ConfigurationCondition condition, Class c } @Override - public void register(ConfigurationCondition condition, boolean queriedOnly, Executable... executables) { + public void register(RegistrationCondition condition, boolean queriedOnly, Executable... executables) { requireNonNull(executables, "executable"); runConditionalInAnalysisTask(condition, (cnd) -> registerMethods(cnd, queriedOnly, executables)); } @Override - public void registerAllMethodsQuery(ConfigurationCondition condition, boolean queriedOnly, Class clazz) { + public void registerAllMethodsQuery(RegistrationCondition condition, boolean queriedOnly, Class clazz) { guaranteeNotRuntimeConditionForQueries(condition, queriedOnly); runConditionalInAnalysisTask(condition, (cnd) -> { for (Class current = clazz; current != null; current = current.getSuperclass()) { @@ -373,7 +375,7 @@ public void registerAllMethodsQuery(ConfigurationCondition condition, boolean qu } @Override - public void registerAllDeclaredMethodsQuery(ConfigurationCondition condition, boolean queriedOnly, Class clazz) { + public void registerAllDeclaredMethodsQuery(RegistrationCondition condition, boolean queriedOnly, Class clazz) { guaranteeNotRuntimeConditionForQueries(condition, queriedOnly); runConditionalInAnalysisTask(condition, (cnd) -> { setQueryFlag(clazz, ALL_DECLARED_METHODS_FLAG); @@ -386,7 +388,7 @@ public void registerAllDeclaredMethodsQuery(ConfigurationCondition condition, bo } @Override - public void registerAllConstructorsQuery(ConfigurationCondition condition, boolean queriedOnly, Class clazz) { + public void registerAllConstructorsQuery(RegistrationCondition condition, boolean queriedOnly, Class clazz) { guaranteeNotRuntimeConditionForQueries(condition, queriedOnly); runConditionalInAnalysisTask(condition, (cnd) -> { for (Class current = clazz; current != null; current = current.getSuperclass()) { @@ -401,7 +403,7 @@ public void registerAllConstructorsQuery(ConfigurationCondition condition, boole } @Override - public void registerAllDeclaredConstructorsQuery(ConfigurationCondition condition, boolean queriedOnly, Class clazz) { + public void registerAllDeclaredConstructorsQuery(RegistrationCondition condition, boolean queriedOnly, Class clazz) { guaranteeNotRuntimeConditionForQueries(condition, queriedOnly); runConditionalInAnalysisTask(condition, (cnd) -> { setQueryFlag(clazz, ALL_DECLARED_CONSTRUCTORS_FLAG); @@ -413,13 +415,13 @@ public void registerAllDeclaredConstructorsQuery(ConfigurationCondition conditio }); } - private void registerMethods(ConfigurationCondition cnd, boolean queriedOnly, Executable[] reflectExecutables) { + private void registerMethods(RegistrationCondition cnd, boolean queriedOnly, Executable[] reflectExecutables) { for (Executable reflectExecutable : reflectExecutables) { registerMethod(cnd, queriedOnly, reflectExecutable); } } - private void registerMethod(ConfigurationCondition cnd, boolean queriedOnly, Executable reflectExecutable) { + private void registerMethod(RegistrationCondition cnd, boolean queriedOnly, Executable reflectExecutable) { if (SubstitutionReflectivityFilter.shouldExclude(reflectExecutable, metaAccess, universe)) { return; } @@ -495,7 +497,7 @@ private void registerMethod(ConfigurationCondition cnd, boolean queriedOnly, Exe } @Override - public void registerMethodLookup(ConfigurationCondition condition, Class declaringClass, String methodName, Class... parameterTypes) { + public void registerMethodLookup(RegistrationCondition condition, Class declaringClass, String methodName, Class... parameterTypes) { guaranteeNotRuntimeConditionForQueries(condition, true); runConditionalInAnalysisTask(condition, (cnd) -> { try { @@ -510,7 +512,7 @@ public void registerMethodLookup(ConfigurationCondition condition, Class decl } @Override - public void registerConstructorLookup(ConfigurationCondition condition, Class declaringClass, Class... parameterTypes) { + public void registerConstructorLookup(RegistrationCondition condition, Class declaringClass, Class... parameterTypes) { guaranteeNotRuntimeConditionForQueries(condition, true); runConditionalInAnalysisTask(condition, (cnd) -> { try { @@ -525,17 +527,17 @@ public void registerConstructorLookup(ConfigurationCondition condition, Class } @Override - public void register(ConfigurationCondition condition, boolean finalIsWritable, Field... fields) { + public void register(RegistrationCondition condition, boolean finalIsWritable, Field... fields) { requireNonNull(fields, "field"); runConditionalInAnalysisTask(condition, (cnd) -> registerFields(cnd, false, fields)); } @Override - public void registerAllFields(ConfigurationCondition condition, Class clazz) { + public void registerAllFields(RegistrationCondition condition, Class clazz) { registerAllFieldsQuery(condition, false, clazz); } - public void registerAllFieldsQuery(ConfigurationCondition condition, boolean queriedOnly, Class clazz) { + public void registerAllFieldsQuery(RegistrationCondition condition, boolean queriedOnly, Class clazz) { guaranteeNotRuntimeConditionForQueries(condition, queriedOnly); runConditionalInAnalysisTask(condition, (cnd) -> { for (Class current = clazz; current != null; current = current.getSuperclass()) { @@ -550,11 +552,11 @@ public void registerAllFieldsQuery(ConfigurationCondition condition, boolean que } @Override - public void registerAllDeclaredFields(ConfigurationCondition condition, Class clazz) { + public void registerAllDeclaredFields(RegistrationCondition condition, Class clazz) { registerAllDeclaredFieldsQuery(condition, false, clazz); } - public void registerAllDeclaredFieldsQuery(ConfigurationCondition condition, boolean queriedOnly, Class clazz) { + public void registerAllDeclaredFieldsQuery(RegistrationCondition condition, boolean queriedOnly, Class clazz) { runConditionalInAnalysisTask(condition, (cnd) -> { setQueryFlag(clazz, ALL_DECLARED_FIELDS_FLAG); try { @@ -565,13 +567,13 @@ public void registerAllDeclaredFieldsQuery(ConfigurationCondition condition, boo }); } - private void registerFields(ConfigurationCondition cnd, boolean queriedOnly, Field[] reflectFields) { + private void registerFields(RegistrationCondition cnd, boolean queriedOnly, Field[] reflectFields) { for (Field reflectField : reflectFields) { registerField(cnd, queriedOnly, reflectField); } } - private void registerField(ConfigurationCondition cnd, boolean queriedOnly, Field reflectField) { + private void registerField(RegistrationCondition cnd, boolean queriedOnly, Field reflectField) { if (SubstitutionReflectivityFilter.shouldExclude(reflectField, metaAccess, universe)) { return; } @@ -623,7 +625,7 @@ private void registerField(ConfigurationCondition cnd, boolean queriedOnly, Fiel } @Override - public void registerFieldLookup(ConfigurationCondition condition, Class declaringClass, String fieldName) { + public void registerFieldLookup(RegistrationCondition condition, Class declaringClass, String fieldName) { runConditionalInAnalysisTask(condition, (cnd) -> { try { registerField(cnd, false, declaringClass.getDeclaredField(fieldName)); @@ -648,8 +650,11 @@ private void processAnnotationMethod(boolean queriedOnly, Method method) { Class annotationClass = method.getDeclaringClass(); Class proxyClass = Proxy.getProxyClass(annotationClass.getClassLoader(), annotationClass); try { - /* build-time condition as it is registered during analysis */ - var condition = ConfigurationCondition.create(proxyClass, false); + /* + * build-time condition as it is registered during analysis GR-62516, this should be + * deleted + */ + var condition = TypeReachabilityCondition.create(proxyClass, false); register(condition, queriedOnly, proxyClass.getDeclaredMethod(method.getName(), method.getParameterTypes())); } catch (NoSuchMethodException e) { /* @@ -659,7 +664,7 @@ private void processAnnotationMethod(boolean queriedOnly, Method method) { } @SuppressWarnings("deprecation") - private void processAnnotationField(ConfigurationCondition cnd, Field field) { + private void processAnnotationField(RegistrationCondition cnd, Field field) { Class annotationClass = field.getDeclaringClass(); Class proxyClass = Proxy.getProxyClass(annotationClass.getClassLoader(), annotationClass); try { @@ -949,7 +954,7 @@ private void registerTypesForGenericSignature(Type type, int dimension) { private void registerTypesForRecordComponent(RecordComponent recordComponent) { Method accessorOrNull = recordComponent.getAccessor(); if (accessorOrNull != null) { - register(ConfigurationCondition.alwaysTrue(), true, accessorOrNull); + register(RegistrationCondition.always(), true, accessorOrNull); } registerTypesForAnnotations(recordComponent); registerTypesForTypeAnnotations(recordComponent); @@ -1224,7 +1229,7 @@ public void registerHeapReflectionField(Field reflectField, ScanReason reason) { if (!SubstitutionReflectivityFilter.shouldExclude(reflectField, metaAccess, universe)) { registerTypesForField(analysisField, reflectField, false); if (analysisField.getDeclaringClass().isAnnotation()) { - processAnnotationField(ConfigurationCondition.alwaysTrue(), reflectField); + processAnnotationField(RegistrationCondition.always(), reflectField); } } } @@ -1351,7 +1356,7 @@ private static String nullErrorMessage(String kind) { public static class TestBackdoor { public static void registerField(ReflectionDataBuilder reflectionDataBuilder, boolean queriedOnly, Field field) { - reflectionDataBuilder.runConditionalInAnalysisTask(ConfigurationCondition.alwaysTrue(), (cnd) -> reflectionDataBuilder.registerField(cnd, queriedOnly, field)); + reflectionDataBuilder.runConditionalInAnalysisTask(RegistrationCondition.always(), (cnd) -> reflectionDataBuilder.registerField(cnd, queriedOnly, field)); } } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java index 0c2ef3583140..70ca019e1722 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionFeature.java @@ -42,9 +42,9 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.c.function.CFunctionPointer; import org.graalvm.nativeimage.hosted.Feature; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeReflection; import org.graalvm.nativeimage.impl.AnnotationExtractor; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeReflectionSupport; import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; @@ -52,13 +52,13 @@ import com.oracle.graal.pointsto.infrastructure.UniverseMetaAccess; import com.oracle.graal.pointsto.meta.AnalysisMethod; import com.oracle.graal.pointsto.meta.AnalysisUniverse; +import com.oracle.svm.configure.ConfigurationFile; +import com.oracle.svm.configure.ReflectionConfigurationParser; import com.oracle.svm.core.BuildPhaseProvider; import com.oracle.svm.core.ParsingReason; import com.oracle.svm.core.SubstrateOptions; import com.oracle.svm.core.annotate.Delete; -import com.oracle.svm.configure.ConfigurationFile; import com.oracle.svm.core.configure.ConfigurationFiles; -import com.oracle.svm.configure.ReflectionConfigurationParser; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; import com.oracle.svm.core.fieldvaluetransformer.FieldValueTransformerWithAvailability; @@ -295,11 +295,11 @@ public void duringSetup(DuringSetupAccess a) { var conditionResolver = new NativeImageConditionResolver(access.getImageClassLoader(), ClassInitializationSupport.singleton()); reflectionData.duringSetup(access.getMetaAccess(), aUniverse); ProxyRegistry proxyRegistry = ImageSingletons.lookup(ProxyRegistry.class); - RuntimeSerializationSupport serializationSupport = RuntimeSerializationSupport.singleton(); - ReflectionConfigurationParser> parser = ConfigurationParserUtils.create(REFLECTION_KEY, true, conditionResolver, reflectionData, proxyRegistry, + RuntimeSerializationSupport serializationSupport = RuntimeSerializationSupport.singleton(); + ReflectionConfigurationParser> parser = ConfigurationParserUtils.create(REFLECTION_KEY, true, conditionResolver, reflectionData, proxyRegistry, serializationSupport, access.getImageClassLoader()); loadedConfigurations = ConfigurationParserUtils.parseAndRegisterConfigurationsFromCombinedFile(parser, access.getImageClassLoader(), "reflection"); - ReflectionConfigurationParser> legacyParser = ConfigurationParserUtils.create(null, false, conditionResolver, reflectionData, proxyRegistry, + ReflectionConfigurationParser> legacyParser = ConfigurationParserUtils.create(null, false, conditionResolver, reflectionData, proxyRegistry, serializationSupport, access.getImageClassLoader()); loadedConfigurations += ConfigurationParserUtils.parseAndRegisterConfigurations(legacyParser, access.getImageClassLoader(), "reflection", ConfigurationFiles.Options.ReflectionConfigurationFiles, ConfigurationFiles.Options.ReflectionConfigurationResources, @@ -310,7 +310,7 @@ public void duringSetup(DuringSetupAccess a) { /* Primitive classes cannot be accessed through Class.forName() */ for (Class primitiveClass : PRIMITIVE_CLASSES) { - ClassForNameSupport.currentLayer().registerNegativeQuery(ConfigurationCondition.alwaysTrue(), primitiveClass.getName()); + ClassForNameSupport.currentLayer().registerNegativeQuery(RegistrationCondition.always(), primitiveClass.getName()); } access.registerObjectReachableCallback(SubstrateAccessor.class, ReflectionFeature::onAccessorReachable); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java index 4231340be5a4..71d3246c08ce 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/DynamicProxyFeature.java @@ -25,7 +25,7 @@ package com.oracle.svm.hosted.reflect.proxy; import org.graalvm.nativeimage.ImageSingletons; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.RuntimeProxyCreationSupport; import com.oracle.svm.configure.ConfigurationFile; @@ -68,9 +68,9 @@ public void afterRegistration(AfterRegistrationAccess a) { public void duringSetup(DuringSetupAccess a) { DuringSetupAccessImpl access = (DuringSetupAccessImpl) a; ImageClassLoader imageClassLoader = access.getImageClassLoader(); - ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(imageClassLoader, ClassInitializationSupport.singleton()); + ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(imageClassLoader, ClassInitializationSupport.singleton()); - ProxyConfigurationParser parser = new ProxyConfigurationParser<>(conditionResolver, ConfigurationFiles.Options.getConfigurationParserOptions(), proxyRegistry); + ProxyConfigurationParser parser = new ProxyConfigurationParser<>(conditionResolver, ConfigurationFiles.Options.getConfigurationParserOptions(), proxyRegistry); loadedConfigurations = ConfigurationParserUtils.parseAndRegisterConfigurations(parser, imageClassLoader, "dynamic proxy", ConfigurationFiles.Options.DynamicProxyConfigurationFiles, ConfigurationFiles.Options.DynamicProxyConfigurationResources, ConfigurationFile.DYNAMIC_PROXY.getFileName()); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/ProxyRegistry.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/ProxyRegistry.java index f2a2e1093e89..f0567cf5d6ff 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/ProxyRegistry.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/proxy/ProxyRegistry.java @@ -27,14 +27,14 @@ import java.util.List; import java.util.function.BiConsumer; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry; import com.oracle.svm.hosted.ConditionalConfigurationRegistry; import com.oracle.svm.hosted.ImageClassLoader; import com.oracle.svm.util.LogUtils; -public class ProxyRegistry extends ConditionalConfigurationRegistry implements BiConsumer> { +public class ProxyRegistry extends ConditionalConfigurationRegistry implements BiConsumer> { private final DynamicProxyRegistry dynamicProxySupport; private final ImageClassLoader imageClassLoader; @@ -44,7 +44,7 @@ public ProxyRegistry(DynamicProxyRegistry dynamicProxySupport, ImageClassLoader } @Override - public void accept(ConfigurationCondition condition, List proxies) { + public void accept(RegistrationCondition condition, List proxies) { Class[] interfaces = checkIfInterfacesAreValid(proxies); if (interfaces != null) { registerConditionalConfiguration(condition, (cnd) -> { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java index 49e27e17a6e3..792b595a45a0 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/serialize/SerializationFeature.java @@ -53,8 +53,8 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.hosted.Feature; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeReflection; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeReflectionSupport; import org.graalvm.nativeimage.impl.RuntimeSerializationSupport; @@ -131,17 +131,17 @@ public void afterRegistration(AfterRegistrationAccess a) { public void duringSetup(DuringSetupAccess a) { FeatureImpl.DuringSetupAccessImpl access = (FeatureImpl.DuringSetupAccessImpl) a; ImageClassLoader imageClassLoader = access.getImageClassLoader(); - ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(imageClassLoader, ClassInitializationSupport.singleton()); + ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(imageClassLoader, ClassInitializationSupport.singleton()); EnumSet parserOptions = ConfigurationFiles.Options.getConfigurationParserOptions(); - SerializationConfigurationParser parser = SerializationConfigurationParser.create(true, conditionResolver, serializationBuilder, parserOptions); + SerializationConfigurationParser parser = SerializationConfigurationParser.create(true, conditionResolver, serializationBuilder, parserOptions); loadedConfigurations = ConfigurationParserUtils.parseAndRegisterConfigurationsFromCombinedFile(parser, imageClassLoader, "serialization"); - SerializationConfigurationParser denyCollectorParser = SerializationConfigurationParser.create(false, conditionResolver, serializationDenyRegistry, parserOptions); + SerializationConfigurationParser denyCollectorParser = SerializationConfigurationParser.create(false, conditionResolver, serializationDenyRegistry, parserOptions); ConfigurationParserUtils.parseAndRegisterConfigurations(denyCollectorParser, imageClassLoader, "serialization", ConfigurationFiles.Options.SerializationDenyConfigurationFiles, ConfigurationFiles.Options.SerializationDenyConfigurationResources, ConfigurationFile.SERIALIZATION_DENY.getFileName()); - SerializationConfigurationParser legacyParser = SerializationConfigurationParser.create(false, conditionResolver, serializationBuilder, parserOptions); + SerializationConfigurationParser legacyParser = SerializationConfigurationParser.create(false, conditionResolver, serializationBuilder, parserOptions); loadedConfigurations += ConfigurationParserUtils.parseAndRegisterConfigurations(legacyParser, imageClassLoader, "serialization", ConfigurationFiles.Options.SerializationConfigurationFiles, ConfigurationFiles.Options.SerializationConfigurationResources, ConfigurationFile.SERIALIZATION.getFileName()); @@ -157,7 +157,7 @@ private static void registerLambdasFromConstantNodesInGraph(StructuredGraph grap if (lambdaClass != null && Serializable.class.isAssignableFrom(lambdaClass)) { RuntimeReflection.register(ReflectionUtil.lookupMethod(lambdaClass, "writeReplace")); SerializationBuilder.registerSerializationUIDElements(lambdaClass, false); - serializationBuilder.serializationSupport.registerSerializationTargetClass(ConfigurationCondition.alwaysTrue(), lambdaClass); + serializationBuilder.serializationSupport.registerSerializationTargetClass(RegistrationCondition.always(), lambdaClass); } } } @@ -214,7 +214,7 @@ public static Object getConstructorAccessor(Constructor constructor) { } } -final class SerializationDenyRegistry implements RuntimeSerializationSupport { +final class SerializationDenyRegistry implements RuntimeSerializationSupport { private final Map, Boolean> deniedClasses = new HashMap<>(); private final ConfigurationTypeResolver typeResolver; @@ -228,24 +228,24 @@ final class SerializationDenyRegistry implements RuntimeSerializationSupport clazz) { + public void registerIncludingAssociatedClasses(RegistrationCondition condition, Class clazz) { register(condition, clazz); } @Override - public void register(ConfigurationCondition condition, Class clazz) { + public void register(RegistrationCondition condition, Class clazz) { if (clazz != null) { deniedClasses.put(clazz, true); } } @Override - public void register(ConfigurationCondition condition, String className) { + public void register(RegistrationCondition condition, String className) { this.register(condition, typeResolver.resolveType(className)); } @Override - public void registerLambdaCapturingClass(ConfigurationCondition condition, String lambdaCapturingClassName) { + public void registerLambdaCapturingClass(RegistrationCondition condition, String lambdaCapturingClassName) { Class lambdaCapturingClass = typeResolver.resolveType(lambdaCapturingClassName); if (lambdaCapturingClass != null) { deniedClasses.put(lambdaCapturingClass, true); @@ -253,7 +253,7 @@ public void registerLambdaCapturingClass(ConfigurationCondition condition, Strin } @Override - public void registerProxyClass(ConfigurationCondition condition, List implementedInterfaces) { + public void registerProxyClass(RegistrationCondition condition, List implementedInterfaces) { } public boolean isAllowed(Class clazz) { @@ -266,7 +266,7 @@ public boolean isAllowed(Class clazz) { } } -final class SerializationBuilder extends ConditionalConfigurationRegistry implements RuntimeSerializationSupport { +final class SerializationBuilder extends ConditionalConfigurationRegistry implements RuntimeSerializationSupport { private static final Method getConstructorAccessorMethod = ReflectionUtil.lookupMethod(Constructor.class, "getConstructorAccessor"); private static final Method getExternalizableConstructorMethod = ReflectionUtil.lookupMethod(ObjectStreamClass.class, "getExternalizableConstructor", Class.class); @@ -309,11 +309,11 @@ private void abortIfSealed() { } @Override - public void registerIncludingAssociatedClasses(ConfigurationCondition condition, Class clazz) { + public void registerIncludingAssociatedClasses(RegistrationCondition condition, Class clazz) { registerIncludingAssociatedClasses(condition, clazz, new HashSet<>()); } - private void registerIncludingAssociatedClasses(ConfigurationCondition condition, Class clazz, Set> alreadyVisited) { + private void registerIncludingAssociatedClasses(RegistrationCondition condition, Class clazz, Set> alreadyVisited) { if (alreadyVisited.contains(clazz)) { return; } @@ -363,7 +363,7 @@ private void registerIncludingAssociatedClasses(ConfigurationCondition condition } @Override - public void registerLambdaCapturingClass(ConfigurationCondition condition, String lambdaCapturingClassName) { + public void registerLambdaCapturingClass(RegistrationCondition condition, String lambdaCapturingClassName) { abortIfSealed(); Class lambdaCapturingClass = typeResolver.resolveType(lambdaCapturingClassName); @@ -385,7 +385,7 @@ public void registerLambdaCapturingClass(ConfigurationCondition condition, Strin } @Override - public void registerProxyClass(ConfigurationCondition condition, List implementedInterfaces) { + public void registerProxyClass(RegistrationCondition condition, List implementedInterfaces) { registerConditionalConfiguration(condition, (cnd) -> { Class proxyClass = proxyRegistry.createProxyClassForSerialization(implementedInterfaces); register(cnd, proxyClass); @@ -393,7 +393,7 @@ public void registerProxyClass(ConfigurationCondition condition, List im } @Override - public void register(ConfigurationCondition condition, String targetClassName) { + public void register(RegistrationCondition condition, String targetClassName) { abortIfSealed(); Class serializationTargetClass = typeResolver.resolveType(targetClassName); /* With invalid streams we have to register the class for lookup */ @@ -405,7 +405,7 @@ public void register(ConfigurationCondition condition, String targetClassName) { } @Override - public void register(ConfigurationCondition condition, Class serializationTargetClass) { + public void register(RegistrationCondition condition, Class serializationTargetClass) { abortIfSealed(); registerConditionalConfiguration(condition, (cnd) -> { /* @@ -428,9 +428,9 @@ public void register(ConfigurationCondition condition, Class serializationTar Class superclass = serializationTargetClass.getSuperclass(); if (superclass != null) { - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredConstructorsQuery(ConfigurationCondition.alwaysTrue(), true, superclass); - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerMethodLookup(ConfigurationCondition.alwaysTrue(), superclass, "writeReplace"); - ImageSingletons.lookup(RuntimeReflectionSupport.class).registerMethodLookup(ConfigurationCondition.alwaysTrue(), superclass, "readResolve"); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerAllDeclaredConstructorsQuery(RegistrationCondition.always(), true, superclass); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerMethodLookup(RegistrationCondition.always(), superclass, "writeReplace"); + ImageSingletons.lookup(RuntimeReflectionSupport.class).registerMethodLookup(RegistrationCondition.always(), superclass, "readResolve"); } registerForSerialization(cnd, serializationTargetClass); @@ -440,7 +440,7 @@ public void register(ConfigurationCondition condition, Class serializationTar }); } - private void addOrQueueConstructorAccessors(ConfigurationCondition cnd, Class serializationTargetClass) { + private void addOrQueueConstructorAccessors(RegistrationCondition cnd, Class serializationTargetClass) { if (pendingConstructorRegistrations != null) { // cannot yet create constructor accessor -> add to pending pendingConstructorRegistrations.add(() -> registerConstructorAccessors(cnd, serializationTargetClass)); @@ -450,7 +450,7 @@ private void addOrQueueConstructorAccessors(ConfigurationCondition cnd, Class } } - private void registerConstructorAccessors(ConfigurationCondition cnd, Class serializationTargetClass) { + private void registerConstructorAccessors(RegistrationCondition cnd, Class serializationTargetClass) { serializationSupport.registerSerializationTargetClass(cnd, serializationTargetClass); registerConstructorAccessor(cnd, serializationTargetClass, null); for (Class superclass = serializationTargetClass; superclass != null; superclass = superclass.getSuperclass()) { @@ -458,7 +458,7 @@ private void registerConstructorAccessors(ConfigurationCondition cnd, Class s } } - private void registerConstructorAccessor(ConfigurationCondition cnd, Class serializationTargetClass, Class targetConstructorClass) { + private void registerConstructorAccessor(RegistrationCondition cnd, Class serializationTargetClass, Class targetConstructorClass) { Optional.ofNullable(addConstructorAccessor(serializationTargetClass, targetConstructorClass)) .map(ReflectionUtil::lookupConstructor) .ifPresent(methods -> ImageSingletons.lookup(RuntimeReflectionSupport.class).register(cnd, false, methods)); @@ -485,7 +485,7 @@ private static void registerQueriesForInheritableMethod(Class clazz, String m } } - private static void registerMethod(ConfigurationCondition cnd, Class clazz, String methodName, Class... args) { + private static void registerMethod(RegistrationCondition cnd, Class clazz, String methodName, Class... args) { Method method = ReflectionUtil.lookupMethod(true, clazz, methodName, args); if (method != null) { ImageSingletons.lookup(RuntimeReflectionSupport.class).register(cnd, false, method); @@ -494,7 +494,7 @@ private static void registerMethod(ConfigurationCondition cnd, Class clazz, S } } - private void registerForSerialization(ConfigurationCondition cnd, Class serializationTargetClass) { + private void registerForSerialization(RegistrationCondition cnd, Class serializationTargetClass) { if (Serializable.class.isAssignableFrom(serializationTargetClass)) { /* @@ -569,7 +569,7 @@ public void afterAnalysis() { sealed = true; } - private static void registerForDeserialization(ConfigurationCondition cnd, Class serializationTargetClass) { + private static void registerForDeserialization(RegistrationCondition cnd, Class serializationTargetClass) { ImageSingletons.lookup(RuntimeReflectionSupport.class).register(cnd, serializationTargetClass); if (serializationTargetClass.isRecord()) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java index 68ca0b5304c0..8304228d5c6e 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/xml/XMLParsersRegistration.java @@ -31,8 +31,8 @@ import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.hosted.Feature; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.hosted.RuntimeReflection; -import org.graalvm.nativeimage.impl.ConfigurationCondition; import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; import com.oracle.svm.configure.ResourcesRegistry; @@ -133,22 +133,22 @@ void registerResources() { ClassInitializationSupport classInitializationSupport = (ClassInitializationSupport) ImageSingletons.lookup(RuntimeClassInitializationSupport.class); classInitializationSupport.setConfigurationSealed(false); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.utils.SerializerMessages"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMessages"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.Encodings"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.HTMLEntities"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xml.internal.serializer.XMLEntities"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.xpath.regex.message"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.DOMMessages"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.DatatypeMessages"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.SAXMessages"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XMLMessages"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xerces.internal.impl.msg.XPointerMessages"); - ResourcesRegistry.singleton().addResourceBundles(ConfigurationCondition.alwaysTrue(), "com.sun.org.apache.xalan.internal.res.XSLTInfo"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xml.internal.serializer.utils.SerializerMessages"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMessages"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xml.internal.serializer.Encodings"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xml.internal.serializer.HTMLEntities"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xml.internal.serializer.XMLEntities"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xerces.internal.impl.xpath.regex.message"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xerces.internal.impl.msg.DOMMessages"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xerces.internal.impl.msg.DatatypeMessages"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xerces.internal.impl.msg.JAXPValidationMessages"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xerces.internal.impl.msg.SAXMessages"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xerces.internal.impl.msg.XIncludeMessages"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xerces.internal.impl.msg.XMLMessages"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xerces.internal.impl.msg.XMLSerializerMessages"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xerces.internal.impl.msg.XPointerMessages"); + ResourcesRegistry.singleton().addResourceBundles(RegistrationCondition.always(), "com.sun.org.apache.xalan.internal.res.XSLTInfo"); classInitializationSupport.setConfigurationSealed(true); } diff --git a/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/JSEntryPointRegistry.java b/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/JSEntryPointRegistry.java index b66e60983333..a442a62a863e 100644 --- a/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/JSEntryPointRegistry.java +++ b/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/JSEntryPointRegistry.java @@ -30,7 +30,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.ReflectionRegistry; /** @@ -47,13 +47,13 @@ public class JSEntryPointRegistry implements ReflectionRegistry { public final Set entryPoints = Collections.newSetFromMap(new ConcurrentHashMap<>()); @Override - public void register(ConfigurationCondition condition, boolean unsafeAllocated, Class clazz) { + public void register(RegistrationCondition condition, boolean unsafeAllocated, Class clazz) { // Do nothing for types } @Override - public void register(ConfigurationCondition condition, boolean queriedOnly, Executable... methods) { - if (!ConfigurationCondition.alwaysTrue().equals(condition)) { + public void register(RegistrationCondition condition, boolean queriedOnly, Executable... methods) { + if (!RegistrationCondition.always().equals(condition)) { System.err.println("Conditional specification in entry points configuration is not supported and is ignored"); } @@ -65,27 +65,27 @@ public void register(ConfigurationCondition condition, boolean queriedOnly, Exec } @Override - public void register(ConfigurationCondition condition, boolean finalIsWritable, Field... fields) { + public void register(RegistrationCondition condition, boolean finalIsWritable, Field... fields) { System.err.println("The specification for fields in entry points configuration is not supported and is ignored."); } @Override - public void registerClassLookup(ConfigurationCondition condition, String typeName) { + public void registerClassLookup(RegistrationCondition condition, String typeName) { } @Override - public void registerFieldLookup(ConfigurationCondition condition, Class declaringClass, String fieldName) { + public void registerFieldLookup(RegistrationCondition condition, Class declaringClass, String fieldName) { } @Override - public void registerMethodLookup(ConfigurationCondition condition, Class declaringClass, String methodName, Class... parameterTypes) { + public void registerMethodLookup(RegistrationCondition condition, Class declaringClass, String methodName, Class... parameterTypes) { } @Override - public void registerConstructorLookup(ConfigurationCondition condition, Class declaringClass, Class... parameterTypes) { + public void registerConstructorLookup(RegistrationCondition condition, Class declaringClass, Class... parameterTypes) { } } diff --git a/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageFeature.java b/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageFeature.java index f1cd1e1848a8..184c3bcadb1f 100644 --- a/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageFeature.java +++ b/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageFeature.java @@ -40,7 +40,7 @@ import org.graalvm.nativeimage.Platforms; import org.graalvm.nativeimage.hosted.Feature; import org.graalvm.nativeimage.hosted.RuntimeReflection; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport; import org.graalvm.nativeimage.impl.RuntimeSystemPropertiesSupport; @@ -219,9 +219,9 @@ public void duringSetup(DuringSetupAccess a) { String entryPointConfig = WebImageOptions.EntryPointsConfig.getValue(ImageSingletons.lookup(HostedOptionValues.class)); if (entryPointConfig != null) { - ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(access.getImageClassLoader(), + ConfigurationConditionResolver conditionResolver = new NativeImageConditionResolver(access.getImageClassLoader(), ClassInitializationSupport.singleton()); - ReflectionConfigurationParser> parser = ConfigurationParserUtils.create(null, false, conditionResolver, entryPointsData, null, null, + ReflectionConfigurationParser> parser = ConfigurationParserUtils.create(null, false, conditionResolver, entryPointsData, null, null, access.getImageClassLoader()); try { parser.parseAndRegister(Path.of(entryPointConfig).toUri()); diff --git a/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageRuntimeJNIAccessSupport.java b/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageRuntimeJNIAccessSupport.java index 739abd9ad5cc..d66960650d1b 100644 --- a/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageRuntimeJNIAccessSupport.java +++ b/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageRuntimeJNIAccessSupport.java @@ -28,7 +28,7 @@ import java.lang.reflect.Executable; import java.lang.reflect.Field; -import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.hosted.RegistrationCondition; import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport; /** @@ -40,37 +40,37 @@ */ public class WebImageRuntimeJNIAccessSupport implements RuntimeJNIAccessSupport { @Override - public void register(ConfigurationCondition condition, boolean unsafeAllocated, Class clazz) { + public void register(RegistrationCondition condition, boolean unsafeAllocated, Class clazz) { // Do nothing. } @Override - public void register(ConfigurationCondition condition, boolean queriedOnly, Executable... methods) { + public void register(RegistrationCondition condition, boolean queriedOnly, Executable... methods) { // Do nothing. } @Override - public void register(ConfigurationCondition condition, boolean finalIsWritable, Field... fields) { + public void register(RegistrationCondition condition, boolean finalIsWritable, Field... fields) { // Do nothing. } @Override - public void registerClassLookup(ConfigurationCondition condition, String typeName) { + public void registerClassLookup(RegistrationCondition condition, String typeName) { // Do nothing. } @Override - public void registerFieldLookup(ConfigurationCondition condition, Class declaringClass, String fieldName) { + public void registerFieldLookup(RegistrationCondition condition, Class declaringClass, String fieldName) { // Do nothing. } @Override - public void registerMethodLookup(ConfigurationCondition condition, Class declaringClass, String methodName, Class... parameterTypes) { + public void registerMethodLookup(RegistrationCondition condition, Class declaringClass, String methodName, Class... parameterTypes) { // Do nothing. } @Override - public void registerConstructorLookup(ConfigurationCondition condition, Class declaringClass, Class... parameterTypes) { + public void registerConstructorLookup(RegistrationCondition condition, Class declaringClass, Class... parameterTypes) { // Do nothing. } }