4040import java .util .ArrayList ;
4141import java .util .Arrays ;
4242import java .util .ConcurrentModificationException ;
43- import java .util .Collections ;
4443import java .util .Date ;
4544import java .util .HashSet ;
4645import java .util .List ;
5756import org .graalvm .nativeimage .ProcessProperties ;
5857import org .graalvm .nativeimage .hosted .Feature ;
5958
60- import com .oracle .svm .agent .configwithorigins .ConfigurationWithOriginsResultWriter ;
59+ import com .oracle .svm .agent .configwithorigins .ConfigurationWithOriginsWriter ;
6160import com .oracle .svm .agent .configwithorigins .MethodInfoRecordKeeper ;
6261import com .oracle .svm .agent .ignoredconfig .AgentMetaInfProcessor ;
63- import com .oracle .svm .agent .predicatedconfig .ConditionalConfigurationWriter ;
62+ import com .oracle .svm .agent .conditionalconfig .ConditionalConfigurationWriter ;
6463import com .oracle .svm .agent .stackaccess .EagerlyLoadedJavaStackAccess ;
6564import com .oracle .svm .agent .stackaccess .InterceptedState ;
6665import com .oracle .svm .agent .stackaccess .OnDemandJavaStackAccess ;
7069import com .oracle .svm .agent .tracing .core .TracingResultWriter ;
7170import com .oracle .svm .configure .config .ConditionalConfigurationPredicate ;
7271import com .oracle .svm .configure .config .ConfigurationFileCollection ;
72+ import com .oracle .svm .configure .config .ConfigurationSet ;
7373import com .oracle .svm .configure .filters .FilterConfigurationParser ;
7474import com .oracle .svm .configure .filters .RuleNode ;
7575import com .oracle .svm .configure .trace .AccessAdvisor ;
@@ -130,8 +130,8 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
130130 boolean experimentalOmitClasspathConfig = false ;
131131 boolean build = false ;
132132 boolean configurationWithOrigins = false ;
133- Set <String > conditionalConfigurationUserCodePackagePrefixes = new HashSet <>();
134- Set <Pattern > conditionalConfigurationClassNameExcludePatterns = new HashSet <>();
133+ Set <String > conditionalConfigUserPackagePrefixes = new HashSet <>();
134+ Set <Pattern > conditionalConfigClassNameExcludePatterns = new HashSet <>();
135135 int configWritePeriod = -1 ; // in seconds
136136 int configWritePeriodInitialDelay = 1 ; // in seconds
137137 boolean trackReflectionMetadata = true ;
@@ -203,12 +203,12 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
203203 build = Boolean .parseBoolean (getTokenValue (token ));
204204 } else if (token .equals ("experimental-configuration-with-origins" )) {
205205 configurationWithOrigins = true ;
206- } else if (token .startsWith ("experimental-conditional-configuration -for-packages =" )) {
207- String userPackagePrefixes = getTokenValue (token );
208- Collections . addAll ( conditionalConfigurationUserCodePackagePrefixes , userPackagePrefixes . split ( "," ) );
209- } else if (token .startsWith ("conditional-configuration -class-name-exclude-patterns =" )) {
206+ } else if (token .startsWith ("experimental-conditional-config -for-package =" )) {
207+ String userPackagePrefix = getTokenValue (token );
208+ conditionalConfigUserPackagePrefixes . add ( userPackagePrefix );
209+ } else if (token .startsWith ("conditional-config -class-name-exclude-pattern =" )) {
210210 String classNamePattern = getTokenValue (token );
211- Arrays . stream ( classNamePattern . split ( "," )). map ( Pattern :: compile ). forEach ( conditionalConfigurationClassNameExcludePatterns :: add );
211+ conditionalConfigClassNameExcludePatterns . add ( Pattern . compile ( classNamePattern ) );
212212 } else if (token .equals ("track-reflection-metadata" )) {
213213 trackReflectionMetadata = true ;
214214 } else if (token .startsWith ("track-reflection-metadata=" )) {
@@ -223,7 +223,7 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
223223 inform ("no output/build options provided, tracking dynamic accesses and writing configuration to directory: " + configOutputDir );
224224 }
225225
226- if (configurationWithOrigins && !conditionalConfigurationUserCodePackagePrefixes .isEmpty ()) {
226+ if (configurationWithOrigins && !conditionalConfigUserPackagePrefixes .isEmpty ()) {
227227 return error (5 , "The agent can only be used in either the configuration with origins mode or the predefined classes mode." );
228228 }
229229
@@ -258,7 +258,7 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
258258 }
259259 }
260260
261- boolean shouldTraceOriginInformation = configurationWithOrigins || !conditionalConfigurationUserCodePackagePrefixes .isEmpty ();
261+ boolean shouldTraceOriginInformation = configurationWithOrigins || !conditionalConfigUserPackagePrefixes .isEmpty ();
262262 final MethodInfoRecordKeeper recordKeeper = new MethodInfoRecordKeeper (shouldTraceOriginInformation );
263263 final Supplier <InterceptedState > interceptedStateSupplier = shouldTraceOriginInformation ? EagerlyLoadedJavaStackAccess .stackAccessSupplier ()
264264 : OnDemandJavaStackAccess .stackAccessSupplier ();
@@ -291,26 +291,25 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
291291 ignoreConfigFromClasspath (jvmti , omittedConfigs );
292292 }
293293 AccessAdvisor advisor = createAccessAdvisor (builtinHeuristicFilter , callerFilter , accessFilter );
294- TraceProcessor omittedConfigProcessor = null ;
294+ TraceProcessor processor = new TraceProcessor (advisor );
295+ ConfigurationSet omittedConfiguration = new ConfigurationSet ();
295296 Predicate <String > shouldExcludeClassesWithHash = null ;
296297 if (!omittedConfigs .isEmpty ()) {
297298 Function <IOException , Exception > ignore = e -> {
298299 warn ("Failed to load omitted config: " + e );
299300 return null ;
300301 };
301- omittedConfigProcessor = new TraceProcessor (advisor , omittedConfigs .loadJniConfig (ignore ), omittedConfigs .loadReflectConfig (ignore ),
302- omittedConfigs .loadProxyConfig (ignore ), omittedConfigs .loadResourceConfig (ignore ), omittedConfigs .loadSerializationConfig (ignore ),
303- omittedConfigs .loadPredefinedClassesConfig (null , null , ignore ), null );
304- shouldExcludeClassesWithHash = omittedConfigProcessor .getPredefinedClassesConfiguration ()::containsClassWithHash ;
302+ omittedConfiguration = omittedConfigs .loadConfigurationSet (ignore , null , null );
303+ shouldExcludeClassesWithHash = omittedConfiguration .getPredefinedClassesConfiguration ()::containsClassWithHash ;
305304 }
306305
307306 if (configurationWithOrigins ) {
308- ConfigurationWithOriginsResultWriter writer = new ConfigurationWithOriginsResultWriter ( advisor , recordKeeper );
307+ ConfigurationWithOriginsWriter writer = new ConfigurationWithOriginsWriter ( processor , recordKeeper );
309308 tracer = writer ;
310309 tracingResultWriter = writer ;
311- } else if (!conditionalConfigurationUserCodePackagePrefixes .isEmpty ()) {
312- ConditionalConfigurationPredicate filter = new ConditionalConfigurationPredicate (conditionalConfigurationClassNameExcludePatterns );
313- ConditionalConfigurationWriter writer = new ConditionalConfigurationWriter (advisor , recordKeeper , conditionalConfigurationUserCodePackagePrefixes , filter );
310+ } else if (!conditionalConfigUserPackagePrefixes .isEmpty ()) {
311+ ConditionalConfigurationPredicate filter = new ConditionalConfigurationPredicate (conditionalConfigClassNameExcludePatterns );
312+ ConditionalConfigurationWriter writer = new ConditionalConfigurationWriter (processor , recordKeeper , conditionalConfigUserPackagePrefixes , filter );
314313 tracer = writer ;
315314 tracingResultWriter = writer ;
316315 } else {
@@ -325,10 +324,9 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c
325324 }
326325 return e ; // rethrow
327326 };
328- TraceProcessor processor = new TraceProcessor (advisor , mergeConfigs .loadJniConfig (handler ), mergeConfigs .loadReflectConfig (handler ),
329- mergeConfigs .loadProxyConfig (handler ), mergeConfigs .loadResourceConfig (handler ), mergeConfigs .loadSerializationConfig (handler ),
330- mergeConfigs .loadPredefinedClassesConfig (predefinedClassDestDirs , shouldExcludeClassesWithHash , handler ), omittedConfigProcessor );
331- ConfigurationResultWriter writer = new ConfigurationResultWriter (processor );
327+
328+ ConfigurationSet configuration = mergeConfigs .loadConfigurationSet (handler , predefinedClassDestDirs , shouldExcludeClassesWithHash );
329+ ConfigurationResultWriter writer = new ConfigurationResultWriter (processor , configuration , omittedConfiguration );
332330 tracer = writer ;
333331 tracingResultWriter = writer ;
334332 }
0 commit comments