SLING-2316 - Adapters WebConsolePlugin doesn't handle AdapterFactory services with more than one adaptable

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1209747 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/adapter/internal/AdapterWebConsolePlugin.java b/src/main/java/org/apache/sling/adapter/internal/AdapterWebConsolePlugin.java
index c3ee0ae..23672e1 100644
--- a/src/main/java/org/apache/sling/adapter/internal/AdapterWebConsolePlugin.java
+++ b/src/main/java/org/apache/sling/adapter/internal/AdapterWebConsolePlugin.java
@@ -79,7 +79,7 @@
     private Logger logger = LoggerFactory.getLogger(AdapterWebConsolePlugin.class);
 
     private List<AdaptableDescription> allAdaptables;
-    private Map<Object, AdaptableDescription> adapterServices;
+    private Map<Object, List<AdaptableDescription>> adapterServices;
     private Map<Bundle, List<AdaptableDescription>> adapterBundles;
 
     private ServiceTracker adapterTracker;
@@ -88,14 +88,20 @@
 
     public Object addingService(ServiceReference reference) {
         Object service = this.bundleContext.getService(reference);
+        addServiceMetadata(reference, service);
+        return service;
+    }
+
+    private void addServiceMetadata(ServiceReference reference, Object service) {
         final String[] adapters = OsgiUtil.toStringArray(reference.getProperty(ADAPTER_CLASSES));
         final String condition = OsgiUtil.toString(reference.getProperty(ADAPTER_CONDITION), null);
-        for (final String adaptable : OsgiUtil.toStringArray(reference.getProperty(ADAPTABLE_CLASSES))) {
-            adapterServices.put(service,
-                    new AdaptableDescription(reference.getBundle(), adaptable, adapters, condition));
+        final String[] adaptables = OsgiUtil.toStringArray(reference.getProperty(ADAPTABLE_CLASSES));
+        final List<AdaptableDescription> descriptions = new ArrayList<AdaptableDescription>(adaptables.length);
+        for (final String adaptable : adaptables) {
+            descriptions.add(new AdaptableDescription(reference.getBundle(), adaptable, adapters, condition));
         }
+        adapterServices.put(service, descriptions);
         update();
-        return service;
     }
 
     public void bundleChanged(BundleEvent event) {
@@ -107,13 +113,7 @@
     }
 
     public void modifiedService(ServiceReference reference, Object service) {
-        final String[] adapters = OsgiUtil.toStringArray(reference.getProperty(ADAPTER_CLASSES));
-        final String condition = OsgiUtil.toString(reference.getProperty(ADAPTER_CONDITION), null);
-        for (final String adaptable : OsgiUtil.toStringArray(reference.getProperty(ADAPTABLE_CLASSES))) {
-            adapterServices.put(service,
-                    new AdaptableDescription(reference.getBundle(), adaptable, adapters, condition));
-        }
-        update();
+        addServiceMetadata(reference, service);
     }
 
     public void removedService(ServiceReference reference, Object service) {
@@ -175,7 +175,9 @@
 
     private void update() {
         final List<AdaptableDescription> newList = new ArrayList<AdaptableDescription>();
-        newList.addAll(adapterServices.values());
+        for (final List<AdaptableDescription> descriptions : adapterServices.values()) {
+            newList.addAll(descriptions);
+        }
         for (final List<AdaptableDescription> list : adapterBundles.values()) {
             newList.addAll(list);
         }
@@ -185,7 +187,7 @@
 
     protected void activate(ComponentContext ctx) throws InvalidSyntaxException {
         this.bundleContext = ctx.getBundleContext();
-        this.adapterServices = new HashMap<Object, AdaptableDescription>();
+        this.adapterServices = new HashMap<Object, List<AdaptableDescription>>();
         this.adapterBundles = new HashMap<Bundle, List<AdaptableDescription>>();
         for (Bundle bundle : this.bundleContext.getBundles()) {
             if (bundle.getState() == Bundle.ACTIVE) {