/** * * Copyright 2014 Andriy Tsykholyas * * 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.hoxt.packet; import javax.xml.namespace.QName; import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.NamedElement; import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.XmlStringBuilder; import org.jivesoftware.smackx.shim.packet.HeadersExtension; /** * Abstract parent for Req and Resp IQ packets. * * @author Andriy Tsykholyas * @see XEP-0332: HTTP over XMPP transport */ public abstract class AbstractHttpOverXmpp extends IQ { public static final String NAMESPACE = "urn:xmpp:http"; private final HeadersExtension headers; private final Data data; private final String version; protected AbstractHttpOverXmpp(String element, Builder builder) { super(element, NAMESPACE); this.headers = builder.headers; this.data = builder.data; this.version = Objects.requireNonNull(builder.version, "version must not be null"); } @Override protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { IQChildElementXmlStringBuilder builder = getIQHoxtChildElementBuilder(xml); builder.optAppend(headers); builder.optAppend(data); return builder; } /** * Returns start tag. * * @param xml builder. * @return start tag */ protected abstract IQChildElementXmlStringBuilder getIQHoxtChildElementBuilder(IQChildElementXmlStringBuilder xml); /** * Returns version attribute. * * @return version attribute */ public String getVersion() { return version; } /** * Returns Headers element. * * @return Headers element */ public HeadersExtension getHeaders() { return headers; } /** * Returns Data element. * * @return Data element */ public Data getData() { return data; } /** * A builder for XMPP connection configurations. *

* See ConnectionConfiguration Builder for more details. *

* * @param the builder type parameter. * @param the resulting HttpOverXmpp IQ */ public abstract static class Builder, C extends AbstractHttpOverXmpp> { private HeadersExtension headers; private Data data; private String version = "1.1"; /** * Sets Data element. * * @param data Headers element * * @return the builder */ public B setData(Data data) { this.data = data; return getThis(); } /** * Sets Headers element. * * @param headers Headers element * * @return the builder */ public B setHeaders(HeadersExtension headers) { this.headers = headers; return getThis(); } /** * Sets version attribute. * * @param version version attribute * * @return the builder */ public B setVersion(String version) { this.version = version; return getThis(); } public abstract C build(); protected abstract B getThis(); } private abstract static class HoxExtensionElement implements ExtensionElement { @Override public final String getNamespace() { return NAMESPACE; } } /** * Representation of Data element. *

* This class is immutable. */ public static class Data extends HoxExtensionElement { public static final String ELEMENT = "data"; public static final QName QNAME = new QName(NAMESPACE, ELEMENT); private final NamedElement child; /** * Creates Data element. * * @param child element nested by Data */ public Data(NamedElement child) { this.child = child; } /** * Returns string containing xml representation of this object. * * @return xml representation of this object */ @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.rightAngleBracket(); xml.append(child); xml.closeElement(this); return xml; } /** * Returns element nested by Data. * * @return element nested by Data */ public NamedElement getChild() { return child; } @Override public String getElementName() { return ELEMENT; } } /** * Representation of Text element. *

* This class is immutable. */ public static class Text extends HoxExtensionElement { public static final String ELEMENT = "text"; public static final QName QNAME = new QName(NAMESPACE, ELEMENT); private final String text; /** * Creates this element. * * @param text value of text */ public Text(String text) { this.text = text; } @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.optTextChild(text, this); return xml; } /** * Returns text of this element. * * @return text TODO javadoc me please */ public String getText() { return text; } @Override public String getElementName() { return ELEMENT; } } /** * Representation of Base64 element. *

* This class is immutable. */ public static class Base64 extends HoxExtensionElement { public static final String ELEMENT = "base64"; public static final QName QNAME = new QName(NAMESPACE, ELEMENT); private final String text; /** * Creates this element. * * @param text value of text */ public Base64(String text) { this.text = text; } @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.optTextChild(text, this); return xml; } /** * Returns text of this element. * * @return text TODO javadoc me please */ public String getText() { return text; } @Override public String getElementName() { return ELEMENT; } } /** * Representation of Xml element. *

* This class is immutable. */ public static class Xml extends HoxExtensionElement { public static final String ELEMENT = "xml"; public static final QName QNAME = new QName(NAMESPACE, ELEMENT); private final String text; /** * Creates this element.builder.toString(). * * @param text value of text */ public Xml(String text) { this.text = text; } @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.optTextChild(text, this); return xml; } /** * Returns text of this element. * * @return text TODO javadoc me please */ public String getText() { return text; } @Override public String getElementName() { return ELEMENT; } } /** * Representation of ChunkedBase64 element. *

* This class is immutable. */ public static class ChunkedBase64 extends HoxExtensionElement { public static final String ELEMENT = "chunkedBase64"; public static final QName QNAME = new QName(NAMESPACE, ELEMENT); private final String streamId; /** * Creates ChunkedBase86 element. * * @param streamId streamId attribute */ public ChunkedBase64(String streamId) { this.streamId = streamId; } @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.attribute("streamId", streamId); xml.closeEmptyElement(); return xml; } /** * Returns streamId attribute. * * @return streamId attribute */ public String getStreamId() { return streamId; } @Override public String getElementName() { return ELEMENT; } } /** * Representation of Ibb element. *

* This class is immutable. */ public static class Ibb extends HoxExtensionElement { public static final String ELEMENT = "ibb"; public static final QName QNAME = new QName(NAMESPACE, ELEMENT); private final String sid; /** * Creates Ibb element. * * @param sid sid attribute */ public Ibb(String sid) { this.sid = sid; } @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.attribute("sid", sid); xml.closeEmptyElement(); return xml; } /** * Returns sid attribute. * * @return sid attribute */ public String getSid() { return sid; } @Override public String getElementName() { return ELEMENT; } } }