package sushi.application.pages.monitoring.bpmn.monitoring.modal; import java.util.ArrayList; import java.util.List; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.HeadersToolbar; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.extensions.markup.html.repeater.tree.table.TreeColumn; import org.apache.wicket.markup.head.CssHeaderItem; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.resource.PackageResourceReference; import org.apache.wicket.request.resource.ResourceReference; import sushi.application.components.form.BootstrapModal; import sushi.application.components.tree.SushiLabelTreeTable; import sushi.application.pages.monitoring.bpmn.monitoring.QueryMonitoringStatusPanel; import sushi.application.pages.monitoring.bpmn.monitoring.QueryViolationMonitoringStatusPanel; import sushi.application.pages.monitoring.bpmn.monitoring.model.ProcessInstanceMonitoringTreeTableElement; import sushi.application.pages.monitoring.bpmn.monitoring.model.ProcessInstanceMonitoringTreeTableExpansionModel; import sushi.application.pages.monitoring.bpmn.monitoring.model.ProcessInstanceMonitoringTreeTableProvider; import sushi.monitoring.bpmn.ProcessInstanceMonitor; import sushi.process.SushiProcess; /** * This is a modal for displaying the monitoring status for a {@link SushiProcess}. * @author micha */ public class ProcessInstanceMonitoringModal extends BootstrapModal { private static final long serialVersionUID = 1L; private static final ResourceReference MODAL_SIZE_CSS = new PackageResourceReference(BootstrapModal.class, "modal_size.css"); private ProcessInstanceMonitor processInstanceMonitor; private Form<Void> layoutForm; private SushiLabelTreeTable<ProcessInstanceMonitoringTreeTableElement, String> treeTable; private ProcessInstanceMonitoringTreeTableProvider treeTableProvider = new ProcessInstanceMonitoringTreeTableProvider(processInstanceMonitor); @Override public void renderHead(IHeaderResponse response) { super.renderHead(response); response.render(CssHeaderItem.forReference(MODAL_SIZE_CSS)); } /** * Constructor for a modal, which displays the monitoring status for a {@link SushiProcess}. * @param id */ public ProcessInstanceMonitoringModal(String id) { super(id, "Process Instance Monitoring"); buildMainLayout(); } private void buildMainLayout() { layoutForm = new Form<Void>("layoutForm"); //Add componentTree createTreeTable(); add(layoutForm); } private void createTreeTable() { List<IColumn<ProcessInstanceMonitoringTreeTableElement, String>> columns = createColumns(); treeTable = new SushiLabelTreeTable<ProcessInstanceMonitoringTreeTableElement, String>( "processInstanceMonitoringTreeTable", columns, treeTableProvider, Integer.MAX_VALUE, new ProcessInstanceMonitoringTreeTableExpansionModel()); treeTable.setOutputMarkupId(true); treeTable.getTable().addTopToolbar(new HeadersToolbar<String>(treeTable.getTable(), treeTableProvider)); ProcessInstanceMonitoringTreeTableExpansionModel.get().expandAll(); layoutForm.addOrReplace(treeTable); } private List<IColumn<ProcessInstanceMonitoringTreeTableElement, String>> createColumns() { List<IColumn<ProcessInstanceMonitoringTreeTableElement, String>> columns = new ArrayList<IColumn<ProcessInstanceMonitoringTreeTableElement, String>>(); columns.add(new TreeColumn<ProcessInstanceMonitoringTreeTableElement, String>(Model.of("Query"), "query")); columns.add(new PropertyColumn<ProcessInstanceMonitoringTreeTableElement, String>(Model.of("Monitored Elements"), "monitoredElements")); columns.add(new AbstractColumn(new Model("Status")) { @Override public void populateItem(Item cellItem, String componentId, IModel rowModel) { int entryId = ((ProcessInstanceMonitoringTreeTableElement) rowModel.getObject()).getID(); cellItem.add(new QueryMonitoringStatusPanel(componentId, entryId, treeTableProvider)); } }); columns.add(new AbstractColumn(new Model("Violation Status")) { @Override public void populateItem(Item cellItem, String componentId, IModel rowModel) { int entryId = ((ProcessInstanceMonitoringTreeTableElement) rowModel.getObject()).getID(); cellItem.add(new QueryViolationMonitoringStatusPanel(componentId, entryId, treeTableProvider)); } }); columns.add(new PropertyColumn<ProcessInstanceMonitoringTreeTableElement, String>(Model.of("Start Time"), "startTime")); columns.add(new PropertyColumn<ProcessInstanceMonitoringTreeTableElement, String>(Model.of("End Time"), "endTime")); return columns; } public void setProcessInstanceMonitor(ProcessInstanceMonitor processInstanceMonitor, AjaxRequestTarget target) { this.processInstanceMonitor = processInstanceMonitor; this.treeTableProvider.setProcessInstanceMonitor(processInstanceMonitor); refreshTreeTable(target); } public void refreshTreeTable(AjaxRequestTarget target){ createTreeTable(); target.add(treeTable); } }