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 }