diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/AbstractError.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/AbstractError.java index d6a0d56a2..3b5fe6b0e 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/AbstractError.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/AbstractError.java @@ -114,9 +114,7 @@ public class AbstractError { xml.escape(text); xml.closeElement("text"); } - for (ExtensionElement packetExtension : extensions) { - xml.append(packetExtension.toXML()); - } + xml.append(extensions); } public abstract static class Builder> { diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/AbstractTextElement.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/AbstractTextElement.java index b60f66e40..00e82d704 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/AbstractTextElement.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/AbstractTextElement.java @@ -1,6 +1,6 @@ /** * - * Copyright © 2017 Florian Schmaus + * Copyright © 2017-2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,8 +38,7 @@ public abstract class AbstractTextElement implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); - xml.optXmlLangAttribute(lang); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.rightAngleBracket(); xml.escape(text); xml.closeElement(this); @@ -50,6 +49,19 @@ public abstract class AbstractTextElement implements ExtensionElement { return text; } + @Override + public final String getLanguage() { + return lang; + } + + /** + * Deprecated. + * + * @return deprecated + * @deprecated use {@link #getLanguage()} instead. + */ + @Deprecated + // TODO: Remove in Smack 4.5. public final String getLang() { return lang; } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/FullyQualifiedElement.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/FullyQualifiedElement.java index 1ed979548..2e93d23bd 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/FullyQualifiedElement.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/FullyQualifiedElement.java @@ -32,4 +32,13 @@ public interface FullyQualifiedElement extends NamedElement { String localPart = getElementName(); return new QName(namespaceURI, localPart); } + + /** + * Returns the xml:lang of this XML element, or null if one has not been set. + * + * @return the xml:lang of this XML element, or null. + */ + default String getLanguage() { + return null; + } } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java index 5bbfa9d17..ec80133c7 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/IQ.java @@ -136,6 +136,11 @@ public abstract class IQ extends Stanza { return childElementNamespace; } + @Override + public final String getElementName() { + return IQ_ELEMENT; + } + @Override public final String toString() { StringBuilder sb = new StringBuilder(); @@ -150,9 +155,8 @@ public abstract class IQ extends Stanza { @Override public final XmlStringBuilder toXML(XmlEnvironment enclosingXmlEnvironment) { - XmlStringBuilder buf = new XmlStringBuilder(enclosingXmlEnvironment); - buf.halfOpenElement(IQ_ELEMENT); - addCommonAttributes(buf, enclosingXmlEnvironment); + XmlStringBuilder buf = new XmlStringBuilder(this, enclosingXmlEnvironment); + addCommonAttributes(buf); if (type == null) { buf.attribute("type", "get"); } @@ -160,7 +164,7 @@ public abstract class IQ extends Stanza { buf.attribute("type", type.toString()); } buf.rightAngleBracket(); - buf.append(getChildElementXML(enclosingXmlEnvironment)); + appendInnerXml(buf); buf.closeElement(IQ_ELEMENT); return buf; } @@ -171,44 +175,52 @@ public abstract class IQ extends Stanza { * * @return the child element section of the IQ XML. */ + // TODO: This method should not be part of the public API as it is mostly used for testing purposes, with the one + // exception of AdHocCommand.getRaw(). public final XmlStringBuilder getChildElementXML() { - return getChildElementXML(null); + XmlStringBuilder xml = new XmlStringBuilder(); + appendInnerXml(xml); + return xml; } /** - * Returns the sub-element XML section of the IQ packet, or the empty String if there - * isn't one. + * Append the sub-element XML section of the IQ stanza. * - * @param enclosingXmlEnvironment the enclosing XML namespace. - * @return the child element section of the IQ XML. - * @since 4.3.0 + * @param xml the XmlStringBuilder to append to. */ - public final XmlStringBuilder getChildElementXML(XmlEnvironment enclosingXmlEnvironment) { - XmlStringBuilder xml = new XmlStringBuilder(); + private void appendInnerXml(XmlStringBuilder xml) { if (type == Type.error) { // Add the error sub-packet, if there is one. - appendErrorIfExists(xml, enclosingXmlEnvironment); + appendErrorIfExists(xml); + return; + } + if (childElementName == null) { + return; } - else if (childElementName != null) { - // Add the query section if there is one. - IQChildElementXmlStringBuilder iqChildElement = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this)); - if (iqChildElement != null) { - xml.append(iqChildElement); - List extensionsXml = getExtensions(); - if (iqChildElement.isEmptyElement) { - if (extensionsXml.isEmpty()) { - xml.closeEmptyElement(); - return xml; - } else { - xml.rightAngleBracket(); - } - } - xml.append(extensionsXml); - xml.closeElement(iqChildElement.element); - } + // Add the query section if there is one. + IQChildElementXmlStringBuilder iqChildElement = getIQChildElementBuilder( + new IQChildElementXmlStringBuilder(this)); + // TOOD: Document the cases where iqChildElement is null but childElementName not. And if there are none, change + // the logic. + if (iqChildElement == null) { + return; } - return xml; + + xml.append(iqChildElement); + + List extensionsXml = getExtensions(); + if (iqChildElement.isEmptyElement) { + if (extensionsXml.isEmpty()) { + xml.closeEmptyElement(); + return; + } + + xml.rightAngleBracket(); + } + + xml.append(extensionsXml); + xml.closeElement(iqChildElement.element); } /** diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/Message.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/Message.java index c1f8f3f1f..b6f426139 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/Message.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/Message.java @@ -467,6 +467,11 @@ public final class Message extends Stanza implements TypedCloneable { return language; } + @Override + public String getElementName() { + return ELEMENT; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -481,9 +486,8 @@ public final class Message extends Stanza implements TypedCloneable { @Override public XmlStringBuilder toXML(XmlEnvironment enclosingXmlEnvironment) { - XmlStringBuilder buf = new XmlStringBuilder(enclosingXmlEnvironment); - buf.halfOpenElement(ELEMENT); - enclosingXmlEnvironment = addCommonAttributes(buf, enclosingXmlEnvironment); + XmlStringBuilder buf = new XmlStringBuilder(this, enclosingXmlEnvironment); + addCommonAttributes(buf); buf.optAttribute("type", type); buf.rightAngleBracket(); @@ -497,16 +501,16 @@ public final class Message extends Stanza implements TypedCloneable { // Skip the default language if (subject.equals(defaultSubject)) continue; - buf.append(subject.toXML()); + buf.append(subject); } buf.optElement("thread", thread); // Append the error subpacket if the message type is an error. if (type == Type.error) { - appendErrorIfExists(buf, enclosingXmlEnvironment); + appendErrorIfExists(buf); } // Add extension elements, if any are defined. - buf.append(getExtensions(), enclosingXmlEnvironment); + buf.append(getExtensions()); buf.closeElement(ELEMENT); return buf; @@ -544,11 +548,7 @@ public final class Message extends Stanza implements TypedCloneable { this.subject = subject; } - /** - * Returns the language of this message subject. - * - * @return the language of this message subject. - */ + @Override public String getLanguage() { return language; } @@ -592,8 +592,8 @@ public final class Message extends Stanza implements TypedCloneable { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(); - xml.halfOpenElement(getElementName()).optXmlLangAttribute(getLanguage()).rightAngleBracket(); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); + xml.rightAngleBracket(); xml.escape(subject); xml.closeElement(getElementName()); return xml; @@ -642,12 +642,7 @@ public final class Message extends Stanza implements TypedCloneable { this.namespace = Objects.requireNonNull(namespace); } - /** - * Returns the language of this message body or {@code null} if the body extension element does not explicitly - * set a language, but instead inherits it from the outer element (usually a {@link Message} stanza). - * - * @return the language of this message body or {@code null}. - */ + @Override public String getLanguage() { return language; } @@ -692,7 +687,7 @@ public final class Message extends Stanza implements TypedCloneable { @Override public XmlStringBuilder toXML(XmlEnvironment enclosingXmlEnvironment) { XmlStringBuilder xml = new XmlStringBuilder(this, enclosingXmlEnvironment); - xml.optXmlLangAttribute(getLanguage()).rightAngleBracket(); + xml.rightAngleBracket(); xml.escape(message); xml.closeElement(getElementName()); return xml; diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/NamedElement.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/NamedElement.java index bdfa0e2cf..219b35ad1 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/NamedElement.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/NamedElement.java @@ -1,6 +1,6 @@ /** * - * Copyright © 2014 Florian Schmaus + * Copyright © 2014-2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,8 +18,13 @@ package org.jivesoftware.smack.packet; /** - * Interface to represent a XML element. This is similar to {@link ExtensionElement}, but does not - * carry a namespace and is usually included as child element of an stanza extension. + * Interface to represent a XML element. This is similar to {@link ExtensionElement}, but does not carry a single + * namespace, but instead is used with multiple namespaces. Examples for this include MUC's <destroy/> element. + *

+ * Please note that usage of this interface is discouraged. The reason is that every XML element is fully + * qualified, i.e., it is qualified by a namespace. The namespace may not be explicitly given, but instead, is inherited + * from an outer element. Use {@link FullyQualifiedElement} instead when possible. + *

*/ public interface NamedElement extends Element { diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/Nonza.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/Nonza.java index 6e2435637..a86a4e1db 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/Nonza.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/Nonza.java @@ -1,6 +1,6 @@ /** * - * Copyright © 2014-2015 Florian Schmaus + * Copyright © 2014-2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,6 @@ package org.jivesoftware.smack.packet; * @author Florian Schmaus * @see XEP-0360: Nonzas (are not Stanzas) */ -public interface Nonza extends TopLevelStreamElement, FullyQualifiedElement { +public interface Nonza extends TopLevelStreamElement { } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/Packet.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/Packet.java index d82209ac3..2a97d0eae 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/Packet.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/Packet.java @@ -113,11 +113,7 @@ public interface Packet extends TopLevelStreamElement { */ void setError(StanzaError error); - /** - * Returns the xml:lang of this Stanza, or null if one has not been set. - * - * @return the xml:lang of this Stanza, or null. - */ + @Override String getLanguage(); /** diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/Presence.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/Presence.java index ae6de5573..62630ecfb 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/Presence.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/Presence.java @@ -256,6 +256,11 @@ public final class Presence extends Stanza implements TypedCloneable { this.mode = mode; } + @Override + public String getElementName() { + return ELEMENT; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -277,9 +282,8 @@ public final class Presence extends Stanza implements TypedCloneable { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder buf = new XmlStringBuilder(enclosingNamespace); - buf.halfOpenElement(ELEMENT); - addCommonAttributes(buf, enclosingNamespace); + XmlStringBuilder buf = new XmlStringBuilder(this, enclosingNamespace); + addCommonAttributes(buf); if (type != Type.available) { buf.attribute("type", type); } @@ -291,10 +295,10 @@ public final class Presence extends Stanza implements TypedCloneable { buf.element("show", mode); } - buf.append(getExtensions(), enclosingNamespace); + buf.append(getExtensions()); // Add the error sub-packet, if there is one. - appendErrorIfExists(buf, enclosingNamespace); + appendErrorIfExists(buf); buf.closeElement(ELEMENT); diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/Stanza.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/Stanza.java index d1362bea9..d4906ff91 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/Stanza.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/Stanza.java @@ -59,6 +59,10 @@ public abstract class Stanza implements TopLevelStreamElement { private final MultiMap extensionElements = new MultiMap<>(); + // Assume that all stanzas Smack handles are in the client namespace, since Smack is an XMPP client library. We can + // change this behavior later if it is required. + private final String namespace = StreamOpen.CLIENT_NAMESPACE; + private String id = null; private Jid to; private Jid from; @@ -283,11 +287,7 @@ public abstract class Stanza implements TopLevelStreamElement { error = xmppErrorBuilder.build(); } - /** - * Returns the xml:lang of this Stanza, or null if one has not been set. - * - * @return the xml:lang of this Stanza, or null. - */ + @Override public String getLanguage() { return language; } @@ -491,6 +491,11 @@ public abstract class Stanza implements TopLevelStreamElement { @Override public abstract String toString(); + @Override + public final String getNamespace() { + return namespace; + } + /** * Returns the default language used for all messages containing localized content. * @@ -501,33 +506,14 @@ public abstract class Stanza implements TopLevelStreamElement { } /** - * Add to, from, id and 'xml:lang' attributes + * Add to, from, and id attributes. * * @param xml the {@link XmlStringBuilder}. - * @param enclosingXmlEnvironment the enclosing XML namespace. - * @return the XML environment for this stanza. */ - protected XmlEnvironment addCommonAttributes(XmlStringBuilder xml, XmlEnvironment enclosingXmlEnvironment) { - String language = getLanguage(); - String namespace = StreamOpen.CLIENT_NAMESPACE; - if (enclosingXmlEnvironment != null) { - String effectiveEnclosingNamespace = enclosingXmlEnvironment.getEffectiveNamespaceOrUse(namespace); - switch (effectiveEnclosingNamespace) { - case StreamOpen.CLIENT_NAMESPACE: - case StreamOpen.SERVER_NAMESPACE: - break; - default: - namespace = effectiveEnclosingNamespace; - } - } - - xml.xmlnsAttribute(namespace); + protected final void addCommonAttributes(XmlStringBuilder xml) { xml.optAttribute("to", getTo()); xml.optAttribute("from", getFrom()); xml.optAttribute("id", getStanzaId()); - xml.xmllangAttribute(language); - - return new XmlEnvironment(namespace, language); } protected void logCommonAttributes(StringBuilder sb) { @@ -546,12 +532,11 @@ public abstract class Stanza implements TopLevelStreamElement { * Append an XMPPError is this stanza has one set. * * @param xml the XmlStringBuilder to append the error to. - * @param enclosingXmlEnvironment the enclosing XML environment. */ - protected void appendErrorIfExists(XmlStringBuilder xml, XmlEnvironment enclosingXmlEnvironment) { + protected void appendErrorIfExists(XmlStringBuilder xml) { StanzaError error = getError(); if (error != null) { - xml.append(error.toXML(enclosingXmlEnvironment)); + xml.append(error); } } } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/TopLevelStreamElement.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/TopLevelStreamElement.java index b952a5d54..7cca472ca 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/TopLevelStreamElement.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/TopLevelStreamElement.java @@ -1,6 +1,6 @@ /** * - * Copyright © 2014-2018 Florian Schmaus + * Copyright © 2014-2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,6 @@ package org.jivesoftware.smack.packet; * A XMPP top level stream element. This is either a stanza ({@link Stanza}) or * just a plain stream element ({@link Nonza}). */ -public interface TopLevelStreamElement extends Element { +public interface TopLevelStreamElement extends FullyQualifiedElement { } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java index 0e713a04c..4abc3eb06 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java @@ -106,6 +106,29 @@ public class XmlEnvironment { return effectiveLanguage; } + public boolean effectiveLanguageEquals(String language) { + String effectiveLanguage = getEffectiveLanguage(); + if (effectiveLanguage == null) { + return false; + } + return effectiveLanguage.equals(language); + } + + private transient String toStringCache; + + @Override + public String toString() { + if (toStringCache == null) { + StringBuilder sb = new StringBuilder(); + sb.append(XmlEnvironment.class.getSimpleName()).append(' '); + sb.append("xmlns=").append(getEffectiveNamespace()).append(' '); + sb.append("xmllang=").append(getEffectiveLanguage()).append(' '); + + toStringCache = sb.toString(); + } + return toStringCache; + } + public static XmlEnvironment from(XmlPullParser parser) { return from(parser, null); } diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java b/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java index 3b7d91c72..acf5ac1b4 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/util/XmlStringBuilder.java @@ -38,17 +38,12 @@ public class XmlStringBuilder implements Appendable, CharSequence, Element { private final XmlEnvironment effectiveXmlEnvironment; public XmlStringBuilder() { - this((XmlEnvironment) null); - } - - public XmlStringBuilder(XmlEnvironment effectiveXmlEnvironment) { sb = new LazyStringBuilder(); - this.effectiveXmlEnvironment = effectiveXmlEnvironment; + effectiveXmlEnvironment = null; } public XmlStringBuilder(ExtensionElement pe) { - this(); - prelude(pe); + this(pe, null); } public XmlStringBuilder(NamedElement e) { @@ -59,12 +54,24 @@ public class XmlStringBuilder implements Appendable, CharSequence, Element { public XmlStringBuilder(FullyQualifiedElement element, XmlEnvironment enclosingXmlEnvironment) { sb = new LazyStringBuilder(); halfOpenElement(element); - if (enclosingXmlEnvironment != null - && !enclosingXmlEnvironment.effectiveNamespaceEquals(element.getNamespace())) { - xmlnsAttribute(element.getNamespace()); + + String xmlNs = element.getNamespace(); + String xmlLang = element.getLanguage(); + if (enclosingXmlEnvironment == null) { + xmlnsAttribute(xmlNs); + xmllangAttribute(xmlLang); + } else { + if (!enclosingXmlEnvironment.effectiveNamespaceEquals(xmlNs)) { + xmlnsAttribute(xmlNs); + } + if (!enclosingXmlEnvironment.effectiveLanguageEquals(xmlLang)) { + xmllangAttribute(xmlLang); + } } + effectiveXmlEnvironment = XmlEnvironment.builder() - .withNamespace(element.getNamespace()) + .withNamespace(xmlNs) + .withLanguage(xmlLang) .withNext(enclosingXmlEnvironment) .build(); } @@ -124,6 +131,15 @@ public class XmlStringBuilder implements Appendable, CharSequence, Element { return this; } + /** + * Deprecated. + * + * @param element deprecated. + * @return deprecated. + * @deprecated use {@link #append(Element)} instead. + */ + @Deprecated + // TODO: Remove in Smack 4.5. public XmlStringBuilder element(Element element) { assert element != null; return append(element.toXML()); @@ -161,7 +177,7 @@ public class XmlStringBuilder implements Appendable, CharSequence, Element { public XmlStringBuilder optElement(Element element) { if (element != null) { - append(element.toXML()); + append(element); } return this; } @@ -435,6 +451,7 @@ public class XmlStringBuilder implements Appendable, CharSequence, Element { } public XmlStringBuilder xmllangAttribute(String value) { + // TODO: This should probably be attribute(), not optAttribute(). optAttribute("xml:lang", value); return this; } @@ -499,13 +516,13 @@ public class XmlStringBuilder implements Appendable, CharSequence, Element { return this; } - public XmlStringBuilder append(Collection elements) { - return append(elements, effectiveXmlEnvironment); + public XmlStringBuilder append(Element element) { + return append(element.toXML(effectiveXmlEnvironment)); } - public XmlStringBuilder append(Collection elements, XmlEnvironment enclosingXmlEnvironment) { + public XmlStringBuilder append(Collection elements) { for (Element element : elements) { - append(element.toXML(enclosingXmlEnvironment)); + append(element); } return this; } diff --git a/smack-core/src/test/java/org/jivesoftware/smack/StanzaCollectorTest.java b/smack-core/src/test/java/org/jivesoftware/smack/StanzaCollectorTest.java index 988cbafef..4eeb028ce 100644 --- a/smack-core/src/test/java/org/jivesoftware/smack/StanzaCollectorTest.java +++ b/smack-core/src/test/java/org/jivesoftware/smack/StanzaCollectorTest.java @@ -188,5 +188,10 @@ public class StanzaCollectorTest { public String toString() { return toXML().toString(); } + + @Override + public String getElementName() { + return "packetId"; + } } } diff --git a/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java b/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java index 8518c1188..76f0d996a 100644 --- a/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java +++ b/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java @@ -738,10 +738,6 @@ public class PacketParserUtilsTest { .a("type", "chat") .a("xml:lang", "en") .e("body") - // TODO: Remove the following xml:lang once Smack's serialization toXml() API is aware of a potential - // scoping xml:lang value. The out message stanza already declares an xml:lang with the exact same - // value, hence this statement is redundant. - .a("xml:lang", "en") .t("This is a test of the emergency broadcast system, 1.") .up() .e("body") diff --git a/smack-debug/src/main/java/org/jivesoftware/smackx/debugger/EnhancedDebugger.java b/smack-debug/src/main/java/org/jivesoftware/smackx/debugger/EnhancedDebugger.java index 958117672..c30f0aaf4 100644 --- a/smack-debug/src/main/java/org/jivesoftware/smackx/debugger/EnhancedDebugger.java +++ b/smack-debug/src/main/java/org/jivesoftware/smackx/debugger/EnhancedDebugger.java @@ -943,6 +943,11 @@ public class EnhancedDebugger extends SmackDebugger { public String toString() { return toXML((XmlEnvironment) null); } + + @Override + public String getElementName() { + return null; + } } /** diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/hoxt/packet/AbstractHttpOverXmpp.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/hoxt/packet/AbstractHttpOverXmpp.java index 1a5e88c43..735807f4b 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/hoxt/packet/AbstractHttpOverXmpp.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/hoxt/packet/AbstractHttpOverXmpp.java @@ -16,6 +16,7 @@ */ package org.jivesoftware.smackx.hoxt.packet; +import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.NamedElement; import org.jivesoftware.smack.util.Objects; @@ -145,12 +146,19 @@ public abstract class AbstractHttpOverXmpp extends IQ { 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 implements NamedElement { + public static class Data extends HoxExtensionElement { public static final String ELEMENT = "data"; @@ -172,9 +180,9 @@ public abstract class AbstractHttpOverXmpp extends IQ { */ @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.rightAngleBracket(); - xml.element(child); + xml.append(child); xml.closeElement(this); return xml; } @@ -199,7 +207,7 @@ public abstract class AbstractHttpOverXmpp extends IQ { *

* This class is immutable. */ - public static class Text implements NamedElement { + public static class Text extends HoxExtensionElement { public static final String ELEMENT = "text"; @@ -216,7 +224,7 @@ public abstract class AbstractHttpOverXmpp extends IQ { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.rightAngleBracket(); xml.optAppend(text); xml.closeElement(this); @@ -243,7 +251,7 @@ public abstract class AbstractHttpOverXmpp extends IQ { *

* This class is immutable. */ - public static class Base64 implements NamedElement { + public static class Base64 extends HoxExtensionElement { public static final String ELEMENT = "base64"; @@ -260,7 +268,7 @@ public abstract class AbstractHttpOverXmpp extends IQ { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.rightAngleBracket(); xml.optAppend(text); xml.closeElement(this); @@ -287,7 +295,7 @@ public abstract class AbstractHttpOverXmpp extends IQ { *

* This class is immutable. */ - public static class Xml implements NamedElement { + public static class Xml extends HoxExtensionElement { public static final String ELEMENT = "xml"; @@ -304,7 +312,7 @@ public abstract class AbstractHttpOverXmpp extends IQ { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.rightAngleBracket(); xml.optAppend(text); xml.closeElement(this); @@ -331,7 +339,7 @@ public abstract class AbstractHttpOverXmpp extends IQ { *

* This class is immutable. */ - public static class ChunkedBase64 implements NamedElement { + public static class ChunkedBase64 extends HoxExtensionElement { public static final String ELEMENT = "chunkedBase64"; @@ -348,7 +356,7 @@ public abstract class AbstractHttpOverXmpp extends IQ { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.attribute("streamId", streamId); xml.closeEmptyElement(); return xml; @@ -374,7 +382,7 @@ public abstract class AbstractHttpOverXmpp extends IQ { *

* This class is immutable. */ - public static class Ibb implements NamedElement { + public static class Ibb extends HoxExtensionElement { public static final String ELEMENT = "ibb"; @@ -391,7 +399,7 @@ public abstract class AbstractHttpOverXmpp extends IQ { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.attribute("sid", sid); xml.closeEmptyElement(); return xml; diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/control/element/SetData.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/control/element/SetData.java index 9c1e0e94e..15d44f641 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/control/element/SetData.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/control/element/SetData.java @@ -1,6 +1,6 @@ /** * - * Copyright © 2016 Florian Schmaus + * Copyright © 2016-2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,10 +18,10 @@ package org.jivesoftware.smackx.iot.control.element; import java.util.Locale; -import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.util.XmlStringBuilder; -public abstract class SetData implements NamedElement { +public abstract class SetData implements ExtensionElement { public enum Type { BOOL, @@ -76,6 +76,11 @@ public abstract class SetData implements NamedElement { return getType().toString(); } + @Override + public final String getNamespace() { + return IoTSetRequest.NAMESPACE; + } + /** * Returns the XML representation of this Element. * @@ -83,7 +88,7 @@ public abstract class SetData implements NamedElement { */ @Override public final XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.attribute("name", name); xml.attribute("value", value); xml.closeEmptyElement(); diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/IoTDataExtensionElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/IoTDataExtensionElement.java new file mode 100644 index 000000000..62e0cf3c6 --- /dev/null +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/IoTDataExtensionElement.java @@ -0,0 +1,28 @@ +/** + * + * Copyright 2019 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.iot.data.element; + +import org.jivesoftware.smack.packet.ExtensionElement; + +public abstract class IoTDataExtensionElement implements ExtensionElement { + + @Override + public final String getNamespace() { + return IoTFieldsExtension.NAMESPACE; + } + +} diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/IoTDataField.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/IoTDataField.java index a3a31fa67..7b10a41ea 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/IoTDataField.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/IoTDataField.java @@ -16,10 +16,9 @@ */ package org.jivesoftware.smackx.iot.data.element; -import org.jivesoftware.smack.packet.NamedElement; import org.jivesoftware.smack.util.XmlStringBuilder; -public abstract class IoTDataField implements NamedElement { +public abstract class IoTDataField extends IoTDataExtensionElement { enum Type { integer("int"), @@ -53,7 +52,7 @@ public abstract class IoTDataField implements NamedElement { @Override public final XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.attribute("name", name).attribute("value", getValueString()); // TODO handle 'unit' attribute as special case if is implemented. xml.closeEmptyElement(); diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/NodeElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/NodeElement.java index f344c99d7..bde5d94f8 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/NodeElement.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/NodeElement.java @@ -19,12 +19,10 @@ package org.jivesoftware.smackx.iot.data.element; import java.util.Collections; import java.util.List; -import org.jivesoftware.smack.packet.NamedElement; import org.jivesoftware.smack.util.XmlStringBuilder; - import org.jivesoftware.smackx.iot.element.NodeInfo; -public class NodeElement implements NamedElement { +public class NodeElement extends IoTDataExtensionElement { public static final String ELEMENT = "node"; @@ -51,7 +49,7 @@ public class NodeElement implements NamedElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); nodeInfo.appendTo(xml); xml.rightAngleBracket(); diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/TimestampElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/TimestampElement.java index 1d428b6eb..a3e6ebc75 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/TimestampElement.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/iot/data/element/TimestampElement.java @@ -20,10 +20,9 @@ import java.util.Collections; import java.util.Date; import java.util.List; -import org.jivesoftware.smack.packet.NamedElement; import org.jivesoftware.smack.util.XmlStringBuilder; -public class TimestampElement implements NamedElement { +public class TimestampElement extends IoTDataExtensionElement { public static final String ELEMENT = "timestamp"; @@ -46,7 +45,7 @@ public class TimestampElement implements NamedElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.attribute("value", date); xml.rightAngleBracket(); diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/Checksum.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/Checksum.java index 1f94c6927..f1455b7ca 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/Checksum.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/Checksum.java @@ -52,7 +52,7 @@ public class Checksum implements ExtensionElement { sb.optAttribute(ATTR_CREATOR, creator); sb.optAttribute(ATTR_NAME, name); sb.rightAngleBracket(); - sb.element(file); + sb.append(file); sb.closeElement(this); return sb; } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/JingleFileTransferChild.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/JingleFileTransferChild.java index 2758f3c18..b4e9021ec 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/JingleFileTransferChild.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/JingleFileTransferChild.java @@ -1,6 +1,6 @@ /** * - * Copyright 2017 Paul Schaub + * Copyright 2017 Paul Schaub, 2019 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,6 +19,7 @@ package org.jivesoftware.smackx.jingle_filetransfer.element; import java.io.File; import java.util.Date; +import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.util.XmlStringBuilder; import org.jivesoftware.smackx.hashes.element.HashElement; @@ -27,8 +28,10 @@ import org.jivesoftware.smackx.jingle.element.JingleContentDescriptionChildEleme /** * Content of type File. */ -public class JingleFileTransferChild extends JingleContentDescriptionChildElement { +public class JingleFileTransferChild implements JingleContentDescriptionChildElement { public static final String ELEMENT = "file"; + public static final String NAMESPACE = JingleFileTransfer.NAMESPACE_V5; + public static final String ELEM_DATE = "date"; public static final String ELEM_DESC = "desc"; public static final String ELEM_MEDIA_TYPE = "media-type"; @@ -87,8 +90,13 @@ public class JingleFileTransferChild extends JingleContentDescriptionChildElemen } @Override - public CharSequence toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder sb = new XmlStringBuilder(this); + public String getNamespace() { + return NAMESPACE; + } + + @Override + public XmlStringBuilder toXML(XmlEnvironment enclosingNamespace) { + XmlStringBuilder sb = new XmlStringBuilder(this, enclosingNamespace); sb.rightAngleBracket(); sb.optElement(ELEM_DATE, date); diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/Range.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/Range.java index 43e422429..20bfc9f6a 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/Range.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/jingle_filetransfer/element/Range.java @@ -16,7 +16,7 @@ */ package org.jivesoftware.smackx.jingle_filetransfer.element; -import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.FullyQualifiedElement; import org.jivesoftware.smack.util.XmlStringBuilder; import org.jivesoftware.smackx.hashes.element.HashElement; @@ -24,9 +24,11 @@ import org.jivesoftware.smackx.hashes.element.HashElement; /** * RangeElement which specifies, which range of a file shall be transferred. */ -public class Range implements NamedElement { +public class Range implements FullyQualifiedElement { public static final String ELEMENT = "range"; + public static final String NAMESPACE = JingleFileTransferChild.NAMESPACE; + public static final String ATTR_OFFSET = "offset"; public static final String ATTR_LENGTH = "length"; @@ -99,6 +101,11 @@ public class Range implements NamedElement { return ELEMENT; } + @Override + public String getNamespace() { + return NAMESPACE; + } + @Override public CharSequence toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { XmlStringBuilder sb = new XmlStringBuilder(this); @@ -108,7 +115,7 @@ public class Range implements NamedElement { if (hash != null) { sb.rightAngleBracket(); - sb.element(hash); + sb.append(hash); sb.closeElement(this); } else { sb.closeEmptyElement(); diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamElements.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamElements.java index 148f1079b..540ffe774 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamElements.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamElements.java @@ -126,15 +126,14 @@ public class MamElements { } @Override - public CharSequence toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(); - xml.halfOpenElement(this); - xml.xmlnsAttribute(NAMESPACE); + public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); + xml.optAttribute("queryid", getQueryId()); xml.optAttribute("id", getId()); xml.rightAngleBracket(); - xml.element(getForwarded()); + xml.append(getForwarded()); xml.closeElement(this); return xml; diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamFinIQ.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamFinIQ.java index 3f6439a70..cd5b92669 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamFinIQ.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamFinIQ.java @@ -124,7 +124,7 @@ public class MamFinIQ extends IQ { xml.setEmptyElement(); } else { xml.rightAngleBracket(); - xml.element(rsmSet); + xml.append(rsmSet); } return xml; } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamPrefsIQ.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamPrefsIQ.java index b0a3e57e5..743847914 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamPrefsIQ.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/mam/element/MamPrefsIQ.java @@ -134,12 +134,12 @@ public class MamPrefsIQ extends IQ { if (alwaysJids != null) { MamElements.AlwaysJidListElement alwaysElement = new AlwaysJidListElement(alwaysJids); - xml.element(alwaysElement); + xml.append(alwaysElement); } if (neverJids != null) { MamElements.NeverJidListElement neverElement = new NeverJidListElement(neverJids); - xml.element(neverElement); + xml.append(neverElement); } return xml; diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/BlockQuoteElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/BlockQuoteElement.java index 0a8acf272..7d66db83a 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/BlockQuoteElement.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/BlockQuoteElement.java @@ -16,14 +16,10 @@ */ package org.jivesoftware.smackx.message_markup.element; -import org.jivesoftware.smack.util.XmlStringBuilder; - -public class BlockQuoteElement implements MarkupElement.BlockLevelMarkupElement { +public class BlockQuoteElement extends MarkupElement.BlockLevelMarkupElement { public static final String ELEMENT = "bquote"; - private final int start, end; - /** * Create a new Block Quote element. * @@ -31,18 +27,7 @@ public class BlockQuoteElement implements MarkupElement.BlockLevelMarkupElement * @param end end index */ public BlockQuoteElement(int start, int end) { - this.start = start; - this.end = end; - } - - @Override - public int getStart() { - return start; - } - - @Override - public int getEnd() { - return end; + super(start, end); } @Override @@ -50,13 +35,4 @@ public class BlockQuoteElement implements MarkupElement.BlockLevelMarkupElement return ELEMENT; } - @Override - public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(); - xml.halfOpenElement(this); - xml.attribute(ATTR_START, getStart()); - xml.attribute(ATTR_END, getEnd()); - xml.closeEmptyElement(); - return xml; - } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/CodeBlockElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/CodeBlockElement.java index 73e333af3..4a741c0c0 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/CodeBlockElement.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/CodeBlockElement.java @@ -16,14 +16,10 @@ */ package org.jivesoftware.smackx.message_markup.element; -import org.jivesoftware.smack.util.XmlStringBuilder; - -public class CodeBlockElement implements MarkupElement.BlockLevelMarkupElement { +public class CodeBlockElement extends MarkupElement.BlockLevelMarkupElement { public static final String ELEMENT = "bcode"; - private final int start, end; - /** * Create a new Code Block element. * @@ -31,18 +27,7 @@ public class CodeBlockElement implements MarkupElement.BlockLevelMarkupElement { * @param end end index */ public CodeBlockElement(int start, int end) { - this.start = start; - this.end = end; - } - - @Override - public int getStart() { - return start; - } - - @Override - public int getEnd() { - return end; + super(start, end); } @Override @@ -50,13 +35,4 @@ public class CodeBlockElement implements MarkupElement.BlockLevelMarkupElement { return ELEMENT; } - @Override - public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(); - xml.halfOpenElement(this); - xml.attribute(ATTR_START, getStart()); - xml.attribute(ATTR_END, getEnd()); - xml.closeEmptyElement(); - return xml; - } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/ListElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/ListElement.java index 499fdaa61..241bd8053 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/ListElement.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/ListElement.java @@ -19,15 +19,14 @@ package org.jivesoftware.smackx.message_markup.element; import java.util.Collections; import java.util.List; -import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.util.XmlStringBuilder; -public class ListElement implements MarkupElement.MarkupChildElement { +public class ListElement extends MarkupElement.NonEmptyChildElement { public static final String ELEMENT = "list"; public static final String ELEM_LI = "li"; - private final int start, end; private final List entries; /** @@ -38,21 +37,10 @@ public class ListElement implements MarkupElement.MarkupChildElement { * @param entries list entries */ public ListElement(int start, int end, List entries) { - this.start = start; - this.end = end; + super(start, end); this.entries = Collections.unmodifiableList(entries); } - @Override - public int getStart() { - return start; - } - - @Override - public int getEnd() { - return end; - } - /** * Return a list of all list entries. * @@ -68,22 +56,11 @@ public class ListElement implements MarkupElement.MarkupChildElement { } @Override - public CharSequence toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(); - xml.halfOpenElement(this); - xml.attribute(ATTR_START, getStart()); - xml.attribute(ATTR_END, getEnd()); - xml.rightAngleBracket(); - - for (ListEntryElement li : getEntries()) { - xml.append(li.toXML()); - } - - xml.closeElement(this); - return xml; + public void appendInnerXml(XmlStringBuilder xml) { + xml.append(getEntries()); } - public static class ListEntryElement implements NamedElement { + public static class ListEntryElement implements ExtensionElement { private final int start; @@ -109,11 +86,15 @@ public class ListElement implements MarkupElement.MarkupChildElement { return ELEM_LI; } + @Override + public String getNamespace() { + return MarkupElement.NAMESPACE; + } + @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(); - xml.halfOpenElement(this); - xml.attribute(ATTR_START, getStart()); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); + xml.attribute(MarkupElement.MarkupChildElement.ATTR_START, getStart()); xml.closeEmptyElement(); return xml; } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/MarkupElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/MarkupElement.java index be76e158b..0c368e0cf 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/MarkupElement.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/MarkupElement.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Set; import org.jivesoftware.smack.packet.ExtensionElement; -import org.jivesoftware.smack.packet.NamedElement; import org.jivesoftware.smack.util.XmlStringBuilder; public class MarkupElement implements ExtensionElement { @@ -267,46 +266,89 @@ public class MarkupElement implements ExtensionElement { } } - - - - - - - - - - - - - /** * Interface for child elements. */ - public interface MarkupChildElement extends NamedElement { + public abstract static class MarkupChildElement implements ExtensionElement { - String ATTR_START = "start"; - String ATTR_END = "end"; + public static final String ATTR_START = "start"; + public static final String ATTR_END = "end"; + + private final int start, end; + + protected MarkupChildElement(int start, int end) { + this.start = start; + this.end = end; + } /** * Return the start index of this element. * * @return start index */ - int getStart(); + public final int getStart() { + return start; + } /** * Return the end index of this element. * * @return end index */ - int getEnd(); + public final int getEnd() { + return end; + } + + @Override + public final String getNamespace() { + return NAMESPACE; + } + + @Override + public final XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); + xml.attribute(ATTR_START, getStart()); + xml.attribute(ATTR_END, getEnd()); + + afterXmlPrelude(xml); + return xml; + } + + protected abstract void afterXmlPrelude(XmlStringBuilder xml); + } + + public abstract static class NonEmptyChildElement extends MarkupChildElement { + + protected NonEmptyChildElement(int start, int end) { + super(start, end); + } + + @Override + protected final void afterXmlPrelude(XmlStringBuilder xml) { + xml.rightAngleBracket(); + + appendInnerXml(xml); + + xml.closeElement(this); + } + + protected abstract void appendInnerXml(XmlStringBuilder xml); + } /** * Interface for block level child elements. */ - public interface BlockLevelMarkupElement extends MarkupChildElement { + public abstract static class BlockLevelMarkupElement extends MarkupChildElement { + + protected BlockLevelMarkupElement(int start, int end) { + super(start, end); + } + + @Override + protected final void afterXmlPrelude(XmlStringBuilder xml) { + xml.closeEmptyElement(); + } } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/SpanElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/SpanElement.java index 74f3adebb..5a5fa1338 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/SpanElement.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/message_markup/element/SpanElement.java @@ -21,11 +21,10 @@ import java.util.Set; import org.jivesoftware.smack.util.XmlStringBuilder; -public class SpanElement implements MarkupElement.MarkupChildElement { +public class SpanElement extends MarkupElement.NonEmptyChildElement { public static final String ELEMENT = "span"; - private final int start, end; private final Set styles; /** @@ -36,21 +35,10 @@ public class SpanElement implements MarkupElement.MarkupChildElement { * @param styles list of styles that apply to this span */ public SpanElement(int start, int end, Set styles) { - this.start = start; - this.end = end; + super(start, end); this.styles = Collections.unmodifiableSet(styles); } - @Override - public int getStart() { - return start; - } - - @Override - public int getEnd() { - return end; - } - /** * Return all styles of this span. * @@ -76,18 +64,9 @@ public class SpanElement implements MarkupElement.MarkupChildElement { } @Override - public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(); - xml.halfOpenElement(this); - xml.attribute(ATTR_START, getStart()); - xml.attribute(ATTR_END, getEnd()); - xml.rightAngleBracket(); - + protected void appendInnerXml(XmlStringBuilder xml) { for (SpanStyle style : getStyles()) { - xml.halfOpenElement(style.toString()).closeEmptyElement(); + xml.emptyElement(style); } - - xml.closeElement(this); - return xml; } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightAffiliationsIQ.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightAffiliationsIQ.java index 9ca1e3ffe..c9e0ead62 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightAffiliationsIQ.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightAffiliationsIQ.java @@ -62,7 +62,7 @@ public class MUCLightAffiliationsIQ extends IQ { Iterator> it = affiliations.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = it.next(); - xml.element(new UserWithAffiliationElement(pair.getKey(), pair.getValue())); + xml.append(new UserWithAffiliationElement(pair.getKey(), pair.getValue())); } return xml; diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightBlockingIQ.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightBlockingIQ.java index b18eb762b..c519ab9bf 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightBlockingIQ.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightBlockingIQ.java @@ -90,7 +90,7 @@ public class MUCLightBlockingIQ extends IQ { Iterator> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = it.next(); - xml.element(new BlockingElement(pair.getKey(), pair.getValue(), isRoom)); + xml.append(new BlockingElement(pair.getKey(), pair.getValue(), isRoom)); } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightChangeAffiliationsIQ.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightChangeAffiliationsIQ.java index d5ab577a9..494a7a4d7 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightChangeAffiliationsIQ.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightChangeAffiliationsIQ.java @@ -71,7 +71,7 @@ public class MUCLightChangeAffiliationsIQ extends IQ { Iterator> it = affiliations.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = it.next(); - xml.element(new UserWithAffiliationElement(pair.getKey(), pair.getValue())); + xml.append(new UserWithAffiliationElement(pair.getKey(), pair.getValue())); } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightConfigurationIQ.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightConfigurationIQ.java index a20a7047d..f284d0656 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightConfigurationIQ.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightConfigurationIQ.java @@ -52,7 +52,7 @@ public class MUCLightConfigurationIQ extends IQ { protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { xml.rightAngleBracket(); xml.optElement("version", version); - xml.element(new ConfigurationElement(configuration)); + xml.append(new ConfigurationElement(configuration)); return xml; } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightCreateIQ.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightCreateIQ.java index b3c059eae..d15d47db5 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightCreateIQ.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightCreateIQ.java @@ -99,10 +99,10 @@ public class MUCLightCreateIQ extends IQ { @Override protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { xml.rightAngleBracket(); - xml.element(new ConfigurationElement(configuration)); + xml.append(new ConfigurationElement(configuration)); if (!occupants.isEmpty()) { - xml.element(new OccupantsElement(occupants)); + xml.append(new OccupantsElement(occupants)); } return xml; diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightElements.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightElements.java index 4365a7e18..2828bebfb 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightElements.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightElements.java @@ -104,7 +104,7 @@ public abstract class MUCLightElements { Iterator> it = affiliations.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = it.next(); - xml.element(new UserWithAffiliationElement(pair.getKey(), pair.getValue())); + xml.append(new UserWithAffiliationElement(pair.getKey(), pair.getValue())); } xml.closeElement(this); @@ -303,7 +303,7 @@ public abstract class MUCLightElements { Iterator> it = occupants.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = it.next(); - xml.element(new UserWithAffiliationElement(pair.getKey(), pair.getValue())); + xml.append(new UserWithAffiliationElement(pair.getKey(), pair.getValue())); } xml.closeElement("occupants"); diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightInfoIQ.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightInfoIQ.java index c737453ef..42a2b9308 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightInfoIQ.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/muclight/element/MUCLightInfoIQ.java @@ -62,8 +62,8 @@ public class MUCLightInfoIQ extends IQ { protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { xml.rightAngleBracket(); xml.optElement("version", version); - xml.element(new ConfigurationElement(configuration)); - xml.element(new OccupantsElement(occupants)); + xml.append(new ConfigurationElement(configuration)); + xml.append(new OccupantsElement(occupants)); return xml; } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/push_notifications/element/EnablePushNotificationsIQ.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/push_notifications/element/EnablePushNotificationsIQ.java index 577b1ab2c..7c86584d8 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/push_notifications/element/EnablePushNotificationsIQ.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/push_notifications/element/EnablePushNotificationsIQ.java @@ -115,7 +115,7 @@ public class EnablePushNotificationsIQ extends IQ { dataForm.addField(field.build()); } - xml.element(dataForm); + xml.append(dataForm); } return xml; diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/spoiler/element/SpoilerElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/spoiler/element/SpoilerElement.java index 65bb14e4b..d2cb7c333 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/spoiler/element/SpoilerElement.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/spoiler/element/SpoilerElement.java @@ -131,12 +131,7 @@ public class SpoilerElement implements ExtensionElement { return map; } - /** - * Return the language of the hint. - * May be null. - * - * @return language of hint text - */ + @Override public String getLanguage() { return language; } @@ -153,8 +148,7 @@ public class SpoilerElement implements ExtensionElement { @Override public CharSequence toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); - xml.optXmlLangAttribute(getLanguage()); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); if (getHint() == null) { xml.closeEmptyElement(); } else { diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/address/MultipleRecipientManager.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/address/MultipleRecipientManager.java index d9d7131b4..fc361c392 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/address/MultipleRecipientManager.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/address/MultipleRecipientManager.java @@ -212,19 +212,19 @@ public class MultipleRecipientManager { if (to != null) { for (Jid jid : to) { packet.setTo(jid); - connection.sendStanza(new PacketCopy(packet.toXML())); + connection.sendStanza(new PacketCopy(packet)); } } if (cc != null) { for (Jid jid : cc) { packet.setTo(jid); - connection.sendStanza(new PacketCopy(packet.toXML())); + connection.sendStanza(new PacketCopy(packet)); } } if (bcc != null) { for (Jid jid : bcc) { packet.setTo(jid); - connection.sendStanza(new PacketCopy(packet.toXML())); + connection.sendStanza(new PacketCopy(packet)); } } } @@ -297,6 +297,7 @@ public class MultipleRecipientManager { */ private static final class PacketCopy extends Stanza { + private final String elementName; private final CharSequence text; /** @@ -305,8 +306,9 @@ public class MultipleRecipientManager { * * @param text the whole text of the stanza to send */ - private PacketCopy(CharSequence text) { - this.text = text; + private PacketCopy(Stanza stanza) { + this.elementName = stanza.getElementName(); + this.text = stanza.toXML(); } @Override @@ -319,6 +321,11 @@ public class MultipleRecipientManager { return toXML().toString(); } + @Override + public String getElementName() { + return elementName; + } + } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/address/packet/MultipleAddresses.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/address/packet/MultipleAddresses.java index 2ec8cd3d7..4e3f76f15 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/address/packet/MultipleAddresses.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/address/packet/MultipleAddresses.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.List; import org.jivesoftware.smack.packet.ExtensionElement; -import org.jivesoftware.smack.packet.NamedElement; import org.jivesoftware.smack.util.XmlStringBuilder; import org.jxmpp.jid.Jid; @@ -129,7 +128,7 @@ public class MultipleAddresses implements ExtensionElement { return buf; } - public static final class Address implements NamedElement { + public static final class Address implements ExtensionElement { public static final String ELEMENT = "address"; @@ -193,10 +192,15 @@ public class MultipleAddresses implements ExtensionElement { return ELEMENT; } + @Override + public String getNamespace() { + return NAMESPACE; + } + @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder buf = new XmlStringBuilder(); - buf.halfOpenElement(this).attribute("type", type); + XmlStringBuilder buf = new XmlStringBuilder(this, enclosingNamespace); + buf.attribute("type", type); buf.optAttribute("jid", jid); buf.optAttribute("node", node); buf.optAttribute("desc", description); @@ -209,5 +213,6 @@ public class MultipleAddresses implements ExtensionElement { buf.closeEmptyElement(); return buf; } + } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/packet/Bytestream.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/packet/Bytestream.java index e51b10061..64b3ad7d9 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/packet/Bytestream.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/bytestreams/socks5/packet/Bytestream.java @@ -21,8 +21,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.packet.IQ; -import org.jivesoftware.smack.packet.NamedElement; import org.jivesoftware.smack.util.InternetAddress; import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.XmlStringBuilder; @@ -260,13 +260,20 @@ public class Bytestream extends IQ { return xml; } + private abstract static class BytestreamExtensionElement implements ExtensionElement { + @Override + public final String getNamespace() { + return NAMESPACE; + } + } + /** * Stanza extension that represents a potential SOCKS5 proxy for the file transfer. Stream hosts * are forwarded to the target of the file transfer who then chooses and connects to one. * * @author Alexander Wenckus */ - public static class StreamHost implements NamedElement { + public static class StreamHost extends BytestreamExtensionElement { public static String ELEMENTNAME = "streamhost"; @@ -342,7 +349,7 @@ public class Bytestream extends IQ { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.attribute("jid", getJID()); xml.attribute("host", address); if (getPort() != 0) { @@ -366,7 +373,7 @@ public class Bytestream extends IQ { * * @author Alexander Wenckus */ - public static class StreamHostUsed implements NamedElement { + public static class StreamHostUsed extends BytestreamExtensionElement { public static String ELEMENTNAME = "streamhost-used"; @@ -397,7 +404,7 @@ public class Bytestream extends IQ { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.attribute("jid", getJID()); xml.closeEmptyElement(); return xml; @@ -409,7 +416,7 @@ public class Bytestream extends IQ { * * @author Alexander Wenckus */ - public static class Activate implements NamedElement { + public static class Activate extends BytestreamExtensionElement { public static String ELEMENTNAME = "activate"; @@ -440,12 +447,13 @@ public class Bytestream extends IQ { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.rightAngleBracket(); xml.escape(getTarget()); xml.closeElement(this); return xml; } + } /** diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/delay/packet/DelayInformation.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/delay/packet/DelayInformation.java index 7a81102bf..24c85d1d8 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/delay/packet/DelayInformation.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/delay/packet/DelayInformation.java @@ -103,7 +103,7 @@ public class DelayInformation implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.attribute("stamp", XmppDateTime.formatXEP0082Date(stamp)); xml.optAttribute("from", from); xml.rightAngleBracket(); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/forward/packet/Forwarded.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/forward/packet/Forwarded.java index 72d9fdb88..e8c886692 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/forward/packet/Forwarded.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/forward/packet/Forwarded.java @@ -72,10 +72,10 @@ public class Forwarded implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.rightAngleBracket(); xml.optElement(getDelayInformation()); - xml.append(forwardedPacket.toXML(NAMESPACE)); + xml.append(forwardedPacket); xml.closeElement(this); return xml; } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java index c88978828..171231a9b 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContent.java @@ -1,6 +1,6 @@ /** * - * Copyright 2017 Florian Schmaus + * Copyright 2017-2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,8 @@ */ package org.jivesoftware.smackx.jingle.element; -import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.FullyQualifiedElement; +import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smack.util.XmlStringBuilder; @@ -24,9 +25,10 @@ import org.jivesoftware.smack.util.XmlStringBuilder; /** * Jingle content element. */ -public final class JingleContent implements NamedElement { +public final class JingleContent implements FullyQualifiedElement { public static final String ELEMENT = "content"; + public static final String NAMESPACE = Jingle.NAMESPACE; public static final String CREATOR_ATTRIBUTE_NAME = "creator"; @@ -132,8 +134,13 @@ public final class JingleContent implements NamedElement { } @Override - public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + public String getNamespace() { + return NAMESPACE; + } + + @Override + public XmlStringBuilder toXML(XmlEnvironment enclosingXmlEnvironment) { + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingXmlEnvironment); xml.attribute(CREATOR_ATTRIBUTE_NAME, creator); xml.optAttribute(DISPOSITION_ATTRIBUTE_NAME, disposition); xml.attribute(NAME_ATTRIBUTE_NAME, name); diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentDescriptionChildElement.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentDescriptionChildElement.java index bb09f205d..aaf2cb269 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentDescriptionChildElement.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentDescriptionChildElement.java @@ -1,6 +1,6 @@ /** * - * Copyright © 2014-2017 Florian Schmaus + * Copyright © 2014-2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,18 +16,12 @@ */ package org.jivesoftware.smackx.jingle.element; -import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.FullyQualifiedElement; /** * An element found usually in 'description' elements. * */ -public abstract class JingleContentDescriptionChildElement implements NamedElement { +public interface JingleContentDescriptionChildElement extends FullyQualifiedElement { - public static final String ELEMENT = "payload-type"; - - @Override - public String getElementName() { - return ELEMENT; - } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransport.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransport.java index f3580540a..a683a9d6e 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransport.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransport.java @@ -1,6 +1,6 @@ /** * - * Copyright 2017 Florian Schmaus + * Copyright 2017-2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.List; import org.jivesoftware.smack.packet.ExtensionElement; +import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.util.XmlStringBuilder; /** @@ -66,8 +67,8 @@ public abstract class JingleContentTransport implements ExtensionElement { } @Override - public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + public XmlStringBuilder toXML(XmlEnvironment xmlEnvironment) { + XmlStringBuilder xml = new XmlStringBuilder(this, xmlEnvironment); addExtraAttributes(xml); if (candidates.isEmpty() && info == null) { diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransportCandidate.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransportCandidate.java index be38c8864..1a8cfb923 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransportCandidate.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransportCandidate.java @@ -1,6 +1,6 @@ /** * - * Copyright 2017 Florian Schmaus + * Copyright 2017-2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +16,13 @@ */ package org.jivesoftware.smackx.jingle.element; -import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.FullyQualifiedElement; /** * An element found usually in Jingle 'transport' elements. * */ -public abstract class JingleContentTransportCandidate implements NamedElement { +public abstract class JingleContentTransportCandidate implements FullyQualifiedElement { public static final String ELEMENT = "candidate"; diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransportInfo.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransportInfo.java index 6e1680046..7b4a13e9e 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransportInfo.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleContentTransportInfo.java @@ -1,6 +1,6 @@ /** * - * Copyright 2017 Paul Schaub + * Copyright 2017 Paul Schaub, 2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,11 @@ */ package org.jivesoftware.smackx.jingle.element; -import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.FullyQualifiedElement; /** * Abstract JingleContentTransportInfo element. */ -public abstract class JingleContentTransportInfo implements NamedElement { +public interface JingleContentTransportInfo extends FullyQualifiedElement { } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleReason.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleReason.java index e4d601aea..91c909aba 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleReason.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/element/JingleReason.java @@ -1,6 +1,6 @@ /** * - * Copyright 2017 Florian Schmaus + * Copyright 2017-2019 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,7 +19,8 @@ package org.jivesoftware.smackx.jingle.element; import java.util.HashMap; import java.util.Map; -import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.FullyQualifiedElement; +import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smack.util.XmlStringBuilder; @@ -29,9 +30,10 @@ import org.jivesoftware.smack.util.XmlStringBuilder; * @see XEP-0166 § 7.4 * */ -public class JingleReason implements NamedElement { +public class JingleReason implements FullyQualifiedElement { public static final String ELEMENT = "reason"; + public static final String NAMESPACE = Jingle.NAMESPACE; public static AlternativeSession AlternativeSession(String sessionId) { return new AlternativeSession(sessionId); @@ -114,11 +116,16 @@ public class JingleReason implements NamedElement { } @Override - public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + public String getNamespace() { + return NAMESPACE; + } + + @Override + public XmlStringBuilder toXML(XmlEnvironment enclosingXmlEnvironment) { + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingXmlEnvironment); xml.rightAngleBracket(); - xml.emptyElement(reason.asString); + xml.emptyElement(reason); xml.closeElement(this); return xml; diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/elements/JingleS5BTransportCandidate.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/elements/JingleS5BTransportCandidate.java index 1947fec41..4ad96fcca 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/elements/JingleS5BTransportCandidate.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/elements/JingleS5BTransportCandidate.java @@ -16,6 +16,7 @@ */ package org.jivesoftware.smackx.jingle.transports.jingle_s5b.elements; +import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.util.InternetAddress; import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.StringUtils; @@ -33,6 +34,8 @@ import org.jxmpp.stringprep.XmppStringprepException; */ public final class JingleS5BTransportCandidate extends JingleContentTransportCandidate { + public static final String NAMESPACE = JingleS5BTransport.NAMESPACE_V1; + public static final String ATTR_CID = "cid"; public static final String ATTR_HOST = "host"; public static final String ATTR_JID = "jid"; @@ -130,10 +133,15 @@ public final class JingleS5BTransportCandidate extends JingleContentTransportCan return new Bytestream.StreamHost(jid, host, port); } + @Override - public CharSequence toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(); - xml.halfOpenElement(this); + public String getNamespace() { + return NAMESPACE; + } + + @Override + public XmlStringBuilder toXML(XmlEnvironment enclosingXmlEnvironment) { + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingXmlEnvironment); xml.attribute(ATTR_CID, cid); xml.attribute(ATTR_HOST, host); xml.attribute(ATTR_JID, jid); @@ -207,4 +215,5 @@ public final class JingleS5BTransportCandidate extends JingleContentTransportCan return new JingleS5BTransportCandidate(cid, host, jid, port, priority, type); } } + } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/elements/JingleS5BTransportInfo.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/elements/JingleS5BTransportInfo.java index e21cd77bf..92733a5c0 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/elements/JingleS5BTransportInfo.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/jingle/transports/jingle_s5b/elements/JingleS5BTransportInfo.java @@ -16,6 +16,7 @@ */ package org.jivesoftware.smackx.jingle.transports.jingle_s5b.elements; +import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.util.XmlStringBuilder; import org.jivesoftware.smackx.jingle.element.JingleContentTransportInfo; @@ -23,7 +24,14 @@ import org.jivesoftware.smackx.jingle.element.JingleContentTransportInfo; /** * Class representing possible SOCKS5 TransportInfo elements. */ -public abstract class JingleS5BTransportInfo extends JingleContentTransportInfo { +public abstract class JingleS5BTransportInfo implements JingleContentTransportInfo { + + public static final String NAMESPACE = JingleS5BTransport.NAMESPACE_V1; + + @Override + public final String getNamespace() { + return NAMESPACE; + } public abstract static class JingleS5BCandidateTransportInfo extends JingleS5BTransportInfo { public static final String ATTR_CID = "cid"; @@ -39,9 +47,8 @@ public abstract class JingleS5BTransportInfo extends JingleContentTransportInfo } @Override - public final XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(); - xml.halfOpenElement(this); + public final XmlStringBuilder toXML(XmlEnvironment xmlEnvironment) { + XmlStringBuilder xml = new XmlStringBuilder(this, xmlEnvironment); xml.attribute(ATTR_CID, getCandidateId()); xml.closeEmptyElement(); return xml; diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/mood/element/MoodElement.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/mood/element/MoodElement.java index 192865faf..ef606387e 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/mood/element/MoodElement.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/mood/element/MoodElement.java @@ -17,8 +17,10 @@ package org.jivesoftware.smackx.mood.element; import org.jivesoftware.smack.packet.ExtensionElement; +import org.jivesoftware.smack.packet.FullyQualifiedElement; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.XmlStringBuilder; @@ -107,8 +109,8 @@ public class MoodElement implements ExtensionElement { } @Override - public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + public XmlStringBuilder toXML(XmlEnvironment xmlEnvironment) { + XmlStringBuilder xml = new XmlStringBuilder(this, xmlEnvironment); if (mood == null && text == null) { // Empty mood element used as STOP signal @@ -152,7 +154,7 @@ public class MoodElement implements ExtensionElement { * {@link NamedElement} which represents the mood. * This element has the element name of the mood selected from {@link Mood}. */ - public static class MoodSubjectElement implements NamedElement { + public static class MoodSubjectElement implements FullyQualifiedElement { private final Mood mood; private final MoodConcretisation concretisation; @@ -168,16 +170,17 @@ public class MoodElement implements ExtensionElement { } @Override - public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(); + public XmlStringBuilder toXML(XmlEnvironment xmlEnvironment) { + XmlStringBuilder xml = new XmlStringBuilder(this, xmlEnvironment); if (concretisation == null) { - return xml.emptyElement(getElementName()); + return xml.closeEmptyElement(); } - return xml.openElement(getElementName()) - .append(concretisation.toXML()) - .closeElement(getElementName()); + xml.rightAngleBracket() + .append(concretisation) + .closeElement(this); + return xml; } /** @@ -197,5 +200,10 @@ public class MoodElement implements ExtensionElement { public MoodConcretisation getConcretisation() { return concretisation; } + + @Override + public String getNamespace() { + return NAMESPACE; + } } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/packet/MUCUser.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/packet/MUCUser.java index 9d5ff84a9..600799d56 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/packet/MUCUser.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/packet/MUCUser.java @@ -323,7 +323,7 @@ public class MUCUser implements ExtensionElement { * * @author Gaston Dombiak */ - public static class Decline implements NamedElement { + public static class Decline implements ExtensionElement { public static final String ELEMENT = "decline"; private final String reason; @@ -370,7 +370,7 @@ public class MUCUser implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.optAttribute("to", getTo()); xml.optAttribute("from", getFrom()); xml.rightAngleBracket(); @@ -383,6 +383,11 @@ public class MUCUser implements ExtensionElement { public String getElementName() { return ELEMENT; } + + @Override + public String getNamespace() { + return NAMESPACE; + } } /** diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/FormField.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/FormField.java index 387c1e7fd..525d8fa75 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/FormField.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/FormField.java @@ -417,7 +417,7 @@ public final class FormField implements FullyQualifiedElement { } else { buf.rightAngleBracket(); - buf.append(formFieldChildElements, enclosingNamespace); + buf.append(formFieldChildElements); buf.closeElement(this); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/packet/DataForm.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/packet/DataForm.java index 661f3bd08..79360a471 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/packet/DataForm.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdata/packet/DataForm.java @@ -325,15 +325,10 @@ public class DataForm implements ExtensionElement { @Override public XmlStringBuilder toXML(XmlEnvironment xmlEnvironment) { - XmlStringBuilder buf = new XmlStringBuilder(this); + XmlStringBuilder buf = new XmlStringBuilder(this, xmlEnvironment); buf.attribute("type", getType()); buf.rightAngleBracket(); - XmlEnvironment dataFormxmlEnvironment = XmlEnvironment.builder() - .withNamespace(NAMESPACE) - .withNext(xmlEnvironment) - .build(); - buf.optElement("title", getTitle()); for (String instruction : getInstructions()) { buf.element("instructions", instruction); @@ -347,7 +342,7 @@ public class DataForm implements ExtensionElement { buf.append(item.toXML()); } // Add all form fields. - buf.append(getFields(), dataFormxmlEnvironment); + buf.append(getFields()); for (Element element : extensionElements) { buf.append(element.toXML()); } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdatalayout/packet/DataLayout.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdatalayout/packet/DataLayout.java index 4d5720829..e13c405db 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdatalayout/packet/DataLayout.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdatalayout/packet/DataLayout.java @@ -1,6 +1,6 @@ /** * - * Copyright 2014 Anno van Vliet + * Copyright 2014 Anno van Vliet, 2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.List; import org.jivesoftware.smack.packet.ExtensionElement; -import org.jivesoftware.smack.packet.NamedElement; import org.jivesoftware.smack.util.XmlStringBuilder; /** @@ -96,24 +95,14 @@ public class DataLayout implements ExtensionElement { buf.optAttribute("label", getLabel()); buf.rightAngleBracket(); - walkList(buf, getPageLayout()); + buf.append(getPageLayout()); buf.closeElement(this); return buf; } - /** - * @param buf TODO javadoc me please - * @param pageLayout TODO javadoc me please - */ - private static void walkList(XmlStringBuilder buf, List pageLayout) { - for (DataFormLayoutElement object : pageLayout) { - buf.append(object.toXML()); - } - } - - public static class Fieldref implements DataFormLayoutElement{ + public static class Fieldref extends DataFormLayoutElement{ public static final String ELEMENT = "fieldref"; private final String var; @@ -128,7 +117,7 @@ public class DataLayout implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder buf = new XmlStringBuilder(this); + XmlStringBuilder buf = new XmlStringBuilder(this, enclosingNamespace); buf.attribute("var", getVar()); buf.closeEmptyElement(); return buf; @@ -150,7 +139,7 @@ public class DataLayout implements ExtensionElement { } - public static class Section implements DataFormLayoutElement{ + public static class Section extends DataFormLayoutElement{ public static final String ELEMENT = "section"; private final List sectionLayout = new ArrayList<>(); @@ -188,11 +177,12 @@ public class DataLayout implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder buf = new XmlStringBuilder(this); + XmlStringBuilder buf = new XmlStringBuilder(this, enclosingNamespace); buf.optAttribute("label", getLabel()); buf.rightAngleBracket(); - walkList(buf, getSectionLayout()); + buf.append(getSectionLayout()); + buf.closeElement(ELEMENT); return buf; } @@ -213,13 +203,13 @@ public class DataLayout implements ExtensionElement { } - public static class Reportedref implements DataFormLayoutElement{ + public static class Reportedref extends DataFormLayoutElement{ public static final String ELEMENT = "reportedref"; @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder buf = new XmlStringBuilder(this); + XmlStringBuilder buf = new XmlStringBuilder(this, enclosingNamespace); buf.closeEmptyElement(); return buf; } @@ -231,7 +221,7 @@ public class DataLayout implements ExtensionElement { } - public static class Text implements DataFormLayoutElement{ + public static class Text extends DataFormLayoutElement{ public static final String ELEMENT = "text"; private final String text; @@ -245,8 +235,10 @@ public class DataLayout implements ExtensionElement { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder buf = new XmlStringBuilder(); - buf.element(ELEMENT, getText()); + XmlStringBuilder buf = new XmlStringBuilder(this, enclosingNamespace); + buf.rightAngleBracket(); + buf.escape(getText()); + buf.closeElement(this); return buf; } @@ -266,7 +258,11 @@ public class DataLayout implements ExtensionElement { } - public interface DataFormLayoutElement extends NamedElement { + public abstract static class DataFormLayoutElement implements ExtensionElement { + @Override + public final String getNamespace() { + return NAMESPACE; + } } } diff --git a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdatavalidation/packet/ValidateElement.java b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdatavalidation/packet/ValidateElement.java index 83edfdf1c..a3643f023 100644 --- a/smack-extensions/src/main/java/org/jivesoftware/smackx/xdatavalidation/packet/ValidateElement.java +++ b/smack-extensions/src/main/java/org/jivesoftware/smackx/xdatavalidation/packet/ValidateElement.java @@ -1,6 +1,6 @@ /** * - * Copyright 2014 Anno van Vliet + * Copyright 2014 Anno van Vliet, 2019 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,7 +19,8 @@ package org.jivesoftware.smackx.xdatavalidation.packet; import javax.xml.namespace.QName; import org.jivesoftware.smack.datatypes.UInt32; -import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.FullyQualifiedElement; +import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smack.util.XmlStringBuilder; @@ -336,7 +337,7 @@ public abstract class ValidateElement implements FormFieldChildElement { * This element indicates for "list-multi", that a minimum and maximum number of options should be selected and/or * entered. */ - public static class ListRange implements NamedElement { + public static class ListRange implements FullyQualifiedElement { public static final String ELEMENT = "list-range"; private final UInt32 min; @@ -363,8 +364,8 @@ public abstract class ValidateElement implements FormFieldChildElement { } @Override - public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder buf = new XmlStringBuilder(this); + public XmlStringBuilder toXML(XmlEnvironment enclosingXmlEnvironment) { + XmlStringBuilder buf = new XmlStringBuilder(this, enclosingXmlEnvironment); buf.optAttribute("min", getMin()); buf.optAttribute("max", getMax()); buf.closeEmptyElement(); @@ -394,6 +395,11 @@ public abstract class ValidateElement implements FormFieldChildElement { return max; } + @Override + public String getNamespace() { + return NAMESPACE; + } + } /** diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleContentTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleContentTest.java index 6023f257e..64d6ea070 100644 --- a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleContentTest.java +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleContentTest.java @@ -70,7 +70,7 @@ public class JingleContentTest extends SmackTestSuite { assertEquals(content1.toXML().toString(), builder.build().toXML().toString()); String xml = - "" + + "" + ""; assertEquals(xml, content1.toXML().toString()); } diff --git a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleReasonTest.java b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleReasonTest.java index d62de70b3..2e643248e 100644 --- a/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleReasonTest.java +++ b/smack-extensions/src/test/java/org/jivesoftware/smackx/jingle/JingleReasonTest.java @@ -1,6 +1,6 @@ /** * - * Copyright 2017 Paul Schaub + * Copyright 2017-2019 Paul Schaub, 2019 Florian Schmaus * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +16,14 @@ */ package org.jivesoftware.smackx.jingle; -import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.jivesoftware.smack.test.util.SmackTestSuite; import org.jivesoftware.smackx.jingle.element.JingleReason; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * Test JingleReason functionality. @@ -31,56 +32,67 @@ public class JingleReasonTest extends SmackTestSuite { @Test public void parserTest() { - assertEquals("", - JingleReason.Success.toXML().toString()); - assertEquals("", - JingleReason.Busy.toXML().toString()); - assertEquals("", - JingleReason.Cancel.toXML().toString()); - assertEquals("", - JingleReason.ConnectivityError.toXML().toString()); - assertEquals("", - JingleReason.Decline.toXML().toString()); - assertEquals("", - JingleReason.Expired.toXML().toString()); - assertEquals("", - JingleReason.UnsupportedTransports.toXML().toString()); - assertEquals("", - JingleReason.FailedTransport.toXML().toString()); - assertEquals("", - JingleReason.GeneralError.toXML().toString()); - assertEquals("", - JingleReason.Gone.toXML().toString()); - assertEquals("", - JingleReason.MediaError.toXML().toString()); - assertEquals("", - JingleReason.SecurityError.toXML().toString()); - assertEquals("", - JingleReason.UnsupportedApplications.toXML().toString()); - assertEquals("", - JingleReason.Timeout.toXML().toString()); - assertEquals("", - JingleReason.FailedApplication.toXML().toString()); - assertEquals("", - JingleReason.IncompatibleParameters.toXML().toString()); - assertEquals("1234", - JingleReason.AlternativeSession("1234").toXML().toString()); + assertReasonXml("", + JingleReason.Success); + assertReasonXml("", + JingleReason.Busy); + assertReasonXml("", + JingleReason.Cancel); + assertReasonXml("", + JingleReason.ConnectivityError); + assertReasonXml("", + JingleReason.Decline); + assertReasonXml("", + JingleReason.Expired); + assertReasonXml("", + JingleReason.UnsupportedTransports); + assertReasonXml("", + JingleReason.FailedTransport); + assertReasonXml("", + JingleReason.GeneralError); + assertReasonXml("", + JingleReason.Gone); + assertReasonXml("", + JingleReason.MediaError); + assertReasonXml("", + JingleReason.SecurityError); + assertReasonXml("", + JingleReason.UnsupportedApplications); + assertReasonXml("", + JingleReason.Timeout); + assertReasonXml("", + JingleReason.FailedApplication); + assertReasonXml("", + JingleReason.IncompatibleParameters); + assertReasonXml("1234", + JingleReason.AlternativeSession("1234")); } - @Test(expected = NullPointerException.class) + private static void assertReasonXml(String expected, JingleReason reason) { + String actualXml = reason.toXML(JingleReason.NAMESPACE).toString(); + assertEquals(expected, actualXml); + } + + @Test public void alternativeSessionEmptyStringTest() { - // Alternative sessionID must not be empty - JingleReason.AlternativeSession(""); + assertThrows(NullPointerException.class, () -> + // Alternative sessionID must not be empty + JingleReason.AlternativeSession("") + ); } - @Test(expected = NullPointerException.class) + @Test public void alternativeSessionNullStringTest() { - // Alternative sessionID must not be null - JingleReason.AlternativeSession(null); + assertThrows(NullPointerException.class, () -> + // Alternative sessionID must not be null + JingleReason.AlternativeSession(null) + ); } - @Test(expected = IllegalArgumentException.class) + @Test public void illegalArgumentTest() { - JingleReason.Reason.fromString("illegal-reason"); + assertThrows(IllegalArgumentException.class, () -> + JingleReason.Reason.fromString("illegal-reason") + ); } } diff --git a/smack-im/src/main/java/org/jivesoftware/smack/roster/packet/RosterPacket.java b/smack-im/src/main/java/org/jivesoftware/smack/roster/packet/RosterPacket.java index 3c079a39c..2944cf6be 100644 --- a/smack-im/src/main/java/org/jivesoftware/smack/roster/packet/RosterPacket.java +++ b/smack-im/src/main/java/org/jivesoftware/smack/roster/packet/RosterPacket.java @@ -24,8 +24,8 @@ import java.util.Locale; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; +import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.packet.IQ; -import org.jivesoftware.smack.packet.NamedElement; import org.jivesoftware.smack.packet.Stanza; import org.jivesoftware.smack.util.EqualsUtil; import org.jivesoftware.smack.util.HashCode; @@ -112,7 +112,7 @@ public final class RosterPacket extends IQ { * the groups the roster item belongs to. */ // TODO Make this class immutable. - public static final class Item implements NamedElement { + public static final class Item implements ExtensionElement { /** * The constant value "{@value}". @@ -163,6 +163,11 @@ public final class RosterPacket extends IQ { return ELEMENT; } + @Override + public String getNamespace() { + return NAMESPACE; + } + /** * Returns the user. * @@ -275,7 +280,7 @@ public final class RosterPacket extends IQ { @Override public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder xml = new XmlStringBuilder(this); + XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); xml.attribute("jid", jid); xml.optAttribute("name", name); xml.optAttribute("subscription", itemType); diff --git a/smack-jingle-old/src/main/java/org/jivesoftware/smackx/jingleold/packet/Jingle.java b/smack-jingle-old/src/main/java/org/jivesoftware/smackx/jingleold/packet/Jingle.java index cfb08d374..d904f0d34 100644 --- a/smack-jingle-old/src/main/java/org/jivesoftware/smackx/jingleold/packet/Jingle.java +++ b/smack-jingle-old/src/main/java/org/jivesoftware/smackx/jingleold/packet/Jingle.java @@ -182,25 +182,6 @@ public class Jingle extends IQ { return sid; } - /** - * Returns the XML element name of the extension sub-packet root element. - * Always returns "jingle" - * - * @return the XML element name of the stanza extension. - */ - public static String getElementName() { - return NODENAME; - } - - /** - * Returns the XML namespace of the extension sub-packet root element. - * - * @return the XML namespace of the stanza extension. - */ - public static String getNamespace() { - return NAMESPACE; - } - /** * Jingle content info. * diff --git a/smack-jingle-old/src/main/java/org/jivesoftware/smackx/jingleold/provider/JingleProvider.java b/smack-jingle-old/src/main/java/org/jivesoftware/smackx/jingleold/provider/JingleProvider.java index e78457342..f717d7303 100644 --- a/smack-jingle-old/src/main/java/org/jivesoftware/smackx/jingleold/provider/JingleProvider.java +++ b/smack-jingle-old/src/main/java/org/jivesoftware/smackx/jingleold/provider/JingleProvider.java @@ -120,7 +120,7 @@ public class JingleProvider extends IQProvider { } } else if (eventType == XmlPullParser.Event.END_ELEMENT) { - if (parser.getName().equals(Jingle.getElementName())) { + if (parser.getName().equals(Jingle.NODENAME)) { done = true; } } diff --git a/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/AgentStatusRequest.java b/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/AgentStatusRequest.java index b52e61e99..a94042d23 100644 --- a/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/AgentStatusRequest.java +++ b/smack-legacy/src/main/java/org/jivesoftware/smackx/workgroup/packet/AgentStatusRequest.java @@ -65,14 +65,6 @@ public class AgentStatusRequest extends IQ { return Collections.unmodifiableSet(agents); } - public String getElementName() { - return ELEMENT_NAME; - } - - public String getNamespace() { - return NAMESPACE; - } - @Override protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder buf) { buf.rightAngleBracket(); diff --git a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoElement.java b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoElement.java index 877436214..6d28da919 100644 --- a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoElement.java +++ b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoElement.java @@ -76,7 +76,7 @@ public abstract class OmemoElement implements ExtensionElement { public XmlStringBuilder toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { XmlStringBuilder sb = new XmlStringBuilder(this, enclosingNamespace).rightAngleBracket(); - sb.element(header); + sb.append(header); if (payload != null) { sb.openElement(ATTR_PAYLOAD).append(Base64.encodeToString(payload)).closeElement(ATTR_PAYLOAD); diff --git a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoHeaderElement.java b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoHeaderElement.java index 8e8a07c09..a0fa6f5f8 100644 --- a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoHeaderElement.java +++ b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoHeaderElement.java @@ -19,17 +19,22 @@ package org.jivesoftware.smackx.omemo.element; import java.util.ArrayList; import java.util.List; -import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.FullyQualifiedElement; +import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.util.XmlStringBuilder; import org.jivesoftware.smack.util.stringencoder.Base64; +import org.jivesoftware.smackx.omemo.util.OmemoConstants; + /** * Header element of the message. The header contains information about the sender and the encrypted keys for * the recipients, as well as the iv element for AES. */ -public abstract class OmemoHeaderElement implements NamedElement { +public abstract class OmemoHeaderElement implements FullyQualifiedElement { + + public static final String ELEMENT = "header"; + public static final String NAMESPACE = OmemoConstants.OMEMO_NAMESPACE_V_AXOLOTL; - public static final String NAME_HEADER = "header"; public static final String ATTR_SID = "sid"; public static final String ATTR_IV = "iv"; @@ -62,16 +67,21 @@ public abstract class OmemoHeaderElement implements NamedElement { @Override public String getElementName() { - return NAME_HEADER; + return ELEMENT; } @Override - public CharSequence toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder sb = new XmlStringBuilder(this); + public String getNamespace() { + return NAMESPACE; + } + + @Override + public XmlStringBuilder toXML(XmlEnvironment enclosingXmlEnvironment) { + XmlStringBuilder sb = new XmlStringBuilder(this, enclosingXmlEnvironment); sb.attribute(ATTR_SID, getSid()).rightAngleBracket(); for (OmemoKeyElement k : getKeys()) { - sb.element(k); + sb.append(k); } sb.openElement(ATTR_IV).append(Base64.encodeToString(getIv())).closeElement(ATTR_IV); diff --git a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoKeyElement.java b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoKeyElement.java index 75c0327d8..fc55c3300 100644 --- a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoKeyElement.java +++ b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/element/OmemoKeyElement.java @@ -16,16 +16,21 @@ */ package org.jivesoftware.smackx.omemo.element; -import org.jivesoftware.smack.packet.NamedElement; +import org.jivesoftware.smack.packet.FullyQualifiedElement; +import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.util.XmlStringBuilder; import org.jivesoftware.smack.util.stringencoder.Base64; +import org.jivesoftware.smackx.omemo.util.OmemoConstants; + /** * Small class to collect key (byte[]), its id and whether its a preKey or not. */ -public class OmemoKeyElement implements NamedElement { +public class OmemoKeyElement implements FullyQualifiedElement { + + public static final String ELEMENT = "key"; + public static final String NAMESPACE = OmemoConstants.OMEMO_NAMESPACE_V_AXOLOTL; - public static final String NAME_KEY = "key"; public static final String ATTR_RID = "rid"; public static final String ATTR_PREKEY = "prekey"; @@ -34,9 +39,7 @@ public class OmemoKeyElement implements NamedElement { private final boolean preKey; public OmemoKeyElement(byte[] data, int id) { - this.data = data; - this.id = id; - this.preKey = false; + this(data, id, false); } public OmemoKeyElement(byte[] data, int id, boolean preKey) { @@ -64,12 +67,17 @@ public class OmemoKeyElement implements NamedElement { @Override public String getElementName() { - return NAME_KEY; + return ELEMENT; } @Override - public CharSequence toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) { - XmlStringBuilder sb = new XmlStringBuilder(this); + public String getNamespace() { + return NAMESPACE; + } + + @Override + public XmlStringBuilder toXML(XmlEnvironment enclosingXmlEnvironment) { + XmlStringBuilder sb = new XmlStringBuilder(this, enclosingXmlEnvironment); if (isPreKey()) { sb.attribute(ATTR_PREKEY, true); diff --git a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/provider/OmemoVAxolotlProvider.java b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/provider/OmemoVAxolotlProvider.java index 1fa0d05ea..cd6ae16f7 100644 --- a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/provider/OmemoVAxolotlProvider.java +++ b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/provider/OmemoVAxolotlProvider.java @@ -54,14 +54,14 @@ public class OmemoVAxolotlProvider extends ExtensionElementProvider