1 package com.atlassian.vcache.internal.legacy;
2
3 import com.atlassian.cache.CacheFactory;
4 import com.atlassian.cache.CacheSettings;
5 import com.atlassian.cache.CacheSettingsBuilder;
6 import com.atlassian.marshalling.api.MarshallingPair;
7 import com.atlassian.vcache.DirectExternalCache;
8 import com.atlassian.vcache.ExternalCacheSettings;
9 import com.atlassian.vcache.JvmCache;
10 import com.atlassian.vcache.JvmCacheSettings;
11 import com.atlassian.vcache.StableReadExternalCache;
12 import com.atlassian.vcache.TransactionalExternalCache;
13 import com.atlassian.vcache.internal.BegunTransactionalActivityHandler;
14 import com.atlassian.vcache.internal.RequestContext;
15 import com.atlassian.vcache.internal.VCacheCreationHandler;
16 import com.atlassian.vcache.internal.VCacheSettingsDefaultsProvider;
17 import com.atlassian.vcache.internal.core.ExternalCacheKeyGenerator;
18 import com.atlassian.vcache.internal.core.Sha1ExternalCacheKeyGenerator;
19 import com.atlassian.vcache.internal.core.metrics.MetricsCollector;
20 import com.atlassian.vcache.internal.core.service.AbstractVCacheService;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
23
24 import java.util.Optional;
25 import java.util.concurrent.TimeUnit;
26 import java.util.function.Supplier;
27
28 import static java.util.Objects.requireNonNull;
29
30
31
32
33
34
35 public class LegacyVCacheService extends AbstractVCacheService {
36 private static final Logger log = LoggerFactory.getLogger(LegacyVCacheService.class);
37
38 private final Supplier<CacheFactory> cacheFactorySupplier;
39 private final LegacyServiceSettings serviceSettings;
40
41 public LegacyVCacheService(
42 String productIdentifier,
43 Supplier<RequestContext> threadLocalContextSupplier,
44 Supplier<RequestContext> workContextContextSupplier,
45 VCacheSettingsDefaultsProvider defaultsProvider,
46 VCacheCreationHandler creationHandler,
47 MetricsCollector metricsCollector,
48 Supplier<CacheFactory> cacheFactorySupplier,
49 LegacyServiceSettings serviceSettings,
50 BegunTransactionalActivityHandler begunTransactionalActivityHandler) {
51 super(threadLocalContextSupplier,
52 workContextContextSupplier,
53 defaultsProvider,
54 creationHandler,
55 metricsCollector,
56 new Sha1ExternalCacheKeyGenerator(productIdentifier),
57 begunTransactionalActivityHandler,
58 serviceSettings.getLockTimeout());
59 this.cacheFactorySupplier = requireNonNull(cacheFactorySupplier);
60 this.serviceSettings = requireNonNull(serviceSettings);
61 }
62
63 public LegacyVCacheService(
64 Supplier<RequestContext> threadLocalContextSupplier,
65 Supplier<RequestContext> workContextContextSupplier,
66 VCacheSettingsDefaultsProvider defaultsProvider,
67 VCacheCreationHandler creationHandler,
68 MetricsCollector metricsCollector,
69 ExternalCacheKeyGenerator externalCacheKeyGenerator,
70 Supplier<CacheFactory> cacheFactorySupplier,
71 LegacyServiceSettings serviceSettings,
72 BegunTransactionalActivityHandler begunTransactionalActivityHandler) {
73 super(threadLocalContextSupplier,
74 workContextContextSupplier,
75 defaultsProvider,
76 creationHandler,
77 metricsCollector,
78 externalCacheKeyGenerator,
79 begunTransactionalActivityHandler, serviceSettings.getLockTimeout());
80 this.cacheFactorySupplier = requireNonNull(cacheFactorySupplier);
81 this.serviceSettings = requireNonNull(serviceSettings);
82 }
83
84 @Override
85 protected Logger log() {
86 return log;
87 }
88
89 @Override
90 protected <K, V> JvmCache<K, V> createJvmCache(String name, JvmCacheSettings settings) {
91 final CacheSettings legacySettings = new CacheSettingsBuilder()
92 .local()
93 .maxEntries(settings.getMaxEntries().get())
94 .expireAfterWrite(settings.getDefaultTtl().get().toNanos(), TimeUnit.NANOSECONDS)
95 .build();
96
97 return new LegacyJvmCache<>(
98 cacheFactorySupplier.get().getCache(name, null, legacySettings),
99 serviceSettings.getLockTimeout());
100 }
101
102 @Override
103 protected <V> TransactionalExternalCache<V> createTransactionalExternalCache(
104 String name, ExternalCacheSettings settings, MarshallingPair<V> valueMarshalling, boolean valueSerializable) {
105 final CacheSettings legacySettings = buildLegacySettings(settings);
106
107 return new LegacyTransactionalExternalCache<>(
108 cacheFactorySupplier.get().getCache(name, null, legacySettings),
109 threadLocalContextSupplier,
110 externalCacheKeyGenerator,
111 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
112 transactionControlManager,
113 serviceSettings,
114 metricsCollector);
115 }
116
117 @Override
118 protected <V> StableReadExternalCache<V> createStableReadExternalCache(
119 String name, ExternalCacheSettings settings, MarshallingPair<V> valueMarshalling, boolean valueSerializable) {
120 final CacheSettings legacySettings = buildLegacySettings(settings);
121
122 return new LegacyStableReadExternalCache<>(
123 cacheFactorySupplier.get().getCache(name, null, legacySettings),
124 workContextContextSupplier,
125 externalCacheKeyGenerator,
126 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
127 serviceSettings,
128 metricsCollector);
129 }
130
131 @Override
132 protected <V> DirectExternalCache<V> createDirectExternalCache(
133 String name, ExternalCacheSettings settings, MarshallingPair<V> valueMarshalling, boolean valueSerializable) {
134 final CacheSettings legacySettings = buildLegacySettings(settings);
135
136 return new LegacyDirectExternalCache<>(
137 cacheFactorySupplier.get().getCache(name, null, legacySettings),
138 workContextContextSupplier,
139 externalCacheKeyGenerator,
140 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
141 serviceSettings);
142 }
143
144 private CacheSettings buildLegacySettings(ExternalCacheSettings settings) {
145 return new CacheSettingsBuilder()
146 .remote()
147 .maxEntries(settings.getEntryCountHint().get())
148 .expireAfterWrite(settings.getDefaultTtl().get().toNanos(), TimeUnit.NANOSECONDS)
149 .build();
150 }
151 }