package sushi.application.pages.monitoring.bpmn.analysis.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.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.ProcessMonitor; /** * This class is the provider for {@link ProcessMonitor}s. * A filter can be specified to return only some ProcessMonitors. * @author micha */ public class ProcessMonitoringProvider extends AbstractDataProvider implements ISortableDataProvider<ProcessMonitor, String>, IFilterStateLocator { private static final long serialVersionUID = 1L; private static List<ProcessMonitor> processMonitors; private static List<ProcessMonitor> selectedProcessMonitors; private ISortState sortState = new SingleSortState(); private ProcessMonitoringFilter processMonitorFilter = new ProcessMonitoringFilter(); /** * Constructor for providing {@link ProcessMonitor}s. */ public ProcessMonitoringProvider() { processMonitors = BPMNQueryMonitor.getInstance().getProcessMonitors(); selectedProcessMonitors = new ArrayList<ProcessMonitor>(); } @Override public void detach() { // processMonitors = null; } @Override public Iterator<? extends ProcessMonitor> iterator(long first, long count) { return processMonitors.subList((int)first, (int)Math.min(first + count, processMonitors.size())).iterator(); } private List<ProcessMonitor> filterProcessMonitors(List<ProcessMonitor> processMonitorsToFilter, ProcessMonitoringFilter processMonitorFilter) { List<ProcessMonitor> returnedProcessMonitors = new ArrayList<ProcessMonitor>(); for(ProcessMonitor processMonitor: processMonitorsToFilter){ if(processMonitorFilter.match(processMonitor)){ returnedProcessMonitors.add(processMonitor); } } return returnedProcessMonitors; } @Override public IModel<ProcessMonitor> model(ProcessMonitor processMonitor) { return Model.of(processMonitor); } @Override public long size() { return processMonitors.size(); } public List<ProcessMonitor> getProcessMonitors() { return processMonitors; } public List<ProcessMonitor> getSelectedProcessMonitors(){ return selectedProcessMonitors; } public static void setProcessMonitors(List<ProcessMonitor> processMonitorList) { processMonitors = processMonitorList; } @Override public ISortState<String> getSortState() { return sortState; } @Override public Object getFilterState() { return processMonitorFilter; } @Override public void setFilterState(Object state) { this.processMonitorFilter = (ProcessMonitoringFilter) state; } public ProcessMonitoringFilter getProcessMonitorFilter() { return processMonitorFilter; } public void setProcessMonitorFilter(ProcessMonitoringFilter processMonitorFilter) { this.processMonitorFilter = processMonitorFilter; processMonitors = filterProcessMonitors(processMonitors, processMonitorFilter); } @Override public void selectEntry(int entryId) { for (Iterator iter = processMonitors.iterator(); iter.hasNext();) { ProcessMonitor processMonitor = (ProcessMonitor) iter.next(); if(processMonitor.getID() == entryId) { selectedProcessMonitors.add(processMonitor); return; } } } @Override public void deselectEntry(int entryId) { for (Iterator<ProcessMonitor> iter = processMonitors.iterator(); iter.hasNext();) { ProcessMonitor processMonitor = (ProcessMonitor) iter.next(); if(processMonitor.getID() == entryId) { selectedProcessMonitors.remove(processMonitor); return; } } } @Override public boolean isEntrySelected(int entryId) { for (ProcessMonitor processMonitor : selectedProcessMonitors) { if(processMonitor.getID() == entryId) { return true; } } return false; } public void deleteSelectedEntries() { for(ProcessMonitor processMonitor : selectedProcessMonitors){ processMonitors.remove(processMonitor); } } public void selectAllEntries() { for(ProcessMonitor processMonitor : processMonitors){ selectedProcessMonitors.add(processMonitor); } } @Override public Object getEntry(int entryId) { for(ProcessMonitor processMonitor : processMonitors){ if(processMonitor.getID() == entryId){ return processMonitor; } } return null; } }