Skip to content

Commit f760369

Browse files
committed
Do not print missing JSON elements for reflection
1 parent 9f016aa commit f760369

File tree

5 files changed

+41
-26
lines changed

5 files changed

+41
-26
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public void printJson(JsonWriter writer) throws IOException {
143143

144144
@Override
145145
public ConfigurationParser createParser() {
146-
return new ReflectionConfigurationParser<>(new ParserConfigurationAdapter(this), true);
146+
return new ReflectionConfigurationParser<>(new ParserConfigurationAdapter(this), true, false);
147147
}
148148

149149
@Override

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,11 @@ public static final class Options {
100100
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> PredefinedClassesConfigurationResources = new HostedOptionKey<>(
101101
LocatableMultiOptionValue.Strings.buildWithCommaDelimiter());
102102

103-
@Option(help = "Causes unknown attributes in configuration objects to abort the image build instead of emitting a warning.")//
103+
@Option(help = "When configuration files don't match the schema, abort the image build instead of emitting a warning.")//
104104
public static final HostedOptionKey<Boolean> StrictConfiguration = new HostedOptionKey<>(false);
105+
106+
@Option(help = "When configuration files don't match the schema, abort the image build instead of emitting a warning.", type = OptionType.Expert)//
107+
public static final HostedOptionKey<Boolean> PrintMissingMetadataElements = new HostedOptionKey<>(false);
105108
}
106109

107110
public static List<Path> findConfigurationFiles(String fileName) {

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,10 @@ public static InputStream openStream(URI uri) throws IOException {
6262
public static final String CONDITIONAL_KEY = "condition";
6363
public static final String TYPE_REACHABLE_KEY = "typeReachable";
6464
private final Map<String, Set<String>> seenUnknownAttributesByType = new HashMap<>();
65-
private final boolean strictConfiguration;
65+
private final boolean strictSchema;
6666

6767
protected ConfigurationParser(boolean strictConfiguration) {
68-
this.strictConfiguration = strictConfiguration;
68+
this.strictSchema = strictConfiguration;
6969
}
7070

7171
public void parseAndRegister(URI uri) throws IOException {
@@ -121,14 +121,20 @@ protected void checkAttributes(EconomicMap<String, Object> map, String type, Col
121121

122122
if (unknownAttributes.size() > 0) {
123123
String message = "Unknown attribute(s) [" + String.join(", ", unknownAttributes) + "] in " + type;
124-
warnOrFail(message);
124+
warnOrFailOnSchemaError(message);
125125
Set<String> unknownAttributesForType = seenUnknownAttributesByType.computeIfAbsent(type, key -> new HashSet<>());
126126
unknownAttributesForType.addAll(unknownAttributes);
127127
}
128128
}
129129

130-
protected void warnOrFail(String message) {
131-
if (strictConfiguration) {
130+
/**
131+
* Used to warn about schema errors in configuration files. Should never be used if the type is
132+
* missing.
133+
*
134+
* @param message message to be displayed.
135+
*/
136+
protected void warnOrFailOnSchemaError(String message) {
137+
if (strictSchema) {
132138
throw new JSONParserException(message);
133139
} else {
134140
LogUtils.warning(message);
@@ -182,7 +188,7 @@ protected ConfigurationCondition parseCondition(EconomicMap<String, Object> data
182188
if (conditionType instanceof String) {
183189
return ConfigurationCondition.create((String) conditionType);
184190
} else {
185-
warnOrFail("'" + TYPE_REACHABLE_KEY + "' should be of type string");
191+
warnOrFailOnSchemaError("'" + TYPE_REACHABLE_KEY + "' should be of type string");
186192
}
187193
}
188194
return ConfigurationCondition.alwaysTrue();

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

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,15 @@ public final class ReflectionConfigurationParser<T> extends ConfigurationParser
5252
"allDeclaredClasses", "allRecordComponents", "allPermittedSubclasses", "allNestMembers", "allSigners",
5353
"allPublicClasses", "methods", "queriedMethods", "fields", CONDITIONAL_KEY,
5454
"queryAllDeclaredConstructors", "queryAllPublicConstructors", "queryAllDeclaredMethods", "queryAllPublicMethods", "unsafeAllocated");
55+
private final boolean printMissingElements;
5556

5657
public ReflectionConfigurationParser(ReflectionConfigurationParserDelegate<T> delegate) {
57-
this(delegate, true);
58+
this(delegate, true, false);
5859
}
5960

60-
public ReflectionConfigurationParser(ReflectionConfigurationParserDelegate<T> delegate, boolean strictConfiguration) {
61+
public ReflectionConfigurationParser(ReflectionConfigurationParserDelegate<T> delegate, boolean strictConfiguration, boolean printMissingElements) {
6162
super(strictConfiguration);
63+
this.printMissingElements = printMissingElements;
6264
this.delegate = delegate;
6365
}
6466

@@ -91,7 +93,7 @@ private void parseClass(EconomicMap<String, Object> data) {
9193
*/
9294
TypeResult<T> result = delegate.resolveType(condition, className, true);
9395
if (!result.isPresent()) {
94-
handleError("Could not resolve class " + className + " for reflection configuration.", result.getException());
96+
handleMissingElement("Could not resolve class " + className + " for reflection configuration.", result.getException());
9597
return;
9698
}
9799
T clazz = result.get();
@@ -199,7 +201,7 @@ private void parseClass(EconomicMap<String, Object> data) {
199201
break;
200202
}
201203
} catch (LinkageError e) {
202-
handleError("Could not register " + delegate.getTypeName(clazz) + ": " + name + " for reflection.", e);
204+
handleMissingElement("Could not register " + delegate.getTypeName(clazz) + ": " + name + " for reflection.", e);
203205
}
204206
}
205207
}
@@ -218,9 +220,9 @@ private void parseField(EconomicMap<String, Object> data, T clazz) {
218220
try {
219221
delegate.registerField(clazz, fieldName, allowWrite);
220222
} catch (NoSuchFieldException e) {
221-
handleError("Field " + formatField(clazz, fieldName) + " not found.");
223+
handleMissingElement("Field " + formatField(clazz, fieldName) + " not found.");
222224
} catch (LinkageError e) {
223-
handleError("Could not register field " + formatField(clazz, fieldName) + " for reflection.", e);
225+
handleMissingElement("Could not register field " + formatField(clazz, fieldName) + " for reflection.", e);
224226
}
225227
}
226228

@@ -251,9 +253,9 @@ private void parseMethod(boolean queriedOnly, EconomicMap<String, Object> data,
251253
delegate.registerMethod(queriedOnly, clazz, methodName, methodParameterTypes);
252254
}
253255
} catch (NoSuchMethodException e) {
254-
handleError("Method " + formatMethod(clazz, methodName, methodParameterTypes) + " not found.");
256+
handleMissingElement("Method " + formatMethod(clazz, methodName, methodParameterTypes) + " not found.");
255257
} catch (LinkageError e) {
256-
handleError("Could not register method " + formatMethod(clazz, methodName, methodParameterTypes) + " for reflection.", e);
258+
handleMissingElement("Could not register method " + formatMethod(clazz, methodName, methodParameterTypes) + " for reflection.", e);
257259
}
258260
} else {
259261
try {
@@ -267,7 +269,7 @@ private void parseMethod(boolean queriedOnly, EconomicMap<String, Object> data,
267269
throw new JSONParserException("Method " + formatMethod(clazz, methodName) + " not found");
268270
}
269271
} catch (LinkageError e) {
270-
handleError("Could not register method " + formatMethod(clazz, methodName) + " for reflection.", e);
272+
handleMissingElement("Could not register method " + formatMethod(clazz, methodName) + " for reflection.", e);
271273
}
272274
}
273275
}
@@ -278,7 +280,7 @@ private List<T> parseMethodParameters(T clazz, String methodName, List<Object> t
278280
String typeName = asString(type, "types");
279281
TypeResult<T> typeResult = delegate.resolveType(ConfigurationCondition.alwaysTrue(), typeName, true);
280282
if (!typeResult.isPresent()) {
281-
handleError("Could not register method " + formatMethod(clazz, methodName) + " for reflection.", typeResult.getException());
283+
handleMissingElement("Could not register method " + formatMethod(clazz, methodName) + " for reflection.", typeResult.getException());
282284
return null;
283285
}
284286
result.add(typeResult.get());
@@ -303,15 +305,17 @@ private String formatMethod(T clazz, String methodName, List<T> paramTypes) {
303305
return delegate.getTypeName(clazz) + '.' + methodName + '(' + parameterTypeNames + ')';
304306
}
305307

306-
private static void handleError(String message) {
307-
handleError(message, null);
308+
private void handleMissingElement(String message) {
309+
handleMissingElement(message, null);
308310
}
309311

310-
private static void handleError(String msg, Throwable cause) {
311-
String message = msg;
312-
if (cause != null) {
313-
message += " Reason: " + formatError(cause) + '.';
312+
private void handleMissingElement(String msg, Throwable cause) {
313+
if (printMissingElements) {
314+
String message = msg;
315+
if (cause != null) {
316+
message += " Reason: " + formatError(cause) + '.';
317+
}
318+
LogUtils.warning(message);
314319
}
315-
LogUtils.warning(message);
316320
}
317321
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ public final class ConfigurationParserUtils {
5757

5858
public static ReflectionConfigurationParser<ConditionalElement<Class<?>>> create(ReflectionRegistry registry, ImageClassLoader imageClassLoader) {
5959
return new ReflectionConfigurationParser<>(RegistryAdapter.create(registry, imageClassLoader),
60-
ConfigurationFiles.Options.StrictConfiguration.getValue());
60+
ConfigurationFiles.Options.StrictConfiguration.getValue(),
61+
ConfigurationFiles.Options.PrintMissingMetadataElements.getValue()
62+
);
6163
}
6264

6365
/**

0 commit comments

Comments
 (0)