diff options
author | Markus Alexander Kuppe | 2010-10-20 07:31:12 +0000 |
---|---|---|
committer | Markus Alexander Kuppe | 2010-10-20 07:32:05 +0000 |
commit | 66956eecf9c51ef393d0a68a1e12948141fc1c61 (patch) | |
tree | bd597dd3bf09b7eca78e78bf38dfb1c637e93381 | |
parent | 4f65e6bd5343ffdee0d86930f176c2a942d43eea (diff) | |
download | org.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
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 |