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