001    package org.granite.tide.spring.data;
002    
003    import java.io.Serializable;
004    
005    import javax.persistence.EntityManager;
006    
007    import org.springframework.data.jpa.repository.JpaRepository;
008    import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;
009    import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean;
010    import org.springframework.data.repository.core.RepositoryMetadata;
011    import org.springframework.data.repository.core.support.RepositoryFactorySupport;
012    
013    public 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    }