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 {}
+}