package sushi.monitoring.bpmn;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import sushi.event.collection.SushiTree;
import sushi.process.SushiProcess;
import sushi.process.SushiProcessInstance;
import sushi.query.SushiPatternQuery;
/**
* The central instance to get information for monitoring and analysing of the status of BPMN queries.
* @author micha
*/
public class BPMNQueryMonitor {
/*Eingehende Informationen:
* - ProcessInstances nach Korrelation
* - Queries für Process aus BPMN-Modell
* - Query-Matches von Esper-Listener
* */
private static BPMNQueryMonitor instance;
private Set<ProcessMonitor> processMonitors;
public BPMNQueryMonitor(){
processMonitors = new HashSet<ProcessMonitor>();
}
public static BPMNQueryMonitor getInstance() {
//lazy initialize
if (instance == null) {
instance = new BPMNQueryMonitor();
}
return instance;
}
public ProcessInstanceStatus getStatus(SushiProcessInstance processInstance){
if(processInstance != null){
ProcessMonitor processMonitor = getProcessMonitorForProcess(processInstance.getProcess());
return processMonitor.getProcessInstanceStatus(processInstance);
}
return null;
}
public SushiTree<DetailedQueryStatus> getDetailedStatus(SushiProcessInstance processInstance){
if(getProcessInstanceMonitor(processInstance) != null){
return getProcessInstanceMonitor(processInstance).getDetailedStatus();
}
return null;
}
public void addQueryForProcess(SushiPatternQuery query, SushiProcess process) {
if(query != null && process != null){
ProcessMonitor processMonitor = getProcessMonitorForProcess(process);
processMonitor.addQuery(query);
}
}
public void setQueryFinishedForProcessInstance(SushiPatternQuery query, SushiProcessInstance processInstance){
if(query != null && processInstance != null){
ProcessMonitor processMonitor = getProcessMonitorForProcess(processInstance.getProcess());
processMonitor.setQueryFinishedForProcessInstance(query, processInstance);
}
}
public ProcessMonitor getProcessMonitorForProcess(SushiProcess process){
if(process != null){
for(ProcessMonitor processMonitor : processMonitors){
/*TODO: equals auf dem Process funktioniert nicht, da gleiche Prozesse mit verschiedenen IDs als Parameter kommen können:
* SushiProcess.equals überschreiben?
* Erstmal mit ID prüfen
*/
if(processMonitor.getProcess() != null && processMonitor.getProcess().getID() == process.getID()){
return processMonitor;
}
}
ProcessMonitor processMonitor = new ProcessMonitor(process);
processMonitors.add(processMonitor);
return processMonitor;
}
return null;
}
public List<ProcessInstanceMonitor> getProcessInstanceMonitors(SushiProcess process){
if(process != null){
ProcessMonitor processMonitor = getProcessMonitorForProcess(process);
return new ArrayList<>(processMonitor.getProcessInstanceMonitors());
} else {
return null;
}
}
public List<ProcessMonitor> getProcessMonitors() {
return new ArrayList<ProcessMonitor>(processMonitors);
}
public static void reset(){
instance = null;
}
private ProcessInstanceMonitor getProcessInstanceMonitor(SushiProcessInstance processInstance){
ProcessMonitor processMonitor = getProcessMonitorForProcess(processInstance.getProcess());
if(processMonitor.getProcessInstanceMonitor(processInstance) != null){
return processMonitor.getProcessInstanceMonitor(processInstance);
}
return null;
}
}