Skip to content

Commit 02cacf5

Browse files
committed
DATACMNS-322 - CdiRepositoryBean implements PassivationCapable.
To allow the CdiRepositoryBeans being used inside scoped CDI beans we need to implement PassivationCapable so that the CDI contain can serialize the bean instance and detect the contextual instance on deserialization. As the repositories are application scoped we simply consider a bean of a given type plus its qualifier annotations unique.
1 parent 0cf875b commit 02cacf5

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717

1818
import java.lang.annotation.Annotation;
1919
import java.lang.reflect.Type;
20+
import java.util.ArrayList;
2021
import java.util.Arrays;
2122
import java.util.Collections;
2223
import java.util.HashSet;
24+
import java.util.List;
2325
import java.util.Set;
2426

2527
import javax.enterprise.context.ApplicationScoped;
@@ -29,24 +31,27 @@
2931
import javax.enterprise.inject.spi.Bean;
3032
import javax.enterprise.inject.spi.BeanManager;
3133
import javax.enterprise.inject.spi.InjectionPoint;
34+
import javax.enterprise.inject.spi.PassivationCapable;
3235

3336
import org.slf4j.Logger;
3437
import org.slf4j.LoggerFactory;
3538
import org.springframework.util.Assert;
39+
import org.springframework.util.StringUtils;
3640

3741
/**
3842
* Base class for {@link Bean} wrappers.
3943
*
4044
* @author Dirk Mahler
4145
* @author Oliver Gierke
4246
*/
43-
public abstract class CdiRepositoryBean<T> implements Bean<T> {
47+
public abstract class CdiRepositoryBean<T> implements Bean<T>, PassivationCapable {
4448

4549
private static final Logger LOGGER = LoggerFactory.getLogger(CdiRepositoryBean.class);
4650

4751
private final Set<Annotation> qualifiers;
4852
private final Class<T> repositoryType;
4953
private final BeanManager beanManager;
54+
private final String passivationId;
5055

5156
/**
5257
* Creates a new {@link CdiRepositoryBean}.
@@ -65,6 +70,30 @@ public CdiRepositoryBean(Set<Annotation> qualifiers, Class<T> repositoryType, Be
6570
this.qualifiers = qualifiers;
6671
this.repositoryType = repositoryType;
6772
this.beanManager = beanManager;
73+
this.passivationId = createPassivationId(qualifiers, repositoryType);
74+
}
75+
76+
/**
77+
* Creates a unique identifier for the given repository type and the given annotations.
78+
*
79+
* @param qualifiers must not be {@literal null} or contain {@literal null} values.
80+
* @param repositoryType must not be {@literal null}.
81+
* @return
82+
*/
83+
private final String createPassivationId(Set<Annotation> qualifiers, Class<?> repositoryType) {
84+
85+
List<String> qualifierNames = new ArrayList<String>(qualifiers.size());
86+
87+
for (Annotation qualifier : qualifiers) {
88+
qualifierNames.add(qualifier.annotationType().getName());
89+
}
90+
91+
Collections.sort(qualifierNames);
92+
93+
StringBuilder builder = new StringBuilder(StringUtils.collectionToDelimitedString(qualifierNames, ":"));
94+
builder.append(":").append(repositoryType.getName());
95+
96+
return builder.toString();
6897
}
6998

7099
/*
@@ -200,6 +229,14 @@ public Class<? extends Annotation> getScope() {
200229
return ApplicationScoped.class;
201230
}
202231

232+
/*
233+
* (non-Javadoc)
234+
* @see javax.enterprise.inject.spi.PassivationCapable#getId()
235+
*/
236+
public String getId() {
237+
return passivationId;
238+
}
239+
203240
/**
204241
* Creates the actual component instance.
205242
*

src/main/java/org/springframework/data/repository/cdi/CdiRepositoryExtensionSupport.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,13 @@ protected Iterable<Entry<Class<?>, Set<Annotation>>> getRepositoryTypes() {
124124
return repositoryTypes.entrySet();
125125
}
126126

127-
private static class DefaultAnnotationLiteral extends AnnotationLiteral<Default> implements Default {
127+
static class DefaultAnnotationLiteral extends AnnotationLiteral<Default> implements Default {
128128

129129
private static final long serialVersionUID = 511359421048623933L;
130130
private static final DefaultAnnotationLiteral INSTANCE = new DefaultAnnotationLiteral();
131131
}
132132

133-
private static class AnyAnnotationLiteral extends AnnotationLiteral<Any> implements Any {
133+
static class AnyAnnotationLiteral extends AnnotationLiteral<Any> implements Any {
134134

135135
private static final long serialVersionUID = 7261821376671361463L;
136136
private static final AnyAnnotationLiteral INSTANCE = new AnyAnnotationLiteral();

src/test/java/org/springframework/data/repository/cdi/CdiRepositoryBeanUnitTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@
4444
@RunWith(MockitoJUnitRunner.class)
4545
public class CdiRepositoryBeanUnitTests {
4646

47+
static final String PASSIVATION_ID = "javax.enterprise.inject.Default:org.springframework.data.repository.cdi.CdiRepositoryBeanUnitTests$SampleRepository";
48+
4749
static final Set<Annotation> NO_ANNOTATIONS = Collections.emptySet();
50+
static final Set<Annotation> SINGLE_ANNOTATION = Collections
51+
.singleton((Annotation) new CdiRepositoryExtensionSupport.DefaultAnnotationLiteral());
4852

4953
@Mock
5054
BeanManager beanManager;
@@ -110,6 +114,17 @@ public void scopeDefaultsToApplicationScoped() {
110114
assertThat(bean.getScope(), equalTo((Class) ApplicationScoped.class));
111115
}
112116

117+
/**
118+
* @see DATACMNS-322
119+
*/
120+
@Test
121+
public void createsPassivationId() {
122+
123+
CdiRepositoryBean<SampleRepository> bean = new DummyCdiRepositoryBean<SampleRepository>(SINGLE_ANNOTATION,
124+
SampleRepository.class, beanManager);
125+
assertThat(bean.getId(), is(PASSIVATION_ID));
126+
}
127+
113128
static class DummyCdiRepositoryBean<T> extends CdiRepositoryBean<T> {
114129

115130
public DummyCdiRepositoryBean(Set<Annotation> qualifiers, Class<T> repositoryType, BeanManager beanManager) {

0 commit comments

Comments
 (0)