1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2025-09-09 17:19:39 +02:00

Treat <body/> just like all other extension elements in Message

This turned out to be a rather large change.
This commit is contained in:
Florian Schmaus 2018-05-09 16:53:08 +02:00
parent cb9a11b74e
commit a9e45475ab
39 changed files with 261 additions and 219 deletions

View file

@ -17,6 +17,7 @@
package org.jivesoftware.smack.packet;
import java.util.List;
import java.util.Locale;
import org.jivesoftware.smack.util.Objects;
@ -128,7 +129,7 @@ public abstract class IQ extends Stanza {
public final XmlStringBuilder toXML(String enclosingNamespace) {
XmlStringBuilder buf = new XmlStringBuilder(enclosingNamespace);
buf.halfOpenElement(IQ_ELEMENT);
addCommonAttributes(buf);
addCommonAttributes(buf, enclosingNamespace);
if (type == null) {
buf.attribute("type", "get");
}
@ -158,9 +159,10 @@ public abstract class IQ extends Stanza {
IQChildElementXmlStringBuilder iqChildElement = getIQChildElementBuilder(new IQChildElementXmlStringBuilder(this));
if (iqChildElement != null) {
xml.append(iqChildElement);
XmlStringBuilder extensionsXml = getExtensionsXML();
List<ExtensionElement> extensionsXml = getExtensions();
if (iqChildElement.isEmptyElement) {
if (extensionsXml.length() == 0) {
if (extensionsXml.isEmpty()) {
xml.closeEmptyElement();
return xml;
} else {

View file

@ -66,7 +66,6 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
private String thread = null;
private final Set<Subject> subjects = new HashSet<Subject>();
private final Set<Body> bodies = new HashSet<Body>();
/**
* Creates a new, "normal" message.
@ -142,7 +141,6 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
this.type = other.type;
this.thread = other.thread;
this.subjects.addAll(other.subjects);
this.bodies.addAll(other.bodies);
}
/**
@ -197,7 +195,7 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
private Subject getMessageSubject(String language) {
language = determineLanguage(language);
for (Subject subject : subjects) {
if (language.equals(subject.language)) {
if (Objects.equals(language, subject.language)) {
return subject;
}
}
@ -296,7 +294,7 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
* @return the body of the message.
*/
public String getBody() {
return getBody(null);
return getBody(language);
}
/**
@ -331,7 +329,13 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
* @since 3.0.2
*/
public Set<Body> getBodies() {
return Collections.unmodifiableSet(bodies);
List<ExtensionElement> bodiesList = getExtensions(Body.ELEMENT, Body.NAMESPACE);
Set<Body> resultSet = new HashSet<>(bodiesList.size());
for (ExtensionElement extensionElement : bodiesList) {
Body body = (Body) extensionElement;
resultSet.add(body);
}
return resultSet;
}
/**
@ -375,8 +379,11 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
*/
public Body addBody(String language, String body) {
language = determineLanguage(language);
removeBody(language);
Body messageBody = new Body(language, body);
bodies.add(messageBody);
addExtension(messageBody);
return messageBody;
}
@ -406,7 +413,8 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
* @since 3.0.2
*/
public boolean removeBody(Body body) {
return bodies.remove(body);
ExtensionElement removedElement = removeExtension(body);
return removedElement != null;
}
/**
@ -418,7 +426,7 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
public List<String> getBodyLanguages() {
Body defaultBody = getMessageBody(null);
List<String> languages = new ArrayList<String>();
for (Body body : bodies) {
for (Body body : getBodies()) {
if (!body.equals(defaultBody)) {
languages.add(body.language);
}
@ -472,9 +480,9 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
@Override
public XmlStringBuilder toXML(String enclosingNamespace) {
XmlStringBuilder buf = new XmlStringBuilder();
XmlStringBuilder buf = new XmlStringBuilder(enclosingNamespace);
buf.halfOpenElement(ELEMENT);
addCommonAttributes(buf);
enclosingNamespace = addCommonAttributes(buf, enclosingNamespace);
buf.optAttribute("type", type);
buf.rightAngleBracket();
@ -490,25 +498,15 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
continue;
buf.append(subject.toXML(null));
}
// Add the body in the default language
Body defaultBody = getMessageBody(null);
if (defaultBody != null) {
buf.element("body", defaultBody.message);
}
// Add the bodies in other languages
for (Body body : getBodies()) {
// Skip the default language
if (body.equals(defaultBody))
continue;
buf.append(body.toXML(enclosingNamespace));
}
buf.optElement("thread", thread);
// Append the error subpacket if the message type is an error.
if (type == Type.error) {
appendErrorIfExists(buf);
}
// Add packet extensions, if any are defined.
buf.append(getExtensionsXML());
// Add extension elements, if any are defined.
buf.append(getExtensions(), enclosingNamespace);
buf.closeElement(ELEMENT);
return buf;
}

View file

@ -273,9 +273,9 @@ public final class Presence extends Stanza implements TypedCloneable<Presence> {
@Override
public XmlStringBuilder toXML(String enclosingNamespace) {
XmlStringBuilder buf = new XmlStringBuilder();
XmlStringBuilder buf = new XmlStringBuilder(enclosingNamespace);
buf.halfOpenElement(ELEMENT);
addCommonAttributes(buf);
addCommonAttributes(buf, enclosingNamespace);
if (type != Type.available) {
buf.attribute("type", type);
}
@ -288,7 +288,8 @@ public final class Presence extends Stanza implements TypedCloneable<Presence> {
if (mode != null && mode != Mode.available) {
buf.element("show", mode);
}
buf.append(getExtensionsXML());
buf.append(getExtensions(), enclosingNamespace);
// Add the error sub-packet, if there is one.
appendErrorIfExists(buf);

View file

@ -470,7 +470,15 @@ public abstract class Stanza implements TopLevelStreamElement {
* @return the removed stanza extension or null.
*/
public ExtensionElement removeExtension(ExtensionElement extension) {
return removeExtension(extension.getElementName(), extension.getNamespace());
String key = XmppStringUtils.generateKey(extension.getElementName(), extension.getNamespace());
synchronized (packetExtensions) {
List<ExtensionElement> list = packetExtensions.getAll(key);
boolean removed = list.remove(extension);
if (removed) {
return extension;
}
}
return null;
}
/**
@ -479,22 +487,6 @@ public abstract class Stanza implements TopLevelStreamElement {
@Override
public abstract String toString();
/**
* Returns the extension sub-packets (including properties data) as an XML
* String, or the Empty String if there are no stanza extensions.
*
* @return the extension sub-packets as XML or the Empty String if there
* are no stanza extensions.
*/
protected final XmlStringBuilder getExtensionsXML() {
XmlStringBuilder xml = new XmlStringBuilder();
// Add in all standard extension sub-packets.
for (ExtensionElement extension : getExtensions()) {
xml.append(extension.toXML(null));
}
return xml;
}
/**
* Returns the default language used for all messages containing localized content.
*
@ -507,13 +499,26 @@ public abstract class Stanza implements TopLevelStreamElement {
/**
* Add to, from, id and 'xml:lang' attributes
*
* @param xml
* @param xml the {@link XmlStringBuilder}.
* @param enclosingNamespace the enclosing XML namespace.
* @return the set namespace for this stanza.
*/
protected void addCommonAttributes(XmlStringBuilder xml) {
protected String addCommonAttributes(XmlStringBuilder xml, String enclosingNamespace) {
String namespace;
if (enclosingNamespace == null || !enclosingNamespace.equals(StreamOpen.CLIENT_NAMESPACE)
|| !enclosingNamespace.equals(StreamOpen.SERVER_NAMESPACE)) {
namespace = StreamOpen.CLIENT_NAMESPACE;
} else {
namespace = enclosingNamespace;
}
xml.xmlnsAttribute(namespace);
xml.optAttribute("to", getTo());
xml.optAttribute("from", getFrom());
xml.optAttribute("id", getStanzaId());
xml.xmllangAttribute(getLanguage());
return namespace;
}
protected void logCommonAttributes(StringBuilder sb) {

View file

@ -246,28 +246,12 @@ public class PacketParserUtils {
switch (elementName) {
case "subject":
String xmlLangSubject = getLanguageAttribute(parser);
if (xmlLangSubject == null) {
xmlLangSubject = defaultLanguage;
}
String subject = parseElementText(parser);
if (message.getSubject(xmlLangSubject) == null) {
message.addSubject(xmlLangSubject, subject);
}
break;
case Message.BODY:
String xmlLang = getLanguageAttribute(parser);
if (xmlLang == null) {
xmlLang = defaultLanguage;
}
String body = parseElementText(parser);
if (message.getBody(xmlLang) == null) {
message.addBody(xmlLang, body);
}
break;
case "thread":
if (thread == null) {
thread = parser.nextText();
@ -290,6 +274,11 @@ public class PacketParserUtils {
}
message.setThread(thread);
// TODO check for duplicate body elements. This means we need to check for duplicate xml:lang pairs and for
// situations where we have a body element with an explicit xml lang set and once where the value is inherited
// and both values are equal.
return message;
}

View file

@ -457,8 +457,12 @@ public class XmlStringBuilder implements Appendable, CharSequence, Element {
}
public XmlStringBuilder append(Collection<? extends Element> elements) {
return append(elements, null);
}
public XmlStringBuilder append(Collection<? extends Element> elements, String enclosingNamespace) {
for (Element element : elements) {
append(element.toXML(null));
append(element.toXML(enclosingNamespace));
}
return this;
}

View file

@ -49,7 +49,7 @@ public class MessageTest {
Message messageTypeInConstructor = new Message(null, Message.Type.chat);
messageTypeInConstructor.setStanzaId(null);
assertEquals(type, messageTypeInConstructor.getType());
assertXMLEqual(control, messageTypeInConstructor.toXML(null).toString());
assertXMLEqual(control, messageTypeInConstructor.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
controlBuilder = new StringBuilder();
controlBuilder.append("<message")
@ -62,7 +62,7 @@ public class MessageTest {
Message messageTypeSet = getNewMessage();
messageTypeSet.setType(type2);
assertEquals(type2, messageTypeSet.getType());
assertXMLEqual(control, messageTypeSet.toXML(null).toString());
assertXMLEqual(control, messageTypeSet.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
}
@Test(expected = NullPointerException.class)
@ -87,7 +87,7 @@ public class MessageTest {
message.setSubject(messageSubject);
assertEquals(messageSubject, message.getSubject());
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
}
@Test
@ -106,7 +106,7 @@ public class MessageTest {
message.setBody(messageBody);
assertEquals(messageBody, message.getBody());
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
}
@Test
@ -183,7 +183,7 @@ public class MessageTest {
message.setThread(messageThread);
assertEquals(messageThread, message.getThread());
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
}
@Test
@ -201,7 +201,7 @@ public class MessageTest {
Message message = getNewMessage();
message.setLanguage(lang);
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
}
private static Message getNewMessage() {

View file

@ -43,7 +43,7 @@ public class PresenceTest {
Presence presenceTypeInConstructor = new Presence(type);
presenceTypeInConstructor.setStanzaId(null);
assertEquals(type, presenceTypeInConstructor.getType());
assertXMLEqual(control, presenceTypeInConstructor.toXML(null).toString());
assertXMLEqual(control, presenceTypeInConstructor.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
controlBuilder = new StringBuilder();
controlBuilder.append("<presence")
@ -56,7 +56,7 @@ public class PresenceTest {
Presence presenceTypeSet = getNewPresence();
presenceTypeSet.setType(type2);
assertEquals(type2, presenceTypeSet.getType());
assertXMLEqual(control, presenceTypeSet.toXML(null).toString());
assertXMLEqual(control, presenceTypeSet.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
}
@Test(expected = NullPointerException.class)
@ -90,7 +90,7 @@ public class PresenceTest {
presence.setStatus(status);
assertEquals(status, presence.getStatus());
assertXMLEqual(control, presence.toXML(null).toString());
assertXMLEqual(control, presence.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
}
@Test
@ -109,7 +109,7 @@ public class PresenceTest {
presence.setPriority(priority);
assertEquals(priority, presence.getPriority());
assertXMLEqual(control, presence.toXML(null).toString());
assertXMLEqual(control, presence.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
}
@Test(expected = IllegalArgumentException.class)
@ -142,7 +142,7 @@ public class PresenceTest {
mode1);
presenceModeInConstructor.setStanzaId(null);
assertEquals(mode1, presenceModeInConstructor.getMode());
assertXMLEqual(control, presenceModeInConstructor.toXML(null).toString());
assertXMLEqual(control, presenceModeInConstructor.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
controlBuilder = new StringBuilder();
controlBuilder.append("<presence>")
@ -155,7 +155,7 @@ public class PresenceTest {
Presence presenceModeSet = getNewPresence();
presenceModeSet.setMode(mode2);
assertEquals(mode2, presenceModeSet.getMode());
assertXMLEqual(control, presenceModeSet.toXML(null).toString());
assertXMLEqual(control, presenceModeSet.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
}
@Test
@ -183,7 +183,7 @@ public class PresenceTest {
Presence presence = getNewPresence();
presence.setLanguage(lang);
assertXMLEqual(control, presence.toXML(null).toString());
assertXMLEqual(control, presence.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
}
private static Presence getNewPresence() {

View file

@ -46,6 +46,7 @@ import org.jivesoftware.smack.test.util.TestUtils;
import org.jivesoftware.smack.test.util.XmlUnitUtils;
import com.jamesmurty.utils.XMLBuilder;
import org.junit.Ignore;
import org.junit.Test;
import org.xml.sax.SAXException;
import org.xmlpull.v1.XmlPullParser;
@ -67,6 +68,7 @@ public class PacketParserUtilsTest {
// message has default language, body has no language
control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -87,6 +89,7 @@ public class PacketParserUtilsTest {
// message has non-default language, body has no language
control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -106,6 +109,7 @@ public class PacketParserUtilsTest {
// message has no language, body has no language
control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -118,12 +122,13 @@ public class PacketParserUtilsTest {
assertEquals(defaultLanguage, message.getBody());
assertTrue(message.getBodyLanguages().isEmpty());
assertEquals(defaultLanguage, message.getBody(defaultLanguage));
assertEquals(defaultLanguage, message.getBody(null));
assertNull(message.getBody(otherLanguage));
assertXMLEqual(control, message.toXML(null).toString());
// message has no language, body has default language
control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -135,16 +140,16 @@ public class PacketParserUtilsTest {
message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
assertEquals(defaultLanguage, message.getBody());
assertTrue(message.getBodyLanguages().isEmpty());
assertNull(message.getBody());
assertFalse(message.getBodyLanguages().isEmpty());
assertEquals(defaultLanguage, message.getBody(defaultLanguage));
assertNull(message.getBody(otherLanguage));
// body attribute xml:lang is unnecessary
assertXMLNotEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(null).toString());
// message has no language, body has non-default language
control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -161,10 +166,11 @@ public class PacketParserUtilsTest {
assertTrue(message.getBodyLanguages().contains(otherLanguage));
assertEquals(otherLanguage, message.getBody(otherLanguage));
assertNull(message.getBody(defaultLanguage));
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
assertXMLEqual(control, message.toXML(null).toString());
// message has default language, body has non-default language
control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -182,10 +188,11 @@ public class PacketParserUtilsTest {
assertTrue(message.getBodyLanguages().contains(otherLanguage));
assertEquals(otherLanguage, message.getBody(otherLanguage));
assertNull(message.getBody(defaultLanguage));
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
assertXMLEqual(control, message.toXML(null).toString());
// message has non-default language, body has default language
control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -203,7 +210,7 @@ public class PacketParserUtilsTest {
assertTrue(message.getBodyLanguages().contains(defaultLanguage));
assertEquals(defaultLanguage, message.getBody(defaultLanguage));
assertNull(message.getBody(otherLanguage));
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
assertXMLEqual(control, message.toXML(null).toString());
}
@ -232,7 +239,7 @@ public class PacketParserUtilsTest {
assertTrue(message.getSubjectLanguages().isEmpty());
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
assertNull(message.getSubject(otherLanguage));
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has non-default language, subject has no language
control = XMLBuilder.create("message")
@ -251,7 +258,7 @@ public class PacketParserUtilsTest {
assertTrue(message.getSubjectLanguages().isEmpty());
assertEquals(otherLanguage, message.getSubject(otherLanguage));
assertNull(message.getSubject(defaultLanguage));
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has no language, subject has no language
control = XMLBuilder.create("message")
@ -267,9 +274,9 @@ public class PacketParserUtilsTest {
assertEquals(defaultLanguage, message.getSubject());
assertTrue(message.getSubjectLanguages().isEmpty());
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
assertEquals(defaultLanguage, message.getSubject(null));
assertNull(message.getSubject(otherLanguage));
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has no language, subject has default language
control = XMLBuilder.create("message")
@ -284,13 +291,11 @@ public class PacketParserUtilsTest {
message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
assertEquals(defaultLanguage, message.getSubject());
assertTrue(message.getSubjectLanguages().isEmpty());
assertFalse(message.getSubjectLanguages().isEmpty());
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
assertNull(message.getSubject(otherLanguage));
// subject attribute xml:lang is unnecessary
assertXMLNotEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has no language, subject has non-default language
control = XMLBuilder.create("message")
@ -310,7 +315,7 @@ public class PacketParserUtilsTest {
assertTrue(message.getSubjectLanguages().contains(otherLanguage));
assertEquals(otherLanguage, message.getSubject(otherLanguage));
assertNull(message.getSubject(defaultLanguage));
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has default language, subject has non-default language
control = XMLBuilder.create("message")
@ -331,7 +336,7 @@ public class PacketParserUtilsTest {
assertTrue(message.getSubjectLanguages().contains(otherLanguage));
assertEquals(otherLanguage, message.getSubject(otherLanguage));
assertNull(message.getSubject(defaultLanguage));
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has non-default language, subject has default language
control = XMLBuilder.create("message")
@ -352,7 +357,7 @@ public class PacketParserUtilsTest {
assertTrue(message.getSubjectLanguages().contains(defaultLanguage));
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
assertNull(message.getSubject(otherLanguage));
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
}
@ -366,6 +371,7 @@ public class PacketParserUtilsTest {
// message has default language, first body no language, second body other language
control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -387,34 +393,11 @@ public class PacketParserUtilsTest {
assertEquals(2, message.getBodies().size());
assertEquals(1, message.getBodyLanguages().size());
assertTrue(message.getBodyLanguages().contains(otherLanguage));
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has default language, first body no language, second body default language
control = XMLBuilder.create("message")
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
.a("type", "chat")
.a("xml:lang", defaultLanguage)
.e("body")
.t(defaultLanguage)
.up()
.e("body")
.a("xml:lang", defaultLanguage)
.t(defaultLanguage + "2")
.asString(outputProperties);
message = PacketParserUtils
.parseMessage(PacketParserUtils.getParserFor(control));
assertEquals(defaultLanguage, message.getBody());
assertEquals(defaultLanguage, message.getBody(defaultLanguage));
assertEquals(1, message.getBodies().size());
assertEquals(0, message.getBodyLanguages().size());
assertXMLNotEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(null).toString());
// message has non-default language, first body no language, second body default language
control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -436,14 +419,24 @@ public class PacketParserUtilsTest {
assertEquals(2, message.getBodies().size());
assertEquals(1, message.getBodyLanguages().size());
assertTrue(message.getBodyLanguages().contains(defaultLanguage));
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
assertXMLEqual(control, message.toXML(null).toString());
}
// message has no language, first body no language, second body default language
control = XMLBuilder.create("message")
// TODO: Re-enable once we throw an exception on duplicate body elements.
@Ignore
@Test
public void duplicateMessageBodiesTest()
throws FactoryConfigurationError, XmlPullParserException, IOException, Exception {
String defaultLanguage = Stanza.getDefaultLanguage();
// message has default language, first body no language, second body default language
String control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
.a("type", "chat")
.a("xml:lang", defaultLanguage)
.e("body")
.t(defaultLanguage)
.up()
@ -452,7 +445,7 @@ public class PacketParserUtilsTest {
.t(defaultLanguage + "2")
.asString(outputProperties);
message = PacketParserUtils
Message message = PacketParserUtils
.parseMessage(PacketParserUtils.getParserFor(control));
assertEquals(defaultLanguage, message.getBody());
@ -460,9 +453,19 @@ public class PacketParserUtilsTest {
assertEquals(1, message.getBodies().size());
assertEquals(0, message.getBodyLanguages().size());
assertXMLNotEqual(control, message.toXML(null).toString());
}
// message has no language, first body no language, second body other language
control = XMLBuilder.create("message")
@Ignore
@Test
public void duplicateMessageBodiesTest2()
throws FactoryConfigurationError, XmlPullParserException, IOException, Exception {
String defaultLanguage = Stanza.getDefaultLanguage();
String otherLanguage = determineNonDefaultLanguage();
// message has no language, first body no language, second body no language
String control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("xml:lang", defaultLanguage)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -470,43 +473,44 @@ public class PacketParserUtilsTest {
.e("body")
.t(defaultLanguage)
.up()
.e("body")
.t(otherLanguage)
.asString(outputProperties);
PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
}
@Test
public void messageNoLanguageFirstBodyNoLanguageSecondBodyOtherTest()
throws FactoryConfigurationError, XmlPullParserException, IOException, Exception {
String defaultLanguage = Stanza.getDefaultLanguage();
String otherLanguage = determineNonDefaultLanguage();
// message has no language, first body no language, second body other language
String control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
.a("type", "chat")
.e("body")
// TODO change default language into something else
.t(defaultLanguage)
.up()
.e("body")
.a("xml:lang", otherLanguage)
.t(otherLanguage)
.asString(outputProperties);
message = PacketParserUtils
Message message = PacketParserUtils
.parseMessage(PacketParserUtils.getParserFor(control));
assertEquals(defaultLanguage, message.getBody());
assertEquals(defaultLanguage, message.getBody(defaultLanguage));
assertEquals(defaultLanguage, message.getBody(null));
assertEquals(otherLanguage, message.getBody(otherLanguage));
assertEquals(2, message.getBodies().size());
assertEquals(1, message.getBodyLanguages().size());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has no language, first body no language, second body no language
control = XMLBuilder.create("message")
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
.a("type", "chat")
.e("body")
.t(defaultLanguage)
.up()
.e("body")
.t(otherLanguage)
.asString(outputProperties);
message = PacketParserUtils
.parseMessage(PacketParserUtils.getParserFor(control));
assertEquals(defaultLanguage, message.getBody());
assertEquals(defaultLanguage, message.getBody(defaultLanguage));
assertEquals(1, message.getBodies().size());
assertEquals(0, message.getBodyLanguages().size());
assertXMLNotEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(null).toString());
}
@Test
@ -540,7 +544,7 @@ public class PacketParserUtilsTest {
assertEquals(2, message.getSubjects().size());
assertEquals(1, message.getSubjectLanguages().size());
assertTrue(message.getSubjectLanguages().contains(otherLanguage));
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has default language, first subject no language, second subject default language
control = XMLBuilder.create("message")
@ -564,7 +568,7 @@ public class PacketParserUtilsTest {
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
assertEquals(1, message.getSubjects().size());
assertEquals(0, message.getSubjectLanguages().size());
assertXMLNotEqual(control, message.toXML(null).toString());
assertXMLNotEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has non-default language, first subject no language, second subject default language
control = XMLBuilder.create("message")
@ -589,8 +593,9 @@ public class PacketParserUtilsTest {
assertEquals(2, message.getSubjects().size());
assertEquals(1, message.getSubjectLanguages().size());
assertTrue(message.getSubjectLanguages().contains(defaultLanguage));
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
/*
// message has no language, first subject no language, second subject default language
control = XMLBuilder.create("message")
.a("from", "romeo@montague.lit/orchard")
@ -612,7 +617,7 @@ public class PacketParserUtilsTest {
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
assertEquals(1, message.getSubjects().size());
assertEquals(0, message.getSubjectLanguages().size());
assertXMLNotEqual(control, message.toXML(null).toString());
assertXMLNotEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has no language, first subject no language, second subject other language
control = XMLBuilder.create("message")
@ -636,7 +641,7 @@ public class PacketParserUtilsTest {
assertEquals(otherLanguage, message.getSubject(otherLanguage));
assertEquals(2, message.getSubjects().size());
assertEquals(1, message.getSubjectLanguages().size());
assertXMLEqual(control, message.toXML(null).toString());
assertXMLEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// message has no language, first subject no language, second subject no language
control = XMLBuilder.create("message")
@ -658,7 +663,8 @@ public class PacketParserUtilsTest {
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
assertEquals(1, message.getSubjects().size());
assertEquals(0, message.getSubjectLanguages().size());
assertXMLNotEqual(control, message.toXML(null).toString());
assertXMLNotEqual(control, message.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
*/
}
@ -671,6 +677,7 @@ public class PacketParserUtilsTest {
@Test(expected = XmlPullParserException.class)
public void invalidMessageBodyContainingTagTest() throws Exception {
String control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -691,6 +698,7 @@ public class PacketParserUtilsTest {
@Test
public void invalidXMLInMessageBody() throws Exception {
String validControl = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
@ -732,12 +740,17 @@ public class PacketParserUtilsTest {
@Test
public void multipleMessageBodiesParsingTest() throws Exception {
String control = XMLBuilder.create("message")
.namespace(StreamOpen.CLIENT_NAMESPACE)
.a("from", "romeo@montague.lit/orchard")
.a("to", "juliet@capulet.lit/balcony")
.a("id", "zid615d9")
.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")
@ -750,7 +763,7 @@ public class PacketParserUtilsTest {
.asString(outputProperties);
Stanza message = PacketParserUtils.parseStanza(control);
XmlUnitUtils.assertSimilar(control, message.toXML(StreamOpen.CLIENT_NAMESPACE));
XmlUnitUtils.assertSimilar(control, message.toXML(null));
}
@Test
@ -760,7 +773,7 @@ public class PacketParserUtilsTest {
Presence presence = PacketParserUtils.parsePresence(PacketParserUtils.getParserFor(stanza));
assertXMLEqual(stanza, presence.toXML(null).toString());
assertXMLEqual(stanza, presence.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
// CHECKSTYLE:ON
}
@ -771,7 +784,7 @@ public class PacketParserUtilsTest {
Presence presence = PacketParserUtils.parsePresence(PacketParserUtils.getParserFor(stanza));
assertXMLEqual(stanza, presence.toXML(null).toString());
assertXMLEqual(stanza, presence.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
assertEquals(Presence.Type.unsubscribed, presence.getType());
// CHECKSTYLE:ON
}
@ -786,7 +799,7 @@ public class PacketParserUtilsTest {
+ "</presence>";
Presence presence = PacketParserUtils.parsePresence(PacketParserUtils.getParserFor(stanza));
assertXMLEqual(stanza, presence.toXML(null).toString());
assertXMLEqual(stanza, presence.toXML(StreamOpen.CLIENT_NAMESPACE).toString());
assertEquals(Presence.Type.unsubscribed, presence.getType());
assertEquals("dnd", presence.getMode().name());
assertEquals("en", presence.getLanguage());