From 21ddb9eb83e961b6af7ee91604e1000b2d6d1aa7 Mon Sep 17 00:00:00 2001 From: slewis Date: Sat, 7 Jun 2008 16:54:11 +0000 Subject: Preparing for 232116 --- .../META-INF/MANIFEST.MF | 1 + .../org.eclipse.ecf.provider.xmpp/plugin.xml | 8 ++- .../xmpp/XMPPFiletURLStreamHandlerService.java | 18 +++++ .../ecf/provider/xmpp/identity/XMPPFileID.java | 84 +++++++++++++++++++--- .../provider/xmpp/identity/XMPPFileNamespace.java | 35 +++++++-- .../eclipse/ecf/provider/xmpp/identity/XMPPID.java | 15 ++-- 6 files changed, 134 insertions(+), 27 deletions(-) create mode 100644 providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/internal/provider/xmpp/XMPPFiletURLStreamHandlerService.java (limited to 'providers/bundles/org.eclipse.ecf.provider.xmpp') diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/META-INF/MANIFEST.MF b/providers/bundles/org.eclipse.ecf.provider.xmpp/META-INF/MANIFEST.MF index 5fde9ee7c..60b433f8c 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/META-INF/MANIFEST.MF +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/META-INF/MANIFEST.MF @@ -32,5 +32,6 @@ Import-Package: org.eclipse.core.runtime.jobs, org.eclipse.osgi.util;version="1.0.0", org.osgi.framework;version="1.3.0", org.osgi.service.log;version="1.3.0", + org.osgi.service.url, org.osgi.util.tracker;version="1.3.2" Bundle-ActivationPolicy: lazy diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/plugin.xml b/providers/bundles/org.eclipse.ecf.provider.xmpp/plugin.xml index 3df5a080d..99fb1ef98 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/plugin.xml +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/plugin.xml @@ -86,5 +86,11 @@ - + + + + diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/internal/provider/xmpp/XMPPFiletURLStreamHandlerService.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/internal/provider/xmpp/XMPPFiletURLStreamHandlerService.java new file mode 100644 index 000000000..3ae128684 --- /dev/null +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/internal/provider/xmpp/XMPPFiletURLStreamHandlerService.java @@ -0,0 +1,18 @@ +package org.eclipse.ecf.internal.provider.xmpp; + +import java.io.IOException; +import java.net.URL; +import java.net.URLConnection; + +import org.osgi.service.url.AbstractURLStreamHandlerService; + +public class XMPPFiletURLStreamHandlerService extends AbstractURLStreamHandlerService { + + public XMPPFiletURLStreamHandlerService() { + } + + public URLConnection openConnection(URL u) throws IOException { + throw new IOException("Cannot open connection with xmppfile protocol"); //$NON-NLS-1$ + } + +} diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPFileID.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPFileID.java index 2b6abcf78..aff356d62 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPFileID.java +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPFileID.java @@ -11,14 +11,19 @@ package org.eclipse.ecf.provider.xmpp.identity; +import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.StringTokenizer; import org.eclipse.core.runtime.Assert; import org.eclipse.ecf.core.identity.BaseID; -import org.eclipse.ecf.core.identity.Namespace; +import org.eclipse.ecf.core.identity.IDCreateException; +import org.eclipse.ecf.core.identity.IDFactory; import org.eclipse.ecf.filetransfer.identity.IFileID; -import org.eclipse.ecf.internal.provider.xmpp.Messages; +import org.eclipse.osgi.util.NLS; /** * XMPPFileID for use with the XMPP outgoing file transfer. @@ -26,15 +31,74 @@ import org.eclipse.ecf.internal.provider.xmpp.Messages; public class XMPPFileID extends BaseID implements IFileID { private static final long serialVersionUID = 9052434567658554404L; + public static final String FILENAME_KEY = "file"; //$NON-NLS-1$ + public static final String XMPPIDNAMESPACE_KEY = "ns"; //$NON-NLS-1$ + private static final String UTF_8 = "utf-8"; //$NON-NLS-1$ - XMPPID xmppid; - String filename; + private final XMPPID xmppid; + private final String filename; + private final URL url; - public XMPPFileID(XMPPID id, String fn) { + public XMPPFileID(XMPPID id, String fn) throws MalformedURLException { Assert.isNotNull(id); Assert.isNotNull(fn); this.xmppid = id; this.filename = fn; + this.url = createURL(xmppid, filename); + } + + XMPPFileID(URL url) throws IDCreateException, MalformedURLException { + Assert.isNotNull(url); + this.url = url; + this.xmppid = (XMPPID) IDFactory.getDefault().createID(getPropertyFromURL(XMPPIDNAMESPACE_KEY, url), getIDStringFromFileURL(url)); + this.filename = getPropertyFromURL(FILENAME_KEY, url); + } + + private static String getIDStringFromFileURL(URL url) throws MalformedURLException { + final String result = url.getAuthority(); + String path = url.getPath(); + path = (path.startsWith("/") ? path : "/" + path); //$NON-NLS-1$ //$NON-NLS-2$ + return result + path; + } + + private static String getPropertyFromURL(String propKey, URL url) throws MalformedURLException { + final String query = url.getQuery(); + if (query == null || query.equals("")) //$NON-NLS-1$ + throw new MalformedURLException(NLS.bind("Cannot have empty query for URL {0}", url)); //$NON-NLS-1$ + final StringTokenizer st = new StringTokenizer(query, "&"); //$NON-NLS-1$ + while (st.hasMoreTokens()) { + final String tok = st.nextToken(); + if (tok.startsWith(propKey + "=")) { //$NON-NLS-1$ + try { + return URLDecoder.decode(tok.substring(propKey.length() + "=".length()), UTF_8); //$NON-NLS-1$ + } catch (final UnsupportedEncodingException e) { + // should not happen + throw new MalformedURLException(NLS.bind("Could not decode {0} in URL {1}", propKey, url)); //$NON-NLS-1$ + + } + } + } + throw new MalformedURLException(NLS.bind("Key {0} not found in URL {1}", propKey, url)); //$NON-NLS-1$ + } + + public static URL createURL(XMPPID xmppid2, String filename2) throws MalformedURLException { + final StringBuffer buf = new StringBuffer(XMPPFileNamespace.SCHEME); + buf.append("://"); //$NON-NLS-1$ + buf.append(xmppid2.getFQName()).append(createQuery(filename2, xmppid2.getNamespace().getName())); + return new URL(buf.toString()); + } + + public static String createQuery(String filename, String xmppidScheme) throws MalformedURLException { + final StringBuffer sb = new StringBuffer("?"); //$NON-NLS-1$ + try { + sb.append(FILENAME_KEY).append("=").append(URLEncoder.encode(filename, UTF_8)); //$NON-NLS-1$ + sb.append("&"); //$NON-NLS-1$ + sb.append(XMPPIDNAMESPACE_KEY).append("=").append(URLEncoder.encode(xmppidScheme, UTF_8)); //$NON-NLS-1$ + return sb.toString(); + } catch (final UnsupportedEncodingException e) { + // should never happen + throw new MalformedURLException("filename encoding exception"); //$NON-NLS-1$ + } } public XMPPID getXMPPID() { @@ -42,10 +106,10 @@ public class XMPPFileID extends BaseID implements IFileID { } /* (non-Javadoc) - * @see org.eclipse.ecf.core.identity.BaseID#namespaceToExternalForm() + * @see org.eclipse.ecf.core.identity.BaseID#toExternalForm() */ - protected String namespaceToExternalForm() { - return namespace.getScheme() + Namespace.SCHEME_SEPARATOR + xmppid.toExternalForm() + "*" + filename; + public String toExternalForm() { + return url.toExternalForm(); } /* (non-Javadoc) @@ -71,7 +135,7 @@ public class XMPPFileID extends BaseID implements IFileID { * @see org.eclipse.ecf.core.identity.BaseID#namespaceGetName() */ protected String namespaceGetName() { - return xmppid.getName() + "/" + filename; //$NON-NLS-1$ + return toExternalForm(); } /* (non-Javadoc) @@ -92,7 +156,7 @@ public class XMPPFileID extends BaseID implements IFileID { * @see org.eclipse.ecf.filetransfer.identity.IFileID#getURL() */ public URL getURL() throws MalformedURLException { - throw new MalformedURLException(Messages.XMPPFileID_EXCEPTION_FILE_IDS_NOT_URLS); + return url; } } diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPFileNamespace.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPFileNamespace.java index 45ac8f4f7..65aafc34d 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPFileNamespace.java +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPFileNamespace.java @@ -11,10 +11,11 @@ package org.eclipse.ecf.provider.xmpp.identity; +import java.net.URL; + import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.identity.IDCreateException; import org.eclipse.ecf.core.identity.Namespace; -import org.eclipse.ecf.internal.provider.xmpp.Messages; import org.eclipse.osgi.util.NLS; /** @@ -28,16 +29,32 @@ public class XMPPFileNamespace extends Namespace { public static final String NAME = "ecf.provider.filetransfer.xmpp"; //$NON-NLS-1$ + private String getInitFromExternalForm(Object[] args) { + if (args == null || args.length < 1 || args[0] == null) + return null; + if (args[0] instanceof String) { + final String arg = (String) args[0]; + if (arg.startsWith(getScheme() + Namespace.SCHEME_SEPARATOR)) { + final int index = arg.indexOf(Namespace.SCHEME_SEPARATOR); + if (index >= arg.length()) + return null; + return arg.substring(index + 1); + } + } + return null; + } + /* (non-Javadoc) * @see org.eclipse.ecf.core.identity.Namespace#createInstance(java.lang.Object[]) */ public ID createInstance(Object[] parameters) throws IDCreateException { - if (parameters == null || parameters.length < 2 || !(parameters[0] instanceof XMPPID || !(parameters[1] instanceof String))) - throw new IDCreateException(Messages.XMPPFileNamespace_EXCEPTION_INVALID_FILEID_PARAMETERS); try { - final XMPPID target = (XMPPID) parameters[0]; - final String filename = (String) parameters[1]; - return new XMPPFileID(target, filename); + final String init = getInitFromExternalForm(parameters); + if (init != null) + return new XMPPFileID(new URL(init)); + if (parameters[0] instanceof URL) + return new XMPPFileID((URL) parameters[0]); + return new XMPPFileID((XMPPID) parameters[0], (String) parameters[1]); } catch (final Exception e) { throw new IDCreateException(NLS.bind("{0} createInstance()", getName()), e); //$NON-NLS-1$ } @@ -50,4 +67,10 @@ public class XMPPFileNamespace extends Namespace { return SCHEME; } + /* (non-Javadoc) + * @see org.eclipse.ecf.core.identity.Namespace#getSupportedParameterTypes() + */ + public Class[][] getSupportedParameterTypes() { + return new Class[][] { {String.class}, {URL.class}, {XMPPID.class, String.class}}; + } } diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPID.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPID.java index c27a4ffc5..deb1e6917 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPID.java +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPID.java @@ -97,15 +97,10 @@ public class XMPPID extends BaseID implements IChatID { } /* (non-Javadoc) - * @see org.eclipse.ecf.core.identity.BaseID#toExternalForm() + * @see org.eclipse.ecf.core.identity.BaseID#namespaceToExternalForm() */ - public String toExternalForm() { - final StringBuffer buf = new StringBuffer(namespace.getScheme()); - buf.append(Namespace.SCHEME_SEPARATOR); - buf.append(USER_HOST_DELIMITER).append(hostname); - buf.append((port == -1) ? "" : PORT_DELIMITER + "" + port); - buf.append(resourcename); - return buf.toString(); + protected String namespaceToExternalForm() { + return uri.toASCIIString(); } public String getUsername() { @@ -125,11 +120,11 @@ public class XMPPID extends BaseID implements IChatID { } public String getUsernameAtHost() { - return getUsername() + "@" + getHostname(); //$NON-NLS-1$ + return getUsername() + USER_HOST_DELIMITER + getHostname(); } public String getFQName() { - return getUsernameAtHost() + getResourceName(); + return getUsernameAtHost() + ((getPort() == -1) ? "" : ":" + getPort()) + getResourceName(); } public String toString() { -- cgit v1.2.3