Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Alexander Kuppe2010-10-20 07:31:12 +0000
committerMarkus Alexander Kuppe2010-10-20 07:32:05 +0000
commit66956eecf9c51ef393d0a68a1e12948141fc1c61 (patch)
treebd597dd3bf09b7eca78e78bf38dfb1c637e93381
parent4f65e6bd5343ffdee0d86930f176c2a942d43eea (diff)
downloadorg.eclipse.ecf-66956eecf9c51ef393d0a68a1e12948141fc1c61.tar.gz
org.eclipse.ecf-66956eecf9c51ef393d0a68a1e12948141fc1c61.tar.xz
org.eclipse.ecf-66956eecf9c51ef393d0a68a1e12948141fc1c61.zip
RESOLVED - bug 328142: [Discovery][Composite] Registering an IService(Type)Listener with OSGi service registry results in listeners notified twice
https://bugs.eclipse.org/bugs/show_bug.cgi?id=328142
-rw-r--r--framework/bundles/org.eclipse.ecf.discovery.ui.userinput/src/org/eclipse/ecf/discovery/ui/userinput/UserInputDiscoveryLocator.java7
-rw-r--r--framework/bundles/org.eclipse.ecf.discovery/src/org/eclipse/ecf/discovery/AbstractDiscoveryContainerAdapter.java25
-rw-r--r--framework/bundles/org.eclipse.ecf.discovery/src/org/eclipse/ecf/internal/discovery/DiscoveryServiceListener.java6
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.discovery/src/org/eclipse/ecf/provider/discovery/CompositeDiscoveryContainer.java7
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java7
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java12
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.jmdns/src/org/eclipse/ecf/internal/provider/jmdns/JMDNSPlugin.java2
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.jmdns/src/org/eclipse/ecf/provider/jmdns/container/JMDNSDiscoveryContainer.java7
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/provider/jslp/container/JSLPDiscoveryContainer.java7
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/ZooDiscoveryContainer.java9
-rwxr-xr-xtests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryServiceTest.java12
11 files changed, 84 insertions, 17 deletions
diff --git a/framework/bundles/org.eclipse.ecf.discovery.ui.userinput/src/org/eclipse/ecf/discovery/ui/userinput/UserInputDiscoveryLocator.java b/framework/bundles/org.eclipse.ecf.discovery.ui.userinput/src/org/eclipse/ecf/discovery/ui/userinput/UserInputDiscoveryLocator.java
index 78223d909..4a0e74f5c 100644
--- a/framework/bundles/org.eclipse.ecf.discovery.ui.userinput/src/org/eclipse/ecf/discovery/ui/userinput/UserInputDiscoveryLocator.java
+++ b/framework/bundles/org.eclipse.ecf.discovery.ui.userinput/src/org/eclipse/ecf/discovery/ui/userinput/UserInputDiscoveryLocator.java
@@ -123,4 +123,11 @@ public class UserInputDiscoveryLocator extends
fireServiceUndiscovered(new ServiceContainerEvent(iinfo, getID()));
}
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ecf.discovery.AbstractDiscoveryContainerAdapter#getContainerName()
+ */
+ public String getContainerName() {
+ return "ecf.discovery.userinput";
+ }
}
diff --git a/framework/bundles/org.eclipse.ecf.discovery/src/org/eclipse/ecf/discovery/AbstractDiscoveryContainerAdapter.java b/framework/bundles/org.eclipse.ecf.discovery/src/org/eclipse/ecf/discovery/AbstractDiscoveryContainerAdapter.java
index 3520055ac..6873c5af2 100644
--- a/framework/bundles/org.eclipse.ecf.discovery/src/org/eclipse/ecf/discovery/AbstractDiscoveryContainerAdapter.java
+++ b/framework/bundles/org.eclipse.ecf.discovery/src/org/eclipse/ecf/discovery/AbstractDiscoveryContainerAdapter.java
@@ -10,12 +10,6 @@
******************************************************************************/
package org.eclipse.ecf.discovery;
-import org.eclipse.ecf.internal.discovery.ServiceTypeComparator;
-
-import java.util.Iterator;
-
-import org.eclipse.ecf.internal.discovery.DiscoveryServiceListener;
-
import java.util.*;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -24,8 +18,7 @@ import org.eclipse.ecf.core.identity.*;
import org.eclipse.ecf.core.util.Trace;
import org.eclipse.ecf.discovery.identity.IServiceID;
import org.eclipse.ecf.discovery.identity.IServiceTypeID;
-import org.eclipse.ecf.internal.discovery.DiscoveryDebugOption;
-import org.eclipse.ecf.internal.discovery.DiscoveryPlugin;
+import org.eclipse.ecf.internal.discovery.*;
import org.eclipse.equinox.concurrent.future.*;
public abstract class AbstractDiscoveryContainerAdapter extends
@@ -242,6 +235,12 @@ public abstract class AbstractDiscoveryContainerAdapter extends
return null;
}
+ /**
+ * @return The name of this discovery container
+ * @since 4.0
+ */
+ public abstract String getContainerName();
+
// merges the allServiceListener with the serviceListeners for the given
// type
@@ -260,12 +259,14 @@ public abstract class AbstractDiscoveryContainerAdapter extends
Assert.isNotNull(aServiceType);
Collection listeners = new HashSet();
synchronized (serviceListeners) {
- for (Iterator itr = serviceListeners.keySet().iterator(); itr.hasNext();) {
+ for (Iterator itr = serviceListeners.keySet().iterator(); itr
+ .hasNext();) {
final IServiceTypeID typeID = (IServiceTypeID) itr.next();
- int compare = discoveryServiceListenerComparator.compare(aServiceType, typeID);
- if(compare == 0) {
+ int compare = discoveryServiceListenerComparator.compare(
+ aServiceType, typeID);
+ if (compare == 0) {
Collection collection = (Collection) serviceListeners
- .get(typeID);
+ .get(typeID);
if (collection != null) {
listeners.addAll(collection);
}
diff --git a/framework/bundles/org.eclipse.ecf.discovery/src/org/eclipse/ecf/internal/discovery/DiscoveryServiceListener.java b/framework/bundles/org.eclipse.ecf.discovery/src/org/eclipse/ecf/internal/discovery/DiscoveryServiceListener.java
index 530117984..de9793659 100644
--- a/framework/bundles/org.eclipse.ecf.discovery/src/org/eclipse/ecf/internal/discovery/DiscoveryServiceListener.java
+++ b/framework/bundles/org.eclipse.ecf.discovery/src/org/eclipse/ecf/internal/discovery/DiscoveryServiceListener.java
@@ -150,6 +150,12 @@ public class DiscoveryServiceListener implements ServiceListener {
* ServiceEvent)
*/
public void serviceChanged(ServiceEvent event) {
+ // ignore events that are targeted at different discovery containers
+ final Object containerName = event.getServiceReference().getProperty(
+ IDiscoveryLocator.CONTAINER_NAME);
+ if (!discoveryContainer.getContainerName().equals(containerName)) {
+ return;
+ }
switch (event.getType()) {
case ServiceEvent.REGISTERED:
addServiceListener(event.getServiceReference());
diff --git a/providers/bundles/org.eclipse.ecf.provider.discovery/src/org/eclipse/ecf/provider/discovery/CompositeDiscoveryContainer.java b/providers/bundles/org.eclipse.ecf.provider.discovery/src/org/eclipse/ecf/provider/discovery/CompositeDiscoveryContainer.java
index 640894a58..f99f3cb54 100644
--- a/providers/bundles/org.eclipse.ecf.provider.discovery/src/org/eclipse/ecf/provider/discovery/CompositeDiscoveryContainer.java
+++ b/providers/bundles/org.eclipse.ecf.provider.discovery/src/org/eclipse/ecf/provider/discovery/CompositeDiscoveryContainer.java
@@ -426,4 +426,11 @@ public class CompositeDiscoveryContainer extends AbstractDiscoveryContainerAdapt
public Collection getDiscoveryContainers() {
return Collections.unmodifiableCollection(containers);
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ecf.discovery.AbstractDiscoveryContainerAdapter#getContainerName()
+ */
+ public String getContainerName() {
+ return NAME;
+ }
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java
index 889416f1e..66bcca2bd 100644
--- a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java
+++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryAdvertiser.java
@@ -266,4 +266,11 @@ public class DnsSdDiscoveryAdvertiser extends DnsSdDiscoveryContainerAdapter {
}
return registrationDomains.size() == 0 ? scopes : (String[]) registrationDomains.toArray(new String[registrationDomains.size()]);
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ecf.discovery.AbstractDiscoveryContainerAdapter#getContainerName()
+ */
+ public String getContainerName() {
+ return Activator.DISCOVERY_CONTAINER_NAME_VALUE + Activator.ADVERTISER;
+ }
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java
index 1a17a4407..d880f3814 100644
--- a/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java
+++ b/providers/bundles/org.eclipse.ecf.provider.dnssd/src/org/eclipse/ecf/provider/dnssd/DnsSdDiscoveryLocator.java
@@ -41,6 +41,10 @@ import org.xbill.DNS.SimpleResolver;
import org.xbill.DNS.TXTRecord;
import org.xbill.DNS.Type;
+/**
+ * @author markus
+ *
+ */
public class DnsSdDiscoveryLocator extends DnsSdDiscoveryContainerAdapter {
private static final String DNS_SD_PATH = "path"; //$NON-NLS-1$
@@ -216,4 +220,12 @@ public class DnsSdDiscoveryLocator extends DnsSdDiscoveryContainerAdapter {
final Collection res = getBrowsingOrRegistrationDomains(aServiceTypeId, rrs);
return (String[]) res.toArray(new String[res.size()]);
}
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ecf.discovery.AbstractDiscoveryContainerAdapter#getContainerName()
+ */
+ public String getContainerName() {
+ return Activator.DISCOVERY_CONTAINER_NAME_VALUE + Activator.LOCATOR;
+ }
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.jmdns/src/org/eclipse/ecf/internal/provider/jmdns/JMDNSPlugin.java b/providers/bundles/org.eclipse.ecf.provider.jmdns/src/org/eclipse/ecf/internal/provider/jmdns/JMDNSPlugin.java
index 2e2f9f542..6caaefb99 100644
--- a/providers/bundles/org.eclipse.ecf.provider.jmdns/src/org/eclipse/ecf/internal/provider/jmdns/JMDNSPlugin.java
+++ b/providers/bundles/org.eclipse.ecf.provider.jmdns/src/org/eclipse/ecf/internal/provider/jmdns/JMDNSPlugin.java
@@ -28,7 +28,7 @@ import org.osgi.util.tracker.ServiceTracker;
* The main plugin class to be used in the desktop.
*/
public class JMDNSPlugin implements BundleActivator {
- private static final String NAME = "ecf.discovery.jmdns"; //$NON-NLS-1$
+ public static final String NAME = "ecf.discovery.jmdns"; //$NON-NLS-1$
// The shared instance.
private static JMDNSPlugin plugin;
diff --git a/providers/bundles/org.eclipse.ecf.provider.jmdns/src/org/eclipse/ecf/provider/jmdns/container/JMDNSDiscoveryContainer.java b/providers/bundles/org.eclipse.ecf.provider.jmdns/src/org/eclipse/ecf/provider/jmdns/container/JMDNSDiscoveryContainer.java
index d739288b7..702926bb6 100644
--- a/providers/bundles/org.eclipse.ecf.provider.jmdns/src/org/eclipse/ecf/provider/jmdns/container/JMDNSDiscoveryContainer.java
+++ b/providers/bundles/org.eclipse.ecf.provider.jmdns/src/org/eclipse/ecf/provider/jmdns/container/JMDNSDiscoveryContainer.java
@@ -466,4 +466,11 @@ public class JMDNSDiscoveryContainer extends AbstractDiscoveryContainerAdapter i
final ServiceInfo si = ServiceInfo.create(sID.getServiceTypeID().getInternal(), serviceInfo.getServiceName(), location.getPort(), serviceInfo.getWeight(), serviceInfo.getPriority(), props);
return si;
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ecf.discovery.AbstractDiscoveryContainerAdapter#getContainerName()
+ */
+ public String getContainerName() {
+ return JMDNSPlugin.NAME;
+ }
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/provider/jslp/container/JSLPDiscoveryContainer.java b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/provider/jslp/container/JSLPDiscoveryContainer.java
index 53defd8ac..ec09cd054 100644
--- a/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/provider/jslp/container/JSLPDiscoveryContainer.java
+++ b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/provider/jslp/container/JSLPDiscoveryContainer.java
@@ -263,4 +263,11 @@ public class JSLPDiscoveryContainer extends AbstractDiscoveryContainerAdapter im
discoveryJob.schedule();
}
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ecf.discovery.AbstractDiscoveryContainerAdapter#getContainerName()
+ */
+ public String getContainerName() {
+ return NAME;
+ }
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/ZooDiscoveryContainer.java b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/ZooDiscoveryContainer.java
index 44b6360f9..7c07073b8 100644
--- a/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/ZooDiscoveryContainer.java
+++ b/providers/bundles/org.eclipse.ecf.provider.zookeeper/src/org/eclipse/ecf/provider/zookeeper/core/ZooDiscoveryContainer.java
@@ -22,10 +22,10 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.zookeeper.server.NIOServerCnxn;
+import org.apache.zookeeper.server.NIOServerCnxn.Factory;
import org.apache.zookeeper.server.PurgeTxnLog;
import org.apache.zookeeper.server.ServerConfig;
import org.apache.zookeeper.server.ZooKeeperServer;
-import org.apache.zookeeper.server.NIOServerCnxn.Factory;
import org.apache.zookeeper.server.persistence.FileTxnSnapLog;
import org.apache.zookeeper.server.quorum.QuorumPeer;
import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
@@ -444,6 +444,13 @@ public class ZooDiscoveryContainer extends AbstractDiscoveryContainerAdapter {
return this.isDisposed;
}
+ /* (non-Javadoc)
+ * @see org.eclipse.ecf.discovery.AbstractDiscoveryContainerAdapter#getContainerName()
+ */
+ public String getContainerName() {
+ return ZooDiscoveryContainerInstantiator.NAME;
+ }
+
private void setDisposed(boolean d) {
this.isDisposed = d;
}
diff --git a/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryServiceTest.java b/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryServiceTest.java
index 2481883a4..7a01b1577 100755
--- a/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryServiceTest.java
+++ b/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryServiceTest.java
@@ -61,9 +61,11 @@ public abstract class DiscoveryServiceTest extends DiscoveryTest {
assertTrue("No Services must be registerd at this point " + (services.length == 0 ? "" : services[0].toString()), services.length == 0);
final TestServiceListener tsl = new TestServiceListener(eventsToExpect, discoveryLocator);
-
+
+ Properties props = new Properties();
+ props.put(IDiscoveryLocator.CONTAINER_NAME, containerUnderTest);
BundleContext ctxt = Activator.getDefault().getContext();
- ServiceRegistration registration = ctxt.registerService(IServiceListener.class.getName(), tsl, null);
+ ServiceRegistration registration = ctxt.registerService(IServiceListener.class.getName(), tsl, props);
addListenerRegisterAndWait(tsl, serviceInfo);
@@ -88,6 +90,7 @@ public abstract class DiscoveryServiceTest extends DiscoveryTest {
props.put("org.eclipse.ecf.discovery.scopes", serviceTypeID.getScopes());
props.put("org.eclipse.ecf.discovery.protocols", serviceTypeID.getProtocols());
props.put("org.eclipse.ecf.discovery.namingauthority", serviceTypeID.getNamingAuthority());
+ props.put(IDiscoveryLocator.CONTAINER_NAME, containerUnderTest);
BundleContext ctxt = Activator.getDefault().getContext();
ServiceRegistration registration = ctxt.registerService(IServiceListener.class.getName(), tsl, props);
@@ -114,6 +117,7 @@ public abstract class DiscoveryServiceTest extends DiscoveryTest {
props.put("org.eclipse.ecf.discovery.scopes", "*");
props.put("org.eclipse.ecf.discovery.protocols", "*");
props.put("org.eclipse.ecf.discovery.namingauthority", "*");
+ props.put(IDiscoveryLocator.CONTAINER_NAME, containerUnderTest);
BundleContext ctxt = Activator.getDefault().getContext();
ServiceRegistration registration = ctxt.registerService(IServiceListener.class.getName(), tsl, props);
@@ -134,8 +138,10 @@ public abstract class DiscoveryServiceTest extends DiscoveryTest {
assertTrue("No Services must be registerd at this point " + (services.length == 0 ? "" : services[0].toString()), services.length == 0);
final TestServiceTypeListener testTypeListener = new TestServiceTypeListener(eventsToExpect);
+ Properties props = new Properties();
+ props.put(IDiscoveryLocator.CONTAINER_NAME, containerUnderTest);
BundleContext ctxt = Activator.getDefault().getContext();
- ServiceRegistration registration = ctxt.registerService(IServiceTypeListener.class.getName(), testTypeListener, null);
+ ServiceRegistration registration = ctxt.registerService(IServiceTypeListener.class.getName(), testTypeListener, props);
synchronized (testTypeListener) {
// register a service which we expect the test listener to get notified of

Back to the top