/**
* Licensed to the Austrian Association for Software Tool Integration (AASTI)
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. The AASTI licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openengsb.ui.common.taskbox.web;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.IFilterStateLocator;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.model.IModel;
import org.openengsb.core.workflow.api.TaskboxService;
import org.openengsb.core.workflow.api.model.Task;
import org.ops4j.pax.wicket.api.InjectorHolder;
@SuppressWarnings({ "serial" })
public class TaskDataProvider extends SortableDataProvider<Task, String> implements IFilterStateLocator<Task> {
@Inject
@Named("taskboxService")
private TaskboxService taskboxService;
private TaskFilter filter = TaskFilter.createTaskFilter();
private List<Task> list;
public TaskDataProvider() {
InjectorHolder.getInjector().inject(this, TaskDataProvider.class);
this.setSort("taskId", SortOrder.ASCENDING);
}
public TaskboxService gett() {
return taskboxService;
}
@Override
public Iterator<? extends Task> iterator(long first, long count) {
initList();
List<Task> ret = list;
if (ret.size() > first + count) {
ret = ret.subList((int) first, (int) (first + count));
} else {
ret = ret.subList((int) first, ret.size());
}
return ret.iterator();
}
private void initList() {
if (list == null) {
list = getSortedandFilteredList();
}
}
private List<Task> getSortedandFilteredList() {
List<Task> result = taskboxService.getOpenTasks();
if (result != null) {
filterTasks(result);
Collections.sort(result, new TaskComparator(getSort()));
} else {
result = new ArrayList<Task>();
}
return result;
}
private void filterTasks(List<Task> result) {
if (filter != null) {
List<Task> tmp = new ArrayList<Task>();
for (Iterator<Task> iterator = result.iterator(); iterator.hasNext();) {
Task task = iterator.next();
if (!filter.match(task)) {
tmp.add(task);
}
}
result.removeAll(tmp);
}
}
@Override
public long size() {
initList();
return list.size();
}
@Override
public void detach() {
super.detach();
list = null;
}
@Override
public IModel<Task> model(Task object) {
return new LoadableTaskModel(object.getTaskId(), taskboxService);
}
public void setTaskboxService(TaskboxService taskboxService) {
this.taskboxService = taskboxService;
}
@Override
public Task getFilterState() {
return filter;
}
@Override
public void setFilterState(Task state) {
filter = (TaskFilter) state;
}
}