Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java84
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;
}
}

Back to the top