package fr.openwide.core.showcase.web.application.task.model;
import java.util.Date;
import java.util.List;
import org.apache.wicket.injection.Injector;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import fr.openwide.core.jpa.more.business.task.model.QueuedTaskHolder;
import fr.openwide.core.jpa.more.business.task.search.QueuedTaskHolderSort;
import fr.openwide.core.jpa.more.business.task.util.TaskResult;
import fr.openwide.core.jpa.more.business.task.util.TaskStatus;
import fr.openwide.core.showcase.core.business.task.model.ShowcaseTaskQueueId;
import fr.openwide.core.showcase.core.business.task.model.TaskTypeEnum;
import fr.openwide.core.showcase.core.business.task.model.search.TaskSearchQueryParameters;
import fr.openwide.core.showcase.core.business.task.service.IShowcaseTaskService;
import fr.openwide.core.wicket.more.markup.html.sort.model.CompositeSortModel;
import fr.openwide.core.wicket.more.markup.html.sort.model.CompositeSortModel.CompositingStrategy;
import fr.openwide.core.wicket.more.markup.repeater.data.LoadableDetachableDataProvider;
import fr.openwide.core.wicket.more.model.GenericEntityModel;
public class TaskDataProvider extends LoadableDetachableDataProvider<QueuedTaskHolder> {
private static final long serialVersionUID = -5506738601502647625L;
@SpringBean
private IShowcaseTaskService showcaseTaskService;
private static final Logger LOGGER = LoggerFactory.getLogger(TaskDataProvider.class);
private final IModel<ShowcaseTaskQueueId> queueIdModel = new Model<ShowcaseTaskQueueId>();
private final IModel<TaskTypeEnum> typeModel = new Model<TaskTypeEnum>();
private final IModel<String> nameModel = new Model<String>();
private final IModel<TaskStatus> statusModel = new Model<TaskStatus>();
private final IModel<TaskResult> resultModel = new Model<TaskResult>();
private final IModel<Date> dateMinModel = new Model<Date>();
private final IModel<Date> dateMaxModel = new Model<Date>();
private final CompositeSortModel<QueuedTaskHolderSort> sortModel = new CompositeSortModel<>(
CompositingStrategy.LAST_ONLY,
ImmutableMap.of(QueuedTaskHolderSort.CREATION_DATE, QueuedTaskHolderSort.CREATION_DATE.getDefaultOrder()),
ImmutableMap.of(
QueuedTaskHolderSort.CREATION_DATE, QueuedTaskHolderSort.CREATION_DATE.getDefaultOrder(),
QueuedTaskHolderSort.NAME, QueuedTaskHolderSort.NAME.getDefaultOrder(),
QueuedTaskHolderSort.ID, QueuedTaskHolderSort.ID.getDefaultOrder()
)
);
public TaskDataProvider() {
super();
Injector.get().inject(this);
}
@Override
public void detach() {
super.detach();
typeModel.detach();
nameModel.detach();
statusModel.detach();
resultModel.detach();
dateMinModel.detach();
dateMaxModel.detach();
}
@Override
public IModel<QueuedTaskHolder> model(QueuedTaskHolder object) {
return new GenericEntityModel<Long, QueuedTaskHolder>(object);
}
public TaskSearchQueryParameters getSearchParameters() {
return new TaskSearchQueryParameters(
queueIdModel.getObject(), typeModel.getObject(), nameModel.getObject(),
statusModel.getObject(), resultModel.getObject(),
dateMinModel.getObject(), dateMaxModel.getObject(),
sortModel.getObject());
}
@Override
protected List<QueuedTaskHolder> loadList(long first, long count) {
try {
return showcaseTaskService.search(getSearchParameters(), count, first);
} catch (Exception e) {
LOGGER.error("Error while searching tasks.", e);
return Lists.newArrayList();
}
}
@Override
protected long loadSize() {
try {
return showcaseTaskService.count(getSearchParameters());
} catch (Exception e) {
LOGGER.error("Error while counting tasks.", e);
return 0;
}
}
public IModel<ShowcaseTaskQueueId> getQueueIdModel() {
return queueIdModel;
}
public IModel<TaskTypeEnum> getTypeModel() {
return typeModel;
}
public IModel<String> getNameModel() {
return nameModel;
}
public IModel<TaskStatus> getStatusModel() {
return statusModel;
}
public IModel<TaskResult> getResultModel() {
return resultModel;
}
public IModel<Date> getDateMinModel() {
return dateMinModel;
}
public IModel<Date> getDateMaxModel() {
return dateMaxModel;
}
public CompositeSortModel<QueuedTaskHolderSort> getSortModel() {
return sortModel;
}
}