package com.thinkbiganalytics.nifi.rest.model.flow; /*- * #%L * thinkbig-nifi-flow-visitor-model * %% * Copyright (C) 2017 ThinkBig Analytics * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.google.common.collect.Lists; import org.apache.nifi.web.api.dto.ConnectionDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; /** * the graph starting with the Set of startingProcessors, or lookup into the graph using hte processorMap and then traverse it back and forth by a specific processor. * * When walking the flow the system removes the internal Processgroups and connects the processors together. * * If Deserialized from JSON you will need to call the NifiFlowDeserializer to construct the full graph * * @see NifiFlowDeserializer */ @JsonIgnoreProperties(ignoreUnknown = true) public class NifiFlowProcessGroup { private static final Logger log = LoggerFactory.getLogger(NifiFlowProcessGroup.class); private String id; private String name; private String parentGroupId; private String parentGroupName; private String feedName; private Map<String, NifiFlowProcessor> processorMap; private Map<String, NifiFlowProcessor> endingProcessors; /** * Connection Identifier to Connection object */ private Map<String, NifiFlowConnection> connectionIdMap; private Set<NifiFlowProcessor> startingProcessors; public NifiFlowProcessGroup() { } public NifiFlowProcessGroup(String id, String name) { this.id = id; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public NifiFlowProcessor getProcessor(String processorId) { return getProcessorMap().get(processorId); } public Set<NifiFlowProcessor> getStartingProcessors() { if (startingProcessors == null) { startingProcessors = new HashSet<>(); } return startingProcessors; } public void setStartingProcessors(Set<NifiFlowProcessor> startingProcessors) { this.startingProcessors = startingProcessors; } public Map<String, NifiFlowProcessor> getEndingProcessors() { if (endingProcessors == null) { endingProcessors = new HashMap<>(); } return endingProcessors; } public void setEndingProcessors(Map<String, NifiFlowProcessor> endingProcessors) { this.endingProcessors = endingProcessors; } public void print() { for (NifiFlowProcessor processor : getStartingProcessors()) { processor.print(); } } public List<NifiFlowProcessor> getSortedStartingProcessors() { List<NifiFlowProcessor> startingProcessors = Lists.newArrayList(getStartingProcessors()); Collections.sort(startingProcessors, new NifiFlowProcessor.FlowIdComparator()); return startingProcessors; } public void assignFlowIds() { Integer flowId = 0; for (NifiFlowProcessor processor : getSortedStartingProcessors()) { flowId = processor.assignFlowIds(flowId); } } public Map<String, NifiFlowProcessor> getProcessorMap() { if (processorMap == null) { processorMap = new HashMap<>(); } return processorMap; } public void setProcessorMap(Map<String, NifiFlowProcessor> processorMap) { this.processorMap = processorMap; this.endingProcessors = processorMap.values().stream().filter(simpleNifiFlowProcessor -> simpleNifiFlowProcessor.isEnd()).collect(Collectors.toMap(processor -> processor.getId(), processor -> processor)); processorMap.values().forEach(processor -> processor.setProcessGroup(this)); } public String getParentGroupId() { return parentGroupId; } public void setParentGroupId(String parentGroupId) { this.parentGroupId = parentGroupId; } public String getParentGroupName() { return parentGroupName; } public void setParentGroupName(String parentGroupName) { this.parentGroupName = parentGroupName; } public String getFeedName() { return feedName; } public void setFeedName(String feedName) { this.feedName = feedName; } public Map<String, NifiFlowConnection> getConnectionIdMap() { if (connectionIdMap == null) { connectionIdMap = new HashMap<>(); } return connectionIdMap; } public void setConnectionIdMap(Map<String, NifiFlowConnection> connectionIdMap) { this.connectionIdMap = connectionIdMap; } public void addConnection(ConnectionDTO connectionDTO) { NifiFlowConnection nifiFlowConnection = NiFiFlowConnectionConverter.toNiFiFlowConnection(connectionDTO); if (nifiFlowConnection != null) { getConnectionIdMap().put(connectionDTO.getId(), nifiFlowConnection); } } public void addConnections(Collection<ConnectionDTO> connectionDTOs) { if (connectionDTOs != null) { connectionDTOs.stream().forEach(connectionDTO -> addConnection(connectionDTO)); } } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } NifiFlowProcessGroup group = (NifiFlowProcessGroup) o; return Objects.equals(id, group.id); } @Override public int hashCode() { return Objects.hash(id); } @Override public String toString() { final StringBuilder sb = new StringBuilder("NifiFlowProcessGroup{"); sb.append("id='").append(id).append('\''); sb.append(", name='").append(name).append('\''); sb.append(", parentGroupId='").append(parentGroupId).append('\''); sb.append(", parentGroupName='").append(parentGroupName).append('\''); sb.append(", feedName='").append(feedName).append('\''); sb.append('}'); return sb.toString(); } }