package models.dataFlowModel;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import models.DirectedGraph;
import models.dataConstraintModel.ResourcePath;
public class DataFlowGraph extends DirectedGraph {
protected Set<ResourceNode> rootResourceNodes = null;
protected Set<ChannelNode> rootChannelNodes = null;
protected Map<DataTransferChannel, ChannelNode> channelNodeMap = null;
protected Map<ResourcePath, ResourceNode> resourceNodeMap = null;
public DataFlowGraph() {
super();
rootResourceNodes = new HashSet<>();
rootChannelNodes = new HashSet<>();
channelNodeMap = new HashMap<>();
resourceNodeMap = new HashMap<>();
}
public ResourceNode addResourceNode(ResourceNode parent,
DataTransferChannel outSideChannel,
ResourcePath outSideResource) {
ResourceNode node = resourceNodeMap.get(outSideResource);
if (node != null) return node;
node = new ResourceNode(parent, outSideChannel, outSideResource);
addNode(node);
if (parent == null) {
rootResourceNodes.add(node);
} else {
parent.addChild(node);
}
resourceNodeMap.put(outSideResource, node);
return node;
}
public ResourceNode addResourceNode(ResourceNode parent,
Map<DataTransferChannel, ResourcePath> inSide,
Map.Entry<DataTransferChannel, ResourcePath> outSide) {
ResourceNode node = resourceNodeMap.get(outSide.getValue());
if (node != null) return node;
node = new ResourceNode(parent, inSide, outSide);
addNode(node);
if (parent == null) {
rootResourceNodes.add(node);
} else {
parent.addChild(node);
}
resourceNodeMap.put(outSide.getValue(), node);
return node;
}
public ChannelNode addChannelNode(ChannelNode parent, DataTransferChannel ch) {
ChannelNode node = channelNodeMap.get(ch);
if (node != null) return node;
node = new ChannelNode(parent, ch);
addNode(node);
if (parent == null) {
rootChannelNodes.add(node);
} else {
parent.addChild(node);
}
channelNodeMap.put(ch, node);
return node;
}
public ResourceNode getResourceNode(ResourcePath outSide) {
return resourceNodeMap.get(outSide);
}
public ChannelNode getChannelNode(DataTransferChannel channel) {
return channelNodeMap.get(channel);
}
public Collection<ResourceNode> getResourceNodes() {
return resourceNodeMap.values();
}
public Collection<ChannelNode> getChannelNodes() {
return channelNodeMap.values();
}
public Set<ResourceNode> getRootResourceNodes() {
return rootResourceNodes;
}
public Set<ChannelNode> getRootChannelNodes() {
return rootChannelNodes;
}
public DataFlowEdge addEdge(ResourceNode srcNode, ChannelNode dstNode) {
DataFlowEdge edge =new DataFlowEdge(srcNode, dstNode);
addEdge(edge);
return edge;
}
public DataFlowEdge addEdge(ChannelNode srcNode, ResourceNode dstNode) {
DataFlowEdge edge = new DataFlowEdge(srcNode, dstNode);
addEdge(edge);
return edge;
}
}