package sushi.application.pages.querying.bpmn; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import sushi.application.pages.querying.bpmn.model.BPMNTreeTableElement; import sushi.bpmn.element.AbstractBPMNElement; import sushi.bpmn.element.BPMNProcess; import sushi.bpmn.monitoringpoint.MonitoringPoint; import sushi.bpmn.monitoringpoint.MonitoringPointStateTransition; import sushi.event.SushiEventType; /** * A form with a dropdown to assign monitoring points to BPMN elements on the base of {@link SushiEventType}s. * @author micha */ public class MonitoringPointField implements Serializable{ private static final long serialVersionUID = 1L; private AjaxButton deleteButton; private Component addButton; private List<String> eventTypeNamesList; private BPMNTreeTableElement treeTableElement; private AbstractBPMNElement bpmnElement; private String enableEventTypeName; private String beginEventTypeName; private String terminateEventTypeName; private String skipEventTypeName; /** * Constructor for a form with a dropdown to assign monitoring points to BPMN elements on the base of {@link SushiEventType}s. * @param treeTableElement */ public MonitoringPointField(BPMNTreeTableElement treeTableElement){ this.treeTableElement = treeTableElement; this.bpmnElement = treeTableElement.getContent(); eventTypeNamesList = new ArrayList<String>(); for (SushiEventType eventType : SushiEventType.findAll()) { eventTypeNamesList.add(eventType.getTypeName()); } } public void addMonitoringField(Form<Void> monitoringForm, final MonitoringPointStateTransition monitoringPointType) { final MonitoringPoint monitoringPoint = treeTableElement.getMonitoringPoint(monitoringPointType); SushiEventType monitoringPointEventType = null; if(monitoringPoint != null){ monitoringPointEventType = monitoringPoint.getEventType(); updateEventTypeNames(monitoringPointType, monitoringPointEventType); } //Div-Container für Label und Select final WebMarkupContainer selectContainer = new WebMarkupContainer(monitoringPointType.getName() + "SelectContainer"); selectContainer.setOutputMarkupPlaceholderTag(true); monitoringForm.add(selectContainer); //EnableButton addButton = new AjaxButton(monitoringPointType.getName() + "Button", monitoringForm) { private static final long serialVersionUID = 1L; @Override public void onSubmit(AjaxRequestTarget target, Form form) { //MonitoringPoint hinzufügen selectContainer.setVisible(true); deleteButton.setVisible(true); addButton.setVisible(false); target.add(selectContainer); target.add(deleteButton); target.add(addButton); } }; addButton.setOutputMarkupPlaceholderTag(true); monitoringForm.add(addButton); //Select final DropDownChoice<String> eventTypeSelect; if(monitoringPointEventType != null){ eventTypeSelect = new DropDownChoice<String>(monitoringPointType.getName() + "Select", new PropertyModel<String>(this, monitoringPointType.getName() + "EventTypeName"), eventTypeNamesList); } else { eventTypeSelect = new DropDownChoice<String>(monitoringPointType.getName() + "Select", new Model<String>(), eventTypeNamesList); } eventTypeSelect.add(new AjaxFormComponentUpdatingBehavior("onchange"){ private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { final String eventTypeName = eventTypeSelect.getChoices().get(Integer.parseInt(eventTypeSelect.getValue())); if(eventTypeName != null && !eventTypeName.isEmpty()){ SushiEventType selectedEventType = SushiEventType.findByTypeName(eventTypeName); if(selectedEventType != null){ //Da wegen dem ComponentBuilder nicht auf dem originalen BPMN-Process aus der Datenbank gearbeitet wird, //muss der noch geholt werden BPMNProcess originalProcess = BPMNProcess.findByContainedElement(bpmnElement); AbstractBPMNElement originalBPMNElement = originalProcess.getBPMNElementById(bpmnElement.getId()); if(originalBPMNElement != null){ MonitoringPoint originalMonitoringPoint = originalBPMNElement.getMonitoringPointByStateTransitionType(monitoringPointType); if(originalMonitoringPoint == null){ originalMonitoringPoint = new MonitoringPoint(selectedEventType, monitoringPointType, null); originalMonitoringPoint.save(); } originalBPMNElement.addMonitoringPoint(originalMonitoringPoint); originalBPMNElement.merge(); updateEventTypeNames(monitoringPointType, selectedEventType); } } } } }); eventTypeSelect.setOutputMarkupPlaceholderTag(true); selectContainer.add(eventTypeSelect); //Delete-Button deleteButton = new AjaxButton(monitoringPointType.getName() + "DeleteButton", monitoringForm) { private static final long serialVersionUID = 1L; @Override public void onSubmit(AjaxRequestTarget target, Form form) { //MonitoringPoint entfernen //Da wegen dem ComponentBuilder nicht auf dem originalen BPMN-Process aus der Datenbank gearbeitet wird, //muss der noch geholt werden BPMNProcess originalProcess = BPMNProcess.findByContainedElement(bpmnElement); AbstractBPMNElement originalBPMNElement = originalProcess.getBPMNElementById(bpmnElement.getId()); if(originalBPMNElement != null){ MonitoringPoint originalMonitoringPoint = originalBPMNElement.getMonitoringPointByStateTransitionType(monitoringPointType); originalBPMNElement.removeMonitoringPoint(originalMonitoringPoint); originalBPMNElement.save(); updateEventTypeNames(monitoringPointType, null); } selectContainer.setVisible(false); addButton.setVisible(true); deleteButton.setVisible(false); target.add(selectContainer); target.add(addButton); target.add(deleteButton); } }; deleteButton.setOutputMarkupPlaceholderTag(true); monitoringForm.add(deleteButton); if(monitoringPoint != null){ addButton.setVisible(false); } else { selectContainer.setVisible(false); deleteButton.setVisible(false); } } private void updateEventTypeNames(final MonitoringPointStateTransition monitoringPointType, SushiEventType monitoringPointEventType) { String eventTypeName = (monitoringPointEventType != null) ? monitoringPointEventType.getTypeName() : null; switch(monitoringPointType){ case begin: beginEventTypeName = eventTypeName; break; case enable: enableEventTypeName = eventTypeName; break; case skip: skipEventTypeName = eventTypeName; break; case terminate: terminateEventTypeName = eventTypeName; break; default: break; } } }