AlexanderAshitkin commented on code in PR #389:
URL:
https://github.com/apache/maven-build-cache-extension/pull/389#discussion_r2479946011
##########
src/main/java/org/apache/maven/buildcache/xml/CacheConfigImpl.java:
##########
@@ -248,27 +249,167 @@ public boolean isLogAllProperties(MojoExecution
mojoExecution) {
}
private GoalReconciliation findReconciliationConfig(MojoExecution
mojoExecution) {
- if (cacheConfig.getExecutionControl() == null) {
+ if (mojoExecution == null) {
return null;
}
- final ExecutionControl executionControl =
cacheConfig.getExecutionControl();
- if (executionControl.getReconcile() == null) {
+ final String goal = mojoExecution.getGoal();
+ final Plugin plugin = mojoExecution.getPlugin();
+
+ if (plugin == null) {
return null;
}
- final List<GoalReconciliation> reconciliation =
- executionControl.getReconcile().getPlugins();
+ // First check explicit configuration
+ if (cacheConfig.getExecutionControl() != null
+ && cacheConfig.getExecutionControl().getReconcile() != null) {
+ List<GoalReconciliation> explicitConfigs =
+
cacheConfig.getExecutionControl().getReconcile().getPlugins();
+ for (GoalReconciliation config : explicitConfigs) {
+ if (isPluginMatch(plugin, config) && Strings.CS.equals(goal,
config.getGoal())) {
+ // Validate explicit config against parameter definitions
(with version)
+ validateReconciliationConfig(config, plugin);
+ return config;
+ }
+ }
+ }
+
+ // Auto-generate from parameter definitions (track all functional
parameters)
+ GoalReconciliation autoGenerated =
generateReconciliationFromParameters(plugin, goal);
+ if (autoGenerated != null) {
+ LOGGER.debug(
+ "Auto-generated reconciliation config for {}:{} with {}
functional parameters",
+ plugin.getArtifactId(),
+ goal,
+ autoGenerated.getReconciles() != null
+ ? autoGenerated.getReconciles().size()
+ : 0);
+ }
+ return autoGenerated;
+ }
+
+ /**
+ * Validates a single reconciliation config against plugin parameter
definitions.
+ * Uses plugin version to load the appropriate parameter definition.
+ */
+ private void validateReconciliationConfig(GoalReconciliation config,
Plugin plugin) {
+ String artifactId = config.getArtifactId();
+ String goal = config.getGoal();
+ String pluginVersion = plugin.getVersion();
+
+ // Load parameter definition for this plugin with version
+ PluginParameterDefinition pluginDef = parameterLoader.load(artifactId,
pluginVersion);
+
+ if (pluginDef == null) {
+ LOGGER.warn(
+ "No parameter definition found for plugin {}:{} version
{}. "
+ + "Cannot validate reconciliation configuration. "
+ + "Consider adding a parameter definition file to
plugin-parameters/{}.xml",
+ artifactId,
+ goal,
+ pluginVersion != null ? pluginVersion : "unknown",
+ artifactId);
+ return;
+ }
+
+ // Get goal definition
+ PluginParameterDefinition.GoalParameterDefinition goalDef =
pluginDef.getGoal(goal);
+ if (goalDef == null) {
+ LOGGER.warn(
+ "Goal '{}' not found in parameter definition for plugin {}
version {}. "
+ + "Cannot validate reconciliation configuration.",
+ goal,
+ artifactId,
+ pluginVersion != null ? pluginVersion : "unknown");
+ return;
+ }
- for (GoalReconciliation goalReconciliationConfig : reconciliation) {
- final String goal = mojoExecution.getGoal();
+ // Validate each tracked property
+ List<TrackedProperty> properties = config.getReconciles();
+ if (properties == null) {
+ return;
+ }
- if (isPluginMatch(mojoExecution.getPlugin(),
goalReconciliationConfig)
- && Strings.CS.equals(goal,
goalReconciliationConfig.getGoal())) {
- return goalReconciliationConfig;
+ for (TrackedProperty property : properties) {
+ String propertyName = property.getPropertyName();
+
+ if (!goalDef.hasParameter(propertyName)) {
+ LOGGER.error(
+ "Unknown parameter '{}' in reconciliation config for
{}:{} version {}. "
+ + "This may indicate a plugin version mismatch
or renamed parameter. "
+ + "Consider updating parameter definition or
removing from reconciliation.",
+ propertyName,
+ artifactId,
+ goal,
+ pluginVersion != null ? pluginVersion : "unknown");
+ } else {
+ PluginParameterDefinition.ParameterDefinition paramDef =
goalDef.getParameter(propertyName);
+ if (paramDef.isBehavioral()) {
+ LOGGER.warn(
+ "Parameter '{}' in reconciliation config for {}:{}
is categorized as BEHAVIORAL. "
+ + "Behavioral parameters affect how the
build runs but not the output. "
+ + "Consider removing if it doesn't
actually affect build artifacts.",
+ propertyName,
+ artifactId,
+ goal);
+ }
}
}
- return null;
+ }
+
+ /**
+ * Auto-generates a reconciliation config by tracking all functional
parameters
+ * from the plugin parameter definition.
+ * This provides automatic default tracking for any plugin with parameter
definitions.
+ *
+ * @param plugin The plugin to generate config for
+ * @param goal The goal name
+ * @return Auto-generated config tracking all functional parameters, or
null if no parameter definition exists
+ */
+ private GoalReconciliation generateReconciliationFromParameters(Plugin
plugin, String goal) {
+ String artifactId = plugin.getArtifactId();
+ String pluginVersion = plugin.getVersion();
+
+ // Load parameter definition for this plugin
+ PluginParameterDefinition pluginDef = parameterLoader.load(artifactId,
pluginVersion);
+ if (pluginDef == null) {
+ return null;
+ }
+
+ // Get goal definition
+ PluginParameterDefinition.GoalParameterDefinition goalDef =
pluginDef.getGoal(goal);
+ if (goalDef == null) {
+ return null;
+ }
+
+ // Collect all functional parameters
+ List<TrackedProperty> functionalProperties = new ArrayList<>();
+ for (PluginParameterDefinition.ParameterDefinition param :
+ goalDef.getParameters().values()) {
+ if (param.isFunctional()) {
+ TrackedProperty property = new TrackedProperty();
+ property.setPropertyName(param.getName());
+ functionalProperties.add(property);
+ }
+ }
+
Review Comment:
Can we add a debug statement here please? Something like: `Default
properties to reconcile for a plugin goal {}: {}`
If it is not logged upstack, it will be helpful.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]