package sushi.application.pages.querying.bpmn.model;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.ISortState;
import org.apache.wicket.extensions.markup.html.repeater.tree.ISortableTreeProvider;
import org.apache.wicket.extensions.markup.html.repeater.util.SingleSortState;
import sushi.application.components.table.model.AbstractDataProvider;
import sushi.bpmn.decomposition.Component;
import sushi.bpmn.decomposition.RPSTBuilder;
import sushi.bpmn.element.AbstractBPMNElement;
import sushi.bpmn.element.BPMNProcess;
import sushi.event.collection.SushiTree;
/**
* Wraps the tree of BPMN components and their event types from the monitoring points for a tree table visualization.
* @author micha
*
* @param
*/
public class BPMNTreeTableProvider extends AbstractDataProvider implements ISortableTreeProvider<BPMNTreeTableElement, String> {
private static final long serialVersionUID = 1L;
private List<BPMNTreeTableElement> treeTableElements;
private List<BPMNTreeTableElement> treeTableRootElements;
private List<BPMNTreeTableElement> selectedTreeTableElements = new ArrayList<BPMNTreeTableElement>();
private BPMNProcess process;
private SushiTree<AbstractBPMNElement> bpmnComponentTree;
public BPMNTreeTableProvider(BPMNProcess process) {
this.treeTableElements = new ArrayList<BPMNTreeTableElement>();
this.process = process;
if(process != null){
bpmnComponentTree = new RPSTBuilder(process).getProcessDecompositionTree();
createTreeTableElements(bpmnComponentTree);
}
}
@Override
public void detach() {
}
@Override
public Iterator<? extends BPMNTreeTableElement> getRoots() {
return getRootElements().iterator();
}
private List<BPMNTreeTableElement> getRootElements(){
treeTableRootElements = new ArrayList<BPMNTreeTableElement>();
for(BPMNTreeTableElement element : treeTableElements){
if(element.getParent() == null){
treeTableRootElements.add(element);
}
}
return treeTableRootElements;
}
@Override
public boolean hasChildren(BPMNTreeTableElement node) {
return !node.getChildren().isEmpty();
}
@Override
public Iterator<? extends BPMNTreeTableElement> getChildren(BPMNTreeTableElement node) {
return node.getChildren().iterator();
}
@Override
public BPMNTreeTableElementModel model(BPMNTreeTableElement node) {
return new BPMNTreeTableElementModel(getRootElements(), node);
}
@Override
public ISortState<String> getSortState() {
return new SingleSortState<String>();
}
@Override
public void selectEntry(int entryId) {
for (BPMNTreeTableElement treeTableElement : treeTableElements) {
if(treeTableElement.getID() == entryId) {
selectedTreeTableElements.add(treeTableElement);
return;
}
}
}
@Override
public void deselectEntry(int entryId) {
for (BPMNTreeTableElement treeTableElement : treeTableElements) {
if(treeTableElement.getID() == entryId) {
selectedTreeTableElements.remove(treeTableElement);
return;
}
}
}
@Override
public boolean isEntrySelected(int entryId) {
for (BPMNTreeTableElement treeTableElement : selectedTreeTableElements) {
if(treeTableElement.getID() == entryId) {
return true;
}
}
return false;
}
/**
* Returns the next free ID for an new element.
* @return
*/
public int getNextID(){
int highestNumber = 0;
for(BPMNTreeTableElement element : treeTableElements ){
highestNumber = element.getID() > highestNumber ? element.getID() : highestNumber;
}
return ++highestNumber;
}
public List<BPMNTreeTableElement> getTreeTableElements() {
return treeTableElements;
}
public void addTreeTableElement(BPMNTreeTableElement treeTableElement) {
this.treeTableElements.add(treeTableElement);
if(!selectedTreeTableElements.isEmpty()){
BPMNTreeTableElement parent = selectedTreeTableElements.get(0);
parent.getChildren().add(treeTableElement);
treeTableElement.setParent(parent);
}
}
public void addTreeTableElementWithParent(BPMNTreeTableElement treeTableElement, BPMNTreeTableElement parent) {
this.treeTableElements.add(treeTableElement);
parent.getChildren().add(treeTableElement);
treeTableElement.setParent(parent);
}
public void setTreeTableElements(List<BPMNTreeTableElement> treeTableElements) {
this.treeTableElements = treeTableElements;
}
public void deleteSelectedEntries() {
for(BPMNTreeTableElement element : selectedTreeTableElements){
element.remove();
}
treeTableElements.removeAll(selectedTreeTableElements);
selectedTreeTableElements.clear();
}
public List<BPMNTreeTableElement> getSelectedTreeTableElements() {
return selectedTreeTableElements;
}
public List<BPMNTreeTableElement> getRootTreeTableElements() {
return getRootElements();
}
private void createTreeTableElements(SushiTree<AbstractBPMNElement> bpmnComponentTree) {
for(AbstractBPMNElement rootElement : bpmnComponentTree.getRootElements()){
addElementToTree(null, rootElement, bpmnComponentTree);
}
}
private void addElementToTree(BPMNTreeTableElement parent, AbstractBPMNElement bpmnElement, SushiTree<AbstractBPMNElement> bpmnComponentTree){
BPMNTreeTableElement treeTableElement = createTreeTableElement(bpmnElement);
treeTableElement.setParent(parent);
treeTableElements.add(treeTableElement);
if(parent == null){
treeTableRootElements.add(treeTableElement);
}
if(bpmnComponentTree.hasChildren(bpmnElement)){
for(AbstractBPMNElement child : bpmnComponentTree.getChildren(bpmnElement)){
addElementToTree(treeTableElement, child, bpmnComponentTree);
}
}
}
private BPMNTreeTableElement createTreeTableElement(AbstractBPMNElement bpmnElement) {
BPMNTreeTableElement element = new BPMNTreeTableElement(getNextID(), bpmnElement);
if(bpmnElement.hasMonitoringPoints() && !(bpmnElement instanceof Component)){
//TODO: Was ist bei mehreren Monitoring-Points?
element.addMonitoringPoints(bpmnElement.getMonitoringPoints());
}
return element;
}
public void deleteAllEntries() {
for(BPMNTreeTableElement element : treeTableElements){
element.remove();
}
selectedTreeTableElements.clear();
treeTableElements.clear();
}
public BPMNProcess getProcess() {
return process;
}
public void setProcess(BPMNProcess process) {
this.process = process;
if(process != null){
bpmnComponentTree = new RPSTBuilder(process).getProcessDecompositionTree();
createTreeTableElements(bpmnComponentTree);
}
}
@Override
public Object getEntry(int entryId) {
for(BPMNTreeTableElement treeTableElement : treeTableElements){
if(treeTableElement.getID() == entryId){
return treeTableElement;
}
}
return null;
}
}