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.event.SushiEventType;
import sushi.eventhandling.Broker;
/**
* This class is the provider for {@link SushiEventType}s.
* A filter can be specified to return only some event types.
* @author micha
*/
public class EventTypeProvider extends AbstractDataProvider implements ISortableDataProvider<SushiEventType, String>, IFilterStateLocator {
private static final long serialVersionUID = 1L;
private static List<SushiEventType> eventTypes;
private ISortState sortState = new SingleSortState();
private EventTypeFilter eventTypeFilter = new EventTypeFilter();
private List<SushiEventType> selectedEventTypes;
/**
* Constructor for providing {@link SushiEventType}s.
*/
public EventTypeProvider() {
eventTypes = filterEventTypes(SushiEventType.findAll(), eventTypeFilter);
selectedEventTypes = new ArrayList<SushiEventType>();
}
@Override
public void detach() {
// events = null;
}
@Override
public Iterator<? extends SushiEventType> iterator(long first, long count) {
List<SushiEventType> data = eventTypes;
Collections.sort(data, new Comparator<SushiEventType>() {
public int compare(SushiEventType e1, SushiEventType e2) {
return (new Integer(e1.getID()).compareTo(e2.getID()));
}
});
return data.subList((int)first, (int)Math.min(first + count, data.size())).iterator();
}
private List<SushiEventType> filterEventTypes(List<SushiEventType> eventTypesToFilter, EventTypeFilter eventTypeFilter) {
List<SushiEventType> returnedEventTypes = new ArrayList<SushiEventType>();
for(SushiEventType eventType: eventTypesToFilter){
if(eventTypeFilter.match(eventType)){
returnedEventTypes.add(eventType);
}
}
return returnedEventTypes;
}
@Override
public IModel<SushiEventType> model(SushiEventType eventType) {
return Model.of(eventType);
}
@Override
public long size() {
return eventTypes.size();
}
public static List<SushiEventType> getEventTypes() {
return eventTypes;
}
public static void setEventTypes(List<SushiEventType> eventTypeList) {
eventTypes = eventTypeList;
}
@Override
public ISortState<String> getSortState() {
return sortState;
}
@Override
public Object getFilterState() {
return eventTypeFilter;
}
@Override
public void setFilterState(Object state) {
this.eventTypeFilter = (EventTypeFilter) state;
}
public EventTypeFilter getEventTypeFilter() {
return eventTypeFilter;
}
public void setEventTypeFilter(EventTypeFilter eventTypeFilter) {
this.eventTypeFilter = eventTypeFilter;
eventTypes = filterEventTypes(SushiEventType.findAll(), eventTypeFilter);
}
@Override
public void selectEntry(int entryId) {
for (Iterator iter = eventTypes.iterator(); iter.hasNext();) {
SushiEventType eventType = (SushiEventType) iter.next();
if(eventType.getID() == entryId) {
selectedEventTypes.add(eventType);
return;
}
}
}
@Override
public void deselectEntry(int entryId) {
for (Iterator<SushiEventType> iter = eventTypes.iterator(); iter.hasNext();) {
SushiEventType eventType = (SushiEventType) iter.next();
if(eventType.getID() == entryId) {
selectedEventTypes.remove(eventType);
return;
}
}
}
@Override
public boolean isEntrySelected(int entryId) {
for(SushiEventType eventType : selectedEventTypes){
if(eventType.getID() == entryId) {
return true;
}
}
return false;
}
public void deleteSelectedEntries() {
for(SushiEventType eventType : selectedEventTypes){
eventTypes.remove(eventType);
Broker.remove(eventType);
}
}
public void selectAllEntries() {
for(SushiEventType eventType : eventTypes){
selectedEventTypes.add(eventType);
}
}
@Override
public Object getEntry(int entryId) {
for(SushiEventType eventType : eventTypes){
if(eventType.getID() == entryId){
return eventType;
}
}
return null;
}
}