mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2025-09-09 18:29:45 +02:00
Rework XML Element hierarchy and XmlStringBuilder
- Reduce the amount of types that are subtypes of NamedElement. See javadoc of NamedElement for rationale. - Work more with XmlEnvironment in XmlStringBuilder. - Some minor changes to XmlStringBuilder API.
This commit is contained in:
parent
e9bcdf3e6d
commit
65576cf3c2
74 changed files with 653 additions and 523 deletions
|
@ -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<B extends Builder<B>> {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<ExtensionElement> 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<ExtensionElement> extensionsXml = getExtensions();
|
||||
if (iqChildElement.isEmptyElement) {
|
||||
if (extensionsXml.isEmpty()) {
|
||||
xml.closeEmptyElement();
|
||||
return;
|
||||
}
|
||||
|
||||
xml.rightAngleBracket();
|
||||
}
|
||||
|
||||
xml.append(extensionsXml);
|
||||
xml.closeElement(iqChildElement.element);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -467,6 +467,11 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
|
|||
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<Message> {
|
|||
|
||||
@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<Message> {
|
|||
// 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<Message> {
|
|||
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<Message> {
|
|||
|
||||
@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<Message> {
|
|||
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<Message> {
|
|||
@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;
|
||||
|
|
|
@ -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.
|
||||
* <p>
|
||||
* Please note that usage of this interface is <b>discouraged</b>. 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.
|
||||
* </p>
|
||||
*/
|
||||
public interface NamedElement extends Element {
|
||||
|
||||
|
|
|
@ -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 <a href="http://xmpp.org/extensions/xep-0360.html">XEP-0360: Nonzas (are not Stanzas)</a>
|
||||
*/
|
||||
public interface Nonza extends TopLevelStreamElement, FullyQualifiedElement {
|
||||
public interface Nonza extends TopLevelStreamElement {
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
/**
|
||||
|
|
|
@ -256,6 +256,11 @@ public final class Presence extends Stanza implements TypedCloneable<Presence> {
|
|||
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<Presence> {
|
|||
|
||||
@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<Presence> {
|
|||
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);
|
||||
|
||||
|
|
|
@ -59,6 +59,10 @@ public abstract class Stanza implements TopLevelStreamElement {
|
|||
|
||||
private final MultiMap<QName, ExtensionElement> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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<? extends Element> elements) {
|
||||
return append(elements, effectiveXmlEnvironment);
|
||||
public XmlStringBuilder append(Element element) {
|
||||
return append(element.toXML(effectiveXmlEnvironment));
|
||||
}
|
||||
|
||||
public XmlStringBuilder append(Collection<? extends Element> elements, XmlEnvironment enclosingXmlEnvironment) {
|
||||
public XmlStringBuilder append(Collection<? extends Element> elements) {
|
||||
for (Element element : elements) {
|
||||
append(element.toXML(enclosingXmlEnvironment));
|
||||
append(element);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
|
|
@ -188,5 +188,10 @@ public class StanzaCollectorTest {
|
|||
public String toString() {
|
||||
return toXML().toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getElementName() {
|
||||
return "packetId";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue