From a091b4be37b51dc53b35d5f817bdbfc149562592 Mon Sep 17 00:00:00 2001
From: Mark Payne
Date: Wed, 30 Nov 2016 11:07:32 -0500
Subject: [PATCH] NIFI-3129: When adding controller services to a snippet,
ensure that we don't add the service multiple times, even when it's
referenced by child process groups
---
.../nifi/util/ComponentIdGenerator.java | 8 +++++++-
.../apache/nifi/web/util/SnippetUtils.java | 19 +++++++++++++------
2 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/ComponentIdGenerator.java b/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/ComponentIdGenerator.java
index 49f00b8d5103..51cf0c0b6ea3 100644
--- a/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/ComponentIdGenerator.java
+++ b/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/util/ComponentIdGenerator.java
@@ -19,6 +19,9 @@
import java.security.SecureRandom;
import java.util.UUID;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
/**
* IMPORTANT: This component is not part of public API!
* ====================================================
@@ -48,6 +51,7 @@
*
*/
public class ComponentIdGenerator {
+ private static final Logger logger = LoggerFactory.getLogger(ComponentIdGenerator.class);
public static final Object lock = new Object();
@@ -97,6 +101,8 @@ public final static UUID generateId(long msb, long lsb, boolean ensureUnique) {
long clockSequenceHi = clockSequence;
clockSequenceHi <<= 48;
lsb = clockSequenceHi | lsb;
- return new UUID(time, lsb);
+ final UUID uuid = new UUID(time, lsb);
+ logger.debug("Generating UUID {} for msb={}, lsb={}, ensureUnique={}", uuid, msb, lsb, ensureUnique);
+ return uuid;
}
}
\ No newline at end of file
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/SnippetUtils.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/SnippetUtils.java
index 4f8afde189ba..c5baa8c9dc08 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/SnippetUtils.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/SnippetUtils.java
@@ -110,6 +110,7 @@ public FlowSnippetDTO populateFlowSnippet(final Snippet snippet, final boolean r
}
final Set controllerServices = new HashSet<>();
+ final Set allServicesReferenced = new HashSet<>();
// add any processors
final Set processors = new LinkedHashSet<>();
@@ -122,7 +123,10 @@ public FlowSnippetDTO populateFlowSnippet(final Snippet snippet, final boolean r
processors.add(dtoFactory.createProcessorDto(processor));
if (includeControllerServices) {
- controllerServices.addAll(getControllerServices(processor.getProperties()));
+ // Include all referenced services that are not already included in this snippet.
+ getControllerServices(processor.getProperties()).stream()
+ .filter(svc -> allServicesReferenced.add(svc))
+ .forEach(svc -> controllerServices.add(svc));
}
}
}
@@ -199,7 +203,7 @@ public FlowSnippetDTO populateFlowSnippet(final Snippet snippet, final boolean r
final ProcessGroupDTO childGroupDto = dtoFactory.createProcessGroupDto(childGroup, recurse);
processGroups.add(childGroupDto);
- addControllerServices(childGroup, childGroupDto);
+ addControllerServices(childGroup, childGroupDto, allServicesReferenced);
}
}
@@ -241,7 +245,7 @@ public FlowSnippetDTO populateFlowSnippet(final Snippet snippet, final boolean r
return snippetDto;
}
- private void addControllerServices(final ProcessGroup group, final ProcessGroupDTO dto) {
+ private void addControllerServices(final ProcessGroup group, final ProcessGroupDTO dto, final Set allServicesReferenced) {
final FlowSnippetDTO contents = dto.getContents();
if (contents == null) {
return;
@@ -250,8 +254,10 @@ private void addControllerServices(final ProcessGroup group, final ProcessGroupD
final Set controllerServices = new HashSet<>();
for (final ProcessorNode procNode : group.getProcessors()) {
- final Set servicesForProcessor = getControllerServices(procNode.getProperties());
- controllerServices.addAll(servicesForProcessor);
+ // Include all referenced services that are not already included in this snippet.
+ getControllerServices(procNode.getProperties()).stream()
+ .filter(svc -> allServicesReferenced.add(svc))
+ .forEach(svc -> controllerServices.add(svc));
}
contents.setControllerServices(controllerServices);
@@ -266,7 +272,7 @@ private void addControllerServices(final ProcessGroup group, final ProcessGroupD
continue;
}
- addControllerServices(childGroup, childDto);
+ addControllerServices(childGroup, childDto, allServicesReferenced);
}
}
@@ -826,6 +832,7 @@ private String generateId(final String currentId, final String seed, boolean isC
uuid = new UUID(msb, seedId.getLeastSignificantBits());
}
}
+ logger.debug("Generating UUID {} from currentId={}, seed={}, isCopy={}", uuid, currentId, seed, isCopy);
return uuid.toString();
}