package sushi.monitoring.bpmn;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import sushi.process.SushiProcess;
import sushi.process.SushiProcessInstance;
import sushi.query.SushiPatternQuery;
/**
* @author micha
*/
public class ProcessMonitor implements Serializable{
private static final long serialVersionUID = 1L;
private SushiProcess process;
private Set<SushiPatternQuery> queries;
private Set<ProcessInstanceMonitor> processInstanceMonitors;
private int ID;
private int numberOfProcessInstances;
private float averageRuntimeMillis;
public ProcessMonitor(SushiProcess process){
this.process = process;
this.queries = new HashSet<SushiPatternQuery>();
this.processInstanceMonitors = new HashSet<ProcessInstanceMonitor>();
this.ID = BPMNQueryMonitor.getInstance().getProcessMonitors().size();
}
public Set<SushiPatternQuery> getQueries() {
return queries;
}
public void addQuery(SushiPatternQuery query){
this.queries.add(query);
for(ProcessInstanceMonitor processInstanceMonitor : processInstanceMonitors){
processInstanceMonitor.addQuery(query);
}
}
public SushiProcess getProcess() {
return process;
}
public void setProcess(SushiProcess process) {
this.process = process;
}
public void setQueryFinishedForProcessInstance(SushiPatternQuery query, SushiProcessInstance processInstance) {
ProcessInstanceMonitor processInstanceMonitor = getProcessInstanceMonitorForProcessInstance(processInstance);
processInstanceMonitor.setQueryFinished(query);
}
private ProcessInstanceMonitor getProcessInstanceMonitorForProcessInstance(SushiProcessInstance processInstance){
for(ProcessInstanceMonitor processInstanceMonitor : processInstanceMonitors){
// if(processInstanceMonitor.getProcessInstance().equals(processInstance)){
/*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(processInstanceMonitor.getProcessInstance() != null && processInstanceMonitor.getProcessInstance().getID() == processInstance.getID()){
return processInstanceMonitor;
}
}
ProcessInstanceMonitor processInstanceMonitor = new ProcessInstanceMonitor(processInstance);
processInstanceMonitor.addQueries(queries);
processInstanceMonitors.add(processInstanceMonitor);
numberOfProcessInstances = processInstanceMonitors.size();
return processInstanceMonitor;
}
public ProcessInstanceStatus getProcessInstanceStatus(SushiProcessInstance processInstance) {
ProcessInstanceMonitor processInstanceMonitor = getProcessInstanceMonitorForProcessInstance(processInstance);
return processInstanceMonitor.getStatus();
}
public Set<ProcessInstanceMonitor> getProcessInstanceMonitors() {
return processInstanceMonitors;
}
/**
* Returns all monitored process instances with the requested status.
* @param processInstanceStatus
* @return
*/
public Set<SushiProcessInstance> getProcessInstances(ProcessInstanceStatus processInstanceStatus){
Set<SushiProcessInstance> processInstances = new HashSet<SushiProcessInstance>();
for(ProcessInstanceMonitor monitor : processInstanceMonitors){
if(monitor.getStatus().equals(processInstanceStatus)){
processInstances.add(monitor.getProcessInstance());
}
}
return processInstances;
}
public int getID() {
return ID;
}
public int getNumberOfProcessInstances() {
return numberOfProcessInstances;
}
public float getAverageRuntimeMillis() {
float sum = 0;
for(ProcessInstanceMonitor processInstanceMonitor : processInstanceMonitors){
sum += processInstanceMonitor.getEndTime().getTime() - processInstanceMonitor.getStartTime().getTime();
}
averageRuntimeMillis = sum / processInstanceMonitors.size();
return averageRuntimeMillis;
}
public float getAverageRuntimeForQuery(SushiPatternQuery query){
if(processInstanceMonitors.isEmpty()){
return 0;
}
float sum = 0;
for(ProcessInstanceMonitor processInstanceMonitor : processInstanceMonitors){
sum += processInstanceMonitor.getRuntimeForQuery(query);
}
return sum / processInstanceMonitors.size();
}
public float getPathFrequencyForQuery(SushiPatternQuery query){
if(processInstanceMonitors.isEmpty()){
return 0;
}
float count = 0;
for(ProcessInstanceMonitor processInstanceMonitor : processInstanceMonitors){
if(processInstanceMonitor.getStatusForQuery(query).equals(QueryStatus.Finished)){
count++;
}
}
return count / processInstanceMonitors.size();
}
public ProcessInstanceMonitor getProcessInstanceMonitor(SushiProcessInstance processInstance) {
for(ProcessInstanceMonitor processInstanceMonitor : processInstanceMonitors){
if(processInstanceMonitor.getProcessInstance().equals(processInstance)){
return processInstanceMonitor;
}
}
return null;
}
}