diff options
Diffstat (limited to 'providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPFileID.java')
-rw-r--r-- | providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/identity/XMPPFileID.java | 84 |
1 files changed, 74 insertions, 10 deletions
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; } } |