package sushi.application.pages.monitoring.bpmn.monitoring.model; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; 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.data.table.ISortableDataProvider; import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.IFilterStateLocator; import org.apache.wicket.extensions.markup.html.repeater.util.SingleSortState; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import sushi.application.components.table.model.AbstractDataProvider; import sushi.monitoring.bpmn.BPMNQueryMonitor; import sushi.monitoring.bpmn.ProcessInstanceMonitor; import sushi.process.SushiProcess; /** * This class is the provider for {@link ProcessInstanceMonitor}s. * @author micha * */ public class ProcessInstanceMonitoringProvider extends AbstractDataProvider implements ISortableDataProvider<ProcessInstanceMonitor, String>, IFilterStateLocator { private static final long serialVersionUID = 1L; private static List<ProcessInstanceMonitor> processInstanceMonitors; private static List<ProcessInstanceMonitor> selectedProcessInstanceMonitors; private ISortState sortState = new SingleSortState(); private ProcessInstanceMonitoringFilter processInstanceMonitorFilter = new ProcessInstanceMonitoringFilter(); private SushiProcess process; /** * Constructor for providing {@link ProcessInstanceMonitor}s. */ public ProcessInstanceMonitoringProvider(SushiProcess process) { this.process = process; processInstanceMonitors = filterProcessInstanceMonitors(BPMNQueryMonitor.getInstance().getProcessInstanceMonitors(process), processInstanceMonitorFilter); selectedProcessInstanceMonitors = new ArrayList<ProcessInstanceMonitor>(); } @Override public void detach() { // events = null; } @Override public Iterator<? extends ProcessInstanceMonitor> iterator(long first, long count) { List<ProcessInstanceMonitor> data = processInstanceMonitors; Collections.sort(data, new Comparator<ProcessInstanceMonitor>() { public int compare(ProcessInstanceMonitor e1, ProcessInstanceMonitor e2) { return (new Integer(e1.getID()).compareTo(e2.getID())); } }); return data.subList((int)first, (int)Math.min(first + count, data.size())).iterator(); } private List<ProcessInstanceMonitor> filterProcessInstanceMonitors(List<ProcessInstanceMonitor> processInstanceMonitorsToFilter, ProcessInstanceMonitoringFilter processInstanceMonitorFilter) { List<ProcessInstanceMonitor> returnedProcessInstanceMonitors = new ArrayList<ProcessInstanceMonitor>(); if(processInstanceMonitorsToFilter != null){ for(ProcessInstanceMonitor processInstanceMonitor: processInstanceMonitorsToFilter){ if(processInstanceMonitorFilter.match(processInstanceMonitor)){ returnedProcessInstanceMonitors.add(processInstanceMonitor); } } } return returnedProcessInstanceMonitors; } @Override public IModel<ProcessInstanceMonitor> model(ProcessInstanceMonitor processInstanceMonitor) { return Model.of(processInstanceMonitor); } @Override public long size() { return processInstanceMonitors.size(); } public List<ProcessInstanceMonitor> getProcessInstanceMonitors() { return processInstanceMonitors; } public List<ProcessInstanceMonitor> getSelectedProcessInstanceMonitors(){ return selectedProcessInstanceMonitors; } public static void setProcessInstanceMonitors(List<ProcessInstanceMonitor> eventList) { processInstanceMonitors = eventList; } @Override public ISortState<String> getSortState() { return sortState; } @Override public Object getFilterState() { return processInstanceMonitorFilter; } @Override public void setFilterState(Object state) { this.processInstanceMonitorFilter = (ProcessInstanceMonitoringFilter) state; } public ProcessInstanceMonitoringFilter getProcessInstanceMonitorFilter() { return processInstanceMonitorFilter; } public void setProcessInstanceMonitorFilter(ProcessInstanceMonitoringFilter processInstanceMonitorFilter) { this.processInstanceMonitorFilter = processInstanceMonitorFilter; processInstanceMonitors = filterProcessInstanceMonitors(BPMNQueryMonitor.getInstance().getProcessInstanceMonitors(process), processInstanceMonitorFilter); } @Override public void selectEntry(int entryId) { for (Iterator iter = processInstanceMonitors.iterator(); iter.hasNext();) { ProcessInstanceMonitor processInstanceMonitor = (ProcessInstanceMonitor) iter.next(); if(processInstanceMonitor.getID() == entryId) { selectedProcessInstanceMonitors.add(processInstanceMonitor); return; } } } @Override public void deselectEntry(int entryId) { for (Iterator<ProcessInstanceMonitor> iter = processInstanceMonitors.iterator(); iter.hasNext();) { ProcessInstanceMonitor processInstanceMonitor = (ProcessInstanceMonitor) iter.next(); if(processInstanceMonitor.getID() == entryId) { selectedProcessInstanceMonitors.remove(processInstanceMonitor); return; } } } @Override public boolean isEntrySelected(int entryId) { for (ProcessInstanceMonitor processInstanceMonitor : selectedProcessInstanceMonitors) { if(processInstanceMonitor.getID() == entryId) { return true; } } return false; } public void selectAllEntries() { for(ProcessInstanceMonitor processInstanceMonitor : processInstanceMonitors){ selectedProcessInstanceMonitors.add(processInstanceMonitor); } } public SushiProcess getProcess() { return process; } public void setProcess(SushiProcess process) { this.process = process; processInstanceMonitors = filterProcessInstanceMonitors(BPMNQueryMonitor.getInstance().getProcessInstanceMonitors(process), processInstanceMonitorFilter); selectedProcessInstanceMonitors = new ArrayList<ProcessInstanceMonitor>(); } @Override public Object getEntry(int entryId) { for (ProcessInstanceMonitor processInstanceMonitor : processInstanceMonitors) { if(processInstanceMonitor.getID() == entryId) { return processInstanceMonitor; } } return null; } }