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 settings.getLockTimeout());
46 this.serviceSettings = requireNonNull(settings);
47 }
48
49 @Override
50 protected Logger log() {
51 return log;
52 }
53
54 @Override
55 protected <K, V> JvmCache<K, V> createJvmCache(String name, JvmCacheSettings settings) {
56 return new GuavaJvmCache<>(name, settings, lockTimeout);
57 }
58
59 @Override
60 protected <V> TransactionalExternalCache<V> createTransactionalExternalCache(String name,
61 ExternalCacheSettings settings,
62 MarshallingPair<V> valueMarshalling,
63 boolean valueSerializable) {
64 if (serviceSettings.getDontExternaliseCache().apply(name)) {
65 log.trace("Cache {}: not being externalised", name);
66 return new GuavaTransactionalExternalCache<>(
67 name,
68 GuavaUtils.buildDelegate(settings),
69 threadLocalContextSupplier,
70 externalCacheKeyGenerator,
71 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
72 transactionControlManager,
73 metricsCollector,
74 lockTimeout);
75 }
76
77 return new MemcachedTransactionalExternalCache<>(
78 serviceSettings,
79 threadLocalContextSupplier,
80 externalCacheKeyGenerator,
81 name,
82 valueMarshalling,
83 settings,
84 transactionControlManager,
85 metricsCollector);
86 }
87
88 @Override
89 protected <V> StableReadExternalCache<V> createStableReadExternalCache(String name,
90 ExternalCacheSettings settings,
91 MarshallingPair<V> valueMarshalling,
92 boolean valueSerializable) {
93 if (serviceSettings.getDontExternaliseCache().apply(name)) {
94 log.trace("Cache {}: not being externalised", name);
95 return new GuavaStableReadExternalCache<>(
96 name,
97 GuavaUtils.buildDelegate(settings),
98 threadLocalContextSupplier,
99 externalCacheKeyGenerator,
100 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
101 metricsCollector,
102 serviceSettings.getLockTimeout());
103 }
104
105 return new MemcachedStableReadExternalCache<>(
106 serviceSettings,
107 threadLocalContextSupplier,
108 externalCacheKeyGenerator,
109 name,
110 valueMarshalling,
111 settings,
112 metricsCollector);
113 }
114
115 @Override
116 protected <V> DirectExternalCache<V> createDirectExternalCache(String name,
117 ExternalCacheSettings settings,
118 MarshallingPair<V> valueMarshalling,
119 boolean valueSerializable) {
120 if (serviceSettings.getDontExternaliseCache().apply(name)) {
121 log.trace("Cache {}: not being externalised", name);
122 return new GuavaDirectExternalCache<>(
123 name,
124 GuavaUtils.buildDelegate(settings),
125 threadLocalContextSupplier,
126 externalCacheKeyGenerator,
127 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
128 lockTimeout);
129 }
130 return new MemcachedDirectExternalCache<>(
131 serviceSettings,
132 threadLocalContextSupplier,
133 externalCacheKeyGenerator,
134 name,
135 valueMarshalling,
136 settings);
137 }
138 }