diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/HttpFileUploadManager.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/HttpFileUploadManager.java index 47e2ddd8b..9bf90c443 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/HttpFileUploadManager.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/HttpFileUploadManager.java @@ -470,6 +470,22 @@ public final class HttpFileUploadManager extends Manager { } } + public static UploadService.Version namespaceToVersion(String namespace) { + UploadService.Version version; + switch (namespace) { + case NAMESPACE: + version = Version.v0_3; + break; + case NAMESPACE_0_2: + version = Version.v0_2; + break; + default: + version = null; + break; + } + return version; + } + private static boolean containsHttpFileUploadNamespace(DiscoverInfo discoverInfo) { return discoverInfo.containsFeature(NAMESPACE) || discoverInfo.containsFeature(NAMESPACE_0_2); } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/UploadService.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/UploadService.java index baf279cd8..17d4fc988 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/UploadService.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/UploadService.java @@ -22,7 +22,7 @@ import org.jxmpp.jid.DomainBareJid; public class UploadService { - enum Version { + public enum Version { /** * Upload service as specified in XEP-0363 v0.2 or lower. * diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/element/Slot.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/element/Slot.java index 943929f9f..274e59bc0 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/element/Slot.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/element/Slot.java @@ -33,8 +33,9 @@ public class Slot extends IQ { public static final String ELEMENT = "slot"; public static final String NAMESPACE = SlotRequest.NAMESPACE; - private final URL putUrl; - private final URL getUrl; + protected final URL putUrl; + protected final URL getUrl; + private final Map headers; public Slot(URL putUrl, URL getUrl) { @@ -73,12 +74,21 @@ public class Slot extends IQ { protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { xml.rightAngleBracket(); - xml.element("put", putUrl.toString()); - xml.element("get", getUrl.toString()); - for (Map.Entry entry : getHeaders().entrySet()) { - xml.openElement("header").attribute(entry.getKey(), entry.getValue()); + xml.halfOpenElement("put").attribute("url", putUrl.toString()); + if (headers.isEmpty()) { + xml.closeEmptyElement(); + } else { + xml.rightAngleBracket(); + for (Map.Entry entry : getHeaders().entrySet()) { + xml.halfOpenElement("header").attribute("name", entry.getKey()).rightAngleBracket(); + xml.escape(entry.getValue()); + xml.closeElement("header"); + } + xml.closeElement("put"); } + xml.halfOpenElement("get").attribute("url", getUrl.toString()).closeEmptyElement(); + return xml; } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/element/Slot_V0_2.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/element/Slot_V0_2.java index 20645ac1a..e44fc3e42 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/element/Slot_V0_2.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/element/Slot_V0_2.java @@ -28,4 +28,13 @@ public class Slot_V0_2 extends Slot { super(putUrl, getUrl, null, NAMESPACE); } + @Override + protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { + xml.rightAngleBracket(); + + xml.element("put", putUrl.toString()); + xml.element("get", getUrl.toString()); + + return xml; + } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/provider/SlotProvider.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/provider/SlotProvider.java index 4647f168c..178a9aaa5 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/provider/SlotProvider.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/httpfileupload/provider/SlotProvider.java @@ -25,6 +25,8 @@ import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.provider.IQProvider; import org.jivesoftware.smack.util.ParserUtils; +import org.jivesoftware.smackx.httpfileupload.HttpFileUploadManager; +import org.jivesoftware.smackx.httpfileupload.UploadService; import org.jivesoftware.smackx.httpfileupload.element.Slot; import org.jivesoftware.smackx.httpfileupload.element.Slot_V0_2; @@ -42,6 +44,10 @@ public class SlotProvider extends IQProvider { @Override public Slot parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException, SmackException { final String namespace = parser.getNamespace(); + + final UploadService.Version version = HttpFileUploadManager.namespaceToVersion(namespace); + assert version != null; + URL putUrl = null; URL getUrl = null; Map headers = null; @@ -53,11 +59,34 @@ public class SlotProvider extends IQProvider { case XmlPullParser.START_TAG: String name = parser.getName(); switch (name) { - case "put": - putUrl = new URL(parser.nextText()); + case "put": { + String putUrlString; + switch (version) { + case v0_2: + putUrlString = parser.nextText(); + break; + case v0_3: + putUrlString = parser.getAttributeValue(null, "url"); + break; + default: + throw new AssertionError(); + } + putUrl = new URL(putUrlString); break; + } case "get": - getUrl = new URL(parser.nextText()); + String getUrlString; + switch (version) { + case v0_2: + getUrlString = parser.nextText(); + break; + case v0_3: + getUrlString = parser.getAttributeValue(null, "url"); + break; + default: + throw new AssertionError(); + } + getUrl = new URL(getUrlString); break; case "header": String headerName = ParserUtils.getRequiredAttribute(parser, "name"); @@ -77,13 +106,14 @@ public class SlotProvider extends IQProvider { } } - switch (namespace) { - case Slot.NAMESPACE: + switch (version) { + case v0_3: return new Slot(putUrl, getUrl, headers); - case Slot_V0_2.NAMESPACE: + case v0_2: return new Slot_V0_2(putUrl, getUrl); default: throw new AssertionError(); } } + } diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/httpfileupload/SlotCreateTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/httpfileupload/SlotCreateTest.java index 49cd2c233..151c0e015 100644 --- a/smack-experimental/src/test/java/org/jivesoftware/smackx/httpfileupload/SlotCreateTest.java +++ b/smack-experimental/src/test/java/org/jivesoftware/smackx/httpfileupload/SlotCreateTest.java @@ -16,23 +16,26 @@ */ package org.jivesoftware.smackx.httpfileupload; -import java.net.MalformedURLException; +import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; + +import java.io.IOException; import java.net.URL; import org.jivesoftware.smackx.httpfileupload.element.Slot; import org.junit.Assert; import org.junit.Test; +import org.xml.sax.SAXException; public class SlotCreateTest { String testSlot = "" - + "https://upload.montague.tld/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67/my_juliet.png" - + "https://download.montague.tld/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67/my_juliet.png" + + "" + + "" + ""; @Test - public void checkSlotRequestCreation() throws MalformedURLException { + public void checkSlotRequestCreation() throws SAXException, IOException { Slot slot = new Slot(new URL("https://upload.montague.tld/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67/my_juliet.png"), new URL("https://download.montague.tld/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67/my_juliet.png")); @@ -41,6 +44,6 @@ public class SlotCreateTest { Assert.assertEquals(new URL("https://download.montague.tld/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67/my_juliet.png"), slot.getGetUrl()); - Assert.assertEquals(testSlot, slot.getChildElementXML().toString()); + assertXMLEqual(testSlot, slot.getChildElementXML().toString()); } } diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/httpfileupload/provider/SlotProviderTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/httpfileupload/provider/SlotProviderTest.java index 82813d5e3..386b1f596 100644 --- a/smack-experimental/src/test/java/org/jivesoftware/smackx/httpfileupload/provider/SlotProviderTest.java +++ b/smack-experimental/src/test/java/org/jivesoftware/smackx/httpfileupload/provider/SlotProviderTest.java @@ -26,7 +26,6 @@ import org.jivesoftware.smackx.httpfileupload.element.Slot; import org.junit.Assert; import org.junit.Test; - public class SlotProviderTest { /** @@ -39,8 +38,8 @@ public class SlotProviderTest { + "to='romeo@montague.tld/garden' " + "type='result'>" + "" - + "https://upload.montague.tld/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67/my_juliet.png" - + "https://download.montague.tld/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67/my_juliet.png" + + "" + + "" + "" + "";