View Javadoc

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   * Main service that is backed by <tt>Atlassian Cache</tt>.
32   *
33   * @since 1.0.0
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 }