diff --git a/pom.xml b/pom.xml
index 6ca40eba5c..cf5c529ce8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-commons
- 2.1.0.BUILD-SNAPSHOT
+ 2.1.0.DATACMNS-1255-SNAPSHOT
Spring Data Core
diff --git a/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java b/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java
index 9342d144b8..109fbc2b7e 100644
--- a/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java
+++ b/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java
@@ -25,12 +25,12 @@
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.Alternative;
import javax.enterprise.inject.Stereotype;
-import javax.enterprise.inject.UnsatisfiedResolutionException;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionPoint;
@@ -38,15 +38,13 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition;
-import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.data.repository.config.CustomRepositoryImplementationDetector;
-import org.springframework.data.repository.config.DefaultRepositoryConfiguration;
-import org.springframework.data.repository.config.RepositoryBeanNameGenerator;
-import org.springframework.data.repository.config.SpringDataAnnotationBeanNameGenerator;
+import org.springframework.data.repository.config.RepositoryFragmentConfiguration;
+import org.springframework.data.repository.core.support.RepositoryComposition.RepositoryFragments;
+import org.springframework.data.repository.core.support.RepositoryFactorySupport;
+import org.springframework.data.repository.core.support.RepositoryFragment;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
-import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
/**
@@ -66,16 +64,12 @@ public abstract class CdiRepositoryBean implements Bean, PassivationCapabl
private final Set qualifiers;
private final Class repositoryType;
- private final Optional detector;
+ private final CdiRepositoryContext context;
private final BeanManager beanManager;
private final String passivationId;
private transient @Nullable T repoInstance;
- private final SpringDataAnnotationBeanNameGenerator annotationBeanNameGenerator = new SpringDataAnnotationBeanNameGenerator();
- private final RepositoryBeanNameGenerator beanNameGenerator = new RepositoryBeanNameGenerator(
- getClass().getClassLoader());
-
/**
* Creates a new {@link CdiRepositoryBean}.
*
@@ -84,7 +78,7 @@ public abstract class CdiRepositoryBean implements Bean, PassivationCapabl
* @param beanManager the CDI {@link BeanManager}, must not be {@literal null}.
*/
public CdiRepositoryBean(Set qualifiers, Class repositoryType, BeanManager beanManager) {
- this(qualifiers, repositoryType, beanManager, Optional.empty());
+ this(qualifiers, repositoryType, beanManager, new CdiRepositoryContext(CdiRepositoryBean.class.getClassLoader()));
}
/**
@@ -93,8 +87,7 @@ public CdiRepositoryBean(Set qualifiers, Class repositoryType, Be
* @param qualifiers must not be {@literal null}.
* @param repositoryType has to be an interface must not be {@literal null}.
* @param beanManager the CDI {@link BeanManager}, must not be {@literal null}.
- * @param detector detector for the custom repository implementations {@link CustomRepositoryImplementationDetector},
- * can be {@literal null}.
+ * @param detector detector for the custom repository implementations {@link CustomRepositoryImplementationDetector}.
*/
public CdiRepositoryBean(Set qualifiers, Class repositoryType, BeanManager beanManager,
Optional detector) {
@@ -107,7 +100,32 @@ public CdiRepositoryBean(Set qualifiers, Class repositoryType, Be
this.qualifiers = qualifiers;
this.repositoryType = repositoryType;
this.beanManager = beanManager;
- this.detector = detector;
+ this.context = new CdiRepositoryContext(getClass().getClassLoader(), detector
+ .orElseThrow(() -> new IllegalArgumentException("CustomRepositoryImplementationDetector must be present!")));
+ this.passivationId = createPassivationId(qualifiers, repositoryType);
+ }
+
+ /**
+ * Creates a new {@link CdiRepositoryBean}.
+ *
+ * @param qualifiers must not be {@literal null}.
+ * @param repositoryType has to be an interface must not be {@literal null}.
+ * @param beanManager the CDI {@link BeanManager}, must not be {@literal null}.
+ * @param context CDI context encapsulating class loader, metadata scanning and fragment detection.
+ * @since 2.1
+ */
+ public CdiRepositoryBean(Set qualifiers, Class repositoryType, BeanManager beanManager,
+ CdiRepositoryContext context) {
+
+ Assert.notNull(qualifiers, "Qualifiers must not be null!");
+ Assert.notNull(beanManager, "BeanManager must not be null!");
+ Assert.notNull(repositoryType, "Repoitory type must not be null!");
+ Assert.isTrue(repositoryType.isInterface(), "RepositoryType must be an interface!");
+
+ this.qualifiers = qualifiers;
+ this.repositoryType = repositoryType;
+ this.beanManager = beanManager;
+ this.context = context;
this.passivationId = createPassivationId(qualifiers, repositoryType);
}
@@ -128,7 +146,6 @@ private String createPassivationId(Set qualifiers, Class> reposito
Collections.sort(qualifierNames);
return StringUtils.collectionToDelimitedString(qualifierNames, ":") + ":" + repositoryType.getName();
-
}
/*
@@ -215,89 +232,6 @@ public void destroy(@SuppressWarnings("null") T instance,
creationalContext.release();
}
- /**
- * Looks up an instance of a {@link CdiRepositoryConfiguration}. In case the instance cannot be found within the CDI
- * scope, a default configuration is used.
- *
- * @return an available CdiRepositoryConfiguration instance or a default configuration.
- */
- protected CdiRepositoryConfiguration lookupConfiguration(BeanManager beanManager, Set qualifiers) {
-
- return beanManager.getBeans(CdiRepositoryConfiguration.class, getQualifiersArray(qualifiers)).stream().findFirst()//
- .map(it -> (CdiRepositoryConfiguration) getDependencyInstance(it)) //
- .orElse(DEFAULT_CONFIGURATION);
- }
-
- /**
- * Try to lookup a custom implementation for a {@link org.springframework.data.repository.Repository}. Can only be
- * used when a {@code CustomRepositoryImplementationDetector} is provided.
- *
- * @param repositoryType
- * @param beanManager
- * @param qualifiers
- * @return the custom implementation instance or null
- */
- private Optional> getCustomImplementationBean(Class> repositoryType, BeanManager beanManager,
- Set qualifiers) {
-
- return detector.flatMap(it -> {
-
- CdiRepositoryConfiguration cdiRepositoryConfiguration = lookupConfiguration(beanManager, qualifiers);
-
- return getCustomImplementationClass(repositoryType, cdiRepositoryConfiguration, it)//
- .flatMap(type -> beanManager.getBeans(type, getQualifiersArray(qualifiers)).stream().findFirst());
- });
- }
-
- /**
- * Retrieves a custom repository interfaces from a repository type. This works for the whole class hierarchy and can
- * find also a custom repository which is inherited over many levels.
- *
- * @param repositoryType The class representing the repository.
- * @param cdiRepositoryConfiguration The configuration for CDI usage.
- * @return the interface class or {@literal null}.
- */
- private Optional> getCustomImplementationClass(Class> repositoryType,
- CdiRepositoryConfiguration cdiRepositoryConfiguration, CustomRepositoryImplementationDetector detector) {
-
- String className = getCustomImplementationClassName(repositoryType, cdiRepositoryConfiguration);
- Optional beanDefinition = detector.detectCustomImplementation( //
- className, //
- getCustomImplementationBeanName(repositoryType), //
- Collections.singleton(repositoryType.getPackage().getName()), //
- Collections.emptySet(), //
- beanNameGenerator::generateBeanName //
- );
-
- return beanDefinition.map(it -> {
-
- try {
- return Class.forName(it.getBeanClassName());
- } catch (ClassNotFoundException e) {
- throw new UnsatisfiedResolutionException(
- String.format("Unable to resolve class for '%s'", it.getBeanClassName()), e);
- }
- });
- }
-
- private String getCustomImplementationBeanName(Class> repositoryType) {
- return annotationBeanNameGenerator.generateBeanName(new AnnotatedGenericBeanDefinition(repositoryType))
- + DEFAULT_CONFIGURATION.getRepositoryImplementationPostfix();
- }
-
- private String getCustomImplementationClassName(Class> repositoryType,
- CdiRepositoryConfiguration cdiRepositoryConfiguration) {
-
- String configuredPostfix = cdiRepositoryConfiguration.getRepositoryImplementationPostfix();
- Assert.hasText(configuredPostfix, "Configured repository postfix must not be null or empty!");
-
- return ClassUtils.getShortName(repositoryType) + configuredPostfix;
- }
-
- private Annotation[] getQualifiersArray(Set qualifiers) {
- return qualifiers.toArray(new Annotation[qualifiers.size()]);
- }
-
/*
* (non-Javadoc)
* @see javax.enterprise.inject.spi.Bean#getQualifiers()
@@ -380,18 +314,75 @@ public String getId() {
* @param creationalContext will never be {@literal null}.
* @param repositoryType will never be {@literal null}.
* @return
- * @deprecated override {@link #create(CreationalContext, Class, Object)} instead.
*/
- @Deprecated
protected T create(CreationalContext creationalContext, Class repositoryType) {
- Optional> customImplementationBean = getCustomImplementationBean(repositoryType, beanManager, qualifiers);
- Optional