From b07f4a0c78dd23641ed3e995b8cc3dd8c4b107e5 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 8 Dec 2023 17:26:00 +0100 Subject: [PATCH 1/3] [MRESOLVER-450] Enhance RepositoryCache Enhance RepositoryCache --- https://issues.apache.org/jira/browse/MRESOLVER-450 --- .../org/eclipse/aether/DefaultRepositoryCache.java | 8 +++++++- .../java/org/eclipse/aether/RepositoryCache.java | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java b/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java index de8c4dc9a..d7c62c475 100644 --- a/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java +++ b/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; /** * A simplistic repository cache backed by a thread-safe map. The simplistic nature of this cache makes it only suitable @@ -27,7 +28,7 @@ */ public final class DefaultRepositoryCache implements RepositoryCache { - private final Map cache = new ConcurrentHashMap<>(256); + private final ConcurrentHashMap cache = new ConcurrentHashMap<>(256); public Object get(RepositorySystemSession session, Object key) { return cache.get(key); @@ -40,4 +41,9 @@ public void put(RepositorySystemSession session, Object key, Object data) { cache.remove(key); } } + + @Override + public Object computeIfAbsent(RepositorySystemSession session, Object key, Supplier supplier) { + return cache.computeIfAbsent(key, k -> supplier.get()); + } } diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/RepositoryCache.java b/maven-resolver-api/src/main/java/org/eclipse/aether/RepositoryCache.java index 9bf6268f0..ef74e47a7 100644 --- a/maven-resolver-api/src/main/java/org/eclipse/aether/RepositoryCache.java +++ b/maven-resolver-api/src/main/java/org/eclipse/aether/RepositoryCache.java @@ -18,6 +18,8 @@ */ package org.eclipse.aether; +import java.util.function.Supplier; + /** * Caches auxiliary data used during repository access like already processed metadata. The data in the cache is meant * for exclusive consumption by the repository system and is opaque to the cache implementation. Note: @@ -53,4 +55,14 @@ public interface RepositoryCache { * @return The requested data or {@code null} if none was present in the cache. */ Object get(RepositorySystemSession session, Object key); + + /** + * Retrieve or compute the data associated with the specified key. + * + * @param key The key for which to retrieve the session data, must not be {@code null}. + * @param supplier The supplier will compute the new value, must not be {@code null}. + * @return The cache data associated with the key. + * @since 2.0.0 + */ + Object computeIfAbsent(RepositorySystemSession session, Object key, Supplier supplier); } From cdc6c925f5f60b71e593b3e24addef79d19093b6 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 8 Dec 2023 18:07:09 +0100 Subject: [PATCH 2/3] Reformat --- .../src/main/java/org/eclipse/aether/DefaultRepositoryCache.java | 1 - 1 file changed, 1 deletion(-) diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java b/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java index d7c62c475..e0f6d5052 100644 --- a/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java +++ b/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultRepositoryCache.java @@ -18,7 +18,6 @@ */ package org.eclipse.aether; -import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; From b7a6462789fc3cf2d9532780d88ef9279a69a5ee Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 8 Dec 2023 18:14:05 +0100 Subject: [PATCH 3/3] This iface is safe as data But lacked warning to not implement it --- .../src/main/java/org/eclipse/aether/RepositoryCache.java | 2 ++ pom.xml | 1 + 2 files changed, 3 insertions(+) diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/RepositoryCache.java b/maven-resolver-api/src/main/java/org/eclipse/aether/RepositoryCache.java index ef74e47a7..565048c8e 100644 --- a/maven-resolver-api/src/main/java/org/eclipse/aether/RepositoryCache.java +++ b/maven-resolver-api/src/main/java/org/eclipse/aether/RepositoryCache.java @@ -26,6 +26,8 @@ * Actual cache implementations must be thread-safe. * * @see RepositorySystemSession#getCache() + * @noimplement This interface is not intended to be implemented by clients. + * @noextend This interface is not intended to be extended by clients. */ public interface RepositoryCache { diff --git a/pom.xml b/pom.xml index 178a31526..602423fc2 100644 --- a/pom.xml +++ b/pom.xml @@ -299,6 +299,7 @@ + org.eclipse.aether.RepositoryCache org.eclipse.aether.RepositoryListener org.eclipse.aether.RepositorySystem org.eclipse.aether.RepositorySystemSession