1 package com.atlassian.vcache.internal.memcached;
2
3 import com.atlassian.marshalling.api.MarshallingPair;
4 import com.atlassian.vcache.DirectExternalCache;
5 import com.atlassian.vcache.ExternalCacheSettings;
6 import com.atlassian.vcache.JvmCache;
7 import com.atlassian.vcache.JvmCacheSettings;
8 import com.atlassian.vcache.StableReadExternalCache;
9 import com.atlassian.vcache.TransactionalExternalCache;
10 import com.atlassian.vcache.internal.core.service.AbstractVCacheService;
11 import com.atlassian.vcache.internal.core.service.GuavaJvmCache;
12 import com.atlassian.vcache.internal.guava.GuavaDirectExternalCache;
13 import com.atlassian.vcache.internal.guava.GuavaStableReadExternalCache;
14 import com.atlassian.vcache.internal.guava.GuavaTransactionalExternalCache;
15 import com.atlassian.vcache.internal.guava.GuavaUtils;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
18
19 import java.util.Optional;
20
21 import static java.util.Objects.requireNonNull;
22
23
24
25
26 public class MemcachedVCacheService extends AbstractVCacheService {
27 private static final Logger log = LoggerFactory.getLogger(MemcachedVCacheService.class);
28
29 private final MemcachedVCacheServiceSettings serviceSettings;
30
31
32
33
34
35
36
37 public MemcachedVCacheService(MemcachedVCacheServiceSettings settings) {
38 super(settings.getContextSupplier(),
39 settings.getWorkContextContextSupplier(),
40 settings.getDefaultsProvider(),
41 settings.getCreationHandler(),
42 settings.getMetricsCollector(),
43 settings.getExternalCacheKeyGenerator(),
44 settings.getBegunTransactionalActivityHandler());
45 this.serviceSettings = requireNonNull(settings);
46 }
47
48 @Override
49 protected Logger log() {
50 return log;
51 }
52
53 @Override
54 protected <K, V> JvmCache<K, V> createJvmCache(String name, JvmCacheSettings settings) {
55 return new GuavaJvmCache<>(name, settings);
56 }
57
58 @Override
59 protected <V> TransactionalExternalCache<V> createTransactionalExternalCache(String name,
60 ExternalCacheSettings settings,
61 MarshallingPair<V> valueMarshalling,
62 boolean valueSerializable) {
63 if (serviceSettings.getDontExternaliseCache().apply(name)) {
64 log.trace("Cache {}: not being externalised", name);
65 return new GuavaTransactionalExternalCache<>(
66 name,
67 GuavaUtils.buildDelegate(settings),
68 threadLocalContextSupplier,
69 externalCacheKeyGenerator,
70 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
71 transactionControlManager,
72 metricsCollector);
73 }
74
75 return new MemcachedTransactionalExternalCache<>(
76 serviceSettings.getClientSupplier(),
77 threadLocalContextSupplier,
78 externalCacheKeyGenerator,
79 name,
80 valueMarshalling,
81 settings,
82 transactionControlManager,
83 metricsCollector);
84 }
85
86 @Override
87 protected <V> StableReadExternalCache<V> createStableReadExternalCache(String name,
88 ExternalCacheSettings settings,
89 MarshallingPair<V> valueMarshalling,
90 boolean valueSerializable) {
91 if (serviceSettings.getDontExternaliseCache().apply(name)) {
92 log.trace("Cache {}: not being externalised", name);
93 return new GuavaStableReadExternalCache<>(
94 name,
95 GuavaUtils.buildDelegate(settings),
96 threadLocalContextSupplier,
97 externalCacheKeyGenerator,
98 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
99 metricsCollector);
100 }
101
102 return new MemcachedStableReadExternalCache<>(
103 serviceSettings.getClientSupplier(),
104 threadLocalContextSupplier,
105 externalCacheKeyGenerator,
106 name,
107 valueMarshalling,
108 settings,
109 metricsCollector);
110 }
111
112 @Override
113 protected <V> DirectExternalCache<V> createDirectExternalCache(String name,
114 ExternalCacheSettings settings,
115 MarshallingPair<V> valueMarshalling,
116 boolean valueSerializable) {
117 if (serviceSettings.getDontExternaliseCache().apply(name)) {
118 log.trace("Cache {}: not being externalised", name);
119 return new GuavaDirectExternalCache<>(
120 name,
121 GuavaUtils.buildDelegate(settings),
122 threadLocalContextSupplier,
123 externalCacheKeyGenerator,
124 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling));
125 }
126 return new MemcachedDirectExternalCache<>(
127 serviceSettings.getClientSupplier(),
128 threadLocalContextSupplier,
129 externalCacheKeyGenerator,
130 name,
131 valueMarshalling,
132 settings);
133 }
134 }