You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2017/12/07 16:50:00 UTC
[sling-org-apache-sling-adapter] 01/01: SLING-7194 AdapterManager
sorts AdapterFactory implementations lowest ranking first
This is an automated email from the ASF dual-hosted git repository.
sseifert pushed a commit to branch feature/SLING-7194-service-ranking
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-adapter.git
commit 4d88efa8563498416a3effefc9802cfa30fe15dc
Author: sseifert <ss...@pro-vision.de>
AuthorDate: Thu Dec 7 17:49:48 2017 +0100
SLING-7194 AdapterManager sorts AdapterFactory implementations lowest ranking first
---
.../internal/AdapterFactoryDescriptorMap.java | 13 ++++++
.../sling/adapter/internal/AdapterManagerTest.java | 48 +++++++++++-----------
2 files changed, 37 insertions(+), 24 deletions(-)
diff --git a/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptorMap.java b/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptorMap.java
index 4de3d08..c36f7dc 100644
--- a/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptorMap.java
+++ b/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptorMap.java
@@ -18,6 +18,7 @@
*/
package org.apache.sling.adapter.internal;
+import java.util.Comparator;
import java.util.TreeMap;
import org.apache.sling.api.adapter.AdapterFactory;
@@ -41,4 +42,16 @@ public class AdapterFactoryDescriptorMap extends
private static final long serialVersionUID = 2L;
+ public AdapterFactoryDescriptorMap() {
+ super(new Comparator<ServiceReference<AdapterFactory>>() {
+ @Override
+ public int compare(ServiceReference<AdapterFactory> o1, ServiceReference<AdapterFactory> o2) {
+ // compareTo of ServiceReference implements service-ranking lowest-first/service id highest-first
+ // but we want service-ranking highest-first/service id lowest-first as it is done e.g. for BundleContext.getService
+ // so explicitly reverse the comparison (SLING-7194)
+ return o2.compareTo(o1);
+ }
+ });
+ }
+
}
diff --git a/src/test/java/org/apache/sling/adapter/internal/AdapterManagerTest.java b/src/test/java/org/apache/sling/adapter/internal/AdapterManagerTest.java
index 1208c85..635ab83 100644
--- a/src/test/java/org/apache/sling/adapter/internal/AdapterManagerTest.java
+++ b/src/test/java/org/apache/sling/adapter/internal/AdapterManagerTest.java
@@ -395,8 +395,8 @@ public class AdapterManagerTest {
}
@org.junit.Test public void testAdaptMultipleAdapterFactoriesServiceRanking() throws Exception {
- final ServiceReference firstAdaptable = new ServiceReferenceImpl(1, new String[]{AdapterObject.class.getName()}, new String[]{ ParentInterface.class.getName(), FirstImplementation.class.getName()});
- final ServiceReference secondAdaptable = new ServiceReferenceImpl(2, new String[]{ AdapterObject.class.getName() }, new String[]{ParentInterface.class.getName(), SecondImplementation.class.getName()});
+ final ServiceReference firstAdaptable = new ServiceReferenceImpl(2, new String[]{AdapterObject.class.getName()}, new String[]{ ParentInterface.class.getName(), FirstImplementation.class.getName()});
+ final ServiceReference secondAdaptable = new ServiceReferenceImpl(1, new String[]{ AdapterObject.class.getName() }, new String[]{ParentInterface.class.getName(), SecondImplementation.class.getName()});
am.activate(this.createMultipleAdaptersComponentContext(firstAdaptable, secondAdaptable));
@@ -410,21 +410,21 @@ public class AdapterManagerTest {
am.bindAdapterFactory(secondAdaptable);
Object adapter = am.getAdapter(first, ParentInterface.class);
- assertNotNull("Did not get an adapter back for first implementation (from ParentInterface), service ranking 1", adapter);
- assertTrue("Did not get the correct adaptable back for first implementation, service ranking 1, ", adapter instanceof FirstImplementation);
+ assertNotNull("Did not get an adapter back for first implementation (from ParentInterface), service ranking 2", adapter);
+ assertTrue("Did not get the correct adaptable back for first implementation, service ranking 2, ", adapter instanceof FirstImplementation);
adapter = am.getAdapter(first, FirstImplementation.class);
- assertNotNull("Did not get an adapter back for first implementation, service ranking 1", adapter);
- assertTrue("Did not get the correct adaptable back for first implementation, service ranking 1, ", adapter instanceof FirstImplementation);
+ assertNotNull("Did not get an adapter back for first implementation, service ranking 2", adapter);
+ assertTrue("Did not get the correct adaptable back for first implementation, service ranking 2, ", adapter instanceof FirstImplementation);
adapter = am.getAdapter(second, SecondImplementation.class);
- assertNotNull("Did not get an adapter back for second implementation, service ranking 2", adapter);
- assertTrue("Did not get the correct adaptable back for second implementation, service ranking 2, ", adapter instanceof SecondImplementation);
+ assertNotNull("Did not get an adapter back for second implementation, service ranking 1", adapter);
+ assertTrue("Did not get the correct adaptable back for second implementation, service ranking 1, ", adapter instanceof SecondImplementation);
}
@org.junit.Test public void testAdaptMultipleAdapterFactoriesServiceRankingSecondHigherOrder() throws Exception {
- final ServiceReference firstAdaptable = new ServiceReferenceImpl(2, new String[]{AdapterObject.class.getName()}, new String[]{ ParentInterface.class.getName(), FirstImplementation.class.getName()});
- final ServiceReference secondAdaptable = new ServiceReferenceImpl(1, new String[]{ AdapterObject.class.getName() }, new String[]{ParentInterface.class.getName(), SecondImplementation.class.getName()});
+ final ServiceReference firstAdaptable = new ServiceReferenceImpl(1, new String[]{AdapterObject.class.getName()}, new String[]{ ParentInterface.class.getName(), FirstImplementation.class.getName()});
+ final ServiceReference secondAdaptable = new ServiceReferenceImpl(2, new String[]{ AdapterObject.class.getName() }, new String[]{ParentInterface.class.getName(), SecondImplementation.class.getName()});
am.activate(this.createMultipleAdaptersComponentContext(firstAdaptable, secondAdaptable));
@@ -438,21 +438,21 @@ public class AdapterManagerTest {
am.bindAdapterFactory(secondAdaptable);
Object adapter = am.getAdapter(first, ParentInterface.class);
- assertNotNull("Did not get an adapter back for second implementation (from ParentInterface), service ranking 1", adapter);
- assertTrue("Did not get the correct adaptable back for second implementation, service ranking 1, ", adapter instanceof SecondImplementation);
+ assertNotNull("Did not get an adapter back for second implementation (from ParentInterface), service ranking 2", adapter);
+ assertTrue("Did not get the correct adaptable back for second implementation, service ranking 2, ", adapter instanceof SecondImplementation);
adapter = am.getAdapter(first, FirstImplementation.class);
- assertNotNull("Did not get an adapter back for first implementation, service ranking 1", adapter);
- assertTrue("Did not get the correct adaptable back for first implementation, service ranking 1, ", adapter instanceof FirstImplementation);
+ assertNotNull("Did not get an adapter back for first implementation, service ranking 2", adapter);
+ assertTrue("Did not get the correct adaptable back for first implementation, service ranking 2, ", adapter instanceof FirstImplementation);
adapter = am.getAdapter(second, SecondImplementation.class);
- assertNotNull("Did not get an adapter back for second implementation, service ranking 2", adapter);
- assertTrue("Did not get the correct adaptable back for second implementation, service ranking 2, ", adapter instanceof SecondImplementation);
+ assertNotNull("Did not get an adapter back for second implementation, service ranking 1", adapter);
+ assertTrue("Did not get the correct adaptable back for second implementation, service ranking 1, ", adapter instanceof SecondImplementation);
}
@org.junit.Test public void testAdaptMultipleAdapterFactoriesServiceRankingReverse() throws Exception {
- final ServiceReference firstAdaptable = new ServiceReferenceImpl(1, new String[]{AdapterObject.class.getName()}, new String[]{ ParentInterface.class.getName(), FirstImplementation.class.getName()});
- final ServiceReference secondAdaptable = new ServiceReferenceImpl(2, new String[]{ AdapterObject.class.getName() }, new String[]{ParentInterface.class.getName(), SecondImplementation.class.getName()});
+ final ServiceReference firstAdaptable = new ServiceReferenceImpl(2, new String[]{AdapterObject.class.getName()}, new String[]{ ParentInterface.class.getName(), FirstImplementation.class.getName()});
+ final ServiceReference secondAdaptable = new ServiceReferenceImpl(1, new String[]{ AdapterObject.class.getName() }, new String[]{ParentInterface.class.getName(), SecondImplementation.class.getName()});
am.activate(this.createMultipleAdaptersComponentContext(firstAdaptable, secondAdaptable));
@@ -467,16 +467,16 @@ public class AdapterManagerTest {
am.bindAdapterFactory(firstAdaptable);
Object adapter = am.getAdapter(first, ParentInterface.class);
- assertNotNull("Did not get an adapter back for first implementation (from ParentInterface), service ranking 1", adapter);
- assertTrue("Did not get the correct adaptable back for first implementation, service ranking 1, ", adapter instanceof FirstImplementation);
+ assertNotNull("Did not get an adapter back for first implementation (from ParentInterface), service ranking 2", adapter);
+ assertTrue("Did not get the correct adaptable back for first implementation, service ranking 2, ", adapter instanceof FirstImplementation);
adapter = am.getAdapter(first, FirstImplementation.class);
- assertNotNull("Did not get an adapter back for first implementation, service ranking 1", adapter);
- assertTrue("Did not get the correct adaptable back for first implementation, service ranking 1, ", adapter instanceof FirstImplementation);
+ assertNotNull("Did not get an adapter back for first implementation, service ranking 2", adapter);
+ assertTrue("Did not get the correct adaptable back for first implementation, service ranking 2, ", adapter instanceof FirstImplementation);
adapter = am.getAdapter(second, SecondImplementation.class);
- assertNotNull("Did not get an adapter back for second implementation, service ranking 2", adapter);
- assertTrue("Did not get the correct adaptable back for second implementation, service ranking 2, ", adapter instanceof SecondImplementation);
+ assertNotNull("Did not get an adapter back for second implementation, service ranking 1", adapter);
+ assertTrue("Did not get the correct adaptable back for second implementation, service ranking 1, ", adapter instanceof SecondImplementation);
}
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.