Fix remove listener methods to conform to spec.

git-svn-id: https://svn.apache.org/repos/asf/incubator/felix/trunk@423456 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/org.apache.felix.framework/src/main/java/org/apache/felix/framework/BundleContextImpl.java b/org.apache.felix.framework/src/main/java/org/apache/felix/framework/BundleContextImpl.java
index 92aa71c..393def6 100644
--- a/org.apache.felix.framework/src/main/java/org/apache/felix/framework/BundleContextImpl.java
+++ b/org.apache.felix.framework/src/main/java/org/apache/felix/framework/BundleContextImpl.java
@@ -121,7 +121,7 @@
     {
         checkValidity();
         
-        m_felix.removeBundleListener(l);
+        m_felix.removeBundleListener(m_bundle, l);
     }
 
     public void addServiceListener(ServiceListener l)
@@ -148,7 +148,7 @@
     {
         checkValidity();
         
-        m_felix.removeServiceListener(l);
+        m_felix.removeServiceListener(m_bundle, l);
     }
 
     public void addFrameworkListener(FrameworkListener l)
@@ -162,7 +162,7 @@
     {
         checkValidity();
         
-        m_felix.removeFrameworkListener(l);
+        m_felix.removeFrameworkListener(m_bundle, l);
     }
 
     public ServiceRegistration registerService(
diff --git a/org.apache.felix.framework/src/main/java/org/apache/felix/framework/Felix.java b/org.apache.felix.framework/src/main/java/org/apache/felix/framework/Felix.java
index d623b9b..a384d43 100644
--- a/org.apache.felix.framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/org.apache.felix.framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -1534,8 +1534,6 @@
                 } 
                 catch (Exception ex)
                 {
-                    rethrow = ex;
-                    
                     try 
                     {
                         archive.undoRevise();
@@ -1545,7 +1543,7 @@
                         m_logger.log(Logger.LOG_ERROR, "Unable to rollback.", busted);
                     }
                     
-                    m_logger.log(Logger.LOG_ERROR, "Unable to update the bundle.", ex);
+                    throw ex;
                 }
             }
             catch (Exception ex)
@@ -2099,9 +2097,14 @@
         }
     }
 
-    protected void removeBundleListener(BundleListener l)
+    protected void removeBundleListener(Bundle bundle, BundleListener l)
     {
-        m_dispatchQueue.removeListener(BundleListener.class, l);
+        BundleListenerWrapper old = (BundleListenerWrapper)
+            m_dispatchQueue.getListener(BundleListener.class, l);
+        if ((old != null) && old.getBundle().equals(bundle))
+        {
+            m_dispatchQueue.removeListener(BundleListener.class, l);
+        }
     }
 
     /**
@@ -2135,12 +2138,18 @@
     /**
      * Implementation for BundleContext.removeServiceListener().
      * Removes service listeners from the listener list.
-     *
+     * 
+     * @param bundle The context bundle of the listener
      * @param l The service listener to remove from the listener list.
     **/
-    protected void removeServiceListener(ServiceListener l)
+    protected void removeServiceListener(Bundle bundle, ServiceListener l)
     {
-        m_dispatchQueue.removeListener(ServiceListener.class, l);
+        ServiceListenerWrapper old = (ServiceListenerWrapper) 
+            m_dispatchQueue.getListener(ServiceListener.class, l);
+        if ((old != null) && old.getBundle().equals(bundle))
+        {
+            m_dispatchQueue.removeListener(ServiceListener.class, l);
+        }
     }
 
     protected void addFrameworkListener(Bundle bundle, FrameworkListener l)
@@ -2156,9 +2165,14 @@
         }
     }
 
-    protected void removeFrameworkListener(FrameworkListener l)
+    protected void removeFrameworkListener(Bundle bundle, FrameworkListener l)
     {
-        m_dispatchQueue.removeListener(FrameworkListener.class, l);
+        FrameworkListenerWrapper old = (FrameworkListenerWrapper)
+            m_dispatchQueue.getListener(FrameworkListener.class, l);
+        if ((old != null) && old.getBundle().equals(bundle))
+        {
+            m_dispatchQueue.removeListener(FrameworkListener.class, l);
+        }
     }
 
     /**