package com.thinkbiganalytics.metadata.rest.model.nifi;
/*-
* #%L
* thinkbig-metadata-rest-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.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.joda.time.DateTime;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
*/
public class NifiFlowCacheSnapshot {
public static NifiFlowCacheSnapshot EMPTY = new Builder()
.withProcessorIdToFeedNameMap(ImmutableMap.of())
.withProcessorIdToFeedProcessGroupId(ImmutableMap.of())
.withProcessorIdToProcessorName(ImmutableMap.of())
.withStreamingFeeds(ImmutableSet.<String>of())
.withFeeds(ImmutableSet.<String>of())
.build();
private DateTime snapshotDate;
//items to add
private Map<String, String> processorIdToFeedNameMap = new ConcurrentHashMap<>();
private Map<String, String> processorIdToFeedProcessGroupId = new ConcurrentHashMap<>();
private Map<String, String> processorIdToProcessorName = new ConcurrentHashMap<>();
private Map<String, String> connectionIdToConnectionName = new ConcurrentHashMap<>();
private Map<String, NiFiFlowCacheConnectionData> connectionIdToConnection = new ConcurrentHashMap<>();
private Set<String> allStreamingFeeds = new HashSet<>();
/**
* Set of the category.feed names
*/
private Set<String> allFeeds = new HashSet<>();
public NifiFlowCacheSnapshot() {
}
public NifiFlowCacheSnapshot(Map<String, String> processorIdToFeedNameMap,
Map<String, String> processorIdToFeedProcessGroupId, Map<String, String> processorIdToProcessorName, Set<String> allStreamingFeeds, Set<String> allFeeds) {
this.processorIdToFeedNameMap = processorIdToFeedNameMap;
this.processorIdToFeedProcessGroupId = processorIdToFeedProcessGroupId;
this.processorIdToProcessorName = processorIdToProcessorName;
this.allStreamingFeeds = allStreamingFeeds;
this.allFeeds = allFeeds;
}
public Map<String, String> getProcessorIdToFeedNameMap() {
if (processorIdToFeedNameMap == null) {
this.processorIdToFeedNameMap = new HashMap<>();
}
return processorIdToFeedNameMap;
}
public void setProcessorIdToFeedNameMap(Map<String, String> processorIdToFeedNameMap) {
this.processorIdToFeedNameMap = processorIdToFeedNameMap;
}
public Map<String, String> getProcessorIdToFeedProcessGroupId() {
if (processorIdToFeedProcessGroupId == null) {
this.processorIdToFeedProcessGroupId = new HashMap<>();
}
return processorIdToFeedProcessGroupId;
}
public void setProcessorIdToFeedProcessGroupId(Map<String, String> processorIdToFeedProcessGroupId) {
this.processorIdToFeedProcessGroupId = processorIdToFeedProcessGroupId;
}
public Map<String, String> getProcessorIdToProcessorName() {
if (processorIdToProcessorName == null) {
this.processorIdToProcessorName = new HashMap<>();
}
return processorIdToProcessorName;
}
public void setProcessorIdToProcessorName(Map<String, String> processorIdToProcessorName) {
this.processorIdToProcessorName = processorIdToProcessorName;
}
public Set<String> getAllStreamingFeeds() {
if (allStreamingFeeds == null) {
return new HashSet<>();
}
return allStreamingFeeds;
}
public void setAllStreamingFeeds(Set<String> allStreamingFeeds) {
this.allStreamingFeeds = allStreamingFeeds;
}
public DateTime getSnapshotDate() {
return snapshotDate;
}
public void setSnapshotDate(DateTime snapshotDate) {
this.snapshotDate = snapshotDate;
}
public Set<String> getAllFeeds() {
return allFeeds;
}
public void setAllFeeds(Set<String> allFeeds) {
this.allFeeds = allFeeds;
}
public Map<String, String> getConnectionIdToConnectionName() {
return connectionIdToConnectionName;
}
public void setConnectionIdToConnectionName(Map<String, String> connectionIdToConnectionName) {
this.connectionIdToConnectionName = connectionIdToConnectionName;
}
public Map<String, NiFiFlowCacheConnectionData> getConnectionIdToConnection() {
return connectionIdToConnection;
}
public void setConnectionIdToConnection(Map<String, NiFiFlowCacheConnectionData> connectionIdToConnection) {
this.connectionIdToConnection = connectionIdToConnection;
}
public void update(NifiFlowCacheSnapshot syncSnapshot) {
processorIdToFeedNameMap.putAll(syncSnapshot.getProcessorIdToFeedNameMap());
processorIdToFeedProcessGroupId.putAll(syncSnapshot.getProcessorIdToFeedProcessGroupId());
processorIdToProcessorName.putAll(syncSnapshot.getProcessorIdToProcessorName());
allStreamingFeeds = new HashSet<>(syncSnapshot.getAllStreamingFeeds());
allFeeds.addAll(syncSnapshot.getAllFeeds());
snapshotDate = syncSnapshot.getSnapshotDate();
connectionIdToConnection.putAll(syncSnapshot.getConnectionIdToConnection());
connectionIdToConnectionName.putAll(syncSnapshot.getConnectionIdToConnectionName());
}
public static class Builder {
//items to add
private Map<String, String> processorIdToFeedNameMap;
private Map<String, String> processorIdToFeedProcessGroupId;
private Map<String, String> processorIdToProcessorName;
private Set<String> streamingFeeds;
private Map<String, NiFiFlowCacheConnectionData> connectionIdToConnection;
/**
* Set of the category.feed names
*/
private Set<String> allFeeds = new HashSet<>();
private DateTime snapshotDate;
public Builder withConnections(Map<String, NiFiFlowCacheConnectionData> connections) {
this.connectionIdToConnection = connections;
return this;
}
public Builder withProcessorIdToFeedNameMap(Map<String, String> addProcessorIdToFeedNameMap) {
this.processorIdToFeedNameMap = addProcessorIdToFeedNameMap;
return this;
}
public Builder withProcessorIdToFeedProcessGroupId(Map<String, String> addProcessorIdToFeedProcessGroupId) {
this.processorIdToFeedProcessGroupId = addProcessorIdToFeedProcessGroupId;
return this;
}
public Builder withProcessorIdToProcessorName(Map<String, String> addProcessorIdToProcessorName) {
this.processorIdToProcessorName = addProcessorIdToProcessorName;
return this;
}
public Builder withStreamingFeeds(Set<String> addStreamingFeeds) {
this.streamingFeeds = addStreamingFeeds;
return this;
}
public Builder withFeeds(Set<String> feeds) {
this.allFeeds = feeds;
return this;
}
public Builder withSnapshotDate(DateTime snapshotDate) {
this.snapshotDate = snapshotDate;
return this;
}
public NifiFlowCacheSnapshot build() {
NifiFlowCacheSnapshot
snapshot =
new NifiFlowCacheSnapshot(processorIdToFeedNameMap, processorIdToFeedProcessGroupId, processorIdToProcessorName, streamingFeeds, allFeeds);
snapshot.setSnapshotDate(this.snapshotDate);
snapshot.setConnectionIdToConnection(connectionIdToConnection);
if (connectionIdToConnection != null) {
Map<String, String> connectionIdNameMap = connectionIdToConnection.values().stream().collect(Collectors.toMap(conn -> conn.getConnectionIdentifier(), conn -> conn.getName()));
snapshot.setConnectionIdToConnectionName(connectionIdNameMap);
}
return snapshot;
}
}
}