View Javadoc

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   * An implementation of the {@link RequestContext}.
15   *
16   * @since 1.0
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          // It doesn't matter if multiple threads get the value from the supplier, it should be a relatively cheap call
31          // and it should always return the same value.
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  }