package sushi.query.bpmn;
import java.util.HashSet;
import java.util.Set;
import sushi.bpmn.decomposition.Component;
import sushi.bpmn.decomposition.RPSTBuilder;
import sushi.bpmn.element.AbstractBPMNElement;
import sushi.event.collection.SushiTree;
import sushi.query.SushiPatternQuery;
/**
* This class is intended as a controller to generate queries for Esper from a BPMN process.
* @author micha
*/
public class PatternQueryGenerator {
private RPSTBuilder sushiRPSTTree;
private SushiTree<AbstractBPMNElement> processDecompositionTree;
private Set<SushiPatternQuery> queries = new HashSet<SushiPatternQuery>();
/**
* Constructor for the PatternQueryGenerator, which is intended as a controller to generate queries from a BPMN process.
* @param sushiRPSTTree
*/
public PatternQueryGenerator(RPSTBuilder sushiRPSTTree){
this.sushiRPSTTree = sushiRPSTTree;
this.processDecompositionTree = this.sushiRPSTTree.getProcessDecompositionTree();
}
/**
* This method generates queries for the given BPMN process.
*/
public void generateQueries(){
//StateTransitionQueries werden hier schon einmal erstellt, dass sie zum Beispiel
//für einen IntermediateTimer in der TimerQueryFactory, schon bekannt sind und
//berücksichtig werden können
for(AbstractBPMNElement treeElement : processDecompositionTree.getLeafElements()){
if(treeElement.hasMonitoringPointsWithEventType()){
SushiPatternQuery stateTransitionQuery = new StateTransitionQueryFactory(this).generateQuery(treeElement, null, null);
queries.add(stateTransitionQuery);
}
}
for(AbstractBPMNElement rootElement : processDecompositionTree.getRootElements()){
if(rootElement instanceof Component){
new PatternQueryFactory(this).generateQuery(rootElement, null, null);
} else {
throw new RuntimeException("Queries can only be generated from components!");
}
}
}
public RPSTBuilder getSushiRPSTTree() {
return sushiRPSTTree;
}
public void setSushiRPSTTree(RPSTBuilder sushiRPSTTree) {
this.sushiRPSTTree = sushiRPSTTree;
}
public SushiTree<AbstractBPMNElement> getProcessDecompositionTree() {
return processDecompositionTree;
}
public void setProcessDecompositionTree(
SushiTree<AbstractBPMNElement> processDecompositionTree) {
this.processDecompositionTree = processDecompositionTree;
}
public Set<SushiPatternQuery> getQueries() {
return queries;
}
public void setQueries(Set<SushiPatternQuery> queries) {
this.queries = queries;
}
public void addQuery(SushiPatternQuery query) {
this.queries.add(query);
}
public void removeQuery(SushiPatternQuery query) {
this.queries.remove(query);
}
/**
* This method searches for {@link SushiPatternQuery}s, which contain only the given element.
* @param element
* @return
*/
public SushiPatternQuery getQueryForElement(AbstractBPMNElement element) {
for(SushiPatternQuery query : queries){
if(query.getMonitoredElements().contains(element) && query.getMonitoredElements().size() == 1){
return query;
}
}
return null;
}
}