From 6d39a4e3ac8abbef11b4a6f8f5d89363c2424980 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Wed, 23 Sep 2020 19:57:13 +0200 Subject: [PATCH] [bob] Add BoBDataExtension, remove BoBExtension BoBExtension extending XHTMLExtension was poorly designed and only worked for a single paragraphy. Fixes SMACK-770. --- .../org/jivesoftware/smackx/bob/BoBData.java | 23 +++-- .../org/jivesoftware/smackx/bob/BoBInfo.java | 6 +- .../jivesoftware/smackx/bob/BoBManager.java | 21 ++-- .../bob/{BoBHash.java => ContentId.java} | 31 +++--- .../smackx/bob/element/BoBDataExtension.java | 81 ++++++++++++++++ .../smackx/bob/element/BoBExtension.java | 97 ------------------- .../smackx/bob/element/BoBIQ.java | 36 ++++--- .../provider/BoBDataExtensionProvider.java | 41 ++++++++ .../smackx/bob/provider/BoBIQProvider.java | 22 +---- .../smackx/bob/provider/BoBProviderUtil.java | 48 +++++++++ .../smackx/xhtmlim/packet/XHTMLExtension.java | 2 +- .../extensions.providers | 6 ++ .../jivesoftware/smackx/bob/BoBIQTest.java | 8 +- 13 files changed, 254 insertions(+), 168 deletions(-) rename smack-extensions/src/main/java/org/jivesoftware/smackx/bob/{BoBHash.java => ContentId.java} (79%) create mode 100644 smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBDataExtension.java delete mode 100644 smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBExtension.java create mode 100644 smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBDataExtensionProvider.java create mode 100644 smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBProviderUtil.java diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBData.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBData.java index 654e120d8..6ec45af34 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBData.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBData.java @@ -29,14 +29,19 @@ import org.jivesoftware.smack.util.stringencoder.Base64; */ public class BoBData { - private final int maxAge; + private final Integer maxAge; private final String type; private byte[] contentBinary; private String contentString; + private BoBData(String type, Integer maxAge) { + this.type = type; + this.maxAge = maxAge; + } + public BoBData(String type, byte[] content) { - this(type, content, -1); + this(type, content, null); } /** @@ -46,20 +51,18 @@ public class BoBData { * @param content TODO javadoc me please * @param maxAge TODO javadoc me please */ - public BoBData(String type, byte[] content, int maxAge) { - this.type = type; + public BoBData(String type, byte[] content, Integer maxAge) { + this(type, maxAge); this.contentBinary = content; - this.maxAge = maxAge; } public BoBData(String type, String content) { - this(type, content, -1); + this(type, content, null); } - public BoBData(String type, String content, int maxAge) { - this.type = type; + public BoBData(String type, String content, Integer maxAge) { + this(type, maxAge); this.contentString = content; - this.maxAge = maxAge; } /** @@ -67,7 +70,7 @@ public class BoBData { * * @return the max age */ - public int getMaxAge() { + public Integer getMaxAge() { return maxAge; } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBInfo.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBInfo.java index a4db4aeae..becb5322f 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBInfo.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBInfo.java @@ -20,15 +20,15 @@ import java.util.Set; public class BoBInfo { - private final Set hashes; + private final Set hashes; private final BoBData data; - BoBInfo(Set hashes, BoBData data) { + BoBInfo(Set hashes, BoBData data) { this.hashes = hashes; this.data = data; } - public Set getHashes() { + public Set getHashes() { return hashes; } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBManager.java index b3ac970d2..e368ab366 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBManager.java @@ -1,6 +1,6 @@ /** * - * Copyright 2016-2017 Fernando Ramirez, Florian Schmaus + * Copyright 2016-2020 Fernando Ramirez, Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,9 +81,9 @@ public final class BoBManager extends Manager { return bobManager; } - private static final LruCache BOB_CACHE = new LruCache<>(128); + private static final LruCache BOB_CACHE = new LruCache<>(128); - private final Map bobs = new ConcurrentHashMap<>(); + private final Map bobs = new ConcurrentHashMap<>(); private BoBManager(XMPPConnection connection) { super(connection); @@ -95,15 +95,16 @@ public final class BoBManager extends Manager { @Override public IQ handleIQRequest(IQ iqRequest) { BoBIQ bobIQRequest = (BoBIQ) iqRequest; + ContentId contentId = bobIQRequest.getContentId(); - BoBInfo bobInfo = bobs.get(bobIQRequest.getBoBHash()); + BoBInfo bobInfo = bobs.get(contentId); if (bobInfo == null) { // TODO return item-not-found return null; } BoBData bobData = bobInfo.getData(); - BoBIQ responseBoBIQ = new BoBIQ(bobIQRequest.getBoBHash(), bobData); + BoBIQ responseBoBIQ = new BoBIQ(contentId, bobData); responseBoBIQ.setType(Type.result); responseBoBIQ.setTo(bobIQRequest.getFrom()); return responseBoBIQ; @@ -137,7 +138,7 @@ public final class BoBManager extends Manager { * @throws NotConnectedException if the XMPP connection is not connected. * @throws InterruptedException if the calling thread was interrupted. */ - public BoBData requestBoB(Jid to, BoBHash bobHash) throws NotLoggedInException, NoResponseException, + public BoBData requestBoB(Jid to, ContentId bobHash) throws NotLoggedInException, NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { BoBData bobData = BOB_CACHE.lookup(bobHash); if (bobData != null) { @@ -159,9 +160,9 @@ public final class BoBManager extends Manager { public BoBInfo addBoB(BoBData bobData) { // We only support SHA-1 for now. - BoBHash bobHash = new BoBHash(SHA1.hex(bobData.getContent()), "sha1"); + ContentId bobHash = new ContentId(SHA1.hex(bobData.getContent()), "sha1"); - Set bobHashes = Collections.singleton(bobHash); + Set bobHashes = Collections.singleton(bobHash); bobHashes = Collections.unmodifiableSet(bobHashes); BoBInfo bobInfo = new BoBInfo(bobHashes, bobData); @@ -171,12 +172,12 @@ public final class BoBManager extends Manager { return bobInfo; } - public BoBInfo removeBoB(BoBHash bobHash) { + public BoBInfo removeBoB(ContentId bobHash) { BoBInfo bobInfo = bobs.remove(bobHash); if (bobInfo == null) { return null; } - for (BoBHash otherBobHash : bobInfo.getHashes()) { + for (ContentId otherBobHash : bobInfo.getHashes()) { bobs.remove(otherBobHash); } return bobInfo; diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBHash.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/ContentId.java similarity index 79% rename from smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBHash.java rename to smack-extensions/src/main/java/org/jivesoftware/smackx/bob/ContentId.java index 8175de8be..5b5265bd9 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/BoBHash.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/ContentId.java @@ -19,29 +19,32 @@ package org.jivesoftware.smackx.bob; import org.jivesoftware.smack.util.StringUtils; /** - * Bits of Binary hash class. + * Content-ID class. * * @author Fernando Ramirez * @author Florian Schmaus - * @see XEP-0231: Bits of - * Binary + * @see RFC 2392: Content-ID and Message-ID Uniform Resource Locators */ -public class BoBHash { +public class ContentId { private final String hash; private final String hashType; private final String cid; + private ContentId(String hash, String hashType, String cid) { + this.hash = StringUtils.requireNotNullNorEmpty(hash, "hash must not be null nor empty"); + this.hashType = StringUtils.requireNotNullNorEmpty(hashType, "hashType must not be null nor empty"); + this.cid = cid; + } + /** * BoB hash constructor. * * @param hash TODO javadoc me please * @param hashType TODO javadoc me please */ - public BoBHash(String hash, String hashType) { - this.hash = StringUtils.requireNotNullNorEmpty(hash, "hash must not be null nor empty"); - this.hashType = StringUtils.requireNotNullNorEmpty(hashType, "hashType must not be null nor empty"); - this.cid = this.hashType + '+' + this.hash + "@bob.xmpp.org"; + public ContentId(String hash, String hashType) { + this(hash, hashType, hashType + '+' + hash + "@bob.xmpp.org"); } /** @@ -82,8 +85,8 @@ public class BoBHash { @Override public boolean equals(Object other) { - if (other instanceof BoBHash) { - BoBHash otherBob = (BoBHash) other; + if (other instanceof ContentId) { + ContentId otherBob = (ContentId) other; return cid.equals(otherBob.cid); } return false; @@ -100,10 +103,10 @@ public class BoBHash { * @param src TODO javadoc me please * @return the BoB hash */ - public static BoBHash fromSrc(String src) { + public static ContentId fromSrc(String src) { String hashType = src.substring(src.lastIndexOf("cid:") + 4, src.indexOf("+")); String hash = src.substring(src.indexOf("+") + 1, src.indexOf("@bob.xmpp.org")); - return new BoBHash(hash, hashType); + return new ContentId(hash, hashType); } /** @@ -112,10 +115,10 @@ public class BoBHash { * @param cid TODO javadoc me please * @return the BoB hash */ - public static BoBHash fromCid(String cid) { + public static ContentId fromCid(String cid) { String hashType = cid.substring(0, cid.indexOf("+")); String hash = cid.substring(cid.indexOf("+") + 1, cid.indexOf("@bob.xmpp.org")); - return new BoBHash(hash, hashType); + return new ContentId(hash, hashType, cid); } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBDataExtension.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBDataExtension.java new file mode 100644 index 000000000..76414d9bc --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBDataExtension.java @@ -0,0 +1,81 @@ +/** + * + * Copyright 2020 Florian Schmaus + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.bob.element; + +import org.jivesoftware.smack.packet.ExtensionElement; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.util.Objects; +import org.jivesoftware.smack.util.XmlStringBuilder; +import org.jivesoftware.smackx.bob.BoBData; +import org.jivesoftware.smackx.bob.BoBManager; +import org.jivesoftware.smackx.bob.ContentId; + +/** + * Bits of Binary data extension element. + * + * @author Florian Schmaus + * @see XEP-0231: Bits of + * Binary + */ +public class BoBDataExtension implements ExtensionElement { + + public static final String ELEMENT = "data"; + public static final String NAMESPACE = BoBManager.NAMESPACE; + + private final ContentId cid; + private final BoBData bobData; + + /** + * Bits of Binary data extension constructor. + * + * @param cid TODO javadoc me please + * @param bobData TODO javadoc me please + */ + public BoBDataExtension(ContentId cid, BoBData bobData) { + this.cid = Objects.requireNonNull(cid); + this.bobData = Objects.requireNonNull(bobData); + } + + @Override + public String getElementName() { + return ELEMENT; + } + + @Override + public String getNamespace() { + return NAMESPACE; + } + + @Override + public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { + XmlStringBuilder xml = new XmlStringBuilder(this); + xml.attribute("cid", cid.getCid()); + xml.attribute("type", bobData.getType()); + xml.optAttribute("max-age", bobData.getMaxAge()); + xml.rightAngleBracket(); + + xml.append(bobData.getContentBase64Encoded()); + + xml.closeElement(this); + return xml; + } + + public static BoBDataExtension from(Message message) { + return message.getExtension(BoBDataExtension.class); + } + +} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBExtension.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBExtension.java deleted file mode 100644 index 442474fa1..000000000 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBExtension.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * - * Copyright 2016 Fernando Ramirez - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jivesoftware.smackx.bob.element; - -import org.jivesoftware.smack.packet.Message; -import org.jivesoftware.smack.util.XmlStringBuilder; - -import org.jivesoftware.smackx.bob.BoBHash; -import org.jivesoftware.smackx.xhtmlim.XHTMLText; -import org.jivesoftware.smackx.xhtmlim.packet.XHTMLExtension; - -/** - * Bits of Binary extension element. - * - * @author Fernando Ramirez - * @see XEP-0231: Bits of - * Binary - */ -public class BoBExtension extends XHTMLExtension { - - private final BoBHash bobHash; - private final String alt; - private final String paragraph; - - /** - * Bits of Binary extension constructor. - * - * @param bobHash TODO javadoc me please - * @param alt TODO javadoc me please - * @param paragraph TODO javadoc me please - */ - public BoBExtension(BoBHash bobHash, String alt, String paragraph) { - this.bobHash = bobHash; - this.alt = alt; - this.paragraph = paragraph; - } - - /** - * Get the BoB hash. - * - * @return the BoB hash - */ - public BoBHash getBoBHash() { - return bobHash; - } - - /** - * Get the alt field. - * - * @return the alt field - */ - public String getAlt() { - return alt; - } - - @Override - public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); - xml.rightAngleBracket(); - - xml.halfOpenElement(Message.BODY); - xml.xmlnsAttribute(XHTMLText.NAMESPACE); - xml.rightAngleBracket(); - - xml.openElement(XHTMLText.P); - xml.optEscape(paragraph); - - xml.halfOpenElement(XHTMLText.IMG); - xml.optAttribute("alt", alt); - xml.attribute("src", bobHash.toSrc()); - xml.closeEmptyElement(); - - xml.closeElement(XHTMLText.P); - xml.closeElement(Message.BODY); - xml.closeElement(this); - return xml; - } - - public static BoBExtension from(Message message) { - return (BoBExtension) message.getExtensionElement(ELEMENT, NAMESPACE); - } - -} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBIQ.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBIQ.java index b79d5d145..085df5fd5 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBIQ.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/element/BoBIQ.java @@ -1,6 +1,6 @@ /** * - * Copyright 2016 Fernando Ramirez + * Copyright 2016 Fernando Ramirez, 2020 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,8 +19,8 @@ package org.jivesoftware.smackx.bob.element; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smackx.bob.BoBData; -import org.jivesoftware.smackx.bob.BoBHash; import org.jivesoftware.smackx.bob.BoBManager; +import org.jivesoftware.smackx.bob.ContentId; /** * Bits of Binary IQ class. @@ -41,28 +41,40 @@ public class BoBIQ extends IQ { */ public static final String NAMESPACE = BoBManager.NAMESPACE; - private final BoBHash bobHash; + private final ContentId cid; private final BoBData bobData; /** * Bits of Binary IQ constructor. * - * @param bobHash TODO javadoc me please + * @param cid TODO javadoc me please * @param bobData TODO javadoc me please */ - public BoBIQ(BoBHash bobHash, BoBData bobData) { + public BoBIQ(ContentId cid, BoBData bobData) { super(ELEMENT, NAMESPACE); - this.bobHash = bobHash; + this.cid = cid; this.bobData = bobData; } /** * Bits of Binary IQ constructor. * - * @param bobHash TODO javadoc me please + * @param cid TODO javadoc me please */ - public BoBIQ(BoBHash bobHash) { - this(bobHash, null); + public BoBIQ(ContentId cid) { + this(cid, null); + } + + /** + * Get the BoB hash. + * + * @return the BoB hash + * @deprecated use {@link #getContentId()} instead. + */ + // TODO: Remove in Smack 4.5. + @Deprecated + public ContentId getBoBHash() { + return cid; } /** @@ -70,8 +82,8 @@ public class BoBIQ extends IQ { * * @return the BoB hash */ - public BoBHash getBoBHash() { - return bobHash; + public ContentId getContentId() { + return cid; } /** @@ -85,7 +97,7 @@ public class BoBIQ extends IQ { @Override protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { - xml.attribute("cid", bobHash.getCid()); + xml.attribute("cid", cid.getCid()); if (bobData != null) { xml.optIntAttribute("max_age", bobData.getMaxAge()); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBDataExtensionProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBDataExtensionProvider.java new file mode 100644 index 000000000..a633c8b07 --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBDataExtensionProvider.java @@ -0,0 +1,41 @@ +/** + * + * Copyright 2020 Florian Schmaus + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.bob.provider; + +import java.io.IOException; + +import org.jivesoftware.smack.packet.XmlEnvironment; +import org.jivesoftware.smack.provider.ExtensionElementProvider; +import org.jivesoftware.smack.util.Pair; +import org.jivesoftware.smack.xml.XmlPullParser; +import org.jivesoftware.smack.xml.XmlPullParserException; +import org.jivesoftware.smackx.bob.BoBData; +import org.jivesoftware.smackx.bob.ContentId; +import org.jivesoftware.smackx.bob.element.BoBDataExtension; + +public class BoBDataExtensionProvider extends ExtensionElementProvider { + + @Override + public BoBDataExtension parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) + throws XmlPullParserException, IOException { + Pair parserResult = BoBProviderUtil.parseContentIdAndBobData(parser, initialDepth, + xmlEnvironment); + + return new BoBDataExtension(parserResult.getFirst(), parserResult.getSecond()); + } + +} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBIQProvider.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBIQProvider.java index 36f820256..a1e9f92f3 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBIQProvider.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBIQProvider.java @@ -20,12 +20,12 @@ import java.io.IOException; import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.provider.IQProvider; -import org.jivesoftware.smack.util.ParserUtils; +import org.jivesoftware.smack.util.Pair; import org.jivesoftware.smack.xml.XmlPullParser; import org.jivesoftware.smack.xml.XmlPullParserException; import org.jivesoftware.smackx.bob.BoBData; -import org.jivesoftware.smackx.bob.BoBHash; +import org.jivesoftware.smackx.bob.ContentId; import org.jivesoftware.smackx.bob.element.BoBIQ; /** @@ -39,22 +39,10 @@ public class BoBIQProvider extends IQProvider { @Override public BoBIQ parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException { - String cid = parser.getAttributeValue("", "cid"); - BoBHash bobHash = BoBHash.fromCid(cid); + Pair parserResult = BoBProviderUtil.parseContentIdAndBobData(parser, initialDepth, + xmlEnvironment); - String dataType = parser.getAttributeValue("", "type"); - int maxAge = ParserUtils.getIntegerAttribute(parser, "max-age", -1); - - String base64EncodedData = parser.nextText(); - - BoBData bobData; - if (dataType != null) { - bobData = new BoBData(dataType, base64EncodedData, maxAge); - } else { - bobData = null; - } - - return new BoBIQ(bobHash, bobData); + return new BoBIQ(parserResult.getFirst(), parserResult.getSecond()); } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBProviderUtil.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBProviderUtil.java new file mode 100644 index 000000000..81c166b45 --- /dev/null +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bob/provider/BoBProviderUtil.java @@ -0,0 +1,48 @@ +/** + * + * Copyright 2020 Florian Schmaus + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.bob.provider; + +import java.io.IOException; + +import org.jivesoftware.smack.packet.XmlEnvironment; +import org.jivesoftware.smack.util.Pair; +import org.jivesoftware.smack.util.ParserUtils; +import org.jivesoftware.smack.xml.XmlPullParser; +import org.jivesoftware.smack.xml.XmlPullParserException; +import org.jivesoftware.smackx.bob.BoBData; +import org.jivesoftware.smackx.bob.ContentId; + +public class BoBProviderUtil { + + public static Pair parseContentIdAndBobData(XmlPullParser parser, int initialDepth, + XmlEnvironment xmlEnvironment) throws IOException, XmlPullParserException { + String cid = parser.getAttributeValue("", "cid"); + ContentId contentId = ContentId.fromCid(cid); + + String dataType = parser.getAttributeValue("", "type"); + Integer maxAge = ParserUtils.getIntegerAttribute(parser, "max-age"); + + String base64EncodedData = parser.nextText(); + + BoBData bobData = null; + if (dataType != null) { + bobData = new BoBData(dataType, base64EncodedData, maxAge); + } + + return Pair.create(contentId, bobData); + } +} diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/packet/XHTMLExtension.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/packet/XHTMLExtension.java index 75ebd5bdf..a49020f68 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/packet/XHTMLExtension.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xhtmlim/packet/XHTMLExtension.java @@ -37,7 +37,7 @@ import org.jivesoftware.smack.util.XmlStringBuilder; * * @author Gaston Dombiak */ -public class XHTMLExtension implements ExtensionElement { +public final class XHTMLExtension implements ExtensionElement { public static final String ELEMENT = "html"; public static final String NAMESPACE = "http://jabber.org/protocol/xhtml-im"; diff --git a/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers b/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers index 6d7ebc38c..19c19a305 100644 --- a/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers +++ b/smack-extensions/src/main/resources/org.jivesoftware.smack.extensions/extensions.providers @@ -500,6 +500,12 @@ + + data + urn:xmpp:bob + org.jivesoftware.smackx.bob.provider.BoBDataExtensionProvider + + data urn:xmpp:bob diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/bob/BoBIQTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/bob/BoBIQTest.java index bc17dd23e..63c2d0183 100644 --- a/smack-extensions/src/test/java/org/jivesoftware/smackx/bob/BoBIQTest.java +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/bob/BoBIQTest.java @@ -41,7 +41,7 @@ public class BoBIQTest extends SmackTestSuite { @Test public void checkBoBIQRequest() throws Exception { - BoBHash bobHash = new BoBHash("8f35fef110ffc5df08d579a50083ff9308fb6242", "sha1"); + ContentId bobHash = new ContentId("8f35fef110ffc5df08d579a50083ff9308fb6242", "sha1"); BoBIQ createdBoBIQ = new BoBIQ(bobHash); createdBoBIQ.setStanzaId("sarasa"); @@ -55,7 +55,7 @@ public class BoBIQTest extends SmackTestSuite { public void checkBoBIQResponse() throws Exception { BoBIQ bobIQ = PacketParserUtils.parseStanza(sampleBoBIQResponse); - BoBHash bobHash = new BoBHash("8f35fef110ffc5df08d579a50083ff9308fb6242", "sha1"); + ContentId bobHash = new ContentId("8f35fef110ffc5df08d579a50083ff9308fb6242", "sha1"); BoBData bobData = new BoBData("image/png", "sarasade2354j2".getBytes(StandardCharsets.UTF_8), 86400); BoBIQ createdBoBIQ = new BoBIQ(bobHash, bobData); @@ -63,8 +63,8 @@ public class BoBIQTest extends SmackTestSuite { createdBoBIQ.setTo(JidCreate.from("doctor@shakespeare.lit/pda")); createdBoBIQ.setType(Type.result); - assertEquals(bobIQ.getBoBHash().getHash(), createdBoBIQ.getBoBHash().getHash()); - assertEquals(bobIQ.getBoBHash().getHashType(), createdBoBIQ.getBoBHash().getHashType()); + assertEquals(bobIQ.getContentId().getHash(), createdBoBIQ.getContentId().getHash()); + assertEquals(bobIQ.getContentId().getHashType(), createdBoBIQ.getContentId().getHashType()); assertEquals(bobIQ.getBoBData().getMaxAge(), createdBoBIQ.getBoBData().getMaxAge()); assertEquals(bobIQ.getBoBData().getType(), createdBoBIQ.getBoBData().getType()); assertEquals(bobIQ.getBoBData().getContentBase64Encoded(), createdBoBIQ.getBoBData().getContentBase64Encoded());