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 fcd6b0d72..7a3ac84a9 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 @@ -315,8 +315,8 @@ public final class Message extends Stanza implements TypedCloneable { private Body getMessageBody(String language) { language = determineLanguage(language); - for (Body body : bodies) { - if (language.equals(body.language)) { + for (Body body : getBodies()) { + if (Objects.equals(language, body.language) || (language != null && language.equals(this.language) && body.language == null)) { return body; } } @@ -388,9 +388,11 @@ public final class Message extends Stanza implements TypedCloneable { */ public boolean removeBody(String language) { language = determineLanguage(language); - for (Body body : bodies) { - if (language.equals(body.language)) { - return bodies.remove(body); + for (Body body : getBodies()) { + String bodyLanguage = body.getLanguage(); + if (Objects.equals(bodyLanguage, language)) { + removeExtension(body); + return true; } } return false; @@ -650,9 +652,6 @@ public final class Message extends Stanza implements TypedCloneable { } public Body(String language, String message, BodyElementNamespace namespace) { - if (language == null) { - throw new NullPointerException("Language cannot be null."); - } if (message == null) { throw new NullPointerException("Message cannot be null."); } @@ -662,9 +661,10 @@ public final class Message extends Stanza implements TypedCloneable { } /** - * Returns the language of this message body. + * 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. + * @return the language of this message body or {@code null}. */ public String getLanguage() { return language; @@ -683,7 +683,9 @@ public final class Message extends Stanza implements TypedCloneable { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + this.language.hashCode(); + if (language != null) { + result = prime * result + this.language.hashCode(); + } result = prime * result + this.message.hashCode(); return result; } @@ -701,7 +703,7 @@ public final class Message extends Stanza implements TypedCloneable { } Body other = (Body) obj; // simplified comparison because language and message are always set - return this.language.equals(other.language) && this.message.equals(other.message); + return Objects.equals(this.language, other.language) && this.message.equals(other.message); } @Override @@ -717,7 +719,7 @@ public final class Message extends Stanza implements TypedCloneable { @Override public XmlStringBuilder toXML(String enclosingNamespace) { XmlStringBuilder xml = new XmlStringBuilder(this, enclosingNamespace); - xml.xmllangAttribute(getLanguage()).rightAngleBracket(); + xml.optXmlLangAttribute(getLanguage()).rightAngleBracket(); xml.escape(message); xml.closeElement(getElementName()); return xml; diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java index 53fd25c20..5ace1e8f5 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java @@ -28,11 +28,8 @@ public class BodyElementProvider extends ExtensionElementProvider @Override public Message.Body parse(XmlPullParser parser, int initialDepth) throws Exception { String xmlLang = ParserUtils.getXmlLang(parser); - if (xmlLang == null) { - xmlLang = "en"; - } - String body = parseElementText(parser); + return new Message.Body(xmlLang, body); } }