17
17
18
18
import java .lang .annotation .Annotation ;
19
19
import java .lang .reflect .Type ;
20
+ import java .util .ArrayList ;
20
21
import java .util .Arrays ;
21
22
import java .util .Collections ;
22
23
import java .util .HashSet ;
24
+ import java .util .List ;
23
25
import java .util .Set ;
24
26
25
27
import javax .enterprise .context .ApplicationScoped ;
29
31
import javax .enterprise .inject .spi .Bean ;
30
32
import javax .enterprise .inject .spi .BeanManager ;
31
33
import javax .enterprise .inject .spi .InjectionPoint ;
34
+ import javax .enterprise .inject .spi .PassivationCapable ;
32
35
33
36
import org .slf4j .Logger ;
34
37
import org .slf4j .LoggerFactory ;
35
38
import org .springframework .util .Assert ;
39
+ import org .springframework .util .StringUtils ;
36
40
37
41
/**
38
42
* Base class for {@link Bean} wrappers.
39
43
*
40
44
* @author Dirk Mahler
41
45
* @author Oliver Gierke
42
46
*/
43
- public abstract class CdiRepositoryBean <T > implements Bean <T > {
47
+ public abstract class CdiRepositoryBean <T > implements Bean <T >, PassivationCapable {
44
48
45
49
private static final Logger LOGGER = LoggerFactory .getLogger (CdiRepositoryBean .class );
46
50
47
51
private final Set <Annotation > qualifiers ;
48
52
private final Class <T > repositoryType ;
49
53
private final BeanManager beanManager ;
54
+ private final String passivationId ;
50
55
51
56
/**
52
57
* Creates a new {@link CdiRepositoryBean}.
@@ -65,6 +70,30 @@ public CdiRepositoryBean(Set<Annotation> qualifiers, Class<T> repositoryType, Be
65
70
this .qualifiers = qualifiers ;
66
71
this .repositoryType = repositoryType ;
67
72
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 ();
68
97
}
69
98
70
99
/*
@@ -200,6 +229,14 @@ public Class<? extends Annotation> getScope() {
200
229
return ApplicationScoped .class ;
201
230
}
202
231
232
+ /*
233
+ * (non-Javadoc)
234
+ * @see javax.enterprise.inject.spi.PassivationCapable#getId()
235
+ */
236
+ public String getId () {
237
+ return passivationId ;
238
+ }
239
+
203
240
/**
204
241
* Creates the actual component instance.
205
242
*
0 commit comments