This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git


The following commit(s) were added to refs/heads/master by this push:
     new 425fb0b36 Make filters daemon friendly (#1681)
425fb0b36 is described below

commit 425fb0b36d88eb41b2a5ca549edaa249aa6dde9e
Author: Tamas Cservenak <[email protected]>
AuthorDate: Thu Nov 20 17:41:16 2025 +0100

    Make filters daemon friendly (#1681)
    
    Filters are not daemon friendly; move everything under session. Components 
are singletons, and use of `RemoteRepository` as key across sessions is 
something not recommended. For that GURK is needed.
---
 .../GroupIdRemoteRepositoryFilterSource.java       | 58 +++++++++------
 .../PrefixesRemoteRepositoryFilterSource.java      | 86 ++++++++++++++++------
 2 files changed, 100 insertions(+), 44 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 844616bcf..3d6643876 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
@@ -33,6 +33,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 java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -154,23 +155,34 @@ public final class GroupIdRemoteRepositoryFilterSource 
extends RemoteRepositoryF
 
     private final PathProcessor pathProcessor;
 
-    private final ConcurrentHashMap<RemoteRepository, GroupTree> rules;
-
-    private final ConcurrentHashMap<RemoteRepository, Path> ruleFiles;
-
-    private final ConcurrentHashMap<RemoteRepository, Set<String>> 
recordedRules;
-
-    private final AtomicBoolean onShutdownHandlerRegistered;
-
     @Inject
     public GroupIdRemoteRepositoryFilterSource(
             RepositorySystemLifecycle repositorySystemLifecycle, PathProcessor 
pathProcessor) {
         this.repositorySystemLifecycle = 
requireNonNull(repositorySystemLifecycle);
         this.pathProcessor = requireNonNull(pathProcessor);
-        this.rules = new ConcurrentHashMap<>();
-        this.ruleFiles = new ConcurrentHashMap<>();
-        this.recordedRules = new ConcurrentHashMap<>();
-        this.onShutdownHandlerRegistered = new AtomicBoolean(false);
+    }
+
+    @SuppressWarnings("unchecked")
+    private ConcurrentMap<RemoteRepository, GroupTree> 
rules(RepositorySystemSession session) {
+        return (ConcurrentMap<RemoteRepository, GroupTree>)
+                session.getData().computeIfAbsent(getClass().getName() + 
".rules", ConcurrentHashMap::new);
+    }
+
+    @SuppressWarnings("unchecked")
+    private ConcurrentMap<RemoteRepository, Path> 
ruleFiles(RepositorySystemSession session) {
+        return (ConcurrentMap<RemoteRepository, Path>)
+                session.getData().computeIfAbsent(getClass().getName() + 
".ruleFiles", ConcurrentHashMap::new);
+    }
+
+    @SuppressWarnings("unchecked")
+    private ConcurrentMap<RemoteRepository, Set<String>> 
recordedRules(RepositorySystemSession session) {
+        return (ConcurrentMap<RemoteRepository, Set<String>>)
+                session.getData().computeIfAbsent(getClass().getName() + 
".recordedRules", ConcurrentHashMap::new);
+    }
+
+    private AtomicBoolean onShutdownHandlerRegistered(RepositorySystemSession 
session) {
+        return (AtomicBoolean) session.getData()
+                .computeIfAbsent(getClass().getName() + 
".onShutdownHandlerRegistered", AtomicBoolean::new);
     }
 
     @Override
@@ -206,8 +218,8 @@ 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) {
@@ -216,10 +228,11 @@ public final class GroupIdRemoteRepositoryFilterSource 
extends RemoteRepositoryF
                         ruleFile(session, remoteRepository); // populate it; 
needed for save
                         String line = "=" + 
artifactResult.getArtifact().getGroupId();
                         RemoteRepository normalized = 
normalizeRemoteRepository(session, remoteRepository);
-                        recordedRules
+                        recordedRules(session)
                                 .computeIfAbsent(normalized, k -> new 
TreeSet<>())
                                 .add(line);
-                        rules.compute(normalized, (k, v) -> {
+                        rules(session)
+                                .compute(normalized, (k, v) -> {
                                     if (v == null || v == GroupTree.SENTINEL) {
                                         v = new GroupTree("");
                                     }
@@ -233,7 +246,7 @@ public final class GroupIdRemoteRepositoryFilterSource 
extends RemoteRepositoryF
     }
 
     private Path ruleFile(RepositorySystemSession session, RemoteRepository 
remoteRepository) {
-        return ruleFiles.computeIfAbsent(normalizeRemoteRepository(session, 
remoteRepository), r -> getBasedir(
+        return 
ruleFiles(session).computeIfAbsent(normalizeRemoteRepository(session, 
remoteRepository), r -> getBasedir(
                         session, LOCAL_REPO_PREFIX_DIR, CONFIG_PROP_BASEDIR, 
false)
                 .resolve(GROUP_ID_FILE_PREFIX
                         + 
RepositoryIdHelper.cachedIdToPathSegment(session).apply(remoteRepository)
@@ -241,8 +254,9 @@ public final class GroupIdRemoteRepositoryFilterSource 
extends RemoteRepositoryF
     }
 
     private GroupTree cacheRules(RepositorySystemSession session, 
RemoteRepository remoteRepository) {
-        return rules.computeIfAbsent(
-                normalizeRemoteRepository(session, remoteRepository), r -> 
loadRepositoryRules(session, r));
+        return rules(session)
+                .computeIfAbsent(
+                        normalizeRemoteRepository(session, remoteRepository), 
r -> loadRepositoryRules(session, r));
     }
 
     private GroupTree loadRepositoryRules(RepositorySystemSession session, 
RemoteRepository remoteRepository) {
@@ -315,10 +329,10 @@ public final class GroupIdRemoteRepositoryFilterSource 
extends RemoteRepositoryF
     /**
      * On-close handler that saves recorded rules, if any.
      */
-    private void saveRecordedLines() {
+    private void saveRecordedLines(RepositorySystemSession session) {
         ArrayList<Exception> exceptions = new ArrayList<>();
-        for (Map.Entry<RemoteRepository, Path> entry : ruleFiles.entrySet()) {
-            Set<String> recorded = recordedRules.get(entry.getKey());
+        for (Map.Entry<RemoteRepository, Path> entry : 
ruleFiles(session).entrySet()) {
+            Set<String> recorded = recordedRules(session).get(entry.getKey());
             if (recorded != null && !recorded.isEmpty()) {
                 try {
                     ArrayList<String> result = new ArrayList<>();
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 854560a59..9a4b2c301 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
@@ -22,10 +22,13 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Collections;
+import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.function.Supplier;
 
 import org.eclipse.aether.DefaultRepositorySystemSession;
@@ -40,6 +43,7 @@ import org.eclipse.aether.metadata.Metadata;
 import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.resolution.MetadataRequest;
 import org.eclipse.aether.resolution.MetadataResult;
+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;
@@ -191,10 +195,6 @@ public final class PrefixesRemoteRepositoryFilterSource 
extends RemoteRepository
 
     private final RepositoryLayoutProvider repositoryLayoutProvider;
 
-    private final ConcurrentHashMap<RemoteRepository, PrefixTree> prefixes;
-
-    private final ConcurrentHashMap<RemoteRepository, RepositoryLayout> 
layouts;
-
     @Inject
     public PrefixesRemoteRepositoryFilterSource(
             Supplier<MetadataResolver> metadataResolver,
@@ -203,8 +203,18 @@ public final class PrefixesRemoteRepositoryFilterSource 
extends RemoteRepository
         this.metadataResolver = requireNonNull(metadataResolver);
         this.remoteRepositoryManager = requireNonNull(remoteRepositoryManager);
         this.repositoryLayoutProvider = 
requireNonNull(repositoryLayoutProvider);
-        this.prefixes = new ConcurrentHashMap<>();
-        this.layouts = new ConcurrentHashMap<>();
+    }
+
+    @SuppressWarnings("unchecked")
+    private ConcurrentMap<RemoteRepository, PrefixTree> 
prefixes(RepositorySystemSession session) {
+        return (ConcurrentMap<RemoteRepository, PrefixTree>)
+                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
@@ -238,25 +248,26 @@ 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 or {@link #NOT_SUPPORTED} if layout not 
supported.
      */
     private RepositoryLayout cacheLayout(RepositorySystemSession session, 
RemoteRepository remoteRepository) {
-        return layouts.computeIfAbsent(normalizeRemoteRepository(session, 
remoteRepository), r -> {
+        return 
layouts(session).computeIfAbsent(normalizeRemoteRepository(session, 
remoteRepository), r -> {
             try {
                 return repositoryLayoutProvider.newRepositoryLayout(session, 
remoteRepository);
             } catch (NoRepositoryLayoutException e) {
-                return null;
+                return NOT_SUPPORTED;
             }
         });
     }
 
     private PrefixTree cachePrefixTree(
             RepositorySystemSession session, Path basedir, RemoteRepository 
remoteRepository) {
-        return prefixes.computeIfAbsent(
-                normalizeRemoteRepository(session, remoteRepository),
-                r -> loadPrefixTree(session, basedir, remoteRepository));
+        return prefixes(session)
+                .computeIfAbsent(
+                        normalizeRemoteRepository(session, remoteRepository),
+                        r -> loadPrefixTree(session, basedir, 
remoteRepository));
     }
 
     private PrefixTree loadPrefixTree(
@@ -339,16 +350,15 @@ public final class PrefixesRemoteRepositoryFilterSource 
extends RemoteRepository
                             session, Collections.emptyList(), 
Collections.singletonList(remoteRepository), true)
                     .get(0);
             // retrieve prefix as metadata from repository
-            MetadataRequest request =
-                    new MetadataRequest(new DefaultMetadata(PREFIX_FILE_TYPE, 
Metadata.Nature.RELEASE_OR_SNAPSHOT));
-            request.setRepository(prepared);
-            request.setDeleteLocalCopyIfMissing(true);
-            request.setFavorLocalRepository(true);
             MetadataResult result = mr.resolveMetadata(
                             new DefaultRepositorySystemSession(session)
                                     .setTransferListener(null)
                                     .setConfigProperty(CONFIG_PROP_SKIPPED, 
Boolean.TRUE.toString()),
-                            Collections.singleton(request))
+                            Collections.singleton(new MetadataRequest(
+                                            new 
DefaultMetadata(PREFIX_FILE_TYPE, Metadata.Nature.RELEASE_OR_SNAPSHOT))
+                                    .setRepository(prepared)
+                                    .setDeleteLocalCopyIfMissing(true)
+                                    .setFavorLocalRepository(true)))
                     .get(0);
             if (result.isResolved()) {
                 return result.getMetadata().getPath();
@@ -371,7 +381,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(
@@ -382,7 +392,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(
@@ -392,7 +402,7 @@ public final class PrefixesRemoteRepositoryFilterSource 
extends RemoteRepository
 
         private Result acceptPrefix(RemoteRepository repository, String path) {
             PrefixTree prefixTree = cachePrefixTree(session, basedir, 
repository);
-            if (PrefixTree.SENTINEL == prefixTree) {
+            if (prefixTree == PrefixTree.SENTINEL) {
                 return NOT_PRESENT_RESULT;
             }
             if (prefixTree.acceptedPath(path)) {
@@ -405,4 +415,36 @@ 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();
+        }
+    };
 }

Reply via email to