1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.project;
20
21 import javax.inject.Named;
22 import javax.inject.Singleton;
23
24 import java.util.Collections;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Objects;
28 import java.util.concurrent.ConcurrentHashMap;
29
30 import org.codehaus.plexus.classworlds.realm.ClassRealm;
31 import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
32 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Disposable;
33 import org.eclipse.aether.graph.DependencyFilter;
34
35
36
37
38 @Named
39 @Singleton
40 public class DefaultProjectRealmCache implements ProjectRealmCache, Disposable {
41
42
43
44 protected static class CacheKey implements Key {
45
46 private final List<? extends ClassRealm> extensionRealms;
47
48 private final int hashCode;
49
50 public CacheKey(List<? extends ClassRealm> extensionRealms) {
51 this.extensionRealms =
52 (extensionRealms != null) ? Collections.unmodifiableList(extensionRealms) : Collections.emptyList();
53
54 this.hashCode = this.extensionRealms.hashCode();
55 }
56
57 @Override
58 public int hashCode() {
59 return hashCode;
60 }
61
62 @Override
63 public boolean equals(Object o) {
64 if (o == this) {
65 return true;
66 }
67
68 if (o instanceof CacheKey other) {
69 return extensionRealms.equals(other.extensionRealms);
70 } else {
71 return false;
72 }
73 }
74
75 @Override
76 public String toString() {
77 return extensionRealms.toString();
78 }
79 }
80
81 protected final Map<Key, CacheRecord> cache = new ConcurrentHashMap<>();
82
83 @Override
84 public Key createKey(List<? extends ClassRealm> extensionRealms) {
85 return new CacheKey(extensionRealms);
86 }
87
88 public CacheRecord get(Key key) {
89 return cache.get(key);
90 }
91
92 public CacheRecord put(Key key, ClassRealm projectRealm, DependencyFilter extensionArtifactFilter) {
93 Objects.requireNonNull(projectRealm, "projectRealm cannot be null");
94
95 if (cache.containsKey(key)) {
96 throw new IllegalStateException("Duplicate project realm for extensions " + key);
97 }
98
99 CacheRecord record = new CacheRecord(projectRealm, extensionArtifactFilter);
100
101 cache.put(key, record);
102
103 return record;
104 }
105
106 public void flush() {
107 for (CacheRecord record : cache.values()) {
108 ClassRealm realm = record.getRealm();
109 try {
110 realm.getWorld().disposeRealm(realm.getId());
111 } catch (NoSuchRealmException e) {
112
113 }
114 }
115 cache.clear();
116 }
117
118 public void register(MavenProject project, Key key, CacheRecord record) {
119
120 }
121
122 @Override
123 public void dispose() {
124 flush();
125 }
126 }