package esl.cuenet.query.pattern.graph;
import esl.cuenet.query.pattern.exceptions.PatternGraphException;
import java.util.Stack;
public class PatternGraphConstructor {
private Stack<PatternGraph> graphStack = new Stack<PatternGraph>();
public PatternGraphConstructor() {
PatternGraph patternGraph = new PatternGraph();
graphStack.add(patternGraph);
}
public PatternGraph getGraph() {
if (graphStack.size() != 1) throw new PatternGraphException("Parsing Not Completed -- Expecting SubEvent Stop");
return graphStack.peek();
}
public void startSubEventPattern(String superEventLabel) {
if (graphStack.size() < 1) throw new PatternGraphException("GraphStack Underflow");
PatternGraph patternGraph = graphStack.peek();
PatternGraphNode node = new PatternGraphNode(superEventLabel);
PatternGraph subEventPatternGraph = node.createSubEventPatternGraph();
patternGraph.add(node);
graphStack.add(subEventPatternGraph);
}
public void startInterleaved() {
PatternGraph patternGraph = graphStack.peek();
PatternGraphNode node = new PatternGraphNode(PatternGraphNode.PatternGraphNodeType.INTERLEAVE_START);
patternGraph.add(node);
PatternGraph firstInterleaveGraphPath = node.createInterleavedGraph();
graphStack.add(firstInterleaveGraphPath);
}
public void switchInterleavePath() {
graphStack.pop();
PatternGraph entryGraph = graphStack.peek();
PatternGraphNode interleaveStartNode = entryGraph.getLast();
if (interleaveStartNode.type() != PatternGraphNode.PatternGraphNodeType.INTERLEAVE_START)
throw new PatternGraphException();
PatternGraph firstInterleaveGraphPath = interleaveStartNode.createInterleavedGraph();
graphStack.add(firstInterleaveGraphPath);
}
public void endInterleaved() {
graphStack.pop();
PatternGraph entryGraph = graphStack.peek();
entryGraph.add(new PatternGraphNode(PatternGraphNode.PatternGraphNodeType.INTERLEAVE_END));
}
public void startUnion() {
PatternGraph patternGraph = graphStack.peek();
PatternGraphNode node = new PatternGraphNode(PatternGraphNode.PatternGraphNodeType.UNION_START);
patternGraph.add(node);
PatternGraph firstUnionGraphPath = node.createUnionGraph();
graphStack.add(firstUnionGraphPath);
}
public void switchUnionPath() {
graphStack.pop();
PatternGraph entryGraph = graphStack.peek();
PatternGraphNode unionStartNode = entryGraph.getLast();
if (unionStartNode.type() != PatternGraphNode.PatternGraphNodeType.UNION_START)
throw new PatternGraphException();
PatternGraph firstUnionGraphPath = unionStartNode.createUnionGraph();
graphStack.add(firstUnionGraphPath);
}
public void endUnion() {
graphStack.pop();
PatternGraph entryGraph = graphStack.peek();
entryGraph.add(new PatternGraphNode(PatternGraphNode.PatternGraphNodeType.UNION_END));
}
public void add(String eventLabel) {
PatternGraphNode node = new PatternGraphNode(eventLabel);
PatternGraph patternGraph = graphStack.peek();
patternGraph.add(node);
}
public void endSubEventPattern() {
if (graphStack.size() == 0) throw new PatternGraphException("Incorrect subevent pattern termination");
graphStack.pop();
}
public void stop() {
if (graphStack.size() != 1) throw new PatternGraphException("Incorrect pattern termination");
System.out.println("Completed");
}
}