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()