Newer
Older
AlgebraicDataflowArchitectureModel / AlgebraicDataflowArchitectureModel / src / models / dataFlowModel / DataFlowGraph.java
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;
	}
}