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

`}

`