You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2021/10/07 08:04:17 UTC
[maven-resolver] branch master updated: [MRESOLVER-204] Add a
SessionData#computeIfAbsent method (#125)
This is an automated email from the ASF dual-hosted git repository.
gnodet 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 e5c8763 [MRESOLVER-204] Add a SessionData#computeIfAbsent method (#125)
e5c8763 is described below
commit e5c8763dfe390a537911094810d0bcf4c58180eb
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Thu Oct 7 10:04:10 2021 +0200
[MRESOLVER-204] Add a SessionData#computeIfAbsent method (#125)
---
.../java/org/eclipse/aether/DefaultSessionData.java | 5 +++++
.../main/java/org/eclipse/aether/SessionData.java | 11 +++++++++++
.../org/eclipse/aether/DefaultSessionDataTest.java | 16 ++++++++++++++++
.../internal/impl/DefaultUpdateCheckManager.java | 21 +++++++++------------
.../impl/DefaultUpdateCheckManagerTest.java | 3 ++-
5 files changed, 43 insertions(+), 13 deletions(-)
diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultSessionData.java b/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultSessionData.java
index c9e07fb..ea430a5 100644
--- a/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultSessionData.java
+++ b/maven-resolver-api/src/main/java/org/eclipse/aether/DefaultSessionData.java
@@ -23,6 +23,7 @@ import static java.util.Objects.requireNonNull;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import java.util.function.Supplier;
/**
* A simple session data storage backed by a thread-safe map.
@@ -81,4 +82,8 @@ public final class DefaultSessionData
return data.get( key );
}
+ public Object computeIfAbsent( Object key, Supplier<Object> supplier )
+ {
+ return data.computeIfAbsent( key, k -> supplier.get() );
+ }
}
diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/SessionData.java b/maven-resolver-api/src/main/java/org/eclipse/aether/SessionData.java
index b6efeac..330449e 100644
--- a/maven-resolver-api/src/main/java/org/eclipse/aether/SessionData.java
+++ b/maven-resolver-api/src/main/java/org/eclipse/aether/SessionData.java
@@ -19,6 +19,8 @@ package org.eclipse.aether;
* under the License.
*/
+import java.util.function.Supplier;
+
/**
* A container for data that is specific to a repository system session. Both components within the repository system
* and clients of the system may use this storage to associate arbitrary data with a session.
@@ -63,4 +65,13 @@ public interface SessionData
*/
Object get( Object key );
+ /**
+ * Retrieve of 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.
+ * @return The session data associated with the key.
+ */
+ Object computeIfAbsent( Object key, Supplier<Object> supplier );
+
}
diff --git a/maven-resolver-api/src/test/java/org/eclipse/aether/DefaultSessionDataTest.java b/maven-resolver-api/src/test/java/org/eclipse/aether/DefaultSessionDataTest.java
index 191b73b..50b0683 100644
--- a/maven-resolver-api/src/test/java/org/eclipse/aether/DefaultSessionDataTest.java
+++ b/maven-resolver-api/src/test/java/org/eclipse/aether/DefaultSessionDataTest.java
@@ -23,6 +23,8 @@ import static org.junit.Assert.*;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Function;
+import java.util.function.Supplier;
import org.junit.Test;
@@ -46,6 +48,11 @@ public class DefaultSessionDataTest
return data.set( key, oldValue, newValue );
}
+ private Object computeIfAbsent( Object key, Supplier<Object> supplier )
+ {
+ return data.computeIfAbsent( key, supplier );
+ }
+
@Test( expected = RuntimeException.class )
public void testGet_NullKey()
{
@@ -94,6 +101,15 @@ public class DefaultSessionDataTest
assertNull( get( key ) );
}
+ @Test
+ public void testComputeIfAbsent()
+ {
+ Object key = "key";
+ assertNull( get( key ) );
+ assertEquals( "value", computeIfAbsent( key, () -> "value" ) );
+ assertEquals( "value", computeIfAbsent( key, () -> "changed" ) );
+ }
+
@Test( timeout = 10000L )
public void testConcurrency()
throws Exception
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java
index 0819df6..188d849 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java
@@ -74,7 +74,14 @@ public class DefaultUpdateCheckManager
private static final String NOT_FOUND = "";
- private static final String SESSION_CHECKS = "updateCheckManager.checks";
+ static final Object SESSION_CHECKS = new Object()
+ {
+ @Override
+ public String toString()
+ {
+ return "updateCheckManager.checks";
+ }
+ };
static final String CONFIG_PROP_SESSION_STATE = "aether.updateCheckManager.sessionState";
@@ -502,17 +509,7 @@ public class DefaultUpdateCheckManager
return;
}
SessionData data = session.getData();
- Object checkedFiles = data.get( SESSION_CHECKS );
- while ( !( checkedFiles instanceof Map ) )
- {
- Object old = checkedFiles;
- checkedFiles = new ConcurrentHashMap<>( 256 );
- if ( data.set( SESSION_CHECKS, old, checkedFiles ) )
- {
- break;
- }
- checkedFiles = data.get( SESSION_CHECKS );
- }
+ Object checkedFiles = data.computeIfAbsent( SESSION_CHECKS, () -> new ConcurrentHashMap<>( 256 ) );
( (Map<Object, Boolean>) checkedFiles ).put( updateKey, Boolean.TRUE );
}
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManagerTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManagerTest.java
index a30770e..a85f5b0 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManagerTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManagerTest.java
@@ -32,6 +32,7 @@ import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.impl.UpdateCheck;
+import org.eclipse.aether.impl.UpdateCheckManager;
import org.eclipse.aether.internal.impl.DefaultUpdateCheckManager;
import org.eclipse.aether.internal.test.util.TestFileUtils;
import org.eclipse.aether.internal.test.util.TestUtils;
@@ -102,7 +103,7 @@ public class DefaultUpdateCheckManagerTest
static void resetSessionData( RepositorySystemSession session )
{
- session.getData().set( "updateCheckManager.checks", null );
+ session.getData().set( DefaultUpdateCheckManager.SESSION_CHECKS, null );
}
private UpdateCheck<Metadata, MetadataTransferException> newMetadataCheck()