1 package com.atlassian.vcache.internal.memcached;
2
3 import com.atlassian.vcache.internal.BegunTransactionalActivityHandler;
4 import com.atlassian.vcache.internal.ExternalCacheExceptionListener;
5 import com.atlassian.vcache.internal.RequestContext;
6 import com.atlassian.vcache.internal.VCacheCreationHandler;
7 import com.atlassian.vcache.internal.VCacheSettingsDefaultsProvider;
8 import com.atlassian.vcache.internal.core.ExternalCacheKeyGenerator;
9 import com.atlassian.vcache.internal.core.Sha1ExternalCacheKeyGenerator;
10 import com.atlassian.vcache.internal.core.metrics.DefaultMetricsCollector;
11 import com.atlassian.vcache.internal.core.metrics.MetricsCollector;
12 import net.spy.memcached.MemcachedClientIF;
13
14 import java.time.Duration;
15 import java.util.function.Function;
16 import java.util.function.Supplier;
17
18 import static java.util.Objects.requireNonNull;
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 public class MemcachedVCacheServiceSettingsBuilder {
35 private Supplier<MemcachedClientIF> clientSupplier;
36 private Supplier<RequestContext> threadLocalContextSupplier;
37 private Supplier<RequestContext> workContextContextSupplier;
38 private VCacheSettingsDefaultsProvider defaultsProvider;
39 private VCacheCreationHandler creationHandler;
40 private MetricsCollector metricsCollector;
41 private ExternalCacheKeyGenerator externalCacheKeyGenerator;
42
43 private BegunTransactionalActivityHandler begunTransactionalActivityHandler = context -> {
44 };
45
46 private Function<String, Boolean> dontExternaliseCache = name -> false;
47
48 private boolean serializationHack;
49
50 @SuppressWarnings("checkstyle:MagicNumber")
51 private Duration lockTimeout = Duration.ofSeconds(30);
52
53 private ExternalCacheExceptionListener externalCacheExceptionListener = (n, ex) -> {};
54
55
56
57
58
59
60
61 public MemcachedVCacheServiceSettingsBuilder clientSupplier(Supplier<MemcachedClientIF> clientSupplier) {
62 this.clientSupplier = requireNonNull(clientSupplier);
63 return this;
64 }
65
66
67
68
69
70
71
72 public MemcachedVCacheServiceSettingsBuilder threadLocalContextSupplier(Supplier<RequestContext> threadLocalContextSupplier) {
73 this.threadLocalContextSupplier = requireNonNull(threadLocalContextSupplier);
74 return this;
75 }
76
77
78
79
80
81
82
83 public MemcachedVCacheServiceSettingsBuilder workContextContextSupplier(Supplier<RequestContext> contextSupplier) {
84 this.workContextContextSupplier = contextSupplier;
85 return this;
86 }
87
88
89
90
91
92
93
94 public MemcachedVCacheServiceSettingsBuilder defaultsProvider(VCacheSettingsDefaultsProvider defaultsProvider) {
95 this.defaultsProvider = requireNonNull(defaultsProvider);
96 return this;
97 }
98
99
100
101
102
103
104
105 public MemcachedVCacheServiceSettingsBuilder creationHandler(VCacheCreationHandler creationHandler) {
106 this.creationHandler = requireNonNull(creationHandler);
107 return this;
108 }
109
110
111
112
113
114
115
116
117 public MemcachedVCacheServiceSettingsBuilder metricsCollector(MetricsCollector metricsCollector) {
118 this.metricsCollector = requireNonNull(metricsCollector);
119 return this;
120 }
121
122
123
124
125
126
127
128
129 public MemcachedVCacheServiceSettingsBuilder productIdentifier(String productIdentifier) {
130 this.externalCacheKeyGenerator = new Sha1ExternalCacheKeyGenerator(productIdentifier);
131 return this;
132 }
133
134
135
136
137
138
139
140 public MemcachedVCacheServiceSettingsBuilder externalCacheKeyGenerator(ExternalCacheKeyGenerator externalCacheKeyGenerator) {
141 this.externalCacheKeyGenerator = requireNonNull(externalCacheKeyGenerator);
142 return this;
143 }
144
145
146
147
148
149
150
151
152 public MemcachedVCacheServiceSettingsBuilder begunTransactionalActivityHandler(BegunTransactionalActivityHandler handler) {
153 this.begunTransactionalActivityHandler = requireNonNull(handler);
154 return this;
155 }
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173 public MemcachedVCacheServiceSettingsBuilder dontExternaliseCache(Function<String, Boolean> dontExternaliseCache) {
174 this.dontExternaliseCache = requireNonNull(dontExternaliseCache);
175 return this;
176 }
177
178
179
180
181
182
183 public MemcachedVCacheServiceSettingsBuilder enableSerializationHack() {
184 serializationHack = true;
185 return this;
186 }
187
188
189
190
191
192
193 public MemcachedVCacheServiceSettingsBuilder lockTimeout(Duration lockTimeout) {
194 this.lockTimeout = requireNonNull(lockTimeout);
195 return this;
196 }
197
198
199
200
201
202
203
204 public MemcachedVCacheServiceSettingsBuilder externalCacheExceptionListener(ExternalCacheExceptionListener externalCacheExceptionListener) {
205 this.externalCacheExceptionListener = requireNonNull(externalCacheExceptionListener);
206 return this;
207 }
208
209
210
211
212
213
214 public MemcachedVCacheServiceSettings build() {
215 return new MemcachedVCacheServiceSettings(
216 requireNonNull(clientSupplier, "missing clientSupplier"),
217 requireNonNull(threadLocalContextSupplier, "missing threadLocalContextSupplier"),
218 requireNonNull(workContextContextSupplier, "missing thread safe workContextContextSupplier"),
219 requireNonNull(defaultsProvider, "missing defaultsProvider"),
220 requireNonNull(creationHandler, "missing creationHandler"),
221 (metricsCollector != null) ? metricsCollector : new DefaultMetricsCollector(threadLocalContextSupplier),
222 requireNonNull(externalCacheKeyGenerator, "missing externalCacheKeyGenerator"),
223 begunTransactionalActivityHandler,
224 dontExternaliseCache,
225 serializationHack,
226 lockTimeout,
227 externalCacheExceptionListener);
228 }
229 }