/*******************************************************************************
* Copyright (c) 2015 Development Gateway, Inc and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the MIT License (MIT)
* which accompanies this distribution, and is available at
* https://opensource.org/licenses/MIT
*
* Contributors:
* Development Gateway - initial API and implementation
*******************************************************************************/
package org.devgateway.toolkit.forms.wicket.providers;
import java.util.Iterator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.IFilterStateLocator;
import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.model.IModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.devgateway.toolkit.forms.WebConstants;
import org.devgateway.toolkit.forms.models.PersistableJpaRepositoryModel;
import org.devgateway.toolkit.forms.wicket.components.table.JpaFilterState;
import org.devgateway.toolkit.persistence.dao.GenericPersistable;
import org.devgateway.toolkit.persistence.repository.BaseJpaRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
/**
* @author mpostelnicu
*
* Smart generic {@link SortableDataProvider} that binds to
* {@link BaseJpaRepository}
*/
public class SortableJpaRepositoryDataProvider<T extends GenericPersistable> extends SortableDataProvider<T, String>
implements IFilterStateLocator<JpaFilterState<T>> {
private static final long serialVersionUID = 6507887810859971417L;
protected BaseJpaRepository<T, Long> jpaRepository;
private JpaFilterState<T> filterState;
/**
* Always provide a proxy jpaRepository here! For example one coming from a
* {@link SpringBean}
*
* @param jpaRepository
*/
public SortableJpaRepositoryDataProvider(final BaseJpaRepository<T, Long> jpaRepository) {
this.jpaRepository = jpaRepository;
}
/**
* Translates from a {@link SortParam} to a Spring {@link Sort}
*
* @return
*/
protected Sort translateSort() {
if (getSort() == null) {
return null;
}
return new Sort(getSort().isAscending() ? Direction.ASC : Direction.DESC, getSort().getProperty());
}
/**
* @see SortableDataProvider#iterator(long, long)
*/
@Override
public Iterator<? extends T> iterator(final long first, final long count) {
int page = (int) ((double) first / WebConstants.PAGE_SIZE);
Page<T> findAll = jpaRepository.findAll(filterState.getSpecification(),
new PageRequest(page, WebConstants.PAGE_SIZE, translateSort()));
return findAll.iterator();
}
@Override
public long size() {
return jpaRepository.count(filterState.getSpecification());
}
/**
* This ensures that the object is detached and reloaded after
* deserialization of the page, since the
* {@link PersistableJpaRepositoryModel} is also loadabledetachable
*/
@Override
public IModel<T> model(final T object) {
return new PersistableJpaRepositoryModel<T>(object, jpaRepository);
}
@Override
public JpaFilterState<T> getFilterState() {
return filterState;
}
@Override
public void setFilterState(final JpaFilterState<T> filterState) {
this.filterState = filterState;
}
}