View Javadoc

1   package com.atlassian.vcache.internal.memcached;
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.core.service.AbstractVCacheService;
11  import com.atlassian.vcache.internal.core.service.GuavaJvmCache;
12  import com.atlassian.vcache.internal.guava.GuavaDirectExternalCache;
13  import com.atlassian.vcache.internal.guava.GuavaStableReadExternalCache;
14  import com.atlassian.vcache.internal.guava.GuavaTransactionalExternalCache;
15  import com.atlassian.vcache.internal.guava.GuavaUtils;
16  import org.slf4j.Logger;
17  import org.slf4j.LoggerFactory;
18  
19  import java.util.Optional;
20  
21  import static java.util.Objects.requireNonNull;
22  
23  /**
24   * Main service that is backed by <tt>Memcached</tt>.
25   */
26  public class MemcachedVCacheService extends AbstractVCacheService {
27      private static final Logger log = LoggerFactory.getLogger(MemcachedVCacheService.class);
28  
29      private final MemcachedVCacheServiceSettings serviceSettings;
30  
31      /**
32       * Creates an instance using the supplied settings.
33       *
34       * @param settings the settings to be used for creating the instance.
35       * @since 1.3.0
36       */
37      public MemcachedVCacheService(MemcachedVCacheServiceSettings settings) {
38          super(settings.getContextSupplier(),
39                  settings.getWorkContextContextSupplier(),
40                  settings.getDefaultsProvider(),
41                  settings.getCreationHandler(),
42                  settings.getMetricsCollector(),
43                  settings.getExternalCacheKeyGenerator(),
44                  settings.getBegunTransactionalActivityHandler());
45          this.serviceSettings = requireNonNull(settings);
46      }
47  
48      @Override
49      protected Logger log() {
50          return log;
51      }
52  
53      @Override
54      protected <K, V> JvmCache<K, V> createJvmCache(String name, JvmCacheSettings settings) {
55          return new GuavaJvmCache<>(name, settings);
56      }
57  
58      @Override
59      protected <V> TransactionalExternalCache<V> createTransactionalExternalCache(String name,
60                                                                                   ExternalCacheSettings settings,
61                                                                                   MarshallingPair<V> valueMarshalling,
62                                                                                   boolean valueSerializable) {
63          if (serviceSettings.getDontExternaliseCache().apply(name)) {
64              log.trace("Cache {}: not being externalised", name);
65              return new GuavaTransactionalExternalCache<>(
66                      name,
67                      GuavaUtils.buildDelegate(settings),
68                      threadLocalContextSupplier,
69                      externalCacheKeyGenerator,
70                      (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
71                      transactionControlManager,
72                      metricsCollector);
73          }
74  
75          return new MemcachedTransactionalExternalCache<>(
76                  serviceSettings.getClientSupplier(),
77                  threadLocalContextSupplier,
78                  externalCacheKeyGenerator,
79                  name,
80                  valueMarshalling,
81                  settings,
82                  transactionControlManager,
83                  metricsCollector);
84      }
85  
86      @Override
87      protected <V> StableReadExternalCache<V> createStableReadExternalCache(String name,
88                                                                             ExternalCacheSettings settings,
89                                                                             MarshallingPair<V> valueMarshalling,
90                                                                             boolean valueSerializable) {
91          if (serviceSettings.getDontExternaliseCache().apply(name)) {
92              log.trace("Cache {}: not being externalised", name);
93              return new GuavaStableReadExternalCache<>(
94                      name,
95                      GuavaUtils.buildDelegate(settings),
96                      threadLocalContextSupplier,
97                      externalCacheKeyGenerator,
98                      (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling),
99                      metricsCollector);
100         }
101 
102         return new MemcachedStableReadExternalCache<>(
103                 serviceSettings.getClientSupplier(),
104                 threadLocalContextSupplier,
105                 externalCacheKeyGenerator,
106                 name,
107                 valueMarshalling,
108                 settings,
109                 metricsCollector);
110     }
111 
112     @Override
113     protected <V> DirectExternalCache<V> createDirectExternalCache(String name,
114                                                                    ExternalCacheSettings settings,
115                                                                    MarshallingPair<V> valueMarshalling,
116                                                                    boolean valueSerializable) {
117         if (serviceSettings.getDontExternaliseCache().apply(name)) {
118             log.trace("Cache {}: not being externalised", name);
119             return new GuavaDirectExternalCache<>(
120                     name,
121                     GuavaUtils.buildDelegate(settings),
122                     threadLocalContextSupplier,
123                     externalCacheKeyGenerator,
124                     (serviceSettings.isSerializationHack() && valueSerializable) ? Optional.empty() : Optional.of(valueMarshalling));
125         }
126         return new MemcachedDirectExternalCache<>(
127                 serviceSettings.getClientSupplier(),
128                 threadLocalContextSupplier,
129                 externalCacheKeyGenerator,
130                 name,
131                 valueMarshalling,
132                 settings);
133     }
134 }