1 package com.atlassian.vcache.internal.core;
2
3 import com.atlassian.vcache.internal.RequestContext;
4
5 import javax.annotation.Nullable;
6 import java.util.Map;
7 import java.util.Optional;
8 import java.util.concurrent.ConcurrentHashMap;
9 import java.util.function.Supplier;
10
11 import static java.util.Objects.requireNonNull;
12
13
14
15
16
17
18 public class DefaultRequestContext implements RequestContext {
19 @Nullable
20 private String partitionId;
21 private final Supplier<String> partitionIdSupplier;
22 private final Map<Object, Object> map = new ConcurrentHashMap<>();
23
24 public DefaultRequestContext(Supplier<String> partitionIdSupplier) {
25 this.partitionIdSupplier = requireNonNull(partitionIdSupplier);
26 }
27
28 @Override
29 public String partitionIdentifier() {
30
31
32 if (partitionId == null) {
33 partitionId = partitionIdSupplier.get();
34 }
35 return partitionId;
36 }
37
38 @SuppressWarnings("unchecked")
39 @Override
40 public <T> T computeIfAbsent(Object key, Supplier<T> supplier) {
41 return (T) map.computeIfAbsent(requireNonNull(key), o -> requireNonNull(supplier.get()));
42 }
43
44 @SuppressWarnings("unchecked")
45 @Override
46 public <T> Optional<T> get(Object key) {
47 return Optional.ofNullable((T) map.get(key));
48 }
49 }