View Javadoc

1   package com.atlassian.vcache.internal.core;
2   
3   import com.atlassian.vcache.ChangeRate;
4   import com.atlassian.vcache.ExternalCacheSettings;
5   import com.atlassian.vcache.ExternalCacheSettingsBuilder;
6   import com.atlassian.vcache.JvmCacheSettings;
7   import com.atlassian.vcache.JvmCacheSettingsBuilder;
8   import com.atlassian.vcache.VCacheException;
9   import com.atlassian.vcache.internal.ExternalCacheDetails;
10  import com.atlassian.vcache.internal.JvmCacheDetails;
11  import com.atlassian.vcache.internal.VCacheCreationHandler;
12  import org.slf4j.Logger;
13  import org.slf4j.LoggerFactory;
14  
15  import java.time.Duration;
16  import java.util.Optional;
17  
18  import static java.util.Objects.requireNonNull;
19  
20  /**
21   * Implementation of {@link VCacheCreationHandler} that enforces maximum allowed values.
22   *
23   * @since 1.0.0
24   */
25  public class DefaultVCacheCreationHandler implements VCacheCreationHandler {
26      private static final Logger log = LoggerFactory.getLogger(DefaultVCacheCreationHandler.class);
27  
28      private final int maxEntries;
29      private final Duration maxDefaultTtl;
30      private final int maxEntryCountHint;
31      private final ChangeRate defaultDataChangeRateHint;
32      private final ChangeRate defaultEntryGrowthRateHint;
33  
34  
35      public DefaultVCacheCreationHandler(
36              int maxEntries,
37              Duration maxDefaultTtl,
38              int maxEntryCountHint,
39              ChangeRate defaultDataChangeRateHint,
40              ChangeRate defaultEntryGrowthRateHint) {
41          this.maxEntries = maxEntries;
42          this.maxDefaultTtl = requireNonNull(maxDefaultTtl);
43          this.maxEntryCountHint = maxEntryCountHint;
44          this.defaultDataChangeRateHint = requireNonNull(defaultDataChangeRateHint);
45          this.defaultEntryGrowthRateHint = requireNonNull(defaultEntryGrowthRateHint);
46      }
47  
48      @Override
49      public JvmCacheSettings jvmCacheCreation(JvmCacheDetails details) throws VCacheException {
50          final JvmCacheSettings candidateSettings = details.getSettings();
51          final JvmCacheSettingsBuilder bob = new JvmCacheSettingsBuilder(candidateSettings);
52  
53          enforceInteger(candidateSettings.getMaxEntries(), maxEntryCountHint, () -> {
54              log.trace("Cache {}: forcing maxEntries to be {}", details.getName(), maxEntries);
55              bob.maxEntries(maxEntries);
56          });
57  
58          enforceDuration(candidateSettings.getDefaultTtl(), maxDefaultTtl, () -> {
59              log.trace("Cache {}: forcing defaultTtl to be {}", details.getName(), maxDefaultTtl);
60              bob.defaultTtl(maxDefaultTtl);
61          });
62  
63          return bob.build();
64      }
65  
66      @Override
67      public void requestCacheCreation(String name) {
68          // Just allow it
69      }
70  
71      @Override
72      public ExternalCacheSettings externalCacheCreation(ExternalCacheDetails details) {
73          final ExternalCacheSettings candidateSettings = details.getSettings();
74          final ExternalCacheSettingsBuilder bob = new ExternalCacheSettingsBuilder(candidateSettings);
75  
76          enforceDuration(candidateSettings.getDefaultTtl(), maxDefaultTtl, () -> {
77              log.trace("Cache {}: forcing defaultTtl to be {}", details.getName(), maxDefaultTtl);
78              bob.defaultTtl(maxDefaultTtl);
79          });
80  
81          enforceInteger(candidateSettings.getEntryCountHint(), maxEntryCountHint, () -> {
82              log.trace("Cache {}: forcing entryCountHint to be {}", details.getName(), maxEntryCountHint);
83              bob.entryCountHint(maxEntryCountHint);
84          });
85  
86          enforceRate(candidateSettings.getDataChangeRateHint(), () -> {
87              log.trace("Cache {}: forcing dataChangeRateHint to be {}", details.getName(), defaultDataChangeRateHint);
88              bob.dataChangeRateHint(defaultDataChangeRateHint);
89          });
90          enforceRate(candidateSettings.getEntryGrowthRateHint(), () -> {
91              log.trace("Cache {}: forcing entryGrowthRateHint to be {}", details.getName(), defaultEntryGrowthRateHint);
92              bob.entryGrowthRateHint(defaultEntryGrowthRateHint);
93          });
94  
95          return bob.build();
96      }
97  
98      private void enforceDuration(Optional<Duration> opt, Duration max, Runnable handler) {
99          if (!opt.isPresent() || (opt.get().compareTo(max) > 0)) {
100             handler.run();
101         }
102     }
103 
104     private void enforceInteger(Optional<Integer> opt, int max, Runnable handler) {
105         if (!opt.isPresent() || (opt.get() > max)) {
106             handler.run();
107         }
108     }
109 
110     private void enforceRate(Optional<ChangeRate> opt, Runnable handler) {
111         if (!opt.isPresent()) {
112             handler.run();
113         }
114     }
115 }