You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 10:23:38 UTC

[sling-org-apache-sling-testing-sling-mock] 22/37: SLING-5086 sling-mock: Add SlingContext.registerAdapter convenience method

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

rombert pushed a commit to annotated tag org.apache.sling.testing.sling-mock-1.6.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-sling-mock.git

commit d74181d3bbeebf153926ab23a0f16f29633ecce8
Author: Stefan Seifert <ss...@apache.org>
AuthorDate: Thu Oct 1 22:00:32 2015 +0000

    SLING-5086 sling-mock: Add SlingContext.registerAdapter convenience method
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/testing/mocks/sling-mock@1706325 13f79535-47bb-0310-9956-ffa450edef68
---
 .../mock/sling/context/SlingContextImpl.java       | 46 ++++++++++++++++++++++
 .../testing/mock/sling/junit/SlingContextTest.java | 23 +++++++++++
 2 files changed, 69 insertions(+)

diff --git a/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java b/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java
index 76439f0..0fe023f 100644
--- a/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java
+++ b/src/main/java/org/apache/sling/testing/mock/sling/context/SlingContextImpl.java
@@ -23,6 +23,7 @@ import java.util.Set;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import org.apache.sling.api.adapter.AdapterFactory;
 import org.apache.sling.api.resource.LoginException;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
@@ -56,6 +57,8 @@ import org.osgi.framework.ServiceReference;
 
 import aQute.bnd.annotation.ConsumerType;
 
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
 /**
@@ -326,5 +329,48 @@ public class SlingContextImpl extends OsgiContextImpl {
         }
         return uniqueRoot;
     }
+    
+    /**
+     * Create a Sling AdapterFactory on the fly which can adapt from <code>adaptableClass</code>
+     * to <code>adapterClass</code> and just returns the given value as result.
+     * @param adaptableClass Class to adapt from
+     * @param adapterClass Class to adapt to
+     * @param adapter Object which is always returned for this adaption.
+     */
+    public <T1, T2> void registerAdapter(final Class<T1> adaptableClass, final Class<T2> adapterClass,
+            final T2 adapter) {
+        registerAdapter(adaptableClass, adapterClass, new Function<T1, T2>() {
+            @Override
+            public T2 apply(T1 input) {
+                return adapter;
+            }
+        });
+    }
+
+    /**
+     * Create a Sling AdapterFactory on the fly which can adapt from <code>adaptableClass</code>
+     * to <code>adapterClass</code> and delegates the adapter mapping to the given <code>adaptHandler</code> function.
+     * @param adaptableClass Class to adapt from
+     * @param adapterClass Class to adapt to
+     * @param adaptHandler Function to handle the adaption
+     */
+    public <T1, T2> void registerAdapter(final Class<T1> adaptableClass, final Class<T2> adapterClass,
+            final Function<T1,T2> adaptHandler) {
+        AdapterFactory adapterFactory = new AdapterFactory() {
+            @SuppressWarnings("unchecked")
+            @Override
+            public <AdapterType> AdapterType getAdapter(Object adaptable, Class<AdapterType> type) {
+                return (AdapterType)adaptHandler.apply((T1)adaptable);
+            }
+        };
+        registerService(AdapterFactory.class, adapterFactory, ImmutableMap.<String, Object>builder()
+                .put(AdapterFactory.ADAPTABLE_CLASSES, new String[] {
+                    adaptableClass.getName()
+                })
+                .put(AdapterFactory.ADAPTER_CLASSES, new String[] {
+                        adapterClass.getName()
+                })
+                .build());
+    }
 
 }
diff --git a/src/test/java/org/apache/sling/testing/mock/sling/junit/SlingContextTest.java b/src/test/java/org/apache/sling/testing/mock/sling/junit/SlingContextTest.java
index 8af0b55..b785f28 100644
--- a/src/test/java/org/apache/sling/testing/mock/sling/junit/SlingContextTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/sling/junit/SlingContextTest.java
@@ -18,13 +18,16 @@
  */
 package org.apache.sling.testing.mock.sling.junit;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
 import java.io.IOException;
 
 import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.testing.mock.sling.ResourceResolverType;
 import org.junit.Before;
 import org.junit.Rule;
@@ -32,6 +35,8 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.runners.MockitoJUnitRunner;
 
+import com.google.common.base.Function;
+
 @RunWith(MockitoJUnitRunner.class)
 public class SlingContextTest {
 
@@ -53,4 +58,22 @@ public class SlingContextTest {
         assertNotNull(context.request());
     }
 
+    @Test
+    public void testRegisterAdapter() {
+        
+        // prepare some adapter factories
+        context.registerAdapter(ResourceResolver.class, Integer.class, 5);
+        context.registerAdapter(ResourceResolver.class, String.class, new Function<ResourceResolver,String>() {
+            @Override
+            public String apply(ResourceResolver input) {
+                return ">" + input.toString();
+            }
+        });
+        
+        // test adaption
+        assertEquals(Integer.valueOf(5), context.resourceResolver().adaptTo(Integer.class));
+        assertEquals(">" + context.resourceResolver().toString(), context.resourceResolver().adaptTo(String.class));
+        assertNull(context.resourceResolver().adaptTo(Double.class));
+    }
+
 }

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.