24
24
import com .datastax .oss .driver .api .mapper .entity .naming .NameConverter ;
25
25
import com .datastax .oss .driver .api .mapper .result .MapperResultProducer ;
26
26
import com .datastax .oss .driver .api .mapper .result .MapperResultProducerService ;
27
+ import com .datastax .oss .driver .internal .core .context .InternalDriverContext ;
27
28
import com .datastax .oss .driver .shaded .guava .common .collect .ImmutableList ;
28
29
import com .datastax .oss .protocol .internal .util .collection .NullAllowingImmutableMap ;
29
30
import edu .umd .cs .findbugs .annotations .NonNull ;
30
31
import edu .umd .cs .findbugs .annotations .Nullable ;
31
32
import java .lang .reflect .InvocationTargetException ;
32
- import java .util .List ;
33
33
import java .util .Map ;
34
34
import java .util .Objects ;
35
35
import java .util .ServiceLoader ;
38
38
39
39
public class DefaultMapperContext implements MapperContext {
40
40
41
- private static final List <MapperResultProducer > RESULT_PRODUCERS = getResultProducers ();
42
-
43
- private static final ConcurrentMap <GenericType <?>, MapperResultProducer > RESULT_PRODUCER_CACHE =
41
+ private final ConcurrentMap <GenericType <?>, MapperResultProducer > resultProducerCache =
44
42
new ConcurrentHashMap <>();
45
43
46
44
private final CqlSession session ;
@@ -50,6 +48,7 @@ public class DefaultMapperContext implements MapperContext {
50
48
private final DriverExecutionProfile executionProfile ;
51
49
private final ConcurrentMap <Class <? extends NameConverter >, NameConverter > nameConverterCache ;
52
50
private final Map <Object , Object > customState ;
51
+ private final ImmutableList <MapperResultProducer > resultProducers ;
53
52
54
53
public DefaultMapperContext (
55
54
@ NonNull CqlSession session ,
@@ -86,6 +85,8 @@ private DefaultMapperContext(
86
85
this .customState = customState ;
87
86
this .executionProfileName = executionProfileName ;
88
87
this .executionProfile = executionProfile ;
88
+ this .resultProducers =
89
+ locateResultProducers (((InternalDriverContext ) session .getContext ()).getClassLoader ());
89
90
}
90
91
91
92
public DefaultMapperContext withDaoParameters (
@@ -154,10 +155,10 @@ public Map<Object, Object> getCustomState() {
154
155
@ NonNull
155
156
@ Override
156
157
public MapperResultProducer getResultProducer (@ NonNull GenericType <?> resultToProduce ) {
157
- return RESULT_PRODUCER_CACHE .computeIfAbsent (
158
+ return resultProducerCache .computeIfAbsent (
158
159
resultToProduce ,
159
160
k -> {
160
- for (MapperResultProducer resultProducer : RESULT_PRODUCERS ) {
161
+ for (MapperResultProducer resultProducer : resultProducers ) {
161
162
if (resultProducer .canProduce (k )) {
162
163
return resultProducer ;
163
164
}
@@ -185,10 +186,11 @@ private static NameConverter buildNameConverter(Class<? extends NameConverter> c
185
186
}
186
187
}
187
188
188
- private static List <MapperResultProducer > getResultProducers () {
189
+ private static ImmutableList <MapperResultProducer > locateResultProducers (
190
+ ClassLoader classLoader ) {
189
191
ImmutableList .Builder <MapperResultProducer > result = ImmutableList .builder ();
190
192
ServiceLoader <MapperResultProducerService > loader =
191
- ServiceLoader .load (MapperResultProducerService .class );
193
+ ServiceLoader .load (MapperResultProducerService .class , classLoader );
192
194
loader .iterator ().forEachRemaining (provider -> result .addAll (provider .getProducers ()));
193
195
return result .build ();
194
196
}
0 commit comments