mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-26 16:22:06 +01:00
add support for localized Message subjects (fixes SMACK-310)
git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@11825 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
parent
cb5310c984
commit
7a3818783b
3 changed files with 492 additions and 12 deletions
|
@ -51,10 +51,10 @@ import java.util.*;
|
||||||
public class Message extends Packet {
|
public class Message extends Packet {
|
||||||
|
|
||||||
private Type type = Type.normal;
|
private Type type = Type.normal;
|
||||||
private String subject = null;
|
|
||||||
private String thread = null;
|
private String thread = null;
|
||||||
private String language;
|
private String language;
|
||||||
|
|
||||||
|
private final Set<Subject> subjects = new HashSet<Subject>();
|
||||||
private final Set<Body> bodies = new HashSet<Body>();
|
private final Set<Body> bodies = new HashSet<Body>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -107,13 +107,50 @@ public class Message extends Packet {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the subject of the message, or null if the subject has not been set.
|
* Returns the default subject of the message, or null if the subject has not been set.
|
||||||
* The subject is a short description of message contents.
|
* The subject is a short description of message contents.
|
||||||
|
* <p>
|
||||||
|
* The default subject of a message is the subject that corresponds to the message's language.
|
||||||
|
* (see {@link #getLanguage()}) or if no language is set to the applications default
|
||||||
|
* language (see {@link Packet#getDefaultLanguage()}).
|
||||||
*
|
*
|
||||||
* @return the subject of the message.
|
* @return the subject of the message.
|
||||||
*/
|
*/
|
||||||
public String getSubject() {
|
public String getSubject() {
|
||||||
return subject;
|
return getSubject(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the subject corresponding to the language. If the language is null, the method result
|
||||||
|
* will be the same as {@link #getSubject()}. Null will be returned if the language does not have
|
||||||
|
* a corresponding subject.
|
||||||
|
*
|
||||||
|
* @param language the language of the subject to return.
|
||||||
|
* @return the subject related to the passed in language.
|
||||||
|
*/
|
||||||
|
public String getSubject(String language) {
|
||||||
|
Subject subject = getMessageSubject(language);
|
||||||
|
return subject == null ? null : subject.subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Subject getMessageSubject(String language) {
|
||||||
|
language = determineLanguage(language);
|
||||||
|
for (Subject subject : subjects) {
|
||||||
|
if (language.equals(subject.language)) {
|
||||||
|
return subject;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a set of all subjects in this Message, including the default message subject accessible
|
||||||
|
* from {@link #getSubject()}.
|
||||||
|
*
|
||||||
|
* @return a collection of all subjects in this message.
|
||||||
|
*/
|
||||||
|
public Collection<Subject> getSubjects() {
|
||||||
|
return Collections.unmodifiableCollection(subjects);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -123,7 +160,68 @@ public class Message extends Packet {
|
||||||
* @param subject the subject of the message.
|
* @param subject the subject of the message.
|
||||||
*/
|
*/
|
||||||
public void setSubject(String subject) {
|
public void setSubject(String subject) {
|
||||||
this.subject = subject;
|
if (subject == null) {
|
||||||
|
removeSubject(""); // use empty string because #removeSubject(null) is ambiguous
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
addSubject(null, subject);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a subject with a corresponding language.
|
||||||
|
*
|
||||||
|
* @param language the language of the subject being added.
|
||||||
|
* @param subject the subject being added to the message.
|
||||||
|
* @return the new {@link org.jivesoftware.smack.packet.Message.Subject}
|
||||||
|
* @throws NullPointerException if the subject is null, a null pointer exception is thrown
|
||||||
|
*/
|
||||||
|
public Subject addSubject(String language, String subject) {
|
||||||
|
language = determineLanguage(language);
|
||||||
|
Subject messageSubject = new Subject(language, subject);
|
||||||
|
subjects.add(messageSubject);
|
||||||
|
return messageSubject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the subject with the given language from the message.
|
||||||
|
*
|
||||||
|
* @param language the language of the subject which is to be removed
|
||||||
|
* @return true if a subject was removed and false if it was not.
|
||||||
|
*/
|
||||||
|
public boolean removeSubject(String language) {
|
||||||
|
language = determineLanguage(language);
|
||||||
|
for (Subject subject : subjects) {
|
||||||
|
if (language.equals(subject.language)) {
|
||||||
|
return subjects.remove(subject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the subject from the message and returns true if the subject was removed.
|
||||||
|
*
|
||||||
|
* @param subject the subject being removed from the message.
|
||||||
|
* @return true if the subject was successfully removed and false if it was not.
|
||||||
|
*/
|
||||||
|
public boolean removeSubject(Subject subject) {
|
||||||
|
return subjects.remove(subject);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all the languages being used for the subjects, not including the default subject.
|
||||||
|
*
|
||||||
|
* @return the languages being used for the subjects.
|
||||||
|
*/
|
||||||
|
public Collection<String> getSubjectLanguages() {
|
||||||
|
Subject defaultSubject = getMessageSubject(null);
|
||||||
|
List<String> languages = new ArrayList<String>();
|
||||||
|
for (Subject subject : subjects) {
|
||||||
|
if (!subject.equals(defaultSubject)) {
|
||||||
|
languages.add(subject.language);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Collections.unmodifiableCollection(languages);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -328,8 +426,19 @@ public class Message extends Packet {
|
||||||
buf.append(" type=\"").append(type).append("\"");
|
buf.append(" type=\"").append(type).append("\"");
|
||||||
}
|
}
|
||||||
buf.append(">");
|
buf.append(">");
|
||||||
if (subject != null) {
|
// Add the subject in the default language
|
||||||
buf.append("<subject>").append(StringUtils.escapeForXML(subject)).append("</subject>");
|
Subject defaultSubject = getMessageSubject(null);
|
||||||
|
if (defaultSubject != null) {
|
||||||
|
buf.append("<subject>").append(StringUtils.escapeForXML(defaultSubject.subject)).append("</subject>");
|
||||||
|
}
|
||||||
|
// Add the subject in other languages
|
||||||
|
for (Subject subject : getSubjects()) {
|
||||||
|
// Skip the default language
|
||||||
|
if(subject.equals(defaultSubject))
|
||||||
|
continue;
|
||||||
|
buf.append("<subject xml:lang=\"").append(subject.language).append("\">");
|
||||||
|
buf.append(StringUtils.escapeForXML(subject.subject));
|
||||||
|
buf.append("</subject>");
|
||||||
}
|
}
|
||||||
// Add the body in the default language
|
// Add the body in the default language
|
||||||
Body defaultBody = getMessageBody(null);
|
Body defaultBody = getMessageBody(null);
|
||||||
|
@ -375,7 +484,7 @@ public class Message extends Packet {
|
||||||
if (language != null ? !language.equals(message.language) : message.language != null) {
|
if (language != null ? !language.equals(message.language) : message.language != null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (subject != null ? !subject.equals(message.subject) : message.subject != null) {
|
if (subjects.size() != message.subjects.size() || !subjects.containsAll(message.subjects)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (thread != null ? !thread.equals(message.thread) : message.thread != null) {
|
if (thread != null ? !thread.equals(message.thread) : message.thread != null) {
|
||||||
|
@ -388,13 +497,76 @@ public class Message extends Packet {
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int result;
|
int result;
|
||||||
result = (type != null ? type.hashCode() : 0);
|
result = (type != null ? type.hashCode() : 0);
|
||||||
result = 31 * result + (subject != null ? subject.hashCode() : 0);
|
result = 31 * result + subjects.hashCode();
|
||||||
result = 31 * result + (thread != null ? thread.hashCode() : 0);
|
result = 31 * result + (thread != null ? thread.hashCode() : 0);
|
||||||
result = 31 * result + (language != null ? language.hashCode() : 0);
|
result = 31 * result + (language != null ? language.hashCode() : 0);
|
||||||
result = 31 * result + bodies.hashCode();
|
result = 31 * result + bodies.hashCode();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a message subject, its language and the content of the subject.
|
||||||
|
*/
|
||||||
|
public static class Subject {
|
||||||
|
|
||||||
|
private String subject;
|
||||||
|
private String language;
|
||||||
|
|
||||||
|
private Subject(String language, String subject) {
|
||||||
|
if (language == null) {
|
||||||
|
throw new NullPointerException("Language cannot be null.");
|
||||||
|
}
|
||||||
|
if (subject == null) {
|
||||||
|
throw new NullPointerException("Subject cannot be null.");
|
||||||
|
}
|
||||||
|
this.language = language;
|
||||||
|
this.subject = subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the language of this message subject.
|
||||||
|
*
|
||||||
|
* @return the language of this message subject.
|
||||||
|
*/
|
||||||
|
public String getLanguage() {
|
||||||
|
return language;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the subject content.
|
||||||
|
*
|
||||||
|
* @return the content of the subject.
|
||||||
|
*/
|
||||||
|
public String getSubject() {
|
||||||
|
return subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + this.language.hashCode();
|
||||||
|
result = prime * result + this.subject.hashCode();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (obj == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (getClass() != obj.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Subject other = (Subject) obj;
|
||||||
|
// simplified comparison because language and subject are always set
|
||||||
|
return this.language.equals(other.language) && this.subject.equals(other.subject);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a message body, its language and the content of the message.
|
* Represents a message body, its language and the content of the message.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -83,7 +83,6 @@ public class PacketParserUtils {
|
||||||
// are only read once. This is because it's possible for the names to appear
|
// are only read once. This is because it's possible for the names to appear
|
||||||
// in arbitrary sub-elements.
|
// in arbitrary sub-elements.
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
String subject = null;
|
|
||||||
String thread = null;
|
String thread = null;
|
||||||
Map<String, Object> properties = null;
|
Map<String, Object> properties = null;
|
||||||
while (!done) {
|
while (!done) {
|
||||||
|
@ -92,8 +91,15 @@ public class PacketParserUtils {
|
||||||
String elementName = parser.getName();
|
String elementName = parser.getName();
|
||||||
String namespace = parser.getNamespace();
|
String namespace = parser.getNamespace();
|
||||||
if (elementName.equals("subject")) {
|
if (elementName.equals("subject")) {
|
||||||
if (subject == null) {
|
String xmlLang = getLanguageAttribute(parser);
|
||||||
subject = parser.nextText();
|
if (xmlLang == null) {
|
||||||
|
xmlLang = defaultLanguage;
|
||||||
|
}
|
||||||
|
|
||||||
|
String subject = parseContent(parser);
|
||||||
|
|
||||||
|
if (message.getSubject(xmlLang) == null) {
|
||||||
|
message.addSubject(xmlLang, subject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (elementName.equals("body")) {
|
else if (elementName.equals("body")) {
|
||||||
|
@ -133,7 +139,7 @@ public class PacketParserUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
message.setSubject(subject);
|
|
||||||
message.setThread(thread);
|
message.setThread(thread);
|
||||||
// Set packet properties.
|
// Set packet properties.
|
||||||
if (properties != null) {
|
if (properties != null) {
|
||||||
|
|
|
@ -185,6 +185,155 @@ public class PacketParserUtilsTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void singleMessageSubjectTest() throws Exception {
|
||||||
|
String defaultLanguage = Packet.getDefaultLanguage();
|
||||||
|
String otherLanguage = determineNonDefaultLanguage();
|
||||||
|
|
||||||
|
String control;
|
||||||
|
|
||||||
|
// message has default language, subject has no 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("subject")
|
||||||
|
.t(defaultLanguage)
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
Message message = (Message) PacketParserUtils
|
||||||
|
.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertEquals(defaultLanguage, message.getSubject());
|
||||||
|
assertTrue(message.getSubjectLanguages().isEmpty());
|
||||||
|
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
|
||||||
|
assertNull(message.getSubject(otherLanguage));
|
||||||
|
assertXMLEqual(control, message.toXML());
|
||||||
|
|
||||||
|
// message has non-default language, subject has no 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", otherLanguage)
|
||||||
|
.e("subject")
|
||||||
|
.t(otherLanguage)
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertEquals(otherLanguage, message.getSubject());
|
||||||
|
assertTrue(message.getSubjectLanguages().isEmpty());
|
||||||
|
assertEquals(otherLanguage, message.getSubject(otherLanguage));
|
||||||
|
assertNull(message.getSubject(defaultLanguage));
|
||||||
|
assertXMLEqual(control, message.toXML());
|
||||||
|
|
||||||
|
// message has no language, subject has 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("subject")
|
||||||
|
.t(defaultLanguage)
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertEquals(defaultLanguage, message.getSubject());
|
||||||
|
assertTrue(message.getSubjectLanguages().isEmpty());
|
||||||
|
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
|
||||||
|
assertNull(message.getSubject(otherLanguage));
|
||||||
|
assertXMLEqual(control, message.toXML());
|
||||||
|
|
||||||
|
// message has no language, subject has default language
|
||||||
|
control = XMLBuilder.create("message")
|
||||||
|
.a("from", "romeo@montague.lit/orchard")
|
||||||
|
.a("to", "juliet@capulet.lit/balcony")
|
||||||
|
.a("id", "zid615d9")
|
||||||
|
.a("type", "chat")
|
||||||
|
.e("subject")
|
||||||
|
.a("xml:lang", defaultLanguage)
|
||||||
|
.t(defaultLanguage)
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertEquals(defaultLanguage, message.getSubject());
|
||||||
|
assertTrue(message.getSubjectLanguages().isEmpty());
|
||||||
|
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
|
||||||
|
assertNull(message.getSubject(otherLanguage));
|
||||||
|
|
||||||
|
// subject attribute xml:lang is unnecessary
|
||||||
|
assertXMLNotEqual(control, message.toXML());
|
||||||
|
|
||||||
|
// message has no language, subject has non-default language
|
||||||
|
control = XMLBuilder.create("message")
|
||||||
|
.a("from", "romeo@montague.lit/orchard")
|
||||||
|
.a("to", "juliet@capulet.lit/balcony")
|
||||||
|
.a("id", "zid615d9")
|
||||||
|
.a("type", "chat")
|
||||||
|
.e("subject")
|
||||||
|
.a("xml:lang", otherLanguage)
|
||||||
|
.t(otherLanguage)
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertNull(message.getSubject());
|
||||||
|
assertFalse(message.getSubjectLanguages().isEmpty());
|
||||||
|
assertTrue(message.getSubjectLanguages().contains(otherLanguage));
|
||||||
|
assertEquals(otherLanguage, message.getSubject(otherLanguage));
|
||||||
|
assertNull(message.getSubject(defaultLanguage));
|
||||||
|
assertXMLEqual(control, message.toXML());
|
||||||
|
|
||||||
|
// message has default language, subject has non-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("subject")
|
||||||
|
.a("xml:lang", otherLanguage)
|
||||||
|
.t(otherLanguage)
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertNull(message.getSubject());
|
||||||
|
assertFalse(message.getSubjectLanguages().isEmpty());
|
||||||
|
assertTrue(message.getSubjectLanguages().contains(otherLanguage));
|
||||||
|
assertEquals(otherLanguage, message.getSubject(otherLanguage));
|
||||||
|
assertNull(message.getSubject(defaultLanguage));
|
||||||
|
assertXMLEqual(control, message.toXML());
|
||||||
|
|
||||||
|
// message has non-default language, subject has 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", otherLanguage)
|
||||||
|
.e("subject")
|
||||||
|
.a("xml:lang", defaultLanguage)
|
||||||
|
.t(defaultLanguage)
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertNull(message.getSubject());
|
||||||
|
assertFalse(message.getSubjectLanguages().isEmpty());
|
||||||
|
assertTrue(message.getSubjectLanguages().contains(defaultLanguage));
|
||||||
|
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
|
||||||
|
assertNull(message.getSubject(otherLanguage));
|
||||||
|
assertXMLEqual(control, message.toXML());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void multipleMessageBodiesTest() throws Exception {
|
public void multipleMessageBodiesTest() throws Exception {
|
||||||
String defaultLanguage = Packet.getDefaultLanguage();
|
String defaultLanguage = Packet.getDefaultLanguage();
|
||||||
|
@ -338,6 +487,159 @@ public class PacketParserUtilsTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void multipleMessageSubjectsTest() throws Exception {
|
||||||
|
String defaultLanguage = Packet.getDefaultLanguage();
|
||||||
|
String otherLanguage = determineNonDefaultLanguage();
|
||||||
|
|
||||||
|
String control;
|
||||||
|
Message message;
|
||||||
|
|
||||||
|
// message has default language, first subject no language, second subject other 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("subject")
|
||||||
|
.t(defaultLanguage)
|
||||||
|
.up()
|
||||||
|
.e("subject")
|
||||||
|
.a("xml:lang", otherLanguage)
|
||||||
|
.t(otherLanguage)
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils
|
||||||
|
.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertEquals(defaultLanguage, message.getSubject());
|
||||||
|
assertEquals(otherLanguage, message.getSubject(otherLanguage));
|
||||||
|
assertEquals(2, message.getSubjects().size());
|
||||||
|
assertEquals(1, message.getSubjectLanguages().size());
|
||||||
|
assertTrue(message.getSubjectLanguages().contains(otherLanguage));
|
||||||
|
assertXMLEqual(control, message.toXML());
|
||||||
|
|
||||||
|
// message has default language, first subject no language, second subject 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("subject")
|
||||||
|
.t(defaultLanguage)
|
||||||
|
.up()
|
||||||
|
.e("subject")
|
||||||
|
.a("xml:lang", defaultLanguage)
|
||||||
|
.t(defaultLanguage + "2")
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils
|
||||||
|
.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertEquals(defaultLanguage, message.getSubject());
|
||||||
|
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
|
||||||
|
assertEquals(1, message.getSubjects().size());
|
||||||
|
assertEquals(0, message.getSubjectLanguages().size());
|
||||||
|
assertXMLNotEqual(control, message.toXML());
|
||||||
|
|
||||||
|
// message has non-default language, first subject no language, second subject 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", otherLanguage)
|
||||||
|
.e("subject")
|
||||||
|
.t(otherLanguage)
|
||||||
|
.up()
|
||||||
|
.e("subject")
|
||||||
|
.a("xml:lang", defaultLanguage)
|
||||||
|
.t(defaultLanguage)
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils
|
||||||
|
.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertEquals(otherLanguage, message.getSubject());
|
||||||
|
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
|
||||||
|
assertEquals(2, message.getSubjects().size());
|
||||||
|
assertEquals(1, message.getSubjectLanguages().size());
|
||||||
|
assertTrue(message.getSubjectLanguages().contains(defaultLanguage));
|
||||||
|
assertXMLEqual(control, message.toXML());
|
||||||
|
|
||||||
|
// message has no language, first subject no language, second subject default language
|
||||||
|
control = XMLBuilder.create("message")
|
||||||
|
.a("from", "romeo@montague.lit/orchard")
|
||||||
|
.a("to", "juliet@capulet.lit/balcony")
|
||||||
|
.a("id", "zid615d9")
|
||||||
|
.a("type", "chat")
|
||||||
|
.e("subject")
|
||||||
|
.t(defaultLanguage)
|
||||||
|
.up()
|
||||||
|
.e("subject")
|
||||||
|
.a("xml:lang", defaultLanguage)
|
||||||
|
.t(defaultLanguage + "2")
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils
|
||||||
|
.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertEquals(defaultLanguage, message.getSubject());
|
||||||
|
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
|
||||||
|
assertEquals(1, message.getSubjects().size());
|
||||||
|
assertEquals(0, message.getSubjectLanguages().size());
|
||||||
|
assertXMLNotEqual(control, message.toXML());
|
||||||
|
|
||||||
|
// message has no language, first subject no language, second subject other language
|
||||||
|
control = XMLBuilder.create("message")
|
||||||
|
.a("from", "romeo@montague.lit/orchard")
|
||||||
|
.a("to", "juliet@capulet.lit/balcony")
|
||||||
|
.a("id", "zid615d9")
|
||||||
|
.a("type", "chat")
|
||||||
|
.e("subject")
|
||||||
|
.t(defaultLanguage)
|
||||||
|
.up()
|
||||||
|
.e("subject")
|
||||||
|
.a("xml:lang", otherLanguage)
|
||||||
|
.t(otherLanguage)
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils
|
||||||
|
.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertEquals(defaultLanguage, message.getSubject());
|
||||||
|
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
|
||||||
|
assertEquals(otherLanguage, message.getSubject(otherLanguage));
|
||||||
|
assertEquals(2, message.getSubjects().size());
|
||||||
|
assertEquals(1, message.getSubjectLanguages().size());
|
||||||
|
assertXMLEqual(control, message.toXML());
|
||||||
|
|
||||||
|
// message has no language, first subject no language, second subject 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("subject")
|
||||||
|
.t(defaultLanguage)
|
||||||
|
.up()
|
||||||
|
.e("subject")
|
||||||
|
.t(otherLanguage)
|
||||||
|
.asString(outputProperties);
|
||||||
|
|
||||||
|
message = (Message) PacketParserUtils
|
||||||
|
.parseMessage(getParser(control));
|
||||||
|
|
||||||
|
assertEquals(defaultLanguage, message.getSubject());
|
||||||
|
assertEquals(defaultLanguage, message.getSubject(defaultLanguage));
|
||||||
|
assertEquals(1, message.getSubjects().size());
|
||||||
|
assertEquals(0, message.getSubjectLanguages().size());
|
||||||
|
assertXMLNotEqual(control, message.toXML());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void invalidMessageBodyContainingTagTest() throws Exception {
|
public void invalidMessageBodyContainingTagTest() throws Exception {
|
||||||
String control = XMLBuilder.create("message")
|
String control = XMLBuilder.create("message")
|
||||||
|
|
Loading…
Reference in a new issue