package fr.openwide.core.basicapp.web.application.history.model; import java.util.Date; import java.util.EnumSet; import java.util.Set; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import fr.openwide.core.basicapp.core.business.history.model.HistoryLog; import fr.openwide.core.basicapp.core.business.history.model.atomic.HistoryEventType; import fr.openwide.core.basicapp.core.business.history.search.IHistoryLogSearchQuery; import fr.openwide.core.basicapp.core.business.user.model.User; import fr.openwide.core.jpa.business.generic.model.GenericEntity; import fr.openwide.core.jpa.more.business.history.search.HistoryLogSort; 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; import fr.openwide.core.wicket.more.util.model.Detachables; public class HistoryLogDataProvider extends AbstractSearchQueryDataProvider<HistoryLog, HistoryLogSort> { private static final long serialVersionUID = 1604966591810765209L; private final IModel<? extends User> subjectModel; private final IModel<Date> dateMinModel = new Model<Date>(); private final IModel<Date> dateMaxModel = new Model<Date>(); private final IModel<? extends GenericEntity<?, ?>> objectModel; private final CompositeSortModel<HistoryLogSort> sortModel = new CompositeSortModel<>(CompositingStrategy.LAST_ONLY, HistoryLogSort.DATE); private Set<HistoryEventType> mandatoryDifferencesEventTypes = EnumSet.noneOf(HistoryEventType.class); public static HistoryLogDataProvider subject(IModel<? extends User> subjectModel) { return new HistoryLogDataProvider(subjectModel, new GenericEntityModel<>()); } public static HistoryLogDataProvider object(IModel<? extends GenericEntity<?, ?>> objectModel) { return new HistoryLogDataProvider(new GenericEntityModel<Long, User>(), objectModel); } public HistoryLogDataProvider(IModel<? extends User> subjectModel, IModel<? extends GenericEntity<?, ?>> objectModel) { this.subjectModel = subjectModel; this.objectModel = objectModel; } @Override public IModel<HistoryLog> model(HistoryLog object) { return GenericEntityModel.of(object); } @Override protected ISearchQuery<HistoryLog, HistoryLogSort> getSearchQuery() { return createSearchQuery(IHistoryLogSearchQuery.class) .subject(subjectModel.getObject()) .date(dateMinModel.getObject(), dateMaxModel.getObject()) .object(objectModel.getObject()) .differencesMandatoryFor(mandatoryDifferencesEventTypes) .sort(sortModel.getObject()); } @Override public void detach() { super.detach(); Detachables.detach(subjectModel, dateMinModel, dateMaxModel, objectModel, sortModel); } public IModel<Date> getDateMinModel() { return dateMinModel; } public IModel<Date> getDateMaxModel() { return dateMaxModel; } public CompositeSortModel<HistoryLogSort> getSortModel() { return sortModel; } public HistoryLogDataProvider addMandatoryDifferenceEventType(HistoryEventType eventType) { mandatoryDifferencesEventTypes.add(eventType); return this; } }