Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/internal/osgi/services/remoteserviceadmin/LocatorServiceListener.java67
-rw-r--r--incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractEndpointDescriptionFactory.java66
-rw-r--r--incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractMetadataFactory.java13
-rw-r--r--incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractServiceInfoFactory.java70
-rw-r--r--incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/DiscoveredEndpointDescription.java51
-rw-r--r--incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/EndpointDescription.java1
-rw-r--r--incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IEndpointDescriptionFactory.java6
7 files changed, 201 insertions, 73 deletions
diff --git a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/internal/osgi/services/remoteserviceadmin/LocatorServiceListener.java b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/internal/osgi/services/remoteserviceadmin/LocatorServiceListener.java
index 9d2bc8ed3..b9202384b 100644
--- a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/internal/osgi/services/remoteserviceadmin/LocatorServiceListener.java
+++ b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/internal/osgi/services/remoteserviceadmin/LocatorServiceListener.java
@@ -21,6 +21,7 @@ import org.eclipse.ecf.discovery.IServiceInfo;
import org.eclipse.ecf.discovery.IServiceListener;
import org.eclipse.ecf.discovery.identity.IServiceID;
import org.eclipse.ecf.internal.osgi.services.remoteserviceadmin.Activator.EndpointListenerHolder;
+import org.eclipse.ecf.osgi.services.remoteserviceadmin.DiscoveredEndpointDescription;
import org.eclipse.ecf.osgi.services.remoteserviceadmin.RemoteConstants;
import org.eclipse.ecf.osgi.services.remoteserviceadmin.IEndpointDescriptionFactory;
import org.eclipse.osgi.framework.eventmgr.CopyOnWriteIdentityMap;
@@ -41,7 +42,7 @@ class LocatorServiceListener implements IServiceListener {
private EventManager eventManager;
private IDiscoveryLocator locator;
-
+
class EndpointListenerEvent {
private EndpointListenerHolder holder;
@@ -62,17 +63,6 @@ class LocatorServiceListener implements IServiceListener {
}
}
- public LocatorServiceListener(IDiscoveryLocator locator) {
- this.locator = locator;
- }
-
- public void serviceDiscovered(IServiceEvent anEvent) {
- synchronized (initializationLock) {
- initialize();
- }
- handleService(anEvent.getServiceInfo(), true);
- }
-
private void initialize() {
if (!initialized) {
ThreadGroup eventGroup = new ThreadGroup(
@@ -87,6 +77,8 @@ class LocatorServiceListener implements IServiceListener {
public void dispatchEvent(Object eventListener,
Object listenerObject, int eventAction,
Object eventObject) {
+ if (locator == null)
+ return;
EndpointListenerHolder endpointListenerHolder = ((EndpointListenerEvent) eventObject)
.getEndpointListenerHolder();
final boolean discovered = ((EndpointListenerEvent) eventObject)
@@ -130,8 +122,23 @@ class LocatorServiceListener implements IServiceListener {
}
}
+ public LocatorServiceListener(IDiscoveryLocator locator) {
+ this.locator = locator;
+ }
+
+ public void serviceDiscovered(IServiceEvent anEvent) {
+ synchronized (initializationLock) {
+ if (locator == null)
+ return;
+ initialize();
+ }
+ handleService(anEvent.getServiceInfo(), true);
+ }
+
public void serviceUndiscovered(IServiceEvent anEvent) {
synchronized (initializationLock) {
+ if (locator == null)
+ return;
initialize();
}
handleService(anEvent.getServiceInfo(), false);
@@ -152,13 +159,19 @@ class LocatorServiceListener implements IServiceListener {
private void handleOSGiServiceEndpoint(IServiceID serviceId,
IServiceInfo serviceInfo, boolean discovered) {
- synchronized (listenerLock) {
- EndpointDescription description = createEndpointDescription(
- serviceId, serviceInfo, discovered);
- if (description != null) {
+ if (locator == null)
+ return;
+ DiscoveredEndpointDescription discoveredEndpointDescription = getEndpointDescription(
+ serviceId, serviceInfo, discovered);
+ if (discovered) {
+ // XXX todo we check to make sure that the locator is the same one
+ }
+ if (discoveredEndpointDescription != null) {
+ synchronized (listenerLock) {
Activator.EndpointListenerHolder[] endpointListenerHolders = Activator
.getDefault().getMatchingEndpointListenerHolders(
- description);
+ discoveredEndpointDescription
+ .getEndpointDescription());
if (endpointListenerHolders != null) {
for (int i = 0; i < endpointListenerHolders.length; i++) {
queue.dispatchEventAsynchronous(0,
@@ -166,14 +179,22 @@ class LocatorServiceListener implements IServiceListener {
endpointListenerHolders[i], discovered));
}
} else {
- logError("No matching EndpointListeners found for"
+ logWarning("No matching EndpointListeners found for"
+ (discovered ? "discovered" : "undiscovered")
+ " serviceInfo=" + serviceInfo);
}
+
}
+ } else {
+ logWarning("handleOSGiServiceEvent discoveredEndpointDescription is null for service info="
+ + serviceInfo + ",discovered=" + discovered);
}
}
+ private void logWarning(String message) {
+ // XXX todo
+ }
+
private void logError(String message) {
logError(message, null);
}
@@ -185,8 +206,8 @@ class LocatorServiceListener implements IServiceListener {
}
}
- private EndpointDescription createEndpointDescription(IServiceID serviceId,
- IServiceInfo serviceInfo, boolean discovered) {
+ private DiscoveredEndpointDescription getEndpointDescription(
+ IServiceID serviceId, IServiceInfo serviceInfo, boolean discovered) {
// Get activator
Activator activator = Activator.getDefault();
if (activator == null)
@@ -204,8 +225,8 @@ class LocatorServiceListener implements IServiceListener {
// Else get endpoint description factory to create
// EndpointDescription
// for given serviceID and serviceInfo
- return (discovered) ? factory
- .createDiscoveredEndpointDescription(locator, serviceInfo) : factory
+ return (discovered) ? factory.createDiscoveredEndpointDescription(
+ locator, serviceInfo) : factory
.getUndiscoveredEndpointDescription(locator, serviceId);
} catch (Exception e) {
logError("Exception calling IEndpointDescriptionFactory."
@@ -232,7 +253,7 @@ class LocatorServiceListener implements IServiceListener {
}
}
}
+ locator = null;
}
- locator = null;
}
} \ No newline at end of file
diff --git a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractEndpointDescriptionFactory.java b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractEndpointDescriptionFactory.java
index 6d7cc9afd..fa277dd3f 100644
--- a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractEndpointDescriptionFactory.java
+++ b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractEndpointDescriptionFactory.java
@@ -1,21 +1,75 @@
package org.eclipse.ecf.osgi.services.remoteserviceadmin;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
import org.eclipse.ecf.discovery.IDiscoveryLocator;
import org.eclipse.ecf.discovery.IServiceInfo;
+import org.eclipse.ecf.discovery.IServiceProperties;
import org.eclipse.ecf.discovery.identity.IServiceID;
-public abstract class AbstractEndpointDescriptionFactory extends AbstractMetadataFactory implements IEndpointDescriptionFactory {
+public abstract class AbstractEndpointDescriptionFactory extends
+ AbstractMetadataFactory implements IEndpointDescriptionFactory {
- public EndpointDescription createDiscoveredEndpointDescription(IDiscoveryLocator locator,
- IServiceInfo discoveredServiceInfo) {
- // XXX todo
+ protected List<DiscoveredEndpointDescription> discoveredEndpointDescriptions = new ArrayList();
+
+ private DiscoveredEndpointDescription findDiscoveredEndpointDescription(
+ EndpointDescription endpointDescription) {
+ synchronized (discoveredEndpointDescriptions) {
+ for (DiscoveredEndpointDescription d : discoveredEndpointDescriptions) {
+ EndpointDescription ed = d.getEndpointDescription();
+ if (ed.equals(endpointDescription))
+ return d;
+ }
+ }
return null;
}
- public EndpointDescription getUndiscoveredEndpointDescription(IDiscoveryLocator locator,
- IServiceID serviceID) {
+ public DiscoveredEndpointDescription createDiscoveredEndpointDescription(
+ IDiscoveryLocator locator, IServiceInfo discoveredServiceInfo) {
+ try {
+ EndpointDescription endpointDescription = createEndpointDescription(
+ locator, discoveredServiceInfo);
+ synchronized (discoveredEndpointDescriptions) {
+ DiscoveredEndpointDescription ded = findDiscoveredEndpointDescription(endpointDescription);
+ if (ded != null) return ded;
+ else return createDiscoveredEndpointDescription(locator,discoveredServiceInfo,endpointDescription);
+ }
+ } catch (Exception e) {
+ logError("createDiscoveredEndpointDescription",
+ "Exception creating discovered endpoint description", e);
+ return null;
+ }
+ }
+
+ public DiscoveredEndpointDescription getUndiscoveredEndpointDescription(
+ IDiscoveryLocator locator, IServiceID serviceID) {
// XXX todo
return null;
}
+ protected EndpointDescription createEndpointDescription(
+ IDiscoveryLocator locator, IServiceInfo discoveredServiceInfo) {
+ IServiceProperties discoveredServiceProperties = discoveredServiceInfo
+ .getServiceProperties();
+ Map props = decodeServiceProperties(discoveredServiceProperties);
+ return new EndpointDescription(props);
+
+ }
+
+ protected DiscoveredEndpointDescription createDiscoveredEndpointDescription(
+ IDiscoveryLocator locator, IServiceInfo discoveredServiceInfo,
+ EndpointDescription endpointDescription) {
+ return new DiscoveredEndpointDescription(
+ locator.getServicesNamespace(), discoveredServiceInfo.getServiceID(), endpointDescription);
+ }
+
+
+ public void close() {
+ synchronized (discoveredEndpointDescriptions) {
+ discoveredEndpointDescriptions.clear();
+ }
+ super.close();
+ }
}
diff --git a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractMetadataFactory.java b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractMetadataFactory.java
index abf5d7406..b4e9429be 100644
--- a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractMetadataFactory.java
+++ b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractMetadataFactory.java
@@ -13,6 +13,8 @@ import java.util.StringTokenizer;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDCreateException;
import org.eclipse.ecf.core.identity.IDFactory;
+import org.eclipse.ecf.discovery.IDiscoveryLocator;
+import org.eclipse.ecf.discovery.IServiceInfo;
import org.eclipse.ecf.discovery.IServiceProperties;
import org.eclipse.ecf.internal.osgi.services.remoteserviceadmin.Activator;
@@ -39,7 +41,6 @@ public abstract class AbstractMetadataFactory {
RemoteConstants.ENDPOINT_REMOTESERVICEFILTER
});
-
protected String[] getStringArrayWithDefault(
Map<String, Object> properties, String key, String[] def) {
if (properties == null)
@@ -144,14 +145,8 @@ public abstract class AbstractMetadataFactory {
return (ID[]) result.toArray(new ID[] {});
}
- protected ID createID(String namespace, String name) {
- try {
- return IDFactory.getDefault().createID(namespace, name);
- } catch (IDCreateException e) {
- logError("createID", "Exception creating id for namespace="
- + namespace + ",name=" + name, e);
- return null;
- }
+ protected ID createID(String namespace, String name) throws IDCreateException {
+ return IDFactory.getDefault().createID(namespace, name);
}
protected Map decodeServiceProperties(IServiceProperties props) {
diff --git a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractServiceInfoFactory.java b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractServiceInfoFactory.java
index 95e468ddf..e491f8646 100644
--- a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractServiceInfoFactory.java
+++ b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/AbstractServiceInfoFactory.java
@@ -50,42 +50,47 @@ public abstract class AbstractServiceInfoFactory extends
}
}
- public IServiceInfo createServiceInfoForDiscovery(IDiscoveryAdvertiser advertiser,
+ public IServiceInfo createServiceInfoForDiscovery(
+ IDiscoveryAdvertiser advertiser,
EndpointDescription endpointDescription) {
- Namespace advertiserNamespace = advertiser.getServicesNamespace();
- ServiceInfoKey key = new ServiceInfoKey(endpointDescription,
- advertiserNamespace);
- IServiceInfo existingServiceInfo = null;
- synchronized (serviceInfos) {
- existingServiceInfo = serviceInfos.get(key);
- // If it's already there, then we return null
- if (existingServiceInfo != null)
- return null;
- IServiceTypeID serviceTypeID = createServiceTypeID(
- endpointDescription, advertiser);
- String serviceName = createServiceName(endpointDescription,
- advertiser, serviceTypeID);
- URI uri = null;
- try {
- uri = createURI(endpointDescription, advertiser, serviceTypeID,
- serviceName);
- } catch (URISyntaxException e) {
- String message = "URI could not be created for endpoint description="
- + endpointDescription;
- logError("createURI", message, e);
- throw new RuntimeException(message, e);
+ try {
+ Namespace advertiserNamespace = advertiser.getServicesNamespace();
+ ServiceInfoKey key = new ServiceInfoKey(endpointDescription,
+ advertiserNamespace);
+ IServiceInfo existingServiceInfo = null;
+ synchronized (serviceInfos) {
+ existingServiceInfo = serviceInfos.get(key);
+ // If it's already there, then we return null
+ if (existingServiceInfo != null)
+ return null;
+ IServiceTypeID serviceTypeID = createServiceTypeID(
+ endpointDescription, advertiser);
+ String serviceName = createServiceName(endpointDescription,
+ advertiser, serviceTypeID);
+ URI uri = createURI(endpointDescription, advertiser,
+ serviceTypeID, serviceName);
+ IServiceProperties serviceProperties = createServiceProperties(
+ endpointDescription, advertiser, serviceTypeID,
+ serviceName, uri);
+ IServiceInfo newServiceInfo = createServiceInfo(uri, serviceName, serviceTypeID, serviceProperties);
+ // put into map using key
+ serviceInfos.put(key, newServiceInfo);
+ return newServiceInfo;
}
- IServiceProperties serviceProperties = createServiceProperties(
- endpointDescription, advertiser, serviceTypeID,
- serviceName, uri);
- IServiceInfo newServiceInfo = new ServiceInfo(uri, serviceName,
- serviceTypeID, serviceProperties);
- // put into map using key
- serviceInfos.put(key, newServiceInfo);
- return newServiceInfo;
+ } catch (Exception e) {
+ logError(
+ "createServiceInfoForDiscovery",
+ "Exception creating service info for endpointDescription="
+ + endpointDescription + ",advertiser=" + advertiser,
+ e);
+ return null;
}
}
+ protected IServiceInfo createServiceInfo(URI uri, String serviceName, IServiceTypeID serviceTypeID, IServiceProperties serviceProperties) {
+ return new ServiceInfo(uri, serviceName,
+ serviceTypeID, serviceProperties);
+ }
protected IServiceProperties createServiceProperties(
EndpointDescription endpointDescription,
@@ -182,7 +187,8 @@ public abstract class AbstractServiceInfoFactory extends
protocols, namingAuthority);
}
- public IServiceInfo removeServiceInfoForUndiscovery(IDiscoveryAdvertiser advertiser,
+ public IServiceInfo removeServiceInfoForUndiscovery(
+ IDiscoveryAdvertiser advertiser,
EndpointDescription endpointDescription) {
Namespace advertiserNamespace = advertiser.getServicesNamespace();
ServiceInfoKey key = new ServiceInfoKey(endpointDescription,
diff --git a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/DiscoveredEndpointDescription.java b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/DiscoveredEndpointDescription.java
new file mode 100644
index 000000000..4afdf59ec
--- /dev/null
+++ b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/DiscoveredEndpointDescription.java
@@ -0,0 +1,51 @@
+package org.eclipse.ecf.osgi.services.remoteserviceadmin;
+
+import org.eclipse.ecf.core.identity.Namespace;
+import org.eclipse.ecf.discovery.identity.IServiceID;
+
+public class DiscoveredEndpointDescription {
+
+ private Namespace discoveryLocatorNamespace;
+ private IServiceID serviceID;
+ private EndpointDescription endpointDescription;
+ private int hashCode = 7;
+
+ public DiscoveredEndpointDescription(Namespace discoveryLocatorNamespace, IServiceID serviceID,
+ EndpointDescription endpointDescription) {
+ this.discoveryLocatorNamespace = discoveryLocatorNamespace;
+ this.serviceID = serviceID;
+ this.endpointDescription = endpointDescription;
+ this.hashCode = 31 * this.hashCode
+ + discoveryLocatorNamespace.getName().hashCode();
+ this.hashCode = 31 * this.hashCode + endpointDescription.hashCode();
+ }
+
+ public int hashCode() {
+ return hashCode;
+ }
+
+ public boolean equals(Object other) {
+ if (other == null)
+ return false;
+ if (other == this)
+ return true;
+ if (!(other instanceof DiscoveredEndpointDescription))
+ return false;
+ DiscoveredEndpointDescription o = (DiscoveredEndpointDescription) other;
+ return (this.discoveryLocatorNamespace
+ .equals(o.discoveryLocatorNamespace) && this.endpointDescription
+ .equals(o.endpointDescription));
+ }
+
+ public Namespace getDiscoveryLocatorNamespace() {
+ return discoveryLocatorNamespace;
+ }
+
+ public IServiceID getServiceID() {
+ return serviceID;
+ }
+
+ public EndpointDescription getEndpointDescription() {
+ return endpointDescription;
+ }
+}
diff --git a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/EndpointDescription.java b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/EndpointDescription.java
index 3cd765127..e0e3cd1fa 100644
--- a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/EndpointDescription.java
+++ b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/EndpointDescription.java
@@ -73,6 +73,7 @@ public class EndpointDescription extends
public boolean equals(Object other) {
if (other == null)
return false;
+ if (other == this) return true;
if (!(other instanceof EndpointDescription))
return false;
EndpointDescription o = (EndpointDescription) other;
diff --git a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IEndpointDescriptionFactory.java b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IEndpointDescriptionFactory.java
index ac9ebcd87..69b9aa2f0 100644
--- a/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IEndpointDescriptionFactory.java
+++ b/incubation/bundles/org.eclipse.ecf.osgi.services.remoteserviceadmin/src/org/eclipse/ecf/osgi/services/remoteserviceadmin/IEndpointDescriptionFactory.java
@@ -23,11 +23,11 @@ public interface IEndpointDescriptionFactory {
*
* @param locator the locator responsible for the discoveredServiceInfo. Must not be <code>null</code>.
* @param discoveredServiceInfo the discovered service info. Must not be <code>null</code>.
- * @return EndpointDescription that will be used to notify EndpointListeners
+ * @return DiscoveredEndpointDescription that will be used to notify EndpointListeners
* about a new EndpointDescription. If <code>null</code> is returned, no
* notification should be performed by the calling code.
*/
- public EndpointDescription createDiscoveredEndpointDescription(IDiscoveryLocator locator, IServiceInfo discoveredServiceInfo);
+ public DiscoveredEndpointDescription createDiscoveredEndpointDescription(IDiscoveryLocator locator, IServiceInfo discoveredServiceInfo);
/**
* Get an EndpointDescription for an undiscovered remote service. Implementers of this
* factory service may return the type of EndpointDescription appropriate for the
@@ -40,6 +40,6 @@ public interface IEndpointDescriptionFactory {
* about an undiscovered EndpointDescription. If <code>null</code> is returned, no
* notification should be performed by the calling code.
*/
- public EndpointDescription getUndiscoveredEndpointDescription(IDiscoveryLocator locator, IServiceID serviceID);
+ public DiscoveredEndpointDescription getUndiscoveredEndpointDescription(IDiscoveryLocator locator, IServiceID serviceID);
}

Back to the top