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.SushiProcess; /** * This class is the provider for {@link SushiProcess}es. * A filter can be specified to return only some processes. * @author micha */ @SuppressWarnings("serial") public class ProcessProvider extends AbstractDataProvider implements ISortableDataProvider<SushiProcess, String>, IFilterStateLocator { private static List<SushiProcess> processes; private ISortState sortState = new SingleSortState(); private ProcessFilter processFilter = new ProcessFilter(); private List<SushiProcess> selectedProcesses; /** * Constructor for providing {@link SushiProcess}es. */ public ProcessProvider() { processes = filterProcesses(SushiProcess.findAll(), processFilter); selectedProcesses = new ArrayList<SushiProcess>(); } @Override public void detach() { // Processs = null; } @Override public Iterator<? extends SushiProcess> iterator(long first, long count) { List<SushiProcess> data = processes; Collections.sort(data, new Comparator<SushiProcess>() { public int compare(SushiProcess e1, SushiProcess e2) { return (new Integer(e1.getID()).compareTo(e2.getID())); } }); return data.subList((int)first, (int)Math.min(first + count, data.size())).iterator(); } private List<SushiProcess> filterProcesses(List<SushiProcess> processesToFilter, ProcessFilter processFilter) { List<SushiProcess> returnedProcesses = new ArrayList<SushiProcess>(); for(SushiProcess process: processesToFilter){ if(processFilter.match(process)){ returnedProcesses.add(process); } } return returnedProcesses; } @Override public IModel<SushiProcess> model(SushiProcess Process) { return Model.of(Process); } @Override public long size() { return processes.size(); } public static List<SushiProcess> getProcesses() { return processes; } public static void setProcesses(List<SushiProcess> processList) { processes = processList; } @Override public ISortState<String> getSortState() { return sortState; } @Override public Object getFilterState() { return processFilter; } @Override public void setFilterState(Object state) { this.processFilter = (ProcessFilter) state; } public ProcessFilter getProcessFilter() { return processFilter; } public void setProcessFilter(ProcessFilter processFilter) { this.processFilter = processFilter; processes = filterProcesses(SushiProcess.findAll(), processFilter); } @Override public void selectEntry(int entryId) { for (Iterator iter = processes.iterator(); iter.hasNext();) { SushiProcess process = (SushiProcess) iter.next(); if(process.getID() == entryId) { selectedProcesses.add(process); return; } } } @Override public void deselectEntry(int entryId) { for (Iterator<SushiProcess> iter = processes.iterator(); iter.hasNext();) { SushiProcess process = (SushiProcess) iter.next(); if(process.getID() == entryId) { selectedProcesses.remove(process); return; } } } @Override public boolean isEntrySelected(int entryId) { for(SushiProcess process : selectedProcesses){ if(process.getID() == entryId) { return true; } } return false; } public void deleteSelectedEntries() { for(SushiProcess process : selectedProcesses){ processes.remove(process); process.remove(); } } public void selectAllEntries() { for(SushiProcess process : processes){ selectedProcesses.add(process); } } @Override public Object getEntry(int entryId) { for(SushiProcess process : processes){ if(process.getID() == entryId){ return process; } } return null; } }