4646import org .graalvm .nativeimage .impl .ConfigurationCondition ;
4747import org .graalvm .nativeimage .impl .RuntimeSerializationSupport ;
4848
49- import com .oracle .svm .core .TypeResult ;
5049import com .oracle .svm .core .annotate .AutomaticFeature ;
5150import com .oracle .svm .core .configure .ConfigurationFile ;
5251import com .oracle .svm .core .configure .ConfigurationFiles ;
5554import com .oracle .svm .core .jdk .RecordSupport ;
5655import com .oracle .svm .core .util .UserError ;
5756import com .oracle .svm .core .util .VMError ;
58- import com .oracle .svm .core .util .json .JSONParserException ;
57+ import com .oracle .svm .hosted .ConditionalConfigurationRegistry ;
58+ import com .oracle .svm .hosted .ConfigurationTypeResolver ;
5959import com .oracle .svm .hosted .FallbackFeature ;
6060import com .oracle .svm .hosted .FeatureImpl ;
6161import com .oracle .svm .hosted .ImageClassLoader ;
6262import com .oracle .svm .hosted .NativeImageOptions ;
63- import com .oracle .svm .hosted .ConditionalConfigurationRegistry ;
6463import com .oracle .svm .hosted .config .ConfigurationParserUtils ;
6564import com .oracle .svm .reflect .hosted .ReflectionFeature ;
6665import com .oracle .svm .reflect .serialize .SerializationRegistry ;
6766import com .oracle .svm .reflect .serialize .SerializationSupport ;
6867import com .oracle .svm .util .ReflectionUtil ;
6968
70- import jdk .vm .ci .meta .MetaUtil ;
71-
7269@ AutomaticFeature
7370public class SerializationFeature implements Feature {
7471 private SerializationBuilder serializationBuilder ;
@@ -83,7 +80,7 @@ public List<Class<? extends Feature>> getRequiredFeatures() {
8380 public void duringSetup (DuringSetupAccess a ) {
8481 FeatureImpl .DuringSetupAccessImpl access = (FeatureImpl .DuringSetupAccessImpl ) a ;
8582 ImageClassLoader imageClassLoader = access .getImageClassLoader ();
86- SerializationTypeResolver typeResolver = new SerializationTypeResolver ( imageClassLoader , NativeImageOptions .AllowIncompleteClasspath .getValue ());
83+ ConfigurationTypeResolver typeResolver = new ConfigurationTypeResolver ( "serialization configuration" , imageClassLoader , NativeImageOptions .AllowIncompleteClasspath .getValue ());
8784 SerializationDenyRegistry serializationDenyRegistry = new SerializationDenyRegistry (typeResolver );
8885 serializationBuilder = new SerializationBuilder (serializationDenyRegistry , access , typeResolver );
8986 ImageSingletons .add (RuntimeSerializationSupport .class , serializationBuilder );
@@ -131,44 +128,12 @@ static void println(String str) {
131128 }
132129}
133130
134- final class SerializationTypeResolver {
135-
136- private final ImageClassLoader classLoader ;
137- private final boolean allowIncompleteClasspath ;
138-
139- SerializationTypeResolver (ImageClassLoader classLoader , boolean allowIncompleteClasspath ) {
140- this .classLoader = classLoader ;
141- this .allowIncompleteClasspath = allowIncompleteClasspath ;
142- }
143-
144- public Class <?> resolveType (String typeName ) {
145- String name = typeName ;
146- if (name .indexOf ('[' ) != -1 ) {
147- /* accept "int[][]", "java.lang.String[]" */
148- name = MetaUtil .internalNameToJava (MetaUtil .toInternalName (name ), true , true );
149- }
150- TypeResult <Class <?>> typeResult = classLoader .findClass (name );
151- if (!typeResult .isPresent ()) {
152- handleError ("Could not resolve " + name + " for serialization configuration." );
153- }
154- return typeResult .get ();
155- }
156-
157- private void handleError (String message ) {
158- if (allowIncompleteClasspath ) {
159- println ("Warning: " + message );
160- } else {
161- throw new JSONParserException (message + " To allow unresolvable reflection configuration, use option -H:+AllowIncompleteClasspath" );
162- }
163- }
164- }
165-
166131final class SerializationDenyRegistry implements RuntimeSerializationSupport {
167132
168133 private final Map <Class <?>, Boolean > deniedClasses = new HashMap <>();
169- private final SerializationTypeResolver typeResolver ;
134+ private final ConfigurationTypeResolver typeResolver ;
170135
171- SerializationDenyRegistry (SerializationTypeResolver typeResolver ) {
136+ SerializationDenyRegistry (ConfigurationTypeResolver typeResolver ) {
172137 this .typeResolver = typeResolver ;
173138 }
174139
@@ -212,11 +177,11 @@ final class SerializationBuilder extends ConditionalConfigurationRegistry implem
212177
213178 private final SerializationSupport serializationSupport ;
214179 private final SerializationDenyRegistry denyRegistry ;
215- private final SerializationTypeResolver typeResolver ;
180+ private final ConfigurationTypeResolver typeResolver ;
216181
217182 private boolean sealed ;
218183
219- SerializationBuilder (SerializationDenyRegistry serializationDenyRegistry , FeatureImpl .DuringSetupAccessImpl access , SerializationTypeResolver typeResolver ) {
184+ SerializationBuilder (SerializationDenyRegistry serializationDenyRegistry , FeatureImpl .DuringSetupAccessImpl access , ConfigurationTypeResolver typeResolver ) {
220185 try {
221186 Class <?> reflectionFactoryClass = access .findClassByName (Package_jdk_internal_reflect .getQualifiedName () + ".ReflectionFactory" );
222187 Method getReflectionFactoryMethod = ReflectionUtil .lookupMethod (reflectionFactoryClass , "getReflectionFactory" );
@@ -252,15 +217,8 @@ public void registerWithTargetConstructorClass(ConfigurationCondition condition,
252217 abortIfSealed ();
253218
254219 Class <?> conditionClass = typeResolver .resolveType (condition .getTypeName ());
255- String msg = "Cannot find condition class %s." ;
256220 if (conditionClass == null ) {
257- if (NativeImageOptions .AllowIncompleteClasspath .getValue ()) {
258- // Checkstyle: stop
259- System .err .println ("Warning: " + String .format (msg , condition .getTypeName ()));
260- // Checkstyle: resume
261- } else {
262- throw UserError .abort (msg , condition .getTypeName ());
263- }
221+ return ;
264222 }
265223
266224 Class <?> serializationTargetClass = typeResolver .resolveType (targetClassName );
0 commit comments