2424 */
2525package com .oracle .svm .configure .config ;
2626
27+ import static com .oracle .svm .core .configure .ConfigurationParser .JNI_KEY ;
28+ import static com .oracle .svm .core .configure .ConfigurationParser .REFLECTION_KEY ;
29+
2730import java .io .IOException ;
2831import java .net .URI ;
2932import java .nio .file .Files ;
3033import java .nio .file .Path ;
34+ import java .nio .file .Paths ;
3135import java .util .Collection ;
3236import java .util .Collections ;
3337import java .util .LinkedHashSet ;
3438import java .util .Objects ;
3539import java .util .Set ;
3640import java .util .function .Function ;
3741import java .util .function .Predicate ;
42+ import java .util .stream .Collectors ;
3843
3944import com .oracle .svm .core .configure .ConfigurationFile ;
4045import com .oracle .svm .core .configure .ConfigurationParser ;
46+ import com .oracle .svm .core .util .VMError ;
4147
4248public class ConfigurationFileCollection {
4349 public static final Function <IOException , Exception > FAIL_ON_EXCEPTION = e -> e ;
4450
51+ private final Set <URI > reachabilityMetadataPaths = new LinkedHashSet <>();
4552 private final Set <URI > jniConfigPaths = new LinkedHashSet <>();
4653 private final Set <URI > reflectConfigPaths = new LinkedHashSet <>();
4754 private final Set <URI > proxyConfigPaths = new LinkedHashSet <>();
@@ -51,6 +58,7 @@ public class ConfigurationFileCollection {
5158 private Set <URI > lockFilePaths ;
5259
5360 public void addDirectory (Path path ) {
61+ reachabilityMetadataPaths .add (path .resolve (ConfigurationFile .REACHABILITY_METADATA .getFileName ()).toUri ());
5462 jniConfigPaths .add (path .resolve (ConfigurationFile .JNI .getFileName ()).toUri ());
5563 reflectConfigPaths .add (path .resolve (ConfigurationFile .REFLECTION .getFileName ()).toUri ());
5664 proxyConfigPaths .add (path .resolve (ConfigurationFile .DYNAMIC_PROXY .getFileName ()).toUri ());
@@ -70,24 +78,51 @@ private <T> void detectAgentLock(T location, Predicate<T> exists, Function<T, UR
7078 }
7179
7280 public void addDirectory (Function <String , URI > fileResolver ) {
73- jniConfigPaths .add (fileResolver .apply (ConfigurationFile .JNI .getFileName ()));
74- reflectConfigPaths .add (fileResolver .apply (ConfigurationFile .REFLECTION .getFileName ()));
75- proxyConfigPaths .add (fileResolver .apply (ConfigurationFile .DYNAMIC_PROXY .getFileName ()));
76- resourceConfigPaths .add (fileResolver .apply (ConfigurationFile .RESOURCES .getFileName ()));
77- serializationConfigPaths .add (fileResolver .apply (ConfigurationFile .SERIALIZATION .getFileName ()));
78- predefinedClassesConfigPaths .add (fileResolver .apply (ConfigurationFile .PREDEFINED_CLASSES_NAME .getFileName ()));
81+ addFile (reachabilityMetadataPaths , fileResolver , ConfigurationFile .REACHABILITY_METADATA );
82+ addFile (jniConfigPaths , fileResolver , ConfigurationFile .JNI );
83+ addFile (reflectConfigPaths , fileResolver , ConfigurationFile .REFLECTION );
84+ addFile (proxyConfigPaths , fileResolver , ConfigurationFile .DYNAMIC_PROXY );
85+ addFile (resourceConfigPaths , fileResolver , ConfigurationFile .RESOURCES );
86+ addFile (serializationConfigPaths , fileResolver , ConfigurationFile .SERIALIZATION );
87+ addFile (predefinedClassesConfigPaths , fileResolver , ConfigurationFile .PREDEFINED_CLASSES_NAME );
7988 detectAgentLock (fileResolver .apply (ConfigurationFile .LOCK_FILE_NAME ), Objects ::nonNull , Function .identity ());
8089 }
8190
91+ private static void addFile (Set <URI > metadataPaths , Function <String , URI > fileResolver , ConfigurationFile configurationFile ) {
92+ URI uri = fileResolver .apply (configurationFile .getFileName ());
93+ if (uri != null ) {
94+ metadataPaths .add (uri );
95+ }
96+ }
97+
8298 public Set <URI > getDetectedAgentLockPaths () {
8399 return (lockFilePaths != null ) ? lockFilePaths : Collections .emptySet ();
84100 }
85101
86102 public boolean isEmpty () {
87- return jniConfigPaths .isEmpty () && reflectConfigPaths .isEmpty () && proxyConfigPaths .isEmpty () &&
103+ return reachabilityMetadataPaths . isEmpty () && jniConfigPaths .isEmpty () && reflectConfigPaths .isEmpty () && proxyConfigPaths .isEmpty () &&
88104 resourceConfigPaths .isEmpty () && serializationConfigPaths .isEmpty () && predefinedClassesConfigPaths .isEmpty ();
89105 }
90106
107+ public Set <Path > getPaths (ConfigurationFile configurationFile ) {
108+ Set <URI > uris ;
109+ switch (configurationFile ) {
110+ case REACHABILITY_METADATA -> uris = getReachabilityMetadataPaths ();
111+ case DYNAMIC_PROXY -> uris = getProxyConfigPaths ();
112+ case RESOURCES -> uris = getResourceConfigPaths ();
113+ case JNI -> uris = getJniConfigPaths ();
114+ case REFLECTION -> uris = getReflectConfigPaths ();
115+ case SERIALIZATION -> uris = getSerializationConfigPaths ();
116+ case PREDEFINED_CLASSES_NAME -> uris = getPredefinedClassesConfigPaths ();
117+ default -> throw VMError .shouldNotReachHere ("Cannot get paths for configuration file " + configurationFile );
118+ }
119+ return uris .stream ().map (Paths ::get ).collect (Collectors .toSet ());
120+ }
121+
122+ public Set <URI > getReachabilityMetadataPaths () {
123+ return reachabilityMetadataPaths ;
124+ }
125+
91126 public Set <URI > getJniConfigPaths () {
92127 return jniConfigPaths ;
93128 }
@@ -113,35 +148,37 @@ public Set<URI> getPredefinedClassesConfigPaths() {
113148 }
114149
115150 public TypeConfiguration loadJniConfig (Function <IOException , Exception > exceptionHandler ) throws Exception {
116- return loadTypeConfig (jniConfigPaths , exceptionHandler );
151+ return loadTypeConfig (JNI_KEY , jniConfigPaths , exceptionHandler );
117152 }
118153
119154 public TypeConfiguration loadReflectConfig (Function <IOException , Exception > exceptionHandler ) throws Exception {
120- return loadTypeConfig (reflectConfigPaths , exceptionHandler );
155+ return loadTypeConfig (REFLECTION_KEY , reflectConfigPaths , exceptionHandler );
121156 }
122157
123158 public ProxyConfiguration loadProxyConfig (Function <IOException , Exception > exceptionHandler ) throws Exception {
124159 ProxyConfiguration proxyConfiguration = new ProxyConfiguration ();
125- loadConfig (proxyConfigPaths , proxyConfiguration .createParser (), exceptionHandler );
160+ loadConfig (proxyConfigPaths , proxyConfiguration .createParser (false ), exceptionHandler );
126161 return proxyConfiguration ;
127162 }
128163
129164 public PredefinedClassesConfiguration loadPredefinedClassesConfig (Path [] classDestinationDirs , Predicate <String > shouldExcludeClassesWithHash ,
130165 Function <IOException , Exception > exceptionHandler ) throws Exception {
131166 PredefinedClassesConfiguration predefinedClassesConfiguration = new PredefinedClassesConfiguration (classDestinationDirs , shouldExcludeClassesWithHash );
132- loadConfig (predefinedClassesConfigPaths , predefinedClassesConfiguration .createParser (), exceptionHandler );
167+ loadConfig (predefinedClassesConfigPaths , predefinedClassesConfiguration .createParser (false ), exceptionHandler );
133168 return predefinedClassesConfiguration ;
134169 }
135170
136171 public ResourceConfiguration loadResourceConfig (Function <IOException , Exception > exceptionHandler ) throws Exception {
137172 ResourceConfiguration resourceConfiguration = new ResourceConfiguration ();
138- loadConfig (resourceConfigPaths , resourceConfiguration .createParser (), exceptionHandler );
173+ loadConfig (reachabilityMetadataPaths , resourceConfiguration .createParser (true ), exceptionHandler );
174+ loadConfig (resourceConfigPaths , resourceConfiguration .createParser (false ), exceptionHandler );
139175 return resourceConfiguration ;
140176 }
141177
142178 public SerializationConfiguration loadSerializationConfig (Function <IOException , Exception > exceptionHandler ) throws Exception {
143179 SerializationConfiguration serializationConfiguration = new SerializationConfiguration ();
144- loadConfig (serializationConfigPaths , serializationConfiguration .createParser (), exceptionHandler );
180+ loadConfig (reachabilityMetadataPaths , serializationConfiguration .createParser (true ), exceptionHandler );
181+ loadConfig (serializationConfigPaths , serializationConfiguration .createParser (false ), exceptionHandler );
145182 return serializationConfiguration ;
146183 }
147184
@@ -152,9 +189,10 @@ public ConfigurationSet loadConfigurationSet(Function<IOException, Exception> ex
152189 loadPredefinedClassesConfig (predefinedConfigClassDestinationDirs , predefinedConfigClassWithHashExclusionPredicate , exceptionHandler ));
153190 }
154191
155- private static TypeConfiguration loadTypeConfig (Collection <URI > uris , Function <IOException , Exception > exceptionHandler ) throws Exception {
156- TypeConfiguration configuration = new TypeConfiguration ();
157- loadConfig (uris , configuration .createParser (), exceptionHandler );
192+ private TypeConfiguration loadTypeConfig (String combinedFileKey , Collection <URI > uris , Function <IOException , Exception > exceptionHandler ) throws Exception {
193+ TypeConfiguration configuration = new TypeConfiguration (combinedFileKey );
194+ loadConfig (reachabilityMetadataPaths , configuration .createParser (true ), exceptionHandler );
195+ loadConfig (uris , configuration .createParser (false ), exceptionHandler );
158196 return configuration ;
159197 }
160198
0 commit comments