package fr.openwide.core.wicket.more.model;
import java.util.List;
import javax.inject.Provider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
import fr.openwide.core.jpa.more.business.search.query.ISearchQuery;
import fr.openwide.core.jpa.more.business.sort.ISort;
import fr.openwide.core.wicket.more.application.CoreWicketApplication;
import fr.openwide.core.wicket.more.markup.repeater.data.LoadableDetachableDataProvider;
public abstract class AbstractSearchQueryDataProvider<T, S extends ISort<?>> extends LoadableDetachableDataProvider<T>
implements IErrorAwareDataProvider {
private static final long serialVersionUID = 8767962077258633492L;
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractSearchQueryDataProvider.class);
private boolean errorFlag = false;
protected AbstractSearchQueryDataProvider() {
}
/**
* {@code @SpringBean} ne fonctionne pas avec les {@link Provider}. Il est donc nécessaire de récupérer la {@link ISearchQuery}
* manuellement depuis le contexte à chaque fois qu'on en veut une nouvelle.
*/
protected final <Q extends ISearchQuery<T, S>> Q createSearchQuery(Class<Q> clazz) {
return CoreWicketApplication.get().getApplicationContext().getBean(clazz);
}
protected abstract ISearchQuery<T, S> getSearchQuery();
@Override
protected List<T> loadList(long offset, long limit) {
try {
return getSearchQuery().list(offset, limit);
} catch (Exception e) {
LOGGER.error("Erreur lors de la recherche : {}", e);
errorFlag |= true;
return Lists.newArrayList();
}
}
@Override
protected long loadSize() {
try {
return getSearchQuery().count();
} catch (Exception e) {
LOGGER.error("Erreur lors de la recherche : {}", e);
errorFlag |= true;
return 0;
}
}
@Override
public void detach() {
super.detach();
errorFlag = false;
}
@Override
public boolean hasError() {
return errorFlag;
}
}