View Javadoc

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   * Main service that is backed by <tt>Guava</tt>.
32   *
33   * @since 1.0.0
34   */
35  public class GuavaVCacheService extends AbstractVCacheService {
36      private static final Logger log = LoggerFactory.getLogger(GuavaVCacheService.class);
37  
38      private final GuavaServiceSettings serviceSettings;
39      // Used to keep track of the underlying Guava caches used. This is to simulate the behaviour
40      // of the real external caches.
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 }