Skip to content

Commit e5f7e59

Browse files
committed
[1.9.x] Maven filters daemon friendly
Filters are not daemon friendly; move everything under session. Components are singletons, and use of `RemoteRepository` as key across sessions is something not recommended.
1 parent 09c3fa9 commit e5f7e59

File tree

2 files changed

+85
-34
lines changed

2 files changed

+85
-34
lines changed

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/filter/GroupIdRemoteRepositoryFilterSource.java

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.util.Set;
3636
import java.util.TreeSet;
3737
import java.util.concurrent.ConcurrentHashMap;
38+
import java.util.concurrent.ConcurrentMap;
3839
import java.util.concurrent.atomic.AtomicBoolean;
3940

4041
import org.eclipse.aether.MultiRuntimeException;
@@ -85,19 +86,27 @@ public final class GroupIdRemoteRepositoryFilterSource extends RemoteRepositoryF
8586

8687
private final RepositorySystemLifecycle repositorySystemLifecycle;
8788

88-
private final ConcurrentHashMap<Path, Set<String>> rules;
89-
90-
private final ConcurrentHashMap<Path, Boolean> changedRules;
91-
92-
private final AtomicBoolean onShutdownHandlerRegistered;
93-
9489
@Inject
9590
public GroupIdRemoteRepositoryFilterSource(RepositorySystemLifecycle repositorySystemLifecycle) {
9691
super(NAME);
9792
this.repositorySystemLifecycle = requireNonNull(repositorySystemLifecycle);
98-
this.rules = new ConcurrentHashMap<>();
99-
this.changedRules = new ConcurrentHashMap<>();
100-
this.onShutdownHandlerRegistered = new AtomicBoolean(false);
93+
}
94+
95+
@SuppressWarnings("unchecked")
96+
private ConcurrentMap<Path, Set<String>> rules(RepositorySystemSession session) {
97+
return (ConcurrentMap<Path, Set<String>>)
98+
session.getData().computeIfAbsent(getClass().getName() + ".rules", ConcurrentHashMap::new);
99+
}
100+
101+
@SuppressWarnings("unchecked")
102+
private ConcurrentMap<Path, Boolean> changedRules(RepositorySystemSession session) {
103+
return (ConcurrentMap<Path, Boolean>)
104+
session.getData().computeIfAbsent(getClass().getName() + ".changedRules", ConcurrentHashMap::new);
105+
}
106+
107+
private AtomicBoolean onShutdownHandlerRegistered(RepositorySystemSession session) {
108+
return (AtomicBoolean) session.getData()
109+
.computeIfAbsent(getClass().getName() + ".onShutdownHandlerRegistered", AtomicBoolean::new);
101110
}
102111

103112
@Override
@@ -111,19 +120,19 @@ public RemoteRepositoryFilter getRemoteRepositoryFilter(RepositorySystemSession
111120
@Override
112121
public void postProcess(RepositorySystemSession session, List<ArtifactResult> artifactResults) {
113122
if (isEnabled(session) && isRecord(session)) {
114-
if (onShutdownHandlerRegistered.compareAndSet(false, true)) {
115-
repositorySystemLifecycle.addOnSystemEndedHandler(this::saveRecordedLines);
123+
if (onShutdownHandlerRegistered(session).compareAndSet(false, true)) {
124+
repositorySystemLifecycle.addOnSystemEndedHandler(() -> saveRecordedLines(session));
116125
}
117126
for (ArtifactResult artifactResult : artifactResults) {
118127
if (artifactResult.isResolved() && artifactResult.getRepository() instanceof RemoteRepository) {
119128
Path filePath = filePath(
120129
getBasedir(session, false),
121130
artifactResult.getRepository().getId());
122-
boolean newGroupId = rules.computeIfAbsent(
123-
filePath, f -> Collections.synchronizedSet(new TreeSet<>()))
131+
boolean newGroupId = rules(session)
132+
.computeIfAbsent(filePath, f -> Collections.synchronizedSet(new TreeSet<>()))
124133
.add(artifactResult.getArtifact().getGroupId());
125134
if (newGroupId) {
126-
changedRules.put(filePath, Boolean.TRUE);
135+
changedRules(session).put(filePath, Boolean.TRUE);
127136
}
128137
}
129138
}
@@ -139,7 +148,7 @@ private Path filePath(Path basedir, String remoteRepositoryId) {
139148

140149
private Set<String> cacheRules(RepositorySystemSession session, RemoteRepository remoteRepository) {
141150
Path filePath = filePath(getBasedir(session, false), remoteRepository.getId());
142-
return rules.computeIfAbsent(filePath, r -> {
151+
return rules(session).computeIfAbsent(filePath, r -> {
143152
Set<String> rules = loadRepositoryRules(filePath);
144153
if (rules != NOT_PRESENT) {
145154
LOGGER.info("Loaded {} groupId for remote repository {}", rules.size(), remoteRepository.getId());
@@ -212,15 +221,15 @@ private boolean isRecord(RepositorySystemSession session) {
212221
/**
213222
* On-close handler that saves recorded rules, if any.
214223
*/
215-
private void saveRecordedLines() {
216-
if (changedRules.isEmpty()) {
224+
private void saveRecordedLines(RepositorySystemSession session) {
225+
if (changedRules(session).isEmpty()) {
217226
return;
218227
}
219228

220229
ArrayList<Exception> exceptions = new ArrayList<>();
221-
for (Map.Entry<Path, Set<String>> entry : rules.entrySet()) {
230+
for (Map.Entry<Path, Set<String>> entry : rules(session).entrySet()) {
222231
Path filePath = entry.getKey();
223-
if (changedRules.get(filePath) != Boolean.TRUE) {
232+
if (changedRules(session).get(filePath) != Boolean.TRUE) {
224233
continue;
225234
}
226235
Set<String> recordedLines = entry.getValue();

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/filter/PrefixesRemoteRepositoryFilterSource.java

Lines changed: 57 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.io.FileNotFoundException;
2727
import java.io.IOException;
2828
import java.io.UncheckedIOException;
29+
import java.net.URI;
2930
import java.nio.charset.StandardCharsets;
3031
import java.nio.file.Files;
3132
import java.nio.file.Path;
@@ -34,11 +35,13 @@
3435
import java.util.HashMap;
3536
import java.util.List;
3637
import java.util.concurrent.ConcurrentHashMap;
38+
import java.util.concurrent.ConcurrentMap;
3739

3840
import org.eclipse.aether.RepositorySystemSession;
3941
import org.eclipse.aether.artifact.Artifact;
4042
import org.eclipse.aether.metadata.Metadata;
4143
import org.eclipse.aether.repository.RemoteRepository;
44+
import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory;
4245
import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilter;
4346
import org.eclipse.aether.spi.connector.layout.RepositoryLayout;
4447
import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
@@ -85,16 +88,22 @@ public final class PrefixesRemoteRepositoryFilterSource extends RemoteRepository
8588

8689
private final RepositoryLayoutProvider repositoryLayoutProvider;
8790

88-
private final ConcurrentHashMap<RemoteRepository, Node> prefixes;
89-
90-
private final ConcurrentHashMap<RemoteRepository, RepositoryLayout> layouts;
91-
9291
@Inject
9392
public PrefixesRemoteRepositoryFilterSource(RepositoryLayoutProvider repositoryLayoutProvider) {
9493
super(NAME);
9594
this.repositoryLayoutProvider = requireNonNull(repositoryLayoutProvider);
96-
this.prefixes = new ConcurrentHashMap<>();
97-
this.layouts = new ConcurrentHashMap<>();
95+
}
96+
97+
@SuppressWarnings("unchecked")
98+
private ConcurrentMap<RemoteRepository, Node> prefixes(RepositorySystemSession session) {
99+
return (ConcurrentMap<RemoteRepository, Node>)
100+
session.getData().computeIfAbsent(getClass().getName() + ".prefixes", ConcurrentHashMap::new);
101+
}
102+
103+
@SuppressWarnings("unchecked")
104+
private ConcurrentMap<RemoteRepository, RepositoryLayout> layouts(RepositorySystemSession session) {
105+
return (ConcurrentMap<RemoteRepository, RepositoryLayout>)
106+
session.getData().computeIfAbsent(getClass().getName() + ".layouts", ConcurrentHashMap::new);
98107
}
99108

100109
@Override
@@ -106,25 +115,26 @@ public RemoteRepositoryFilter getRemoteRepositoryFilter(RepositorySystemSession
106115
}
107116

108117
/**
109-
* Caches layout instances for remote repository. In case of unknown layout it returns {@code null}.
118+
* Caches layout instances for remote repository. In case of unknown layout it returns {@link #NOT_SUPPORTED}.
110119
*
111-
* @return the layout instance of {@code null} if layout not supported.
120+
* @return the layout instance of {@link #NOT_SUPPORTED} if layout not supported.
112121
*/
113122
private RepositoryLayout cacheLayout(RepositorySystemSession session, RemoteRepository remoteRepository) {
114-
return layouts.computeIfAbsent(remoteRepository, r -> {
123+
return layouts(session).computeIfAbsent(remoteRepository, r -> {
115124
try {
116125
return repositoryLayoutProvider.newRepositoryLayout(session, remoteRepository);
117126
} catch (NoRepositoryLayoutException e) {
118-
return null;
127+
return NOT_SUPPORTED;
119128
}
120129
});
121130
}
122131

123132
/**
124133
* Caches prefixes instances for remote repository.
125134
*/
126-
private Node cacheNode(Path basedir, RemoteRepository remoteRepository) {
127-
return prefixes.computeIfAbsent(remoteRepository, r -> loadRepositoryPrefixes(basedir, remoteRepository));
135+
private Node cacheNode(RepositorySystemSession session, Path basedir, RemoteRepository remoteRepository) {
136+
return prefixes(session)
137+
.computeIfAbsent(remoteRepository, r -> loadRepositoryPrefixes(basedir, remoteRepository));
128138
}
129139

130140
/**
@@ -173,7 +183,7 @@ private PrefixesFilter(RepositorySystemSession session, Path basedir) {
173183
@Override
174184
public Result acceptArtifact(RemoteRepository remoteRepository, Artifact artifact) {
175185
RepositoryLayout repositoryLayout = cacheLayout(session, remoteRepository);
176-
if (repositoryLayout == null) {
186+
if (repositoryLayout == NOT_SUPPORTED) {
177187
return new SimpleResult(true, "Unsupported layout: " + remoteRepository);
178188
}
179189
return acceptPrefix(
@@ -184,7 +194,7 @@ public Result acceptArtifact(RemoteRepository remoteRepository, Artifact artifac
184194
@Override
185195
public Result acceptMetadata(RemoteRepository remoteRepository, Metadata metadata) {
186196
RepositoryLayout repositoryLayout = cacheLayout(session, remoteRepository);
187-
if (repositoryLayout == null) {
197+
if (repositoryLayout == NOT_SUPPORTED) {
188198
return new SimpleResult(true, "Unsupported layout: " + remoteRepository);
189199
}
190200
return acceptPrefix(
@@ -193,7 +203,7 @@ public Result acceptMetadata(RemoteRepository remoteRepository, Metadata metadat
193203
}
194204

195205
private Result acceptPrefix(RemoteRepository remoteRepository, String path) {
196-
Node root = cacheNode(basedir, remoteRepository);
206+
Node root = cacheNode(session, basedir, remoteRepository);
197207
if (NOT_PRESENT_NODE == root) {
198208
return NOT_PRESENT_RESULT;
199209
}
@@ -222,6 +232,38 @@ private Result acceptPrefix(RemoteRepository remoteRepository, String path) {
222232
private static final RemoteRepositoryFilter.Result NOT_PRESENT_RESULT =
223233
new SimpleResult(true, "Prefix file not present");
224234

235+
private static final RepositoryLayout NOT_SUPPORTED = new RepositoryLayout() {
236+
@Override
237+
public List<ChecksumAlgorithmFactory> getChecksumAlgorithmFactories() {
238+
throw new UnsupportedOperationException();
239+
}
240+
241+
@Override
242+
public boolean hasChecksums(Artifact artifact) {
243+
throw new UnsupportedOperationException();
244+
}
245+
246+
@Override
247+
public URI getLocation(Artifact artifact, boolean upload) {
248+
throw new UnsupportedOperationException();
249+
}
250+
251+
@Override
252+
public URI getLocation(Metadata metadata, boolean upload) {
253+
throw new UnsupportedOperationException();
254+
}
255+
256+
@Override
257+
public List<ChecksumLocation> getChecksumLocations(Artifact artifact, boolean upload, URI location) {
258+
throw new UnsupportedOperationException();
259+
}
260+
261+
@Override
262+
public List<ChecksumLocation> getChecksumLocations(Metadata metadata, boolean upload, URI location) {
263+
throw new UnsupportedOperationException();
264+
}
265+
};
266+
225267
private static class Node {
226268
private final String name;
227269

0 commit comments

Comments
 (0)