mirror of https://github.com/apache/nifi.git
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. This closes #1284
This commit is contained in:
parent
ba513447d7
commit
fff0148a0e
|
@ -19,6 +19,9 @@ package org.apache.nifi.util;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IMPORTANT: This component is not part of public API!
|
* IMPORTANT: This component is not part of public API!
|
||||||
* ====================================================
|
* ====================================================
|
||||||
|
@ -48,6 +51,7 @@ import java.util.UUID;
|
||||||
* </p>
|
* </p>
|
||||||
*/
|
*/
|
||||||
public class ComponentIdGenerator {
|
public class ComponentIdGenerator {
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(ComponentIdGenerator.class);
|
||||||
|
|
||||||
public static final Object lock = new Object();
|
public static final Object lock = new Object();
|
||||||
|
|
||||||
|
@ -97,6 +101,8 @@ public class ComponentIdGenerator {
|
||||||
long clockSequenceHi = clockSequence;
|
long clockSequenceHi = clockSequence;
|
||||||
clockSequenceHi <<= 48;
|
clockSequenceHi <<= 48;
|
||||||
lsb = clockSequenceHi | lsb;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -110,6 +110,7 @@ public final class SnippetUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
final Set<ControllerServiceDTO> controllerServices = new HashSet<>();
|
final Set<ControllerServiceDTO> controllerServices = new HashSet<>();
|
||||||
|
final Set<ControllerServiceDTO> allServicesReferenced = new HashSet<>();
|
||||||
|
|
||||||
// add any processors
|
// add any processors
|
||||||
final Set<ProcessorDTO> processors = new LinkedHashSet<>();
|
final Set<ProcessorDTO> processors = new LinkedHashSet<>();
|
||||||
|
@ -122,7 +123,10 @@ public final class SnippetUtils {
|
||||||
processors.add(dtoFactory.createProcessorDto(processor));
|
processors.add(dtoFactory.createProcessorDto(processor));
|
||||||
|
|
||||||
if (includeControllerServices) {
|
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 final class SnippetUtils {
|
||||||
final ProcessGroupDTO childGroupDto = dtoFactory.createProcessGroupDto(childGroup, recurse);
|
final ProcessGroupDTO childGroupDto = dtoFactory.createProcessGroupDto(childGroup, recurse);
|
||||||
processGroups.add(childGroupDto);
|
processGroups.add(childGroupDto);
|
||||||
|
|
||||||
addControllerServices(childGroup, childGroupDto);
|
addControllerServices(childGroup, childGroupDto, allServicesReferenced);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,7 +245,7 @@ public final class SnippetUtils {
|
||||||
return snippetDto;
|
return snippetDto;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addControllerServices(final ProcessGroup group, final ProcessGroupDTO dto) {
|
private void addControllerServices(final ProcessGroup group, final ProcessGroupDTO dto, final Set<ControllerServiceDTO> allServicesReferenced) {
|
||||||
final FlowSnippetDTO contents = dto.getContents();
|
final FlowSnippetDTO contents = dto.getContents();
|
||||||
if (contents == null) {
|
if (contents == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -250,8 +254,10 @@ public final class SnippetUtils {
|
||||||
final Set<ControllerServiceDTO> controllerServices = new HashSet<>();
|
final Set<ControllerServiceDTO> controllerServices = new HashSet<>();
|
||||||
|
|
||||||
for (final ProcessorNode procNode : group.getProcessors()) {
|
for (final ProcessorNode procNode : group.getProcessors()) {
|
||||||
final Set<ControllerServiceDTO> servicesForProcessor = getControllerServices(procNode.getProperties());
|
// Include all referenced services that are not already included in this snippet.
|
||||||
controllerServices.addAll(servicesForProcessor);
|
getControllerServices(procNode.getProperties()).stream()
|
||||||
|
.filter(svc -> allServicesReferenced.add(svc))
|
||||||
|
.forEach(svc -> controllerServices.add(svc));
|
||||||
}
|
}
|
||||||
|
|
||||||
contents.setControllerServices(controllerServices);
|
contents.setControllerServices(controllerServices);
|
||||||
|
@ -266,7 +272,7 @@ public final class SnippetUtils {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
addControllerServices(childGroup, childDto);
|
addControllerServices(childGroup, childDto, allServicesReferenced);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -826,6 +832,7 @@ public final class SnippetUtils {
|
||||||
uuid = new UUID(msb, seedId.getLeastSignificantBits());
|
uuid = new UUID(msb, seedId.getLeastSignificantBits());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
logger.debug("Generating UUID {} from currentId={}, seed={}, isCopy={}", uuid, currentId, seed, isCopy);
|
||||||
return uuid.toString();
|
return uuid.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue