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;
 

Reply via email to