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
22
23
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
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 }