1 package com.atlassian.vcache.internal.guava;
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.BegunTransactionalActivityHandler;
11 import com.atlassian.vcache.internal.RequestContext;
12 import com.atlassian.vcache.internal.VCacheCreationHandler;
13 import com.atlassian.vcache.internal.VCacheSettingsDefaultsProvider;
14 import com.atlassian.vcache.internal.core.ExternalCacheKeyGenerator;
15 import com.atlassian.vcache.internal.core.Sha1ExternalCacheKeyGenerator;
16 import com.atlassian.vcache.internal.core.metrics.MetricsCollector;
17 import com.atlassian.vcache.internal.core.service.AbstractVCacheService;
18 import com.atlassian.vcache.internal.core.service.GuavaJvmCache;
19 import com.google.common.cache.Cache;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23 import java.util.Map;
24 import java.util.Optional;
25 import java.util.concurrent.ConcurrentHashMap;
26 import java.util.function.Supplier;
27
28 import static java.util.Objects.requireNonNull;
29
30
31
32
33
34
35 public class GuavaVCacheService extends AbstractVCacheService {
36 private static final Logger log = LoggerFactory.getLogger(GuavaVCacheService.class);
37
38 private final GuavaServiceSettings serviceSettings;
39
40
41 private final Map<String, Cache> delegatedCaches = new ConcurrentHashMap<>();
42
43 public GuavaVCacheService(
44 String productIdentifier,
45 Supplier<RequestContext> threadLocalContextSupplier,
46 Supplier<RequestContext> workContextContextSupplier,
47 VCacheSettingsDefaultsProvider defaultsProvider,
48 VCacheCreationHandler creationHandler,
49 MetricsCollector metricsCollector,
50 GuavaServiceSettings serviceSettings,
51 BegunTransactionalActivityHandler begunTransactionalActivityHandler) {
52 super(threadLocalContextSupplier,
53 workContextContextSupplier,
54 defaultsProvider,
55 creationHandler,
56 metricsCollector,
57 new Sha1ExternalCacheKeyGenerator(productIdentifier),
58 begunTransactionalActivityHandler,
59 serviceSettings.getLockTimeout());
60 this.serviceSettings = requireNonNull(serviceSettings);
61 }
62
63 public GuavaVCacheService(
64 Supplier<RequestContext> threadLocalContextSupplier,
65 Supplier<RequestContext> workContextContextSupplier,
66 VCacheSettingsDefaultsProvider defaultsProvider,
67 VCacheCreationHandler creationHandler,
68 MetricsCollector metricsCollector,
69 ExternalCacheKeyGenerator externalCacheKeyGenerator,
70 GuavaServiceSettings serviceSettings,
71 BegunTransactionalActivityHandler begunTransactionalActivityHandler) {
72 super(threadLocalContextSupplier,
73 workContextContextSupplier,
74 defaultsProvider,
75 creationHandler,
76 metricsCollector,
77 externalCacheKeyGenerator,
78 begunTransactionalActivityHandler,
79 serviceSettings.getLockTimeout());
80 this.serviceSettings = requireNonNull(serviceSettings);
81 }
82
83 @Override
84 protected Logger log() {
85 return log;
86 }
87
88 @Override
89 protected <K, V> JvmCache<K, V> createJvmCache(String name, JvmCacheSettings settings) {
90 return new GuavaJvmCache<>(name, settings, lockTimeout);
91 }
92
93 @Override
94 protected <V> TransactionalExternalCache<V> createTransactionalExternalCache(
95 String name, ExternalCacheSettings settings, MarshallingPair<V> valueMarshalling, boolean valueSerializable) {
96 return new GuavaTransactionalExternalCache<>(
97 name,
98 obtainDelegate(name, settings),
99 threadLocalContextSupplier,
100 externalCacheKeyGenerator,
101 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
102 transactionControlManager,
103 metricsCollector,
104 serviceSettings.getLockTimeout());
105 }
106
107 @Override
108 protected <V> StableReadExternalCache<V> createStableReadExternalCache(
109 String name, ExternalCacheSettings settings, MarshallingPair<V> valueMarshalling, boolean valueSerializable) {
110 return new GuavaStableReadExternalCache<>(
111 name,
112 obtainDelegate(name, settings),
113 workContextContextSupplier,
114 externalCacheKeyGenerator,
115 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
116 metricsCollector,
117 serviceSettings.getLockTimeout());
118 }
119
120 @Override
121 protected <V> DirectExternalCache<V> createDirectExternalCache(
122 String name, ExternalCacheSettings settings, MarshallingPair<V> valueMarshalling, boolean valueSerializable) {
123 return new GuavaDirectExternalCache<>(
124 name,
125 obtainDelegate(name, settings),
126 workContextContextSupplier,
127 externalCacheKeyGenerator,
128 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
129 serviceSettings.getLockTimeout());
130 }
131
132 private <V> Cache<String, V> obtainDelegate(String name, ExternalCacheSettings settings) {
133 return delegatedCaches.computeIfAbsent(name, k -> GuavaUtils.buildDelegate(settings));
134 }
135 }