001package org.granite.tide.spring.data;
002
003import java.io.Serializable;
004
005import javax.persistence.EntityManager;
006
007import org.springframework.data.jpa.repository.JpaRepository;
008import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;
009import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean;
010import org.springframework.data.repository.core.RepositoryMetadata;
011import org.springframework.data.repository.core.support.RepositoryFactorySupport;
012
013public class FilterableJpaRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable> extends JpaRepositoryFactoryBean<R, T, I> {
014
015        @Override
016        protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
017                return new FilterableJpaRepositoryFactory<T, I>(entityManager);
018        }
019        
020        private static class FilterableJpaRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory {
021
022                private EntityManager entityManager;
023
024                public FilterableJpaRepositoryFactory(EntityManager entityManager) {
025                        super(entityManager);
026
027                        this.entityManager = entityManager;
028                }
029                
030                @SuppressWarnings("unchecked")
031                @Override
032                protected Object getTargetRepository(RepositoryMetadata metadata) {
033                        return new FilterableJpaRepositoryImpl<T, I>((Class<T>)metadata.getDomainType(), entityManager);
034                }
035
036                @Override
037                protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
038                        return FilterableJpaRepository.class;
039                }
040        }
041}