Use SessionData for cache storage (#930) · apache/maven-enforcer@27e1f46 (original) (raw)
`@@ -18,8 +18,9 @@
`
18
18
` */
`
19
19
`package org.apache.maven.plugins.enforcer.internal;
`
20
20
``
21
``
`-
import javax.annotation.PreDestroy;
`
``
21
`+
import javax.inject.Inject;
`
22
22
`import javax.inject.Named;
`
``
23
`+
import javax.inject.Provider;
`
23
24
`import javax.inject.Singleton;
`
24
25
``
25
26
`import java.util.ArrayList;
`
`@@ -28,6 +29,8 @@
`
28
29
`import java.util.Map;
`
29
30
``
30
31
`import org.apache.maven.enforcer.rule.api.AbstractEnforcerRule;
`
``
32
`+
import org.apache.maven.execution.MavenSession;
`
``
33
`+
import org.eclipse.aether.SessionData;
`
31
34
`import org.slf4j.Logger;
`
32
35
`import org.slf4j.LoggerFactory;
`
33
36
``
`@@ -43,8 +46,14 @@ public class EnforcerRuleCache {
`
43
46
``
44
47
`private final Logger logger = LoggerFactory.getLogger(EnforcerRuleCache.class);
`
45
48
``
46
``
`-
private final Map<Class<? extends AbstractEnforcerRule>, List> cache = new HashMap<>();
`
``
49
`+
private final Provider sessionProvider;
`
47
50
``
``
51
`+
@Inject
`
``
52
`+
EnforcerRuleCache(Provider sessionProvider) {
`
``
53
`+
this.sessionProvider = sessionProvider;
`
``
54
`+
}
`
``
55
+
``
56
`+
@SuppressWarnings("unchecked")
`
48
57
`public boolean isCached(AbstractEnforcerRule rule) {
`
49
58
``
50
59
`String cacheId = rule.getCacheId();
`
`@@ -56,7 +65,19 @@ public boolean isCached(AbstractEnforcerRule rule) {
`
56
65
`Class<? extends AbstractEnforcerRule> ruleClass = rule.getClass();
`
57
66
`logger.debug("Check cache for {} with id {}", ruleClass, cacheId);
`
58
67
``
``
68
`+
SessionData sessionData = sessionProvider.get().getRepositorySession().getData();
`
``
69
+
59
70
`synchronized (this) {
`
``
71
+
``
72
`+
// sessionData.computeIfAbsent() is available in Maven 3.9.x, so do it manually
`
``
73
`+
Map<Class<? extends AbstractEnforcerRule>, List> cache =
`
``
74
`+
(Map<Class<? extends AbstractEnforcerRule>, List>) sessionData.get("enforcer-cache");
`
``
75
+
``
76
`+
if (cache == null) {
`
``
77
`+
cache = new HashMap<>();
`
``
78
`+
sessionData.set("enforcer-cache", cache);
`
``
79
`+
}
`
``
80
+
60
81
`List cacheIdList = cache.computeIfAbsent(ruleClass, k -> new ArrayList<>());
`
61
82
`if (cacheIdList.contains(cacheId)) {
`
62
83
`logger.debug("Already cached {} with id {}", ruleClass, cacheId);
`
`@@ -68,11 +89,4 @@ public boolean isCached(AbstractEnforcerRule rule) {
`
68
89
``
69
90
`return false;
`
70
91
` }
`
71
``
-
72
``
`-
@PreDestroy
`
73
``
`-
public void cleanup() {
`
74
``
`-
synchronized (this) {
`
75
``
`-
cache.clear();
`
76
``
`-
}
`
77
``
`-
}
`
78
92
`}
`