This is an automated email from the ASF dual-hosted git repository.
mcgilman pushed a commit to branch NIFI-15258
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/NIFI-15258 by this push:
new 673b493e2c NIFI-15481: Updated ConnectorActions to reflect that
starting is not … (#10782)
673b493e2c is described below
commit 673b493e2cf87171cdd1ff0033667788746397fe
Author: Mark Payne <[email protected]>
AuthorDate: Wed Jan 21 12:49:44 2026 -0500
NIFI-15481: Updated ConnectorActions to reflect that starting is not …
(#10782)
* NIFI-15481: Updated ConnectorActions to reflect that starting is not
allowed when invalid. Also updated ValidationState to ensure that we don't
return any ValidationResult with a valid flag of true as a 'validation error'.
* NIFI-15481: Addressed review feedback
---
.../components/validation/ValidationState.java | 20 +++++++++---
.../nifi/controller/AbstractComponentNode.java | 12 +++++---
.../connector/StandardConnectorNode.java | 36 ++++++++++------------
3 files changed, 40 insertions(+), 28 deletions(-)
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/components/validation/ValidationState.java
b/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/components/validation/ValidationState.java
index 22aab7099e..d1efd43ab9 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/components/validation/ValidationState.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/components/validation/ValidationState.java
@@ -17,17 +17,29 @@
package org.apache.nifi.components.validation;
-import java.util.Collection;
-
import org.apache.nifi.components.ValidationResult;
+import java.util.Collection;
+import java.util.Collections;
+
public class ValidationState {
private final ValidationStatus status;
private final Collection<ValidationResult> validationErrors;
- public ValidationState(final ValidationStatus status, final
Collection<ValidationResult> validationErrors) {
+ public ValidationState(final ValidationStatus status, final
Collection<ValidationResult> validationResults) {
this.status = status;
- this.validationErrors = validationErrors;
+ // Ensure that if we are provided any valid results, they are filtered
out because we only want to store validation failures.
+ this.validationErrors = removeValidResults(validationResults);
+ }
+
+ private Collection<ValidationResult> removeValidResults(final
Collection<ValidationResult> validationResults) {
+ if (validationResults.isEmpty()) {
+ return Collections.emptyList();
+ }
+
+ return validationResults.stream()
+ .filter(vr -> !vr.isValid())
+ .toList();
}
public ValidationStatus getStatus() {
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
b/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
index ca7c6f9065..ecaa4d3f31 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
@@ -867,13 +867,15 @@ public abstract class AbstractComponentNode implements
ComponentNode {
@Override
public ValidationState performValidation(final ValidationContext
validationContext) {
- final Collection<ValidationResult> results;
+ final Collection<ValidationResult> allResults;
try (final NarCloseable ignored =
NarCloseable.withComponentNarLoader(extensionManager,
getComponent().getClass(), getIdentifier())) {
- results = computeValidationErrors(validationContext);
+ allResults = computeValidationErrors(validationContext);
}
- final ValidationStatus status = results.isEmpty() ?
ValidationStatus.VALID : ValidationStatus.INVALID;
- final ValidationState validationState = new ValidationState(status,
results);
+ final Collection<ValidationResult> invalidResults =
allResults.isEmpty() ? Collections.emptyList()
+ : allResults.stream().filter(result ->
!result.isValid()).toList();
+ final ValidationStatus status = invalidResults.isEmpty() ?
ValidationStatus.VALID : ValidationStatus.INVALID;
+ final ValidationState validationState = new ValidationState(status,
invalidResults);
return validationState;
}
@@ -892,7 +894,7 @@ public abstract class AbstractComponentNode implements
ComponentNode {
}
protected Collection<ValidationResult> computeValidationErrors(final
ValidationContext validationContext) {
- Throwable failureCause = null;
+ Throwable failureCause;
try {
if (!sensitiveDynamicPropertyNames.get().isEmpty() &&
!isSupportsSensitiveDynamicProperties()) {
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/components/connector/StandardConnectorNode.java
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/components/connector/StandardConnectorNode.java
index 2bb5793432..afb6e37bd9 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/components/connector/StandardConnectorNode.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/components/connector/StandardConnectorNode.java
@@ -809,7 +809,6 @@ public class StandardConnectorNode implements ConnectorNode
{
final ValidationState state = performValidation();
if (state.getStatus() == ValidationStatus.INVALID) {
final List<String> validationFailureExplanations =
state.getValidationErrors().stream()
- .filter(result -> !result.isValid())
.map(ValidationResult::getExplanation)
.toList();
@@ -894,6 +893,7 @@ public class StandardConnectorNode implements ConnectorNode
{
if (currentState == ConnectorState.UPDATED || currentState ==
ConnectorState.UPDATE_FAILED) {
return
!hasActiveThread(getActiveFlowContext().getManagedProcessGroup());
}
+
return false;
}
@@ -905,8 +905,16 @@ public class StandardConnectorNode implements
ConnectorNode {
allowed = false;
reason = "Connector is not stopped";
} else {
- allowed = true;
- reason = null;
+ final Collection<ValidationResult> validationResults =
getValidationErrors();
+ if (validationResults.isEmpty()) {
+ allowed = true;
+ reason = null;
+ } else {
+ allowed = false;
+ reason = "Connector is not valid: " +
validationResults.stream()
+ .map(ValidationResult::getExplanation)
+ .collect(Collectors.joining("; "));
+ }
}
return new StandardConnectorAction("START", "Start the connector",
allowed, reason);
@@ -954,24 +962,14 @@ public class StandardConnectorNode implements
ConnectorNode {
}
private ConnectorAction createPurgeFlowFilesAction(final boolean stopped,
final boolean dataQueued) {
- final boolean allowed;
- final String reason;
-
- if (!stopped) {
- allowed = false;
- reason = "Connector must be stopped";
- } else if (!dataQueued) {
- allowed = false;
- reason = "No data is queued";
- } else {
- allowed = true;
- reason = null;
- }
-
- return new StandardConnectorAction("PURGE_FLOWFILES", "Purge all
FlowFiles from the connector, dropping all data without processing it",
allowed, reason);
+ return createDataQueuedAction(stopped, dataQueued, "PURGE_FLOWFILES",
"Purge all FlowFiles from the connector, dropping all data without processing
it");
}
private ConnectorAction createDrainFlowFilesAction(final boolean stopped,
final boolean dataQueued) {
+ return createDataQueuedAction(stopped, dataQueued, "DRAIN_FLOWFILES",
"Process data that is currently in the flow but do not ingest any additional
data");
+ }
+
+ private static ConnectorAction createDataQueuedAction(final boolean
stopped, final boolean dataQueued, final String actionName, final String
description) {
final boolean allowed;
final String reason;
@@ -986,7 +984,7 @@ public class StandardConnectorNode implements ConnectorNode
{
reason = null;
}
- return new StandardConnectorAction("DRAIN_FLOWFILES", "Process data
that is currently in the flow but do not ingest any additional data", allowed,
reason);
+ return new StandardConnectorAction(actionName, description, allowed,
reason);
}
private ConnectorAction createApplyUpdatesAction(final ConnectorState
currentState) {