You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by cs...@apache.org on 2013/04/15 14:49:16 UTC

svn commit: r1467989 - in /cxf/dosgi/trunk/dsw/cxf-dsw/src: main/java/org/apache/cxf/dosgi/dsw/service/ test/java/org/apache/cxf/dosgi/dsw/service/

Author: cschneider
Date: Mon Apr 15 12:49:15 2013
New Revision: 1467989

URL: http://svn.apache.org/r1467989
Log:
DOSGI-169 Fix for issue in removeExportRegistrations. Patch applied with thanks to Amichai

Modified:
    cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java
    cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminInstance.java
    cxf/dosgi/trunk/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCoreTest.java

Modified: cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java?rev=1467989&r1=1467988&r2=1467989&view=diff
==============================================================================
--- cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java (original)
+++ cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java Mon Apr 15 12:49:15 2013
@@ -29,7 +29,6 @@ import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 
 import org.apache.cxf.dosgi.dsw.handlers.ConfigTypeHandlerFactory;
 import org.apache.cxf.dosgi.dsw.handlers.ConfigurationTypeHandler;
@@ -427,29 +426,25 @@ public class RemoteServiceAdminCore impl
     }
 
     // Remove all export registrations associated with the given bundle
-    protected void removeExportRegistrations(BundleContext exportingBundleCtx) {
-        Bundle exportingBundle = exportingBundleCtx.getBundle();
+    protected void removeExportRegistrations(Bundle exportingBundle) {
+        List<ExportRegistration> bundleExports = getExportsForBundle(exportingBundle);
+        for (ExportRegistration export : bundleExports) {
+            export.close();
+        }
+    }
 
-        // Work on a copy as the map gets modified as part of the behaviour by underlying methods
-        Map<Map<String, Object>, Collection<ExportRegistration>> exportCopy
-            = new HashMap<Map<String, Object>, Collection<ExportRegistration>>(exportedServices);
-
-        for (Iterator<Map.Entry<Map<String, Object>, Collection<ExportRegistration>>> it
-                = exportCopy.entrySet().iterator(); it.hasNext();) {
-
-            Entry<Map<String, Object>, Collection<ExportRegistration>> entry = it.next();
-            Bundle regBundle = null;
-            Iterator<ExportRegistration> it2 = entry.getValue().iterator();
-            if (it2.hasNext())
-                regBundle = it2.next().getExportReference().getExportedService().getBundle();
-
-            if (exportingBundle.equals(regBundle)) {
-                // Again work on a copy, as the value gets modified by the behaviour inside export.close()
-                for (ExportRegistration export : new ArrayList<ExportRegistration>(entry.getValue())) {
-                    // This will remove the registration from the real map of exports
-                    export.close();
+    private List<ExportRegistration> getExportsForBundle(Bundle exportingBundle) {
+        synchronized (exportedServices) {
+            List<ExportRegistration> bundleRegs = new ArrayList<ExportRegistration>();
+            for (Collection<ExportRegistration> regs : exportedServices.values()) {
+                if (!regs.isEmpty()) {
+                    Bundle regBundle = regs.iterator().next().getExportReference().getExportedService().getBundle();
+                    if (exportingBundle.equals(regBundle)) {
+                        bundleRegs.addAll(regs);
+                    }
                 }
             }
+            return bundleRegs;
         }
     }
 

Modified: cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminInstance.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminInstance.java?rev=1467989&r1=1467988&r2=1467989&view=diff
==============================================================================
--- cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminInstance.java (original)
+++ cxf/dosgi/trunk/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminInstance.java Mon Apr 15 12:49:15 2013
@@ -122,6 +122,6 @@ public class RemoteServiceAdminInstance 
     public void close() {
         closed = true;
 
-        rsaCore.removeExportRegistrations(bctx);
+        rsaCore.removeExportRegistrations(bctx.getBundle());
     }
 }

Modified: cxf/dosgi/trunk/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCoreTest.java
URL: http://svn.apache.org/viewvc/cxf/dosgi/trunk/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCoreTest.java?rev=1467989&r1=1467988&r2=1467989&view=diff
==============================================================================
--- cxf/dosgi/trunk/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCoreTest.java (original)
+++ cxf/dosgi/trunk/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCoreTest.java Mon Apr 15 12:49:15 2013
@@ -317,7 +317,7 @@ public class RemoteServiceAdminCoreTest 
                 1, exportedServices.values().iterator().next().size());
 
         // Remove all export registrations from the service bundle
-        rsaCore.removeExportRegistrations(sref.getBundle().getBundleContext());
+        rsaCore.removeExportRegistrations(sref.getBundle());
         assertEquals("No more exported services", 0, exportedServices.size());
     }