diff options
author | mkuppe | 2008-04-30 13:15:28 +0000 |
---|---|---|
committer | mkuppe | 2008-04-30 13:15:28 +0000 |
commit | 559a25bfb56a6076126f450062797cfe9b6ab366 (patch) | |
tree | 8979d3be6343f23f9e8dba7fe542e9e5a946fdba | |
parent | fdaca474d9c3a29be96a85da8a8a1e9cca4218a0 (diff) | |
download | org.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
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 { |