Skip to content

Commit 55ad6f2

Browse files
committed
[GR-32340] Conditional resource and proxy configuration.
PullRequest: graal/9746
2 parents db22885 + 14c6ad3 commit 55ad6f2

File tree

31 files changed

+409
-237
lines changed

31 files changed

+409
-237
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public final class RuntimeReflection {
6969
* @since 19.0
7070
*/
7171
public static void register(Class<?>... classes) {
72-
ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.objectReachable(), classes);
72+
ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), classes);
7373
}
7474

7575
/**
@@ -80,7 +80,7 @@ public static void register(Class<?>... classes) {
8080
* @since 19.0
8181
*/
8282
public static void register(Executable... methods) {
83-
ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.objectReachable(), methods);
83+
ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), methods);
8484
}
8585

8686
/**
@@ -91,7 +91,7 @@ public static void register(Executable... methods) {
9191
* @since 19.0
9292
*/
9393
public static void register(Field... fields) {
94-
ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.objectReachable(), false, fields);
94+
ImageSingletons.lookup(RuntimeReflectionSupport.class).register(ConfigurationCondition.alwaysTrue(), false, fields);
9595
}
9696

9797
/**

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public final class RuntimeSerialization {
6161
* @since 21.3
6262
*/
6363
public static void register(Class<?>... classes) {
64-
ImageSingletons.lookup(RuntimeSerializationSupport.class).register(ConfigurationCondition.objectReachable(), classes);
64+
ImageSingletons.lookup(RuntimeSerializationSupport.class).register(ConfigurationCondition.alwaysTrue(), classes);
6565
}
6666

6767
/**
@@ -76,7 +76,7 @@ public static void register(Class<?>... classes) {
7676
* @since 21.3
7777
*/
7878
public static void registerWithTargetConstructorClass(Class<?> clazz, Class<?> customTargetConstructorClazz) {
79-
ImageSingletons.lookup(RuntimeSerializationSupport.class).registerWithTargetConstructorClass(ConfigurationCondition.objectReachable(), clazz, customTargetConstructorClazz);
79+
ImageSingletons.lookup(RuntimeSerializationSupport.class).registerWithTargetConstructorClass(ConfigurationCondition.alwaysTrue(), clazz, customTargetConstructorClazz);
8080
}
8181

8282
private RuntimeSerialization() {

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public final class ConfigurationCondition implements Comparable<ConfigurationCon
4646
private final String typeName;
4747
private static final ConfigurationCondition OBJECT_REACHABLE = new ConfigurationCondition(Object.class.getTypeName());
4848

49-
public static ConfigurationCondition objectReachable() {
49+
public static ConfigurationCondition alwaysTrue() {
5050
return OBJECT_REACHABLE;
5151
}
5252

@@ -87,4 +87,9 @@ public int hashCode() {
8787
public int compareTo(ConfigurationCondition o) {
8888
return this.typeName.compareTo(o.typeName);
8989
}
90+
91+
@Override
92+
public String toString() {
93+
return "[typeReachable: \"" + typeName + "\"" + "]";
94+
}
9095
}

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

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ private static void doTestTypeConfig(TypeConfiguration typeConfig) {
146146
}
147147

148148
private static void doTestExpectedMissingTypes(TypeConfiguration typeConfig) {
149-
Assert.assertNull(typeConfig.get(ConfigurationCondition.objectReachable(), "FlagTestA"));
150-
Assert.assertNull(typeConfig.get(ConfigurationCondition.objectReachable(), "FlagTestB"));
149+
Assert.assertNull(typeConfig.get(ConfigurationCondition.alwaysTrue(), "FlagTestA"));
150+
Assert.assertNull(typeConfig.get(ConfigurationCondition.alwaysTrue(), "FlagTestB"));
151151
}
152152

153153
private static void doTestTypeFlags(TypeConfiguration typeConfig) {
@@ -182,26 +182,28 @@ private static void doTestMethods(TypeConfiguration typeConfig) {
182182
}
183183

184184
private static void doTestProxyConfig(ProxyConfiguration proxyConfig) {
185-
Assert.assertFalse(proxyConfig.contains("testProxySeenA", "testProxySeenB", "testProxySeenC"));
186-
Assert.assertTrue(proxyConfig.contains("testProxyUnseen"));
185+
ConfigurationCondition condition = ConfigurationCondition.alwaysTrue();
186+
Assert.assertFalse(proxyConfig.contains(condition, "testProxySeenA", "testProxySeenB", "testProxySeenC"));
187+
Assert.assertTrue(proxyConfig.contains(condition, "testProxyUnseen"));
187188
}
188189

189190
private static void doTestResourceConfig(ResourceConfiguration resourceConfig) {
190191
Assert.assertFalse(resourceConfig.anyResourceMatches("seenResource.txt"));
191192
Assert.assertTrue(resourceConfig.anyResourceMatches("unseenResource.txt"));
192193

193-
Assert.assertFalse(resourceConfig.anyBundleMatches("seenBundle"));
194-
Assert.assertTrue(resourceConfig.anyBundleMatches("unseenBundle"));
194+
ConfigurationCondition condition = ConfigurationCondition.alwaysTrue();
195+
Assert.assertFalse(resourceConfig.anyBundleMatches(condition, "seenBundle"));
196+
Assert.assertTrue(resourceConfig.anyBundleMatches(condition, "unseenBundle"));
195197
}
196198

197199
private static void doTestSerializationConfig(SerializationConfiguration serializationConfig) {
198-
ConfigurationCondition condition = ConfigurationCondition.objectReachable();
200+
ConfigurationCondition condition = ConfigurationCondition.alwaysTrue();
199201
Assert.assertFalse(serializationConfig.contains(condition, "seenType", null));
200202
Assert.assertTrue(serializationConfig.contains(condition, "unseenType", null));
201203
}
202204

203205
private static ConfigurationType getConfigTypeOrFail(TypeConfiguration typeConfig, String typeName) {
204-
ConfigurationType type = typeConfig.get(ConfigurationCondition.objectReachable(), typeName);
206+
ConfigurationType type = typeConfig.get(ConfigurationCondition.alwaysTrue(), typeName);
205207
Assert.assertNotNull(type);
206208
return type;
207209
}
@@ -261,11 +263,11 @@ Map<ConfigurationMethod, ConfigurationMemberKind> getMethodsMap(ConfigurationMem
261263
}
262264

263265
void populateConfig() {
264-
ConfigurationType oldType = new ConfigurationType(ConfigurationCondition.objectReachable(), getTypeName());
266+
ConfigurationType oldType = new ConfigurationType(ConfigurationCondition.alwaysTrue(), getTypeName());
265267
setFlags(oldType);
266268
previousConfig.add(oldType);
267269

268-
ConfigurationType newType = new ConfigurationType(ConfigurationCondition.objectReachable(), getTypeName());
270+
ConfigurationType newType = new ConfigurationType(ConfigurationCondition.alwaysTrue(), getTypeName());
269271
for (Map.Entry<ConfigurationMethod, ConfigurationMemberKind> methodEntry : methodsThatMustExist.entrySet()) {
270272
newType.addMethod(methodEntry.getKey().getName(), methodEntry.getKey().getInternalSignature(), methodEntry.getValue());
271273
}
@@ -296,7 +298,7 @@ String getTypeName() {
296298

297299
void doTest() {
298300
String name = getTypeName();
299-
ConfigurationType configurationType = currentConfig.get(ConfigurationCondition.objectReachable(), name);
301+
ConfigurationType configurationType = currentConfig.get(ConfigurationCondition.alwaysTrue(), name);
300302
if (methodsThatMustExist.size() == 0) {
301303
Assert.assertNull("Generated configuration type " + name + " exists. Expected it to be cleared as it is empty.", configurationType);
302304
} else {

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

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.LinkedList;
3232
import java.util.List;
3333

34+
import org.graalvm.nativeimage.impl.ConfigurationCondition;
3435
import org.junit.Assert;
3536
import org.junit.Test;
3637

@@ -44,14 +45,15 @@ public class ResourceConfigurationTest {
4445
@Test
4546
public void anyResourceMatches() {
4647
ResourceConfiguration rc = new ResourceConfiguration();
47-
rc.addResourcePattern(".*/Resource.*txt$");
48+
ConfigurationCondition defaultCond = ConfigurationCondition.alwaysTrue();
49+
rc.addResourcePattern(defaultCond, ".*/Resource.*txt$");
4850

4951
Assert.assertTrue(rc.anyResourceMatches("com/my/app/Resource0.txt"));
5052
Assert.assertTrue(rc.anyResourceMatches("com/my/app/Resource1.txt"));
5153
Assert.assertTrue(rc.anyResourceMatches("/Resource2.txt"));
5254
Assert.assertTrue(rc.anyResourceMatches("/Resource3.txt"));
5355

54-
rc.ignoreResourcePattern(".*/Resource2.txt$");
56+
rc.ignoreResourcePattern(defaultCond, ".*/Resource2.txt$");
5557

5658
Assert.assertTrue(rc.anyResourceMatches("com/my/app/Resource0.txt"));
5759
Assert.assertTrue(rc.anyResourceMatches("com/my/app/Resource1.txt"));
@@ -62,28 +64,20 @@ public void anyResourceMatches() {
6264
@Test
6365
public void printJson() {
6466
ResourceConfiguration rc = new ResourceConfiguration();
65-
rc.addResourcePattern(".*/Resource.*txt$");
66-
rc.ignoreResourcePattern(".*/Resource2.txt$");
67+
ConfigurationCondition defaultCond = ConfigurationCondition.alwaysTrue();
68+
rc.addResourcePattern(defaultCond, ".*/Resource.*txt$");
69+
rc.ignoreResourcePattern(defaultCond, ".*/Resource2.txt$");
6770
PipedWriter pw = new PipedWriter();
6871
JsonWriter jw = new JsonWriter(pw);
6972

7073
try (PipedReader pr = new PipedReader()) {
7174
pr.connect(pw);
7275

73-
Thread writerThread = new Thread(new Runnable() {
74-
75-
@Override
76-
public void run() {
77-
try {
78-
rc.printJson(jw);
79-
} catch (IOException e) {
80-
Assert.fail(e.getMessage());
81-
} finally {
82-
try {
83-
jw.close();
84-
} catch (IOException e) {
85-
}
86-
}
76+
Thread writerThread = new Thread(() -> {
77+
try (JsonWriter w = jw) {
78+
rc.printJson(w);
79+
} catch (IOException e) {
80+
Assert.fail(e.getMessage());
8781
}
8882
});
8983

@@ -93,17 +87,17 @@ public void run() {
9387
ResourcesRegistry registry = new ResourcesRegistry() {
9488

9589
@Override
96-
public void addResources(String pattern) {
90+
public void addResources(ConfigurationCondition condition, String pattern) {
9791
addedResources.add(pattern);
9892
}
9993

10094
@Override
101-
public void ignoreResources(String pattern) {
95+
public void ignoreResources(ConfigurationCondition condition, String pattern) {
10296
ignoredResources.add(pattern);
10397
}
10498

10599
@Override
106-
public void addResourceBundles(String name) {
100+
public void addResourceBundles(ConfigurationCondition condition, String name) {
107101
}
108102
};
109103

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
final class ConfigurationConditionPrintable {
3737
static void printConditionAttribute(ConfigurationCondition condition, JsonWriter writer) throws IOException {
38-
if (!condition.equals(ConfigurationCondition.objectReachable())) {
38+
if (!condition.equals(ConfigurationCondition.alwaysTrue())) {
3939
writer.quote(CONDITIONAL_KEY).append(":{");
4040
writer.quote(TYPE_REACHABLE_KEY).append(':').quote(condition.getTypeName());
4141
writer.append("},").newline();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import java.net.URI;
3131
import java.nio.file.Path;
3232
import java.nio.file.Paths;
33-
import java.util.Arrays;
33+
import java.util.ArrayList;
3434
import java.util.Collection;
3535
import java.util.LinkedHashSet;
3636
import java.util.Set;
@@ -112,7 +112,7 @@ public TypeConfiguration loadReflectConfig(Function<IOException, Exception> exce
112112

113113
public ProxyConfiguration loadProxyConfig(Function<IOException, Exception> exceptionHandler) throws Exception {
114114
ProxyConfiguration proxyConfiguration = new ProxyConfiguration();
115-
loadConfig(proxyConfigPaths, new ProxyConfigurationParser(types -> proxyConfiguration.add(Arrays.asList(types)), true), exceptionHandler);
115+
loadConfig(proxyConfigPaths, new ProxyConfigurationParser(types -> proxyConfiguration.add(types.getCondition(), new ArrayList<>(types.getElement())), true), exceptionHandler);
116116
return proxyConfiguration;
117117
}
118118

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

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,31 +30,34 @@
3030
import java.util.List;
3131
import java.util.concurrent.ConcurrentHashMap;
3232

33+
import org.graalvm.nativeimage.impl.ConfigurationCondition;
34+
3335
import com.oracle.svm.configure.ConfigurationBase;
3436
import com.oracle.svm.configure.json.JsonWriter;
37+
import com.oracle.svm.core.configure.ConditionalElement;
3538

3639
public class ProxyConfiguration implements ConfigurationBase {
37-
private final ConcurrentHashMap.KeySetView<List<String>, Boolean> interfaceLists = ConcurrentHashMap.newKeySet();
40+
private final ConcurrentHashMap.KeySetView<ConditionalElement<List<String>>, Boolean> interfaceLists = ConcurrentHashMap.newKeySet();
3841

3942
public ProxyConfiguration() {
4043
}
4144

4245
public ProxyConfiguration(ProxyConfiguration other) {
43-
for (List<String> interfaceList : other.interfaceLists) {
44-
interfaceLists.add(new ArrayList<>(interfaceList));
46+
for (ConditionalElement<List<String>> interfaceList : other.interfaceLists) {
47+
interfaceLists.add(new ConditionalElement<>(interfaceList.getCondition(), new ArrayList<>(interfaceList.getElement())));
4548
}
4649
}
4750

48-
public void add(List<String> interfaceList) {
49-
interfaceLists.add(interfaceList);
51+
public void add(ConfigurationCondition condition, List<String> interfaceList) {
52+
interfaceLists.add(new ConditionalElement<>(condition, interfaceList));
5053
}
5154

52-
public boolean contains(List<String> interfaceList) {
53-
return interfaceLists.contains(interfaceList);
55+
public boolean contains(ConfigurationCondition condition, List<String> interfaceList) {
56+
return interfaceLists.contains(new ConditionalElement<>(condition, interfaceList));
5457
}
5558

56-
public boolean contains(String... interfaces) {
57-
return contains(Arrays.asList(interfaces));
59+
public boolean contains(ConfigurationCondition condition, String... interfaces) {
60+
return contains(condition, Arrays.asList(interfaces));
5861
}
5962

6063
public void removeAll(ProxyConfiguration other) {
@@ -63,29 +66,25 @@ public void removeAll(ProxyConfiguration other) {
6366

6467
@Override
6568
public void printJson(JsonWriter writer) throws IOException {
66-
List<String[]> lists = new ArrayList<>(interfaceLists.size());
67-
for (List<String> list : interfaceLists) {
68-
lists.add(list.toArray(new String[0]));
69-
}
70-
lists.sort((a, b) -> {
71-
int c = 0;
72-
for (int i = 0; c == 0 && i < a.length && i < b.length; i++) {
73-
c = a[i].compareTo(b[i]);
74-
}
75-
return (c != 0) ? c : (a.length - b.length);
76-
});
69+
List<ConditionalElement<List<String>>> lists = new ArrayList<>(interfaceLists.size());
70+
lists.addAll(interfaceLists);
71+
lists.sort(ConditionalElement.comparator(ProxyConfiguration::compareList));
7772

7873
writer.append('[');
7974
writer.indent();
8075
String prefix = "";
81-
for (String[] list : lists) {
82-
writer.append(prefix).newline().append('[');
76+
for (ConditionalElement<List<String>> list : lists) {
77+
writer.append(prefix).newline();
78+
writer.append('{').indent().newline();
79+
ConfigurationConditionPrintable.printConditionAttribute(list.getCondition(), writer);
80+
writer.quote("interfaces").append(":").append('[');
8381
String typePrefix = "";
84-
for (String type : list) {
82+
for (String type : list.getElement()) {
8583
writer.append(typePrefix).quote(type);
8684
typePrefix = ",";
8785
}
8886
writer.append(']');
87+
writer.append('}').unindent().newline();
8988
prefix = ",";
9089
}
9190
writer.unindent().newline();
@@ -97,4 +96,14 @@ public boolean isEmpty() {
9796
return interfaceLists.isEmpty();
9897
}
9998

99+
private static <T extends Comparable<T>> int compareList(List<T> l1, List<T> l2) {
100+
for (int i = 0; i < l1.size() && i < l2.size(); i++) {
101+
int c = l1.get(i).compareTo(l2.get(i));
102+
if (c != 0) {
103+
return c;
104+
}
105+
}
106+
return l1.size() - l2.size();
107+
}
108+
100109
}

0 commit comments

Comments
 (0)