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.getClientSupplier(),
79 threadLocalContextSupplier,
80 externalCacheKeyGenerator,
81 name,
82 valueMarshalling,
83 settings,
84 transactionControlManager,
85 metricsCollector,
86 lockTimeout);
87 }
88
89 @Override
90 protected <V> StableReadExternalCache<V> createStableReadExternalCache(String name,
91 ExternalCacheSettings settings,
92 MarshallingPair<V> valueMarshalling,
93 boolean valueSerializable) {
94 if (serviceSettings.getDontExternaliseCache().apply(name)) {
95 log.trace("Cache {}: not being externalised", name);
96 return new GuavaStableReadExternalCache<>(
97 name,
98 GuavaUtils.buildDelegate(settings),
99 threadLocalContextSupplier,
100 externalCacheKeyGenerator,
101 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
102 metricsCollector,
103 serviceSettings.getLockTimeout());
104 }
105
106 return new MemcachedStableReadExternalCache<>(
107 serviceSettings.getClientSupplier(),
108 threadLocalContextSupplier,
109 externalCacheKeyGenerator,
110 name,
111 valueMarshalling,
112 settings,
113 metricsCollector,
114 serviceSettings.getLockTimeout());
115 }
116
117 @Override
118 protected <V> DirectExternalCache<V> createDirectExternalCache(String name,
119 ExternalCacheSettings settings,
120 MarshallingPair<V> valueMarshalling,
121 boolean valueSerializable) {
122 if (serviceSettings.getDontExternaliseCache().apply(name)) {
123 log.trace("Cache {}: not being externalised", name);
124 return new GuavaDirectExternalCache<>(
125 name,
126 GuavaUtils.buildDelegate(settings),
127 threadLocalContextSupplier,
128 externalCacheKeyGenerator,
129 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
130 lockTimeout);
131 }
132 return new MemcachedDirectExternalCache<>(
133 serviceSettings.getClientSupplier(),
134 threadLocalContextSupplier,
135 externalCacheKeyGenerator,
136 name,
137 valueMarshalling,
138 settings,
139 lockTimeout);
140 }
141 }