Skip to content

Commit c568eaf

Browse files
committed
Implement auto-tracking of functional parameters from plugin XML definitions
Replace static defaults.xml with dynamic auto-generation that tracks ALL functional parameters from plugin-parameters/*.xml files. Changes: - Remove defaults.xml (no longer needed - all plugins have XML definitions) - Remove DefaultReconciliationLoader class (replaced by auto-generation) - Add generateReconciliationFromParameters() method to CacheConfigImpl that automatically creates reconciliation configs by reading functional parameters from plugin parameter definitions - Auto-generation runs as final fallback after explicit config check Benefits: - Single source of truth (plugin-parameters/*.xml defines everything) - More comprehensive tracking (all functional params, not just 3) - Easier maintenance (no need to keep defaults.xml in sync) - Future-proof (new plugins with XML definitions get auto-tracking) For maven-compiler-plugin: - Before: Tracked 3 params (source, target, release) - After: Tracks ALL 15 functional params (source, target, release, encoding, debug, debuglevel, optimize, compilerArgs, etc.) All existing tests pass, including DefaultReconciliationTest which validates the auto-generation works correctly. Addresses reviewer feedback on PR apache#389.
1 parent 81856c4 commit c568eaf

File tree

3 files changed

+52
-261
lines changed

3 files changed

+52
-261
lines changed

src/main/java/org/apache/maven/buildcache/xml/CacheConfigImpl.java

Lines changed: 52 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ public class CacheConfigImpl implements org.apache.maven.buildcache.xml.CacheCon
119119
private final Provider<MavenSession> providerSession;
120120
private final RuntimeInformation rtInfo;
121121
private final PluginParameterLoader parameterLoader;
122-
private final DefaultReconciliationLoader defaultReconciliationLoader;
123122

124123
private volatile CacheState state;
125124
private CacheConfig cacheConfig;
@@ -132,7 +131,6 @@ public CacheConfigImpl(XmlService xmlService, Provider<MavenSession> providerSes
132131
this.providerSession = providerSession;
133132
this.rtInfo = rtInfo;
134133
this.parameterLoader = new PluginParameterLoader();
135-
this.defaultReconciliationLoader = new DefaultReconciliationLoader();
136134
}
137135

138136
@Nonnull
@@ -276,17 +274,16 @@ private GoalReconciliation findReconciliationConfig(MojoExecution mojoExecution)
276274
}
277275
}
278276

279-
// Fall back to defaults if no explicit configuration found
280-
List<GoalReconciliation> defaults = getDefaultReconciliationConfigs();
281-
for (GoalReconciliation config : defaults) {
282-
if (isPluginMatch(plugin, config) && Strings.CS.equals(goal, config.getGoal())) {
283-
// Validate default config against parameter definitions (with version)
284-
validateReconciliationConfig(config, plugin);
285-
return config;
286-
}
277+
// Auto-generate from parameter definitions (track all functional parameters)
278+
GoalReconciliation autoGenerated = generateReconciliationFromParameters(plugin, goal);
279+
if (autoGenerated != null) {
280+
LOGGER.debug(
281+
"Auto-generated reconciliation config for {}:{} with {} functional parameters",
282+
plugin.getArtifactId(),
283+
goal,
284+
autoGenerated.getReconciles() != null ? autoGenerated.getReconciles().size() : 0);
287285
}
288-
289-
return null;
286+
return autoGenerated;
290287
}
291288

292289
/**
@@ -359,83 +356,57 @@ private void validateReconciliationConfig(GoalReconciliation config, Plugin plug
359356
}
360357

361358
/**
362-
* Load default reconciliation configurations from XML.
363-
* Defaults are loaded from classpath: default-reconciliation/defaults.xml
359+
* Auto-generates a reconciliation config by tracking all functional parameters
360+
* from the plugin parameter definition.
361+
* This provides automatic default tracking for any plugin with parameter definitions.
362+
*
363+
* @param plugin The plugin to generate config for
364+
* @param goal The goal name
365+
* @return Auto-generated config tracking all functional parameters, or null if no parameter definition exists
364366
*/
365-
private List<GoalReconciliation> getDefaultReconciliationConfigs() {
366-
List<GoalReconciliation> defaults = defaultReconciliationLoader.loadDefaults();
367+
private GoalReconciliation generateReconciliationFromParameters(Plugin plugin, String goal) {
368+
String artifactId = plugin.getArtifactId();
369+
String pluginVersion = plugin.getVersion();
367370

368-
// Validate all default configurations against parameter definitions
369-
validateReconciliationConfigs(defaults);
371+
// Load parameter definition for this plugin
372+
PluginParameterDefinition pluginDef = parameterLoader.load(artifactId, pluginVersion);
373+
if (pluginDef == null) {
374+
return null;
375+
}
370376

371-
return defaults;
372-
}
377+
// Get goal definition
378+
PluginParameterDefinition.GoalParameterDefinition goalDef = pluginDef.getGoal(goal);
379+
if (goalDef == null) {
380+
return null;
381+
}
373382

374-
/**
375-
* Validates reconciliation configs against plugin parameter definitions.
376-
* Warns about unknown parameters that may indicate plugin changes or configuration errors.
377-
*/
378-
private void validateReconciliationConfigs(List<GoalReconciliation> configs) {
379-
for (GoalReconciliation config : configs) {
380-
String artifactId = config.getArtifactId();
381-
String goal = config.getGoal();
382-
383-
// Load parameter definition for this plugin
384-
PluginParameterDefinition pluginDef = parameterLoader.load(artifactId);
385-
386-
if (pluginDef == null) {
387-
LOGGER.warn(
388-
"No parameter definition found for plugin {}:{}. "
389-
+ "Cannot validate reconciliation configuration. "
390-
+ "Consider adding a parameter definition file to plugin-parameters/{}.xml",
391-
artifactId,
392-
goal,
393-
artifactId);
394-
continue;
383+
// Collect all functional parameters
384+
List<TrackedProperty> functionalProperties = new ArrayList<>();
385+
for (PluginParameterDefinition.ParameterDefinition param : goalDef.getParameters().values()) {
386+
if (param.isFunctional()) {
387+
TrackedProperty property = new TrackedProperty();
388+
property.setPropertyName(param.getName());
389+
functionalProperties.add(property);
395390
}
391+
}
396392

397-
// Get goal definition
398-
PluginParameterDefinition.GoalParameterDefinition goalDef = pluginDef.getGoal(goal);
399-
if (goalDef == null) {
400-
LOGGER.warn(
401-
"Goal '{}' not found in parameter definition for plugin {}. "
402-
+ "Cannot validate reconciliation configuration.",
403-
goal,
404-
artifactId);
405-
continue;
406-
}
393+
// Only create config if there are functional parameters to track
394+
if (functionalProperties.isEmpty()) {
395+
return null;
396+
}
407397

408-
// Validate each tracked property
409-
List<TrackedProperty> properties = config.getReconciles();
410-
if (properties != null) {
411-
for (TrackedProperty property : properties) {
412-
String propertyName = property.getPropertyName();
413-
414-
if (!goalDef.hasParameter(propertyName)) {
415-
LOGGER.error(
416-
"Unknown parameter '{}' in default reconciliation config for {}:{}. "
417-
+ "This parameter is not defined in the plugin parameter definition. "
418-
+ "This may indicate a plugin version mismatch or renamed parameter. "
419-
+ "Please update the parameter definition or remove this property from reconciliation.",
420-
propertyName,
421-
artifactId,
422-
goal);
423-
} else {
424-
PluginParameterDefinition.ParameterDefinition paramDef =
425-
goalDef.getParameter(propertyName);
426-
if (paramDef.isBehavioral()) {
427-
LOGGER.warn(
428-
"Parameter '{}' in reconciliation config for {}:{} is categorized as BEHAVIORAL. "
429-
+ "Behavioral parameters typically should not affect cache invalidation. "
430-
+ "Consider removing this parameter from reconciliation if it doesn't affect build output.",
431-
propertyName,
432-
artifactId,
433-
goal);
434-
}
435-
}
436-
}
437-
}
398+
// Create auto-generated reconciliation config
399+
GoalReconciliation config = new GoalReconciliation();
400+
config.setArtifactId(artifactId);
401+
if (plugin.getGroupId() != null) {
402+
config.setGroupId(plugin.getGroupId());
403+
}
404+
config.setGoal(goal);
405+
for (TrackedProperty property : functionalProperties) {
406+
config.addReconcile(property);
438407
}
408+
409+
return config;
439410
}
440411

441412
@Nonnull

src/main/java/org/apache/maven/buildcache/xml/DefaultReconciliationLoader.java

Lines changed: 0 additions & 126 deletions
This file was deleted.

src/main/resources/default-reconciliation/defaults.xml

Lines changed: 0 additions & 54 deletions
This file was deleted.

0 commit comments

Comments
 (0)