This is an automated email from the ASF dual-hosted git repository.
cstamas pushed a commit to branch maven-resolver-1.9.x
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git
The following commit(s) were added to refs/heads/maven-resolver-1.9.x by this
push:
new ace32f64b [1.9.x] Maven filters daemon friendly (#1682)
ace32f64b is described below
commit ace32f64b1307d5d96c9ed3612d4b456f1a48e0d
Author: Tamas Cservenak <[email protected]>
AuthorDate: Thu Nov 20 17:40:59 2025 +0100
[1.9.x] Maven filters daemon friendly (#1682)
Filters are not daemon friendly; move everything under session.
Components are singletons, and use of `RemoteRepository` as
key across sessions is something not recommended.
---
.../GroupIdRemoteRepositoryFilterSource.java | 47 ++++++++------
.../PrefixesRemoteRepositoryFilterSource.java | 72 +++++++++++++++++-----
2 files changed, 85 insertions(+), 34 deletions(-)
diff --git
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/filter/GroupIdRemoteRepositoryFilterSource.java
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/filter/GroupIdRemoteRepositoryFilterSource.java
index 993f1fdbc..e4f88e41e 100644
---
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/filter/GroupIdRemoteRepositoryFilterSource.java
+++
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/filter/GroupIdRemoteRepositoryFilterSource.java
@@ -35,6 +35,7 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.aether.MultiRuntimeException;
@@ -85,19 +86,27 @@ public final class GroupIdRemoteRepositoryFilterSource
extends RemoteRepositoryF
private final RepositorySystemLifecycle repositorySystemLifecycle;
- private final ConcurrentHashMap<Path, Set<String>> rules;
-
- private final ConcurrentHashMap<Path, Boolean> changedRules;
-
- private final AtomicBoolean onShutdownHandlerRegistered;
-
@Inject
public GroupIdRemoteRepositoryFilterSource(RepositorySystemLifecycle
repositorySystemLifecycle) {
super(NAME);
this.repositorySystemLifecycle =
requireNonNull(repositorySystemLifecycle);
- this.rules = new ConcurrentHashMap<>();
- this.changedRules = new ConcurrentHashMap<>();
- this.onShutdownHandlerRegistered = new AtomicBoolean(false);
+ }
+
+ @SuppressWarnings("unchecked")
+ private ConcurrentMap<Path, Set<String>> rules(RepositorySystemSession
session) {
+ return (ConcurrentMap<Path, Set<String>>)
+ session.getData().computeIfAbsent(getClass().getName() +
".rules", ConcurrentHashMap::new);
+ }
+
+ @SuppressWarnings("unchecked")
+ private ConcurrentMap<Path, Boolean> changedRules(RepositorySystemSession
session) {
+ return (ConcurrentMap<Path, Boolean>)
+ session.getData().computeIfAbsent(getClass().getName() +
".changedRules", ConcurrentHashMap::new);
+ }
+
+ private AtomicBoolean onShutdownHandlerRegistered(RepositorySystemSession
session) {
+ return (AtomicBoolean) session.getData()
+ .computeIfAbsent(getClass().getName() +
".onShutdownHandlerRegistered", AtomicBoolean::new);
}
@Override
@@ -111,19 +120,19 @@ public final class GroupIdRemoteRepositoryFilterSource
extends RemoteRepositoryF
@Override
public void postProcess(RepositorySystemSession session,
List<ArtifactResult> artifactResults) {
if (isEnabled(session) && isRecord(session)) {
- if (onShutdownHandlerRegistered.compareAndSet(false, true)) {
-
repositorySystemLifecycle.addOnSystemEndedHandler(this::saveRecordedLines);
+ if (onShutdownHandlerRegistered(session).compareAndSet(false,
true)) {
+ repositorySystemLifecycle.addOnSystemEndedHandler(() ->
saveRecordedLines(session));
}
for (ArtifactResult artifactResult : artifactResults) {
if (artifactResult.isResolved() &&
artifactResult.getRepository() instanceof RemoteRepository) {
Path filePath = filePath(
getBasedir(session, false),
artifactResult.getRepository().getId());
- boolean newGroupId = rules.computeIfAbsent(
- filePath, f ->
Collections.synchronizedSet(new TreeSet<>()))
+ boolean newGroupId = rules(session)
+ .computeIfAbsent(filePath, f ->
Collections.synchronizedSet(new TreeSet<>()))
.add(artifactResult.getArtifact().getGroupId());
if (newGroupId) {
- changedRules.put(filePath, Boolean.TRUE);
+ changedRules(session).put(filePath, Boolean.TRUE);
}
}
}
@@ -139,7 +148,7 @@ public final class GroupIdRemoteRepositoryFilterSource
extends RemoteRepositoryF
private Set<String> cacheRules(RepositorySystemSession session,
RemoteRepository remoteRepository) {
Path filePath = filePath(getBasedir(session, false),
remoteRepository.getId());
- return rules.computeIfAbsent(filePath, r -> {
+ return rules(session).computeIfAbsent(filePath, r -> {
Set<String> rules = loadRepositoryRules(filePath);
if (rules != NOT_PRESENT) {
LOGGER.info("Loaded {} groupId for remote repository {}",
rules.size(), remoteRepository.getId());
@@ -212,15 +221,15 @@ public final class GroupIdRemoteRepositoryFilterSource
extends RemoteRepositoryF
/**
* On-close handler that saves recorded rules, if any.
*/
- private void saveRecordedLines() {
- if (changedRules.isEmpty()) {
+ private void saveRecordedLines(RepositorySystemSession session) {
+ if (changedRules(session).isEmpty()) {
return;
}
ArrayList<Exception> exceptions = new ArrayList<>();
- for (Map.Entry<Path, Set<String>> entry : rules.entrySet()) {
+ for (Map.Entry<Path, Set<String>> entry : rules(session).entrySet()) {
Path filePath = entry.getKey();
- if (changedRules.get(filePath) != Boolean.TRUE) {
+ if (changedRules(session).get(filePath) != Boolean.TRUE) {
continue;
}
Set<String> recordedLines = entry.getValue();
diff --git
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/filter/PrefixesRemoteRepositoryFilterSource.java
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/filter/PrefixesRemoteRepositoryFilterSource.java
index 7fa18e968..ec4da7611 100644
---
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/filter/PrefixesRemoteRepositoryFilterSource.java
+++
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/filter/PrefixesRemoteRepositoryFilterSource.java
@@ -26,6 +26,7 @@ import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UncheckedIOException;
+import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -34,11 +35,13 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.metadata.Metadata;
import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory;
import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilter;
import org.eclipse.aether.spi.connector.layout.RepositoryLayout;
import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
@@ -85,16 +88,22 @@ public final class PrefixesRemoteRepositoryFilterSource
extends RemoteRepository
private final RepositoryLayoutProvider repositoryLayoutProvider;
- private final ConcurrentHashMap<RemoteRepository, Node> prefixes;
-
- private final ConcurrentHashMap<RemoteRepository, RepositoryLayout>
layouts;
-
@Inject
public PrefixesRemoteRepositoryFilterSource(RepositoryLayoutProvider
repositoryLayoutProvider) {
super(NAME);
this.repositoryLayoutProvider =
requireNonNull(repositoryLayoutProvider);
- this.prefixes = new ConcurrentHashMap<>();
- this.layouts = new ConcurrentHashMap<>();
+ }
+
+ @SuppressWarnings("unchecked")
+ private ConcurrentMap<RemoteRepository, Node>
prefixes(RepositorySystemSession session) {
+ return (ConcurrentMap<RemoteRepository, Node>)
+ session.getData().computeIfAbsent(getClass().getName() +
".prefixes", ConcurrentHashMap::new);
+ }
+
+ @SuppressWarnings("unchecked")
+ private ConcurrentMap<RemoteRepository, RepositoryLayout>
layouts(RepositorySystemSession session) {
+ return (ConcurrentMap<RemoteRepository, RepositoryLayout>)
+ session.getData().computeIfAbsent(getClass().getName() +
".layouts", ConcurrentHashMap::new);
}
@Override
@@ -106,16 +115,16 @@ public final class PrefixesRemoteRepositoryFilterSource
extends RemoteRepository
}
/**
- * Caches layout instances for remote repository. In case of unknown
layout it returns {@code null}.
+ * Caches layout instances for remote repository. In case of unknown
layout it returns {@link #NOT_SUPPORTED}.
*
- * @return the layout instance of {@code null} if layout not supported.
+ * @return the layout instance of {@link #NOT_SUPPORTED} if layout not
supported.
*/
private RepositoryLayout cacheLayout(RepositorySystemSession session,
RemoteRepository remoteRepository) {
- return layouts.computeIfAbsent(remoteRepository, r -> {
+ return layouts(session).computeIfAbsent(remoteRepository, r -> {
try {
return repositoryLayoutProvider.newRepositoryLayout(session,
remoteRepository);
} catch (NoRepositoryLayoutException e) {
- return null;
+ return NOT_SUPPORTED;
}
});
}
@@ -123,8 +132,9 @@ public final class PrefixesRemoteRepositoryFilterSource
extends RemoteRepository
/**
* Caches prefixes instances for remote repository.
*/
- private Node cacheNode(Path basedir, RemoteRepository remoteRepository) {
- return prefixes.computeIfAbsent(remoteRepository, r ->
loadRepositoryPrefixes(basedir, remoteRepository));
+ private Node cacheNode(RepositorySystemSession session, Path basedir,
RemoteRepository remoteRepository) {
+ return prefixes(session)
+ .computeIfAbsent(remoteRepository, r ->
loadRepositoryPrefixes(basedir, remoteRepository));
}
/**
@@ -173,7 +183,7 @@ public final class PrefixesRemoteRepositoryFilterSource
extends RemoteRepository
@Override
public Result acceptArtifact(RemoteRepository remoteRepository,
Artifact artifact) {
RepositoryLayout repositoryLayout = cacheLayout(session,
remoteRepository);
- if (repositoryLayout == null) {
+ if (repositoryLayout == NOT_SUPPORTED) {
return new SimpleResult(true, "Unsupported layout: " +
remoteRepository);
}
return acceptPrefix(
@@ -184,7 +194,7 @@ public final class PrefixesRemoteRepositoryFilterSource
extends RemoteRepository
@Override
public Result acceptMetadata(RemoteRepository remoteRepository,
Metadata metadata) {
RepositoryLayout repositoryLayout = cacheLayout(session,
remoteRepository);
- if (repositoryLayout == null) {
+ if (repositoryLayout == NOT_SUPPORTED) {
return new SimpleResult(true, "Unsupported layout: " +
remoteRepository);
}
return acceptPrefix(
@@ -193,7 +203,7 @@ public final class PrefixesRemoteRepositoryFilterSource
extends RemoteRepository
}
private Result acceptPrefix(RemoteRepository remoteRepository, String
path) {
- Node root = cacheNode(basedir, remoteRepository);
+ Node root = cacheNode(session, basedir, remoteRepository);
if (NOT_PRESENT_NODE == root) {
return NOT_PRESENT_RESULT;
}
@@ -222,6 +232,38 @@ public final class PrefixesRemoteRepositoryFilterSource
extends RemoteRepository
private static final RemoteRepositoryFilter.Result NOT_PRESENT_RESULT =
new SimpleResult(true, "Prefix file not present");
+ private static final RepositoryLayout NOT_SUPPORTED = new
RepositoryLayout() {
+ @Override
+ public List<ChecksumAlgorithmFactory> getChecksumAlgorithmFactories() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean hasChecksums(Artifact artifact) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public URI getLocation(Artifact artifact, boolean upload) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public URI getLocation(Metadata metadata, boolean upload) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<ChecksumLocation> getChecksumLocations(Artifact artifact,
boolean upload, URI location) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<ChecksumLocation> getChecksumLocations(Metadata metadata,
boolean upload, URI location) {
+ throw new UnsupportedOperationException();
+ }
+ };
+
private static class Node {
private final String name;