package sushi.application.pages.monitoring.bpmn.monitoring;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable;
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.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import sushi.application.pages.AbstractSushiPage;
import sushi.application.pages.monitoring.bpmn.monitoring.modal.ProcessInstanceMonitoringModal;
import sushi.application.pages.monitoring.bpmn.monitoring.model.ProcessInstanceMonitoringFilter;
import sushi.application.pages.monitoring.bpmn.monitoring.model.ProcessInstanceMonitoringProvider;
import sushi.monitoring.bpmn.ProcessInstanceMonitor;
import sushi.process.SushiProcess;
import sushi.process.SushiProcessInstance;
/**
* This panel facilitates the monitoring of running {@link SushiProcessInstance}s.
* The details for a single process instance are visualized with a {@link ProcessInstanceMonitoringStatusPanel}.
* @author micha
*/
@SuppressWarnings("serial")
public class BPMNMonitoringPanel extends Panel {
private AbstractSushiPage abstractSushiPage;
private ArrayList<String> processNameList;
private DropDownChoice<String> processSelect;
private DefaultDataTable<ProcessInstanceMonitor, String> dataTable;
private ProcessInstanceMonitoringProvider processInstanceMonitoringProvider;
private ProcessInstanceMonitoringFilter processInstanceMonitoringFilter;
private SushiProcess process;
private ProcessInstanceMonitoringModal processInstanceMonitorModal;
/**
* Constructor for a panel, which facilitates the monitoring of running {@link SushiProcessInstance}s.
* @param id
* @param abstractSushiPage
*/
public BPMNMonitoringPanel(String id, final AbstractSushiPage abstractSushiPage) {
super(id);
this.abstractSushiPage = abstractSushiPage;
createProcessInstanceMonitoringProvider();
buildMainLayout();
}
private void buildMainLayout() {
Form<Void> layoutForm = new Form<Void>("layoutForm");
add(layoutForm);
addProcessSelect(layoutForm);
addProcessInstanceMonitorModal(layoutForm);
addProcessInstanceTable(layoutForm);
}
private void addProcessInstanceTable(Form<Void> layoutForm) {
dataTable = new DefaultDataTable<ProcessInstanceMonitor, String>("processInstancesMonitoringTable", createColumns(), processInstanceMonitoringProvider, 20);
dataTable.setOutputMarkupId(true);
add(dataTable);
}
private void addProcessInstanceMonitorModal(Form<Void> layoutForm) {
processInstanceMonitorModal = new ProcessInstanceMonitoringModal("processInstanceMonitorModal");
add(processInstanceMonitorModal);
}
private List<? extends IColumn<ProcessInstanceMonitor, String>> createColumns() {
ArrayList<IColumn<ProcessInstanceMonitor, String>> columns = new ArrayList<IColumn<ProcessInstanceMonitor, String>>();
columns.add(new PropertyColumn<ProcessInstanceMonitor, String>(Model.of("ID"), "ID"));
columns.add(new PropertyColumn<ProcessInstanceMonitor, String>(Model.of("ProcessInstance"), "processInstance"));
// columns.add(new PropertyColumn<ProcessInstanceMonitor, String>(Model.of("Status"), "status"));
columns.add(new AbstractColumn(new Model("Status")) {
@Override
public void populateItem(Item cellItem, String componentId, IModel rowModel) {
int entryId = ((ProcessInstanceMonitor) rowModel.getObject()).getID();
cellItem.add(new ProcessInstanceMonitoringStatusPanel(componentId, entryId, processInstanceMonitoringProvider));
}
});
columns.add(new AbstractColumn(new Model("Status Details")) {
@Override
public void populateItem(Item cellItem, String componentId, IModel rowModel) {
int entryId = ((ProcessInstanceMonitor) rowModel.getObject()).getID();
cellItem.add(new ProcessInstanceMonitorEntryDetailsPanel(componentId, entryId, processInstanceMonitoringProvider, processInstanceMonitorModal));
}
});
return columns;
}
private void addProcessSelect(Form<Void> layoutForm) {
processNameList = new ArrayList<String>();
for (SushiProcess process : SushiProcess.findAll()) {
processNameList.add(process.getName());
}
processSelect = new DropDownChoice<String>("processSelect", new Model<String>(), processNameList);
processSelect.setOutputMarkupId(true);
processSelect.add(new AjaxFormComponentUpdatingBehavior("onchange") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
process = SushiProcess.findByName(processSelect.getChoices().get(Integer.parseInt(processSelect.getValue()))).get(0);
createProcessInstanceMonitoringProvider();
target.add(dataTable);
}
});
layoutForm.add(processSelect);
}
private void createProcessInstanceMonitoringProvider() {
processInstanceMonitoringProvider = new ProcessInstanceMonitoringProvider(process);
processInstanceMonitoringFilter = new ProcessInstanceMonitoringFilter();
processInstanceMonitoringProvider.setProcessInstanceMonitorFilter(processInstanceMonitoringFilter);
}
}