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                  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 }