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

joerghoh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-api.git


The following commit(s) were added to refs/heads/master by this push:
     new eeb8f84  SLING-8759 use computeIfAbsent to reduce code size (#26)
eeb8f84 is described below

commit eeb8f84f92a2f1bbfad236ba9dca9c15c2e837f3
Author: Jörg Hoh <[email protected]>
AuthorDate: Fri Apr 23 14:10:55 2021 +0200

    SLING-8759 use computeIfAbsent to reduce code size (#26)
---
 .../apache/sling/api/adapter/SlingAdaptable.java   | 19 ++----
 .../sling/api/adapter/SlingAdaptableTest.java      | 69 ++++++++++++++++++++++
 2 files changed, 75 insertions(+), 13 deletions(-)

diff --git a/src/main/java/org/apache/sling/api/adapter/SlingAdaptable.java 
b/src/main/java/org/apache/sling/api/adapter/SlingAdaptable.java
index 5adf0ce..7ecf5fd 100644
--- a/src/main/java/org/apache/sling/api/adapter/SlingAdaptable.java
+++ b/src/main/java/org/apache/sling/api/adapter/SlingAdaptable.java
@@ -94,22 +94,15 @@ public abstract class SlingAdaptable implements Adaptable {
      */
     @SuppressWarnings("unchecked")
     public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
-        AdapterType result = null;
         synchronized ( this ) {
-            if ( adaptersCache != null ) {
-                result = (AdapterType) adaptersCache.get(type);
+            if (ADAPTER_MANAGER == null) {
+                return null;
             }
-            if ( result == null ) {
-                final AdapterManager mgr = ADAPTER_MANAGER;
-                result = (mgr == null ? null : mgr.getAdapter(this, type));
-                if ( result != null ) {
-                    if ( adaptersCache == null ) {
-                        adaptersCache = new HashMap<Class<?>, Object>();
-                    }
-                    adaptersCache.put(type, result);
-                }
+            if (adaptersCache == null) {
+                adaptersCache = new HashMap<Class<?>, Object>();
             }
+            return (AdapterType) adaptersCache.computeIfAbsent(type,
+                    klazz -> ADAPTER_MANAGER.getAdapter(this, type));
         }
-        return result;
     }
 }
diff --git a/src/test/java/org/apache/sling/api/adapter/SlingAdaptableTest.java 
b/src/test/java/org/apache/sling/api/adapter/SlingAdaptableTest.java
new file mode 100644
index 0000000..3e56ddc
--- /dev/null
+++ b/src/test/java/org/apache/sling/api/adapter/SlingAdaptableTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.api.adapter;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.mockito.Mockito.*;
+
+public class SlingAdaptableTest {
+
+    private SlingAdaptable sut;
+    private AdapterManager adapterMgr;
+
+    @Before
+    public void setup() {
+        sut = new SlingAdaptable() {};
+        adapterMgr = mock(AdapterManager.class);
+    }
+
+    @Test
+    public void testAdaptTo() {
+        assertNull(sut.adaptTo(AdapterType.class));
+        SlingAdaptable.setAdapterManager(adapterMgr);
+        assertNull(sut.adaptTo(AdapterType.class));
+    }
+
+    @Test
+    public void testAdaptToWithCache() {
+        SlingAdaptable.setAdapterManager(adapterMgr);
+        when (adapterMgr.getAdapter(any(), 
eq(AdapterType.class))).thenReturn(new AdapterType());
+        assertNotNull(sut.adaptTo(AdapterType.class));
+        verify(adapterMgr,times(1)).getAdapter(any(), eq(AdapterType.class));
+        
+        // the 2nd time it has to come out of the cache
+        assertNotNull(sut.adaptTo(AdapterType.class));
+        verify(adapterMgr,times(1)).getAdapter(any(), eq(AdapterType.class));
+
+        assertNull(sut.adaptTo(AdapterType2.class));
+        when (adapterMgr.getAdapter(any(), 
eq(AdapterType2.class))).thenReturn(new AdapterType2());
+        assertNotNull(sut.adaptTo(AdapterType2.class));
+        assertNotNull(sut.adaptTo(AdapterType.class));
+    }
+
+    // pseudo adaptable
+    public class AdapterType {}
+
+    // pseudo adaptable
+    public class AdapterType2 {}
+}

Reply via email to