Skip to content

Commit c2b6bb0

Browse files
committed
Introduced public API for registration conditions.
ConfigurationCondition is divided into RegistrationCondition(API) and TypeReachabilityCondition(implementation).
1 parent e3ef253 commit c2b6bb0

File tree

2 files changed

+244
-0
lines changed

2 files changed

+244
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/*
2+
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
package org.graalvm.nativeimage.hosted;
42+
43+
import org.graalvm.nativeimage.impl.TypeReachabilityCondition;
44+
45+
/**
46+
* A condition that must be satisfied to register elements for dynamic access (e.g., reflection,
47+
* serialization, JNI access, resource access, and foreign access at runtime). Conditions prevent
48+
* unnecessary growth of the native binary size.
49+
* <p>
50+
* There are currently two types of conditions:
51+
* <ul>
52+
* <li>{@link #typeReached} - satisfied when the type is both reachable by static analysis at build
53+
* time, and reached at run time.</li>
54+
* <li>{@link #always} - a condition that is always satisfied.</li>
55+
* </ul>
56+
* <p>
57+
* Conditions can be created via the {@link #always} and {@link #typeReached} factory methods.
58+
*
59+
* @since 25.0
60+
*/
61+
public interface RegistrationCondition {
62+
63+
/**
64+
* Creates the condition that is always satisfied. Any metadata that is predicated with this
65+
* condition will always be included.
66+
*
67+
* @return instance of the condition
68+
*
69+
* @since 25.0
70+
*/
71+
static RegistrationCondition always() {
72+
return TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED;
73+
}
74+
75+
/**
76+
* Creates the {@code typeReached} condition that is satisfied when the type is reached at
77+
* runtime. A type is reached at runtime, right before the class-initialization routine starts
78+
* for that type, or any of the type's subtypes are reached. Metadata predicated with this
79+
* condition is only included if the condition is satisfied.
80+
* <p>
81+
* <strong>Example:</strong>
82+
*
83+
* <pre>{@code
84+
* class SuperType {
85+
* static {
86+
* // ConditionType reached (subtype reached) => metadata is available
87+
* }
88+
* }
89+
*
90+
* class ConditionType extends SuperType {
91+
* static {
92+
* // ConditionType reached (before static initializer) => metadata is available
93+
* }
94+
*
95+
* static ConditionType singleton() {
96+
* // ConditionType reached (already initialized) => metadata is available
97+
* }
98+
* }
99+
*
100+
* public class App {
101+
* public static void main(String[] args) {
102+
* // ConditionType not reached => metadata is not available
103+
* Class<?> clazz = ConditionType.class;
104+
* // ConditionType not reached (ConditionType.class doesn't start class initialization)
105+
* // => metadata is not available
106+
* ConditionType.singleton();
107+
* // ConditionType reached (already initialized) => metadata is available
108+
* }
109+
* }
110+
* }</pre>
111+
* <p>
112+
* Type is also reached, if it is marked as {@code --initialize-at-build-time} or any of its
113+
* subtypes are marked as {@code --initialize-at-build-time} and they exist on the classpath.
114+
* Array types are never marked as reached and therefore cannot be used as the type in a
115+
* condition.
116+
*
117+
* @param type the type that has to be reached for this condition to be satisfied, must not be
118+
* {@code null}
119+
*
120+
* @return instance of the condition
121+
*
122+
* @since 25.0
123+
*/
124+
static RegistrationCondition typeReached(Class<?> type) {
125+
return TypeReachabilityCondition.create(type, true);
126+
}
127+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/*
2+
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
package org.graalvm.nativeimage.impl;
42+
43+
import java.util.Objects;
44+
45+
import org.graalvm.nativeimage.hosted.RegistrationCondition;
46+
47+
/**
48+
* Type that represents both {@code typeReached} and {@code typeReachable} condition. When
49+
* {@link TypeReachabilityCondition#runtimeChecked} is <code>true</code> denotes that this is a
50+
* <code>typeReached</code> condition.
51+
*/
52+
public class TypeReachabilityCondition implements RegistrationCondition {
53+
54+
/* Cached to save space: it is used as a marker for all non-conditional elements */
55+
public static final TypeReachabilityCondition JAVA_LANG_OBJECT_REACHED = new TypeReachabilityCondition(Object.class, true);
56+
private final Class<?> type;
57+
58+
public final boolean runtimeChecked;
59+
60+
/**
61+
* Creates either a type-reached condition ({@code runtimeChecked = true}) or a type-reachable
62+
* condition.
63+
*
64+
* @param type that has to be reached (or reachable) for this condition to be satisfied
65+
* @param runtimeChecked makes this a type-reachable condition when false
66+
* @return instance of the condition
67+
*/
68+
public static TypeReachabilityCondition create(Class<?> type, boolean runtimeChecked) {
69+
Objects.requireNonNull(type);
70+
if (TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED.getKey().equals(type)) {
71+
return TypeReachabilityCondition.JAVA_LANG_OBJECT_REACHED;
72+
}
73+
return new TypeReachabilityCondition(type, runtimeChecked);
74+
}
75+
76+
public boolean isAlwaysTrue() {
77+
return RegistrationCondition.always().equals(this);
78+
}
79+
80+
public TypeReachabilityCondition(Class<?> type, boolean runtimeChecked) {
81+
this.runtimeChecked = runtimeChecked;
82+
this.type = type;
83+
}
84+
85+
public Class<?> getKey() {
86+
return type;
87+
}
88+
89+
@Override
90+
public boolean equals(Object o) {
91+
if (this == o) {
92+
return true;
93+
}
94+
if (o == null || getClass() != o.getClass()) {
95+
return false;
96+
}
97+
TypeReachabilityCondition that = (TypeReachabilityCondition) o;
98+
return runtimeChecked == that.runtimeChecked && Objects.equals(type, that.type);
99+
}
100+
101+
@Override
102+
public int hashCode() {
103+
return Objects.hash(type, runtimeChecked);
104+
}
105+
106+
@Override
107+
public String toString() {
108+
return "TypeReachabilityCondition(" +
109+
"type=" + type +
110+
", runtimeChecked=" + runtimeChecked +
111+
')';
112+
}
113+
114+
public boolean isRuntimeChecked() {
115+
return runtimeChecked;
116+
}
117+
}

0 commit comments

Comments
 (0)