package fr.openwide.core.basicapp.web.application.administration.model;
import org.apache.wicket.injection.Injector;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import com.google.common.collect.ImmutableMap;
import fr.openwide.core.basicapp.core.business.user.model.User;
import fr.openwide.core.basicapp.core.business.user.model.UserGroup;
import fr.openwide.core.basicapp.core.business.user.search.IGenericUserSearchQuery;
import fr.openwide.core.basicapp.core.business.user.search.UserSort;
import fr.openwide.core.jpa.more.business.search.query.ISearchQuery;
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.model.AbstractSearchQueryDataProvider;
import fr.openwide.core.wicket.more.model.GenericEntityModel;
public abstract class AbstractUserDataProvider<U extends User> extends AbstractSearchQueryDataProvider<U, UserSort> {
private static final long serialVersionUID = -8540890431031886412L;
private final Class<U> clazz;
private final IModel<String> nameModel = Model.of();
private final IModel<UserGroup> groupModel = new GenericEntityModel<Long, UserGroup>();
private final IModel<Boolean> includeInactivesModel = Model.of(Boolean.FALSE);
private final CompositeSortModel<UserSort> sortModel = new CompositeSortModel<UserSort>(
CompositingStrategy.LAST_ONLY,
ImmutableMap.of(
UserSort.FULL_NAME, UserSort.FULL_NAME.getDefaultOrder(),
UserSort.ID, UserSort.ID.getDefaultOrder()
),
ImmutableMap.of(
UserSort.ID, UserSort.ID.getDefaultOrder()
)
);
public AbstractUserDataProvider(Class<U> clazz) {
super();
Injector.get().inject(this);
this.clazz = clazz;
}
@Override
public IModel<U> model(U item) {
return new GenericEntityModel<Long, U>(item);
}
public Class<U> getClazz() {
return clazz;
}
public IModel<String> getNameModel() {
return nameModel;
}
public IModel<UserGroup> getGroupModel() {
return groupModel;
}
public IModel<Boolean> getIncludeInactivesModel() {
return includeInactivesModel;
}
public CompositeSortModel<UserSort> getSortModel() {
return sortModel;
}
protected abstract IGenericUserSearchQuery<U> createSearchQuery();
@Override
protected ISearchQuery<U, UserSort> getSearchQuery() {
return createSearchQuery()
.name(nameModel.getObject())
.group(groupModel.getObject())
.includeInactive(includeInactivesModel.getObject())
.sort(sortModel.getObject());
}
@Override
public void detach() {
super.detach();
nameModel.detach();
groupModel.detach();
sortModel.detach();
includeInactivesModel.detach();
}
}