Use XmlStringBuilder in RosterPacket and XMPPError

This commit is contained in:
Florian Schmaus 2014-07-07 12:29:59 +02:00
parent ed7dc1800d
commit bdf9a75c4f
4 changed files with 49 additions and 38 deletions

View File

@ -36,6 +36,9 @@ import java.util.concurrent.atomic.AtomicLong;
*/ */
public abstract class Packet { public abstract class Packet {
public static final String TEXT = "text";
public static final String ITEM = "item";
protected static final String DEFAULT_LANGUAGE = protected static final String DEFAULT_LANGUAGE =
java.util.Locale.getDefault().getLanguage().toLowerCase(Locale.US); java.util.Locale.getDefault().getLanguage().toLowerCase(Locale.US);

View File

@ -17,10 +17,14 @@
package org.jivesoftware.smack.packet; package org.jivesoftware.smack.packet;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smack.util.XmlStringBuilder; import org.jivesoftware.smack.util.XmlStringBuilder;
import java.util.*; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CopyOnWriteArraySet;
/** /**
@ -66,7 +70,8 @@ public class RosterPacket extends IQ {
} }
} }
public CharSequence getChildElementXML() { @Override
public XmlStringBuilder getChildElementXML() {
XmlStringBuilder buf = new XmlStringBuilder(); XmlStringBuilder buf = new XmlStringBuilder();
buf.halfOpenElement("query"); buf.halfOpenElement("query");
buf.xmlnsAttribute("jabber:iq:roster"); buf.xmlnsAttribute("jabber:iq:roster");
@ -96,6 +101,8 @@ public class RosterPacket extends IQ {
*/ */
public static class Item { public static class Item {
public static final String GROUP = "group";
private String user; private String user;
private String name; private String name;
private ItemType itemType; private ItemType itemType;
@ -207,24 +214,19 @@ public class RosterPacket extends IQ {
groupNames.remove(groupName); groupNames.remove(groupName);
} }
public String toXML() { public XmlStringBuilder toXML() {
StringBuilder buf = new StringBuilder(); XmlStringBuilder xml = new XmlStringBuilder();
buf.append("<item jid=\"").append(StringUtils.escapeForXML(user)).append("\""); xml.halfOpenElement(Packet.ITEM).attribute("jid", user);
if (name != null) { xml.optAttribute("name", name);
buf.append(" name=\"").append(StringUtils.escapeForXML(name)).append("\""); xml.optAttribute("subscription", itemType);
} xml.optAttribute("ask", itemStatus);
if (itemType != null) { xml.rightAngelBracket();
buf.append(" subscription=\"").append(itemType).append("\"");
}
if (itemStatus != null) {
buf.append(" ask=\"").append(itemStatus).append("\"");
}
buf.append(">");
for (String groupName : groupNames) { for (String groupName : groupNames) {
buf.append("<group>").append(StringUtils.escapeForXML(groupName)).append("</group>"); xml.openElement(GROUP).escape(groupName).closeElement(GROUP);
} }
buf.append("</item>"); xml.closeElement(Packet.ITEM);
return buf.toString(); return xml;
} }
@Override @Override

View File

@ -23,6 +23,8 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import org.jivesoftware.smack.util.XmlStringBuilder;
/** /**
* Represents a XMPP error sub-packet. Typically, a server responds to a request that has * Represents a XMPP error sub-packet. Typically, a server responds to a request that has
* problems by sending the packet back and including an error packet. Each error has a type, * problems by sending the packet back and including an error packet. Each error has a type,
@ -60,6 +62,9 @@ import java.util.Map;
*/ */
public class XMPPError { public class XMPPError {
public static final String NAMESPACE = "urn:ietf:params:xml:ns:xmpp-stanzas";
public static final String ERROR = "error";
private final Type type; private final Type type;
private final String condition; private final String condition;
private String message; private String message;
@ -153,29 +158,30 @@ public class XMPPError {
* *
* @return the error as XML. * @return the error as XML.
*/ */
public CharSequence toXML() { public XmlStringBuilder toXML() {
StringBuilder buf = new StringBuilder(); XmlStringBuilder xml = new XmlStringBuilder();
buf.append("<error"); xml.halfOpenElement(ERROR);
if (type != null) { xml.optAttribute("type", type.name().toLowerCase(Locale.US));
buf.append(" type=\""); xml.rightAngelBracket();
buf.append(type.name().toLowerCase(Locale.US));
buf.append("\"");
}
buf.append(">");
if (condition != null) { if (condition != null) {
buf.append("<").append(condition); xml.halfOpenElement(condition);
buf.append(" xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>"); xml.xmlnsAttribute(NAMESPACE);
xml.closeEmptyElement();
} }
if (message != null) { if (message != null) {
buf.append("<text xml:lang=\"en\" xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\">"); xml.halfOpenElement(Packet.TEXT);
buf.append(message); xml.xmllangAttribute("en");
buf.append("</text>"); xml.xmlnsAttribute(NAMESPACE);
xml.rightAngelBracket();
xml.escape(message);
xml.closeElement(Packet.TEXT);
} }
for (PacketExtension element : this.getExtensions()) { for (PacketExtension element : this.getExtensions()) {
buf.append(element.toXML()); xml.append(element.toXML());
} }
buf.append("</error>"); xml.closeElement(ERROR);
return buf.toString(); return xml;
} }
public String toString() { public String toString() {

View File

@ -779,7 +779,7 @@ public class PacketParserUtils {
String namespace = parser.getNamespace(); String namespace = parser.getNamespace();
if (StreamError.NAMESPACE.equals(namespace)) { if (StreamError.NAMESPACE.equals(namespace)) {
String name = parser.getName(); String name = parser.getName();
if (name.equals("text") && !parser.isEmptyElementTag()) { if (name.equals(Packet.TEXT) && !parser.isEmptyElementTag()) {
parser.next(); parser.next();
text = parser.getText(); text = parser.getText();
} }
@ -822,7 +822,7 @@ public class PacketParserUtils {
while (!done) { while (!done) {
int eventType = parser.next(); int eventType = parser.next();
if (eventType == XmlPullParser.START_TAG) { if (eventType == XmlPullParser.START_TAG) {
if (parser.getName().equals("text")) { if (parser.getName().equals(Packet.TEXT)) {
message = parser.nextText(); message = parser.nextText();
} }
else { else {