Author: bdelacretaz Date: Tue Jul 2 13:55:42 2013 New Revision: 1498941 URL: http://svn.apache.org/r1498941 Log: SLING-2938 - support adapting from child classes
Modified: sling/whiteboard/bdelacretaz/adapter-methods/extensions-adapter/src/main/java/org/apache/sling/adapter/internal/AdapterMethodsManagerImpl.java sling/whiteboard/bdelacretaz/adapter-methods/extensions-adapter/src/test/java/org/apache/sling/adapter/internal/AdapterMethodManagerIT.java Modified: sling/whiteboard/bdelacretaz/adapter-methods/extensions-adapter/src/main/java/org/apache/sling/adapter/internal/AdapterMethodsManagerImpl.java URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/adapter-methods/extensions-adapter/src/main/java/org/apache/sling/adapter/internal/AdapterMethodsManagerImpl.java?rev=1498941&r1=1498940&r2=1498941&view=diff ============================================================================== --- sling/whiteboard/bdelacretaz/adapter-methods/extensions-adapter/src/main/java/org/apache/sling/adapter/internal/AdapterMethodsManagerImpl.java (original) +++ sling/whiteboard/bdelacretaz/adapter-methods/extensions-adapter/src/main/java/org/apache/sling/adapter/internal/AdapterMethodsManagerImpl.java Tue Jul 2 13:55:42 2013 @@ -128,7 +128,7 @@ public class AdapterMethodsManagerImpl { final AdapterFactory factory = new AdapterFactory() { @SuppressWarnings("unchecked") public <AdapterType> AdapterType getAdapter(Object adaptable, Class<AdapterType> type) { - if(adaptable.getClass().equals(fromClass) && type.equals(toClass)) { + if(fromClass.isAssignableFrom(adaptable.getClass()) && toClass.equals(type)) { try { log.debug("Adapting using method {} from {}", method, provider); return (AdapterType)method.invoke(provider, adaptable); Modified: sling/whiteboard/bdelacretaz/adapter-methods/extensions-adapter/src/test/java/org/apache/sling/adapter/internal/AdapterMethodManagerIT.java URL: http://svn.apache.org/viewvc/sling/whiteboard/bdelacretaz/adapter-methods/extensions-adapter/src/test/java/org/apache/sling/adapter/internal/AdapterMethodManagerIT.java?rev=1498941&r1=1498940&r2=1498941&view=diff ============================================================================== --- sling/whiteboard/bdelacretaz/adapter-methods/extensions-adapter/src/test/java/org/apache/sling/adapter/internal/AdapterMethodManagerIT.java (original) +++ sling/whiteboard/bdelacretaz/adapter-methods/extensions-adapter/src/test/java/org/apache/sling/adapter/internal/AdapterMethodManagerIT.java Tue Jul 2 13:55:42 2013 @@ -56,6 +56,8 @@ public class AdapterMethodManagerIT { BundleContext bundleContext; private List<ServiceRegistration> registeredServices; + final TestAdaptable parent = new TestAdaptable(System.currentTimeMillis()); + final TestAdaptableChild child = new TestAdaptableChild(System.currentTimeMillis() + 1); static class TestAdaptable extends SlingAdaptable { final long value; @@ -65,6 +67,14 @@ public class AdapterMethodManagerIT { } } + static class TestAdaptableChild extends TestAdaptable { + final String someAdditionalField = "FOO"; + + TestAdaptableChild(long value) { + super(value); + } + } + /** Example/test AdapterMethodsProvider that converts TestAdaptable to Long */ public static class SingleMethodProvider implements AdapterMethodsProvider { @@ -184,15 +194,9 @@ public class AdapterMethodManagerIT { public void testInvalidMethodsIgnored() { registerProvider(new ProviderWithInvalidMethods()); - - final long value = System.currentTimeMillis(); - final TestAdaptable t = new TestAdaptable(value); - final Long result = t.adaptTo(Long.class); - - assertNotNull("Expecting non-null adapted Long", result); - assertEquals("Expecting correct adapted value", value + 1, result.longValue()); - assertNull("Expecting no Integer adaptation", t.adaptTo(Integer.class)); - assertNull("Expecting no URL adaptation", t.adaptTo(URL.class)); + assertAdapted(parent); + assertNull("Expecting no Integer adaptation", parent.adaptTo(Integer.class)); + assertNull("Expecting no URL adaptation", parent.adaptTo(URL.class)); } @Test @@ -200,26 +204,37 @@ public class AdapterMethodManagerIT { registerProvider(new SingleMethodProvider()); registerProvider(new MultipleMethodsProvider()); - final int value = (int)System.currentTimeMillis(); - final TestAdaptable ta = new TestAdaptable(value); + assertAdapted(parent); { - final Long result = ta.adaptTo(Long.class); - assertNotNull("Expecting non-null adapted Long", result); - assertEquals("Expecting correct Long adapted value", value, result.longValue()); - } - - { - final Integer result = ta.adaptTo(Integer.class); + final Integer result = parent.adaptTo(Integer.class); assertNotNull("Expecting non-null adapted Integer", result); - assertEquals("Expecting correct Integer adapted value", value, result.intValue()); + assertEquals("Expecting correct Integer adapted value", (int)parent.value, result.intValue()); } { - final URL result = ta.adaptTo(URL.class); - final URL expected = new URL("http://example.com/" + value); + final URL result = parent.adaptTo(URL.class); + final URL expected = new URL("http://example.com/" + parent.value); assertNotNull("Expecting non-null adapted URL", result); assertEquals("Expecting correctly adapted URL", expected, result); } } -} \ No newline at end of file + + private void assertAdapted(TestAdaptable src) { + final Long result = src.adaptTo(Long.class); + assertNotNull("Expecting non-null result", result); + assertEquals("Expecting correct value", src.value, result.longValue()); + } + + @Test + public void testParentToLong() { + registerProvider(new SingleMethodProvider()); + assertAdapted(parent); + } + + @Test + public void testChildToLong() { + registerProvider(new SingleMethodProvider()); + assertAdapted(parent); + } + } \ No newline at end of file