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 this.cacheFactorySupplier = requireNonNull(cacheFactorySupplier);
59 this.serviceSettings = requireNonNull(serviceSettings);
60 }
61
62 public LegacyVCacheService(
63 Supplier<RequestContext> threadLocalContextSupplier,
64 Supplier<RequestContext> workContextContextSupplier,
65 VCacheSettingsDefaultsProvider defaultsProvider,
66 VCacheCreationHandler creationHandler,
67 MetricsCollector metricsCollector,
68 ExternalCacheKeyGenerator externalCacheKeyGenerator,
69 Supplier<CacheFactory> cacheFactorySupplier,
70 LegacyServiceSettings serviceSettings,
71 BegunTransactionalActivityHandler begunTransactionalActivityHandler) {
72 super(threadLocalContextSupplier,
73 workContextContextSupplier,
74 defaultsProvider,
75 creationHandler,
76 metricsCollector,
77 externalCacheKeyGenerator,
78 begunTransactionalActivityHandler);
79 this.cacheFactorySupplier = requireNonNull(cacheFactorySupplier);
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 final CacheSettings legacySettings = new CacheSettingsBuilder()
91 .local()
92 .maxEntries(settings.getMaxEntries().get())
93 .expireAfterWrite(settings.getDefaultTtl().get().toNanos(), TimeUnit.NANOSECONDS)
94 .build();
95
96 return new LegacyJvmCache<>(cacheFactorySupplier.get().getCache(name, null, legacySettings));
97 }
98
99 @Override
100 protected <V> TransactionalExternalCache<V> createTransactionalExternalCache(
101 String name, ExternalCacheSettings settings, MarshallingPair<V> valueMarshalling, boolean valueSerializable) {
102 final CacheSettings legacySettings = buildLegacySettings(settings);
103
104 return new LegacyTransactionalExternalCache<>(
105 cacheFactorySupplier.get().getCache(name, null, legacySettings),
106 threadLocalContextSupplier,
107 externalCacheKeyGenerator,
108 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
109 transactionControlManager,
110 serviceSettings,
111 metricsCollector);
112 }
113
114 @Override
115 protected <V> StableReadExternalCache<V> createStableReadExternalCache(
116 String name, ExternalCacheSettings settings, MarshallingPair<V> valueMarshalling, boolean valueSerializable) {
117 final CacheSettings legacySettings = buildLegacySettings(settings);
118
119 return new LegacyStableReadExternalCache<>(
120 cacheFactorySupplier.get().getCache(name, null, legacySettings),
121 workContextContextSupplier,
122 externalCacheKeyGenerator,
123 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
124 serviceSettings,
125 metricsCollector);
126 }
127
128 @Override
129 protected <V> DirectExternalCache<V> createDirectExternalCache(
130 String name, ExternalCacheSettings settings, MarshallingPair<V> valueMarshalling, boolean valueSerializable) {
131 final CacheSettings legacySettings = buildLegacySettings(settings);
132
133 return new LegacyDirectExternalCache<>(
134 cacheFactorySupplier.get().getCache(name, null, legacySettings),
135 workContextContextSupplier,
136 externalCacheKeyGenerator,
137 (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
138 serviceSettings);
139 }
140
141 private CacheSettings buildLegacySettings(ExternalCacheSettings settings) {
142 return new CacheSettingsBuilder()
143 .remote()
144 .maxEntries(settings.getEntryCountHint().get())
145 .expireAfterWrite(settings.getDefaultTtl().get().toNanos(), TimeUnit.NANOSECONDS)
146 .build();
147 }
148 }