AbstractHttpOverXmpp.java

  1. /**
  2.  *
  3.  * Copyright 2014 Andriy Tsykholyas
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.jivesoftware.smackx.hoxt.packet;

  18. import javax.xml.namespace.QName;

  19. import org.jivesoftware.smack.packet.ExtensionElement;
  20. import org.jivesoftware.smack.packet.IQ;
  21. import org.jivesoftware.smack.packet.NamedElement;
  22. import org.jivesoftware.smack.util.Objects;
  23. import org.jivesoftware.smack.util.XmlStringBuilder;

  24. import org.jivesoftware.smackx.shim.packet.HeadersExtension;

  25. /**
  26.  * Abstract parent for Req and Resp IQ packets.
  27.  *
  28.  * @author Andriy Tsykholyas
  29.  * @see <a href="http://xmpp.org/extensions/xep-0332.html">XEP-0332: HTTP over XMPP transport</a>
  30.  */
  31. public abstract class AbstractHttpOverXmpp extends IQ {

  32.     public static final String NAMESPACE = "urn:xmpp:http";

  33.     private final HeadersExtension headers;
  34.     private final Data data;

  35.     private final String version;

  36.     protected AbstractHttpOverXmpp(String element, Builder<?, ?> builder) {
  37.         super(element, NAMESPACE);
  38.         this.headers = builder.headers;
  39.         this.data = builder.data;
  40.         this.version = Objects.requireNonNull(builder.version, "version must not be null");
  41.     }

  42.     @Override
  43.     protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
  44.         IQChildElementXmlStringBuilder builder = getIQHoxtChildElementBuilder(xml);
  45.         builder.optAppend(headers);
  46.         builder.optAppend(data);
  47.         return builder;
  48.     }

  49.     /**
  50.      * Returns start tag.
  51.      *
  52.      * @param xml builder.
  53.      * @return start tag
  54.      */
  55.     protected abstract IQChildElementXmlStringBuilder getIQHoxtChildElementBuilder(IQChildElementXmlStringBuilder xml);

  56.     /**
  57.      * Returns version attribute.
  58.      *
  59.      * @return version attribute
  60.      */
  61.     public String getVersion() {
  62.         return version;
  63.     }

  64.     /**
  65.      * Returns Headers element.
  66.      *
  67.      * @return Headers element
  68.      */
  69.     public HeadersExtension getHeaders() {
  70.         return headers;
  71.     }

  72.     /**
  73.      * Returns Data element.
  74.      *
  75.      * @return Data element
  76.      */
  77.     public Data getData() {
  78.         return data;
  79.     }

  80.     /**
  81.      * A builder for XMPP connection configurations.
  82.      * <p>
  83.      * See ConnectionConfiguration Builder for more details.
  84.      * </p>
  85.      *
  86.      * @param <B> the builder type parameter.
  87.      * @param <C> the resulting HttpOverXmpp IQ
  88.      */
  89.     public abstract static class Builder<B extends Builder<B, C>, C extends AbstractHttpOverXmpp> {

  90.         private HeadersExtension headers;
  91.         private Data data;

  92.         private String version = "1.1";

  93.         /**
  94.          * Sets Data element.
  95.          *
  96.          * @param data Headers element
  97.          *
  98.          * @return the builder
  99.          */
  100.         public B setData(Data data) {
  101.             this.data = data;
  102.             return getThis();
  103.         }

  104.         /**
  105.          * Sets Headers element.
  106.          *
  107.          * @param headers Headers element
  108.          *
  109.          * @return the builder
  110.          */
  111.         public B setHeaders(HeadersExtension headers) {
  112.             this.headers = headers;
  113.             return getThis();
  114.         }

  115.         /**
  116.          * Sets version attribute.
  117.          *
  118.          * @param version version attribute
  119.          *
  120.          * @return the builder
  121.          */
  122.         public B setVersion(String version) {
  123.             this.version = version;
  124.             return getThis();
  125.         }

  126.         public abstract C build();

  127.         protected abstract B getThis();
  128.     }

  129.     private abstract static class HoxExtensionElement implements ExtensionElement {
  130.         @Override
  131.         public final String getNamespace() {
  132.             return NAMESPACE;
  133.         }
  134.     }

  135.     /**
  136.      * Representation of Data element.
  137.      * <p>
  138.      * This class is immutable.
  139.      */
  140.     public static class Data extends HoxExtensionElement {

  141.         public static final String ELEMENT = "data";
  142.         public static final QName QNAME = new QName(NAMESPACE, ELEMENT);

  143.         private final NamedElement child;

  144.         /**
  145.          * Creates Data element.
  146.          *
  147.          * @param child element nested by Data
  148.          */
  149.         public Data(NamedElement child) {
  150.             this.child = child;
  151.         }

  152.         /**
  153.          * Returns string containing xml representation of this object.
  154.          *
  155.          * @return xml representation of this object
  156.          */
  157.         @Override
  158.         public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) {
  159.             XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace);
  160.             xml.rightAngleBracket();
  161.             xml.append(child);
  162.             xml.closeElement(this);
  163.             return xml;
  164.         }

  165.         /**
  166.          * Returns element nested by Data.
  167.          *
  168.          * @return element nested by Data
  169.          */
  170.         public NamedElement getChild() {
  171.             return child;
  172.         }

  173.         @Override
  174.         public String getElementName() {
  175.             return ELEMENT;
  176.         }
  177.     }

  178.     /**
  179.      * Representation of Text element.
  180.      * <p>
  181.      * This class is immutable.
  182.      */
  183.     public static class Text extends HoxExtensionElement {

  184.         public static final String ELEMENT = "text";
  185.         public static final QName QNAME = new QName(NAMESPACE, ELEMENT);

  186.         private final String text;

  187.         /**
  188.          * Creates this element.
  189.          *
  190.          * @param text value of text
  191.          */
  192.         public Text(String text) {
  193.             this.text = text;
  194.         }

  195.         @Override
  196.         public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) {
  197.             XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace);
  198.             xml.optTextChild(text, this);
  199.             return xml;
  200.         }

  201.         /**
  202.          * Returns text of this element.
  203.          *
  204.          * @return text TODO javadoc me please
  205.          */
  206.         public String getText() {
  207.             return text;
  208.         }

  209.         @Override
  210.         public String getElementName() {
  211.             return ELEMENT;
  212.         }
  213.     }

  214.     /**
  215.      * Representation of Base64 element.
  216.      * <p>
  217.      * This class is immutable.
  218.      */
  219.     public static class Base64 extends HoxExtensionElement {

  220.         public static final String ELEMENT = "base64";
  221.         public static final QName QNAME = new QName(NAMESPACE, ELEMENT);

  222.         private final String text;

  223.         /**
  224.          * Creates this element.
  225.          *
  226.          * @param text value of text
  227.          */
  228.         public Base64(String text) {
  229.             this.text = text;
  230.         }

  231.         @Override
  232.         public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) {
  233.             XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace);
  234.             xml.optTextChild(text, this);
  235.             return xml;
  236.         }

  237.         /**
  238.          * Returns text of this element.
  239.          *
  240.          * @return text TODO javadoc me please
  241.          */
  242.         public String getText() {
  243.             return text;
  244.         }

  245.         @Override
  246.         public String getElementName() {
  247.             return ELEMENT;
  248.         }
  249.     }

  250.     /**
  251.      * Representation of Xml element.
  252.      * <p>
  253.      * This class is immutable.
  254.      */
  255.     public static class Xml extends HoxExtensionElement {

  256.         public static final String ELEMENT = "xml";
  257.         public static final QName QNAME = new QName(NAMESPACE, ELEMENT);

  258.         private final String text;

  259.         /**
  260.          * Creates this element.builder.toString().
  261.          *
  262.          * @param text value of text
  263.          */
  264.         public Xml(String text) {
  265.             this.text = text;
  266.         }

  267.         @Override
  268.         public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) {
  269.             XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace);
  270.             xml.optTextChild(text, this);
  271.             return xml;
  272.         }

  273.         /**
  274.          * Returns text of this element.
  275.          *
  276.          * @return text TODO javadoc me please
  277.          */
  278.         public String getText() {
  279.             return text;
  280.         }

  281.         @Override
  282.         public String getElementName() {
  283.             return ELEMENT;
  284.         }
  285.     }

  286.     /**
  287.      * Representation of ChunkedBase64 element.
  288.      * <p>
  289.      * This class is immutable.
  290.      */
  291.     public static class ChunkedBase64 extends HoxExtensionElement {

  292.         public static final String ELEMENT = "chunkedBase64";
  293.         public static final QName QNAME = new QName(NAMESPACE, ELEMENT);

  294.         private final String streamId;

  295.         /**
  296.          * Creates ChunkedBase86 element.
  297.          *
  298.          * @param streamId streamId attribute
  299.          */
  300.         public ChunkedBase64(String streamId) {
  301.             this.streamId = streamId;
  302.         }

  303.         @Override
  304.         public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) {
  305.             XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace);
  306.             xml.attribute("streamId", streamId);
  307.             xml.closeEmptyElement();
  308.             return xml;
  309.         }

  310.         /**
  311.          * Returns streamId attribute.
  312.          *
  313.          * @return streamId attribute
  314.          */
  315.         public String getStreamId() {
  316.             return streamId;
  317.         }

  318.         @Override
  319.         public String getElementName() {
  320.             return ELEMENT;
  321.         }
  322.     }

  323.     /**
  324.      * Representation of Ibb element.
  325.      * <p>
  326.      * This class is immutable.
  327.      */
  328.     public static class Ibb extends HoxExtensionElement {

  329.         public static final String ELEMENT = "ibb";
  330.         public static final QName QNAME = new QName(NAMESPACE, ELEMENT);

  331.         private final String sid;

  332.         /**
  333.          * Creates Ibb element.
  334.          *
  335.          * @param sid sid attribute
  336.          */
  337.         public Ibb(String sid) {
  338.             this.sid = sid;
  339.         }

  340.         @Override
  341.         public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) {
  342.             XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace);
  343.             xml.attribute("sid", sid);
  344.             xml.closeEmptyElement();
  345.             return xml;
  346.         }

  347.         /**
  348.          * Returns sid attribute.
  349.          *
  350.          * @return sid attribute
  351.          */
  352.         public String getSid() {
  353.             return sid;
  354.         }

  355.         @Override
  356.         public String getElementName() {
  357.             return ELEMENT;
  358.         }
  359.     }
  360. }