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);
+ }
}
/**