Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormkuppe2008-04-30 13:15:28 +0000
committermkuppe2008-04-30 13:15:28 +0000
commit559a25bfb56a6076126f450062797cfe9b6ab366 (patch)
tree8979d3be6343f23f9e8dba7fe542e9e5a946fdba
parentfdaca474d9c3a29be96a85da8a8a1e9cca4218a0 (diff)
downloadorg.eclipse.ecf-559a25bfb56a6076126f450062797cfe9b6ab366.tar.gz
org.eclipse.ecf-559a25bfb56a6076126f450062797cfe9b6ab366.tar.xz
org.eclipse.ecf-559a25bfb56a6076126f450062797cfe9b6ab366.zip
FIXED - bug 228882: [Discovery][slp][provider] SLP not getting service properties
https://bugs.eclipse.org/bugs/show_bug.cgi?id=228882
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/Activator.java45
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/JSLPDiscoveryJob.java10
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/ServicePropertiesAdapter.java91
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/ServiceURLAdapter.java2
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/provider/jslp/container/JSLPDiscoveryContainer.java17
-rw-r--r--providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/provider/jslp/container/JSLPServiceInfo.java5
6 files changed, 147 insertions, 23 deletions
diff --git a/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/Activator.java b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/Activator.java
index d1b3ec14e..0266f9584 100644
--- a/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/Activator.java
+++ b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/Activator.java
@@ -13,7 +13,6 @@ package org.eclipse.ecf.internal.provider.jslp;
import ch.ethz.iks.slp.*;
import java.util.*;
import org.eclipse.ecf.core.util.Trace;
-import org.eclipse.ecf.provider.jslp.identity.JSLPServiceTypeID;
import org.osgi.framework.*;
import org.osgi.util.tracker.ServiceTracker;
@@ -130,7 +129,7 @@ public class Activator implements BundleActivator {
/* (non-Javadoc)
* @see ch.ethz.iks.slp.Locator#findServices(ch.ethz.iks.slp.ServiceType, java.util.List, java.lang.String)
*/
- public ServiceLocationEnumeration findServices(ServiceType type, List scopes, String searchFilter) throws ServiceLocationException {
+ private ServiceLocationEnumeration findServices(ServiceType type, List scopes, String searchFilter) throws ServiceLocationException {
Locator locator = getLocator();
if (locator != null) {
return locator.findServices(type, scopes, searchFilter);
@@ -141,6 +140,19 @@ public class Activator implements BundleActivator {
}
/* (non-Javadoc)
+ * @see ch.ethz.iks.slp.Locator#findAttributes(ch.ethz.iks.slp.ServiceURL, java.util.List, java.util.List)
+ */
+ private ServiceLocationEnumeration findAttributes(ServiceURL anURL, List scopes, List attributes) throws ServiceLocationException {
+ Locator locator = getLocator();
+ if (locator != null) {
+ return locator.findAttributes(anURL, scopes, attributes);
+ }
+ //TODO add logging
+ Trace.trace(PLUGIN_ID, JSLPDebugOptions.METHODS_TRACING, getClass(), "findAttributes(ch.ethz.iks.slp.ServiceType, java.util.List, java.util.List)", Locator.class + " not present"); //$NON-NLS-1$//$NON-NLS-2$
+ return emptyServiceLocationEnumeration;
+ }
+
+ /* (non-Javadoc)
* @see ch.ethz.iks.slp.Advertiser#deregister(ch.ethz.iks.slp.ServiceURL)
*/
public void deregister(ServiceURL url) throws ServiceLocationException {
@@ -188,20 +200,37 @@ public class Activator implements BundleActivator {
//TODO add logging
}
- public Collection getServiceURLs() throws ServiceLocationException {
+ /**
+ * @return A Map whos keys are {@link ServiceURL} and Entries are {@link List} describing service attributes
+ * @throws ServiceLocationException
+ */
+ public Map getServiceURLs() throws ServiceLocationException {
Enumeration stEnum = findServiceTypes(null, null);
Set aSet = new HashSet(Collections.list(stEnum));
- Set result = new HashSet();
+ Map result = new HashMap();
for (Iterator itr = aSet.iterator(); itr.hasNext();) {
String type = (String) itr.next();
- result.addAll(Collections.list(findServices(new ServiceType(type), null, null)));
+ ServiceLocationEnumeration services = findServices(new ServiceType(type), null, null);
+ while (services.hasMoreElements()) {
+ ServiceURL url = (ServiceURL) services.next();
+ result.put(url, Collections.list(findAttributes(url, null, null)));
+ }
}
return result;
}
- public Collection getServiceURLs(JSLPServiceTypeID stid) throws ServiceLocationException {
- Set result = new HashSet();
- result.addAll(Collections.list(findServices(stid.getServiceType(), Arrays.asList(stid.getScopes()), null)));
+ /**
+ * @param stid
+ * @return A Map whos keys are {@link ServiceURL} and Entries are {@link List} describing service attributes
+ * @throws ServiceLocationException
+ */
+ public Map getServiceURLs(ServiceType aServiceType, List scopes) throws ServiceLocationException {
+ Map result = new HashMap();
+ ServiceLocationEnumeration services = findServices(aServiceType, scopes, null);
+ while (services.hasMoreElements()) {
+ ServiceURL url = (ServiceURL) services.next();
+ result.put(url, Collections.list(findAttributes(url, scopes, null)));
+ }
return result;
}
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/JSLPDiscoveryJob.java b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/JSLPDiscoveryJob.java
index dd0b2e02e..6bc68ec90 100644
--- a/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/JSLPDiscoveryJob.java
+++ b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/JSLPDiscoveryJob.java
@@ -17,7 +17,6 @@ import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.ecf.core.util.Trace;
import org.eclipse.ecf.discovery.IServiceInfo;
-import org.eclipse.ecf.discovery.ServiceProperties;
import org.eclipse.ecf.provider.jslp.container.JSLPDiscoveryContainer;
import org.eclipse.ecf.provider.jslp.container.JSLPServiceInfo;
import org.osgi.framework.Bundle;
@@ -41,17 +40,18 @@ public final class JSLPDiscoveryJob extends Job {
protected IStatus run(IProgressMonitor monitor) {
Assert.isNotNull(monitor);
try {
- Collection availableServices = Activator.getDefault().getServiceURLs();
+ Map availableServices = Activator.getDefault().getServiceURLs();
Map removedServices = new HashMap(services);
- for (Iterator itr = availableServices.iterator(); itr.hasNext() && !monitor.isCanceled();) {
- ServiceURL url = (ServiceURL) itr.next();
+ for (Iterator itr = availableServices.entrySet().iterator(); itr.hasNext() && !monitor.isCanceled();) {
+ Map.Entry entry = (Map.Entry) itr.next();
+ ServiceURL url = (ServiceURL) entry.getKey();
// do we know the service already?
if (removedServices.containsKey(url)) {
removedServices.remove(url);
} else { // we don't know the service, so we need to create the
// service discovery object
//TODO-mkuppe do we get meaningful values for ServiceProperties (SLP attributes?), priority and weight from SLP?
- IServiceInfo serviceInfo = new JSLPServiceInfo(new ServiceURLAdapter(url), -1, -1, new ServiceProperties());
+ IServiceInfo serviceInfo = new JSLPServiceInfo(new ServiceURLAdapter(url), -1, -1, new ServicePropertiesAdapter((List) entry.getValue()));
services.put(url, serviceInfo);
discoveryContainer.fireServiceDiscovered(serviceInfo);
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/ServicePropertiesAdapter.java b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/ServicePropertiesAdapter.java
new file mode 100644
index 000000000..fe94f75c8
--- /dev/null
+++ b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/ServicePropertiesAdapter.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Versant Corp.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Markus Kuppe (mkuppe <at> versant <dot> com) - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.ecf.internal.provider.jslp;
+
+import java.util.*;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.ecf.core.util.StringUtils;
+import org.eclipse.ecf.discovery.IServiceProperties;
+import org.eclipse.ecf.discovery.ServiceProperties;
+
+/**
+ * Adapts SLP's service properties to ECF's ServiceProperties and vice versa
+ * @see "http://www.ietf.org/rfc/rfc2608.txt page. 10ff"
+ */
+public class ServicePropertiesAdapter {
+
+ private static final String SLP_BYTE_PREFIX = "\\FF"; //$NON-NLS-1$
+ private IServiceProperties serviceProperties;
+
+ public ServicePropertiesAdapter(List aList) {
+ Assert.isNotNull(aList);
+ serviceProperties = new ServiceProperties();
+ for (Iterator itr = aList.iterator(); itr.hasNext();) {
+ String[] str = StringUtils.split((String) itr.next(), "="); //$NON-NLS-1$
+ // remove the brackets "( )" from the string value which are added by jSLP for the LDAP style string representation
+ String key = str[0].substring(1);
+ String value = str[1].substring(0, str[1].length() - 1);
+ if (value.startsWith(SLP_BYTE_PREFIX)) {
+ String[] strs = StringUtils.split(value.substring(4), "\\"); //$NON-NLS-1$
+ byte[] b = new byte[strs.length];
+ for (int i = 0; i < strs.length; i++) {
+ b[i] = new Byte(strs[i]).byteValue();
+ }
+ serviceProperties.setPropertyBytes(key, b);
+ } else if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("false")) { //$NON-NLS-1$ //$NON-NLS-2$
+ serviceProperties.setProperty(key, new Boolean(value));
+ } else if (isInteger(value)) {
+ serviceProperties.setProperty(key, new Integer(value));
+ } else {
+ serviceProperties.setProperty(key, value);
+ }
+ }
+ }
+
+ public ServicePropertiesAdapter(IServiceProperties aServiceProperties) {
+ Assert.isNotNull(aServiceProperties);
+ serviceProperties = aServiceProperties;
+ }
+
+ private boolean isInteger(String value) {
+ try {
+ Integer.parseInt(value);
+ return true;
+ } catch (NumberFormatException e) {
+ return false;
+ }
+ }
+
+ public IServiceProperties toServiceProperties() {
+ return serviceProperties;
+ }
+
+ public Dictionary toProperties() {
+ Dictionary dict = new Properties();
+ Enumeration propertyNames = serviceProperties.getPropertyNames();
+ while (propertyNames.hasMoreElements()) {
+ String key = (String) propertyNames.nextElement();
+ byte[] propertyBytes = serviceProperties.getPropertyBytes(key);
+ if (propertyBytes != null) {
+ StringBuffer buf = new StringBuffer();
+ buf.append(SLP_BYTE_PREFIX);
+ for (int i = 0; i < propertyBytes.length; i++) {
+ buf.append("\\"); //$NON-NLS-1$
+ buf.append(propertyBytes[i]);
+ }
+ dict.put(key, buf.toString());
+ } else {
+ dict.put(key, serviceProperties.getProperty(key).toString());
+ }
+ }
+ return dict;
+ }
+} \ No newline at end of file
diff --git a/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/ServiceURLAdapter.java b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/ServiceURLAdapter.java
index 499b68dd7..bff817ac4 100644
--- a/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/ServiceURLAdapter.java
+++ b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/internal/provider/jslp/ServiceURLAdapter.java
@@ -19,7 +19,7 @@ import org.eclipse.ecf.discovery.identity.IServiceID;
import org.eclipse.ecf.provider.jslp.identity.JSLPNamespace;
/**
- *
+ * Adapts jSLP's ServiceURL to an ECF's IServiceID and vice versa
*/
public class ServiceURLAdapter {
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 23ca2da16..89cd4fbb9 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
@@ -14,6 +14,7 @@ import ch.ethz.iks.slp.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
+import java.util.Map.Entry;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.events.*;
@@ -175,7 +176,8 @@ public class JSLPDiscoveryContainer extends AbstractDiscoveryContainerAdapter {
Assert.isNotNull(type);
try {
JSLPServiceID sid = (JSLPServiceID) IDFactory.getDefault().createID(getConnectNamespace(), new Object[] {type, null});
- return convertToIServiceInfo(Activator.getDefault().getServiceURLs((JSLPServiceTypeID) sid.getServiceTypeID()), type.getScopes());
+ JSLPServiceTypeID stid = (JSLPServiceTypeID) sid.getServiceTypeID();
+ return convertToIServiceInfo(Activator.getDefault().getServiceURLs(stid.getServiceType(), Arrays.asList(stid.getScopes())), type.getScopes());
} catch (IDCreateException e) {
Trace.catching(Activator.PLUGIN_ID, JSLPDebugOptions.EXCEPTIONS_CATCHING, this.getClass(), "getServices(IServiceTypeID)", e); //$NON-NLS-1$
} catch (ServiceLocationException e) {
@@ -192,7 +194,7 @@ public class JSLPDiscoveryContainer extends AbstractDiscoveryContainerAdapter {
try {
JSLPServiceInfo si = new JSLPServiceInfo(aServiceInfo);
IServiceTypeID stid = si.getServiceID().getServiceTypeID();
- Activator.getDefault().register(si.getServiceURL(), Arrays.asList(stid.getScopes()), si.getServiceProperties().asProperties());
+ Activator.getDefault().register(si.getServiceURL(), Arrays.asList(stid.getScopes()), new ServicePropertiesAdapter(si.getServiceProperties()).toProperties());
} catch (ServiceLocationException e) {
Trace.catching(Activator.PLUGIN_ID, JSLPDebugOptions.EXCEPTIONS_CATCHING, this.getClass(), "registerService(IServiceInfo)", e); //$NON-NLS-1$
throw new ECFException(e.getMessage(), e);
@@ -212,15 +214,16 @@ public class JSLPDiscoveryContainer extends AbstractDiscoveryContainerAdapter {
}
}
- private IServiceInfo[] convertToIServiceInfo(Collection serviceURLs) {
+ private IServiceInfo[] convertToIServiceInfo(Map serviceURLs) {
return convertToIServiceInfo(serviceURLs, new String[0]);
}
- private IServiceInfo[] convertToIServiceInfo(Collection serviceURLs, String[] scopes) {
+ private IServiceInfo[] convertToIServiceInfo(Map serviceURLs, String[] scopes) {
List tmp = new ArrayList();
- for (Iterator itr = serviceURLs.iterator(); itr.hasNext();) {
- ServiceURL url = (ServiceURL) itr.next();
- IServiceInfo serviceInfo = new JSLPServiceInfo(new ServiceURLAdapter(url, scopes), -1, -1, new ServiceProperties());
+ for (Iterator itr = serviceURLs.entrySet().iterator(); itr.hasNext();) {
+ Map.Entry entry = (Entry) itr.next();
+ ServiceURL url = (ServiceURL) entry.getKey();
+ IServiceInfo serviceInfo = new JSLPServiceInfo(new ServiceURLAdapter(url, scopes), -1, -1, new ServicePropertiesAdapter((List) entry.getValue()));
tmp.add(serviceInfo);
}
return (IServiceInfo[]) tmp.toArray(new IServiceInfo[tmp.size()]);
diff --git a/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/provider/jslp/container/JSLPServiceInfo.java b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/provider/jslp/container/JSLPServiceInfo.java
index 411d911f1..188935404 100644
--- a/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/provider/jslp/container/JSLPServiceInfo.java
+++ b/providers/bundles/org.eclipse.ecf.provider.jslp/src/org/eclipse/ecf/provider/jslp/container/JSLPServiceInfo.java
@@ -17,6 +17,7 @@ import org.eclipse.ecf.core.identity.IDCreateException;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.discovery.*;
import org.eclipse.ecf.discovery.identity.*;
+import org.eclipse.ecf.internal.provider.jslp.ServicePropertiesAdapter;
import org.eclipse.ecf.internal.provider.jslp.ServiceURLAdapter;
import org.eclipse.ecf.provider.jslp.identity.JSLPNamespace;
@@ -36,8 +37,8 @@ public class JSLPServiceInfo extends ServiceInfo implements IServiceInfo {
this(aSI.getLocation(), ServiceIDFactory.getDefault().createServiceID(IDFactory.getDefault().getNamespaceByName(JSLPNamespace.NAME), aSI.getServiceID().getServiceTypeID(), aSI.getServiceID().getServiceName()), aSI.getPriority(), aSI.getWeight(), aSI.getServiceProperties());
}
- public JSLPServiceInfo(ServiceURLAdapter anAdapter, int priority, int weight, ServiceProperties serviceProperties) {
- this(anAdapter.getURI(), anAdapter.getIServiceID(), priority, weight, serviceProperties);
+ public JSLPServiceInfo(ServiceURLAdapter anAdapter, int priority, int weight, ServicePropertiesAdapter aServicePropertiesAdapter) {
+ this(anAdapter.getURI(), anAdapter.getIServiceID(), priority, weight, aServicePropertiesAdapter.toServiceProperties());
}
public ServiceURL getServiceURL() throws ServiceLocationException {

Back to the top