package sushi.application.pages.monitoring.bpmn.analysis.modal.model;
import java.io.Serializable;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import sushi.bpmn.element.AbstractBPMNElement;
import sushi.bpmn.monitoringpoint.MonitoringPoint;
import sushi.bpmn.monitoringpoint.MonitoringPointStateTransition;
import sushi.monitoring.bpmn.ProcessMonitor;
import sushi.query.SushiPatternQuery;
/**
* Representation of a tree node of the process analysing treetable.
* Each element contains a {@link SushiPatternQuery} and associated informations for these query.
*
* @param <T> type of content to be stored
*/
public class ProcessAnalysingTreeTableElement implements Serializable {
private static final long serialVersionUID = 1L;
private int ID;
private SushiPatternQuery query;
private ProcessAnalysingTreeTableElement parent;
private Set<ProcessAnalysingTreeTableElement> children = new HashSet<ProcessAnalysingTreeTableElement>();
private List<MonitoringPoint> monitoringPoints = new ArrayList<MonitoringPoint>();
private Set<AbstractBPMNElement> monitoredElements;
private ProcessMonitor processMonitor;
private float averageRuntime;
private String pathFrequency;
/**
* creates a root node
* @param processMonitor
*
* @param content the content to be stored in the new node
*/
public ProcessAnalysingTreeTableElement(int ID, SushiPatternQuery query, ProcessMonitor processMonitor) {
this.ID = ID;
this.query = query;
this.processMonitor = processMonitor;
this.monitoredElements = new HashSet<AbstractBPMNElement>(query.getMonitoredElements());
this.averageRuntime = processMonitor.getAverageRuntimeForQuery(query);
this.pathFrequency = NumberFormat.getPercentInstance().format(processMonitor.getPathFrequencyForQuery(query));
}
/**
* creates a node and adds it to its parent
*
* @param parent
* @param content the content to be stored in the node
*/
public ProcessAnalysingTreeTableElement(ProcessAnalysingTreeTableElement parent, int ID, SushiPatternQuery query, ProcessMonitor processMonitor) {
this(ID, query, processMonitor);
this.parent = parent;
this.parent.getChildren().add(this);
}
public Integer getID() {
return ID;
}
public void setID(int ID) {
this.ID = ID;
}
public SushiPatternQuery getContent() {
return query;
}
public boolean hasParent() {
return parent != null;
}
public ProcessAnalysingTreeTableElement getParent() {
return parent;
}
public Set<ProcessAnalysingTreeTableElement> getChildren() {
return children;
}
@Override
public String toString() {
if (query == null) {
return new String();
}
return query.toString();
}
public void remove() {
if(this.parent != null){
this.parent.getChildren().remove(this);
}
//Müssen Kinder noch explizit entfernt werden?
}
public void setParent(ProcessAnalysingTreeTableElement parent) {
this.parent = parent;
if(parent != null){
this.parent.getChildren().add(this);
}
}
public boolean hasMonitoringPoints(){
return !monitoringPoints.isEmpty();
}
public void addMonitoringPoint(MonitoringPoint monitoringPoint){
if(getMonitoringPoint(monitoringPoint.getStateTransitionType()) != null){
monitoringPoints.remove(getMonitoringPoint(monitoringPoint.getStateTransitionType()));
}
monitoringPoints.add(monitoringPoint);
}
public void addMonitoringPoints(List<MonitoringPoint> monitoringPoints){
for(MonitoringPoint monitoringPoint : monitoringPoints){
addMonitoringPoint(monitoringPoint);
}
}
public MonitoringPoint getMonitoringPoint(MonitoringPointStateTransition type){
for(MonitoringPoint monitoringPoint : monitoringPoints){
if(monitoringPoint.getStateTransitionType().equals(type)){
return monitoringPoint;
}
}
return null;
}
public boolean hasMonitoringPoint(MonitoringPointStateTransition type){
return this.getMonitoringPoint(type) != null;
}
public Set<AbstractBPMNElement> getMonitoredElements() {
return monitoredElements;
}
public void setMonitoredElements(Set<AbstractBPMNElement> monitoredElements) {
this.monitoredElements = monitoredElements;
}
public SushiPatternQuery getQuery() {
return query;
}
public void setQuery(SushiPatternQuery query) {
this.query = query;
}
public ProcessMonitor getProcessMonitor() {
return processMonitor;
}
public float getAverageRuntime() {
return averageRuntime;
}
public String getPathFrequency() {
return pathFrequency;
}
}