package sushi.application.pages.eventrepository.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.process.SushiProcessInstance; /** * This class is the provider for {@link SushiProcessInstance}s. * A filter can be specified to return only some process instances. * @author micha */ public class ProcessInstanceProvider extends AbstractDataProvider implements ISortableDataProvider<SushiProcessInstance, String>, IFilterStateLocator { private static final long serialVersionUID = 1L; private static List<SushiProcessInstance> processInstances; private ISortState sortState = new SingleSortState(); private ProcessInstanceFilter processInstanceFilter = new ProcessInstanceFilter(); private List<SushiProcessInstance> selectedProcessInstances; /** * Constructor for providing {@link SushiProcessInstance}s. */ public ProcessInstanceProvider(){ processInstances = filterProcessInstances(SushiProcessInstance.findAll(), processInstanceFilter); selectedProcessInstances = new ArrayList<SushiProcessInstance>(); } @Override public void detach() { } @Override public Iterator<? extends SushiProcessInstance> iterator(long first, long count) { List<SushiProcessInstance> data = new ArrayList<SushiProcessInstance>(processInstances); Collections.sort(data, new Comparator<SushiProcessInstance>() { public int compare(SushiProcessInstance e1, SushiProcessInstance e2) { return (new Integer(e1.getID()).compareTo(e2.getID())); } }); return data.subList((int)first, (int)Math.min(first + count, data.size())).iterator(); } @Override public IModel<SushiProcessInstance> model(SushiProcessInstance processInstance) { return Model.of(processInstance); } @Override public long size() { return processInstances.size(); } public static List<SushiProcessInstance> getProcessInstances() { return processInstances; } public static void setProcessInstances(List<SushiProcessInstance> processInstances) { ProcessInstanceProvider.processInstances = processInstances; } public ProcessInstanceFilter getProcessInstanceFilter() { return processInstanceFilter; } public void setProcessInstanceFilter(ProcessInstanceFilter processInstanceFilter) { this.processInstanceFilter = processInstanceFilter; processInstances = filterProcessInstances(SushiProcessInstance.findAll(), processInstanceFilter); } private List<SushiProcessInstance> filterProcessInstances(List<SushiProcessInstance> processInstancesToFilter, ProcessInstanceFilter processInstanceFilter) { List<SushiProcessInstance> returnedProcessInstances = new ArrayList<SushiProcessInstance>(); for(SushiProcessInstance processInstance: processInstancesToFilter){ if(processInstanceFilter.match(processInstance)){ returnedProcessInstances.add(processInstance); } } return returnedProcessInstances; } @Override public ISortState<String> getSortState() { return sortState; } @Override public Object getFilterState() { return processInstanceFilter; } @Override public void setFilterState(Object state) { this.processInstanceFilter = (ProcessInstanceFilter) state; } @Override public void selectEntry(int entryId) { for (Iterator iter = processInstances.iterator(); iter.hasNext();) { SushiProcessInstance processInstance = (SushiProcessInstance) iter.next(); if(processInstance.getID() == entryId) { selectedProcessInstances.add(processInstance); return; } } } @Override public void deselectEntry(int entryId) { for (Iterator<SushiProcessInstance> iter = processInstances.iterator(); iter.hasNext();) { SushiProcessInstance processInstance = (SushiProcessInstance) iter.next(); if(processInstance.getID() == entryId) { selectedProcessInstances.remove(processInstance); return; } } } @Override public boolean isEntrySelected(int entryId) { for(SushiProcessInstance processInstance : selectedProcessInstances){ if(processInstance.getID() == entryId) { return true; } } return false; } public void deleteSelectedEntries() { for(SushiProcessInstance processInstance : selectedProcessInstances){ processInstances.remove(processInstance); processInstance.remove(); } } public void selectAllEntries() { for(SushiProcessInstance processInstance : processInstances){ selectedProcessInstances.add(processInstance); } } @Override public Object getEntry(int entryId) { for(SushiProcessInstance processInstance : processInstances){ if(processInstance.getID() == entryId){ return processInstance; } } return null; } }