2014-03-20 14:35:38 +01:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* Copyright 2014 Florian Schmaus
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
package org.jivesoftware.smack.util;
|
|
|
|
|
2014-07-05 11:58:13 +02:00
|
|
|
import org.jivesoftware.smack.packet.Element;
|
2014-09-11 09:49:16 +02:00
|
|
|
import org.jivesoftware.smack.packet.NamedElement;
|
2014-03-21 09:51:52 +01:00
|
|
|
import org.jivesoftware.smack.packet.PacketExtension;
|
|
|
|
|
2014-03-20 14:35:38 +01:00
|
|
|
public class XmlStringBuilder implements Appendable, CharSequence {
|
2014-08-20 21:25:14 +02:00
|
|
|
public static final String RIGHT_ANGLE_BRACKET = Character.toString('>');
|
2014-03-20 14:35:38 +01:00
|
|
|
|
2014-03-21 09:51:52 +01:00
|
|
|
private final LazyStringBuilder sb;
|
2014-03-20 14:35:38 +01:00
|
|
|
|
|
|
|
public XmlStringBuilder() {
|
2014-03-21 09:51:52 +01:00
|
|
|
sb = new LazyStringBuilder();
|
|
|
|
}
|
|
|
|
|
|
|
|
public XmlStringBuilder(PacketExtension pe) {
|
|
|
|
this();
|
|
|
|
prelude(pe);
|
2014-03-20 14:35:38 +01:00
|
|
|
}
|
|
|
|
|
2014-09-11 09:49:16 +02:00
|
|
|
public XmlStringBuilder(NamedElement e) {
|
2014-07-05 11:58:13 +02:00
|
|
|
this();
|
|
|
|
halfOpenElement(e.getElementName());
|
|
|
|
}
|
|
|
|
|
2014-11-07 21:12:01 +01:00
|
|
|
public XmlStringBuilder escapedElement(String name, String escapedContent) {
|
|
|
|
assert escapedContent != null;
|
|
|
|
openElement(name);
|
|
|
|
append(escapedContent);
|
|
|
|
closeElement(name);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-03-20 14:35:38 +01:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param name
|
|
|
|
* @param content
|
2014-03-21 09:51:52 +01:00
|
|
|
* @return the XmlStringBuilder
|
2014-03-20 14:35:38 +01:00
|
|
|
*/
|
|
|
|
public XmlStringBuilder element(String name, String content) {
|
2014-03-21 09:51:52 +01:00
|
|
|
assert content != null;
|
2014-03-20 14:35:38 +01:00
|
|
|
openElement(name);
|
|
|
|
escape(content);
|
|
|
|
closeElement(name);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public XmlStringBuilder element(String name, Enum<?> content) {
|
2014-03-21 09:51:52 +01:00
|
|
|
assert content != null;
|
|
|
|
element(name, content.name());
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-09-05 00:18:48 +02:00
|
|
|
public XmlStringBuilder element(Element element) {
|
|
|
|
assert element != null;
|
|
|
|
return append(element.toXML());
|
|
|
|
}
|
|
|
|
|
2014-03-21 09:51:52 +01:00
|
|
|
public XmlStringBuilder optElement(String name, String content) {
|
|
|
|
if (content != null) {
|
|
|
|
element(name, content);
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-07-14 19:22:02 +02:00
|
|
|
public XmlStringBuilder optElement(Element element) {
|
|
|
|
if (element != null) {
|
|
|
|
append(element.toXML());
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-03-21 09:51:52 +01:00
|
|
|
public XmlStringBuilder optElement(String name, Enum<?> content) {
|
2014-03-20 14:35:38 +01:00
|
|
|
if (content != null) {
|
2014-03-21 09:51:52 +01:00
|
|
|
element(name, content);
|
2014-03-20 14:35:38 +01:00
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-09-13 11:03:40 +02:00
|
|
|
public XmlStringBuilder optIntElement(String name, int value) {
|
|
|
|
if (value >= 0) {
|
|
|
|
element(name, String.valueOf(value));
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-03-20 14:35:38 +01:00
|
|
|
public XmlStringBuilder halfOpenElement(String name) {
|
2014-11-07 21:12:01 +01:00
|
|
|
assert(StringUtils.isNotEmpty(name));
|
2014-03-20 14:35:38 +01:00
|
|
|
sb.append('<').append(name);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-10-11 17:06:20 +02:00
|
|
|
public XmlStringBuilder halfOpenElement(NamedElement namedElement) {
|
|
|
|
return halfOpenElement(namedElement.getElementName());
|
|
|
|
}
|
|
|
|
|
2014-03-20 14:35:38 +01:00
|
|
|
public XmlStringBuilder openElement(String name) {
|
2014-08-20 21:25:14 +02:00
|
|
|
halfOpenElement(name).rightAngleBracket();
|
2014-03-20 14:35:38 +01:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public XmlStringBuilder closeElement(String name) {
|
2014-03-21 09:51:52 +01:00
|
|
|
sb.append("</").append(name);
|
2014-08-20 21:25:14 +02:00
|
|
|
rightAngleBracket();
|
2014-03-20 14:35:38 +01:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-09-11 09:49:16 +02:00
|
|
|
public XmlStringBuilder closeElement(NamedElement e) {
|
2014-07-05 11:58:13 +02:00
|
|
|
closeElement(e.getElementName());
|
2014-03-21 09:51:52 +01:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public XmlStringBuilder closeEmptyElement() {
|
2014-03-20 14:35:38 +01:00
|
|
|
sb.append("/>");
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-08-20 21:25:14 +02:00
|
|
|
/**
|
|
|
|
* Add a right angle bracket '>'
|
|
|
|
*
|
|
|
|
* @return a reference to this object.
|
|
|
|
*/
|
|
|
|
public XmlStringBuilder rightAngleBracket() {
|
|
|
|
sb.append(RIGHT_ANGLE_BRACKET);
|
2014-03-21 09:51:52 +01:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-08-20 21:25:14 +02:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @return a reference to this object
|
|
|
|
* @deprecated use {@link #rightAngleBracket()} instead
|
|
|
|
*/
|
|
|
|
@Deprecated
|
|
|
|
public XmlStringBuilder rightAngelBracket() {
|
|
|
|
return rightAngleBracket();
|
|
|
|
}
|
|
|
|
|
2014-03-20 14:35:38 +01:00
|
|
|
/**
|
|
|
|
* Does nothing if value is null.
|
|
|
|
*
|
|
|
|
* @param name
|
|
|
|
* @param value
|
2014-03-21 09:51:52 +01:00
|
|
|
* @return the XmlStringBuilder
|
2014-03-20 14:35:38 +01:00
|
|
|
*/
|
|
|
|
public XmlStringBuilder attribute(String name, String value) {
|
2014-03-21 09:51:52 +01:00
|
|
|
assert value != null;
|
2014-03-20 14:35:38 +01:00
|
|
|
sb.append(' ').append(name).append("='");
|
|
|
|
escape(value);
|
|
|
|
sb.append('\'');
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-03-21 09:51:52 +01:00
|
|
|
public XmlStringBuilder attribute(String name, Enum<?> value) {
|
|
|
|
assert value != null;
|
|
|
|
attribute(name, value.name());
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-09-05 00:18:48 +02:00
|
|
|
public XmlStringBuilder attribute(String name, int value) {
|
|
|
|
assert name != null;
|
|
|
|
return attribute(name, String.valueOf(value));
|
|
|
|
}
|
|
|
|
|
2014-03-21 09:51:52 +01:00
|
|
|
public XmlStringBuilder optAttribute(String name, String value) {
|
|
|
|
if (value != null) {
|
|
|
|
attribute(name, value);
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public XmlStringBuilder optAttribute(String name, Enum<?> value) {
|
|
|
|
if (value != null) {
|
|
|
|
attribute(name, value.name());
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-07-14 19:22:02 +02:00
|
|
|
/**
|
|
|
|
* Add the given attribute if value => 0
|
|
|
|
*
|
|
|
|
* @param name
|
|
|
|
* @param value
|
|
|
|
* @return a reference to this object
|
|
|
|
*/
|
|
|
|
public XmlStringBuilder optIntAttribute(String name, int value) {
|
|
|
|
if (value >= 0) {
|
|
|
|
attribute(name, Integer.toString(value));
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-07-16 11:46:30 +02:00
|
|
|
/**
|
|
|
|
* Add the given attribute if value => 0
|
|
|
|
*
|
|
|
|
* @param name
|
|
|
|
* @param value
|
|
|
|
* @return a reference to this object
|
|
|
|
*/
|
|
|
|
public XmlStringBuilder optLongAttribute(String name, Long value) {
|
|
|
|
if (value >= 0) {
|
|
|
|
attribute(name, Long.toString(value));
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-10-11 17:06:20 +02:00
|
|
|
public XmlStringBuilder optBooleanAttribute(String name, boolean bool) {
|
|
|
|
if (bool) {
|
|
|
|
sb.append(' ').append(name).append("='true'");
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-03-20 14:35:38 +01:00
|
|
|
public XmlStringBuilder xmlnsAttribute(String value) {
|
2014-03-21 09:51:52 +01:00
|
|
|
optAttribute("xmlns", value);
|
2014-03-20 14:35:38 +01:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-03-21 09:51:52 +01:00
|
|
|
public XmlStringBuilder xmllangAttribute(String value) {
|
|
|
|
optAttribute("xml:lang", value);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-03-20 14:35:38 +01:00
|
|
|
public XmlStringBuilder escape(String text) {
|
2014-03-21 09:51:52 +01:00
|
|
|
assert text != null;
|
2014-03-20 14:35:38 +01:00
|
|
|
sb.append(StringUtils.escapeForXML(text));
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-03-21 09:51:52 +01:00
|
|
|
public XmlStringBuilder prelude(PacketExtension pe) {
|
2014-11-07 21:12:01 +01:00
|
|
|
return prelude(pe.getElementName(), pe.getNamespace());
|
|
|
|
}
|
|
|
|
|
|
|
|
public XmlStringBuilder prelude(String elementName, String namespace) {
|
|
|
|
halfOpenElement(elementName);
|
|
|
|
xmlnsAttribute(namespace);
|
2014-03-21 09:51:52 +01:00
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public XmlStringBuilder optAppend(CharSequence csq) {
|
|
|
|
if (csq != null) {
|
|
|
|
append(csq);
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-11-07 21:12:01 +01:00
|
|
|
public XmlStringBuilder optAppend(Element element) {
|
|
|
|
if (element != null) {
|
|
|
|
append(element.toXML());
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-03-21 09:51:52 +01:00
|
|
|
public XmlStringBuilder append(XmlStringBuilder xsb) {
|
|
|
|
assert xsb != null;
|
|
|
|
sb.append(xsb.sb);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-09-12 11:03:12 +02:00
|
|
|
public XmlStringBuilder emptyElement(Enum<?> element) {
|
|
|
|
return emptyElement(element.name());
|
|
|
|
}
|
|
|
|
|
2014-06-19 11:48:01 +02:00
|
|
|
public XmlStringBuilder emptyElement(String element) {
|
|
|
|
halfOpenElement(element);
|
|
|
|
return closeEmptyElement();
|
|
|
|
}
|
|
|
|
|
|
|
|
public XmlStringBuilder condEmptyElement(boolean condition, String element) {
|
|
|
|
if (condition) {
|
|
|
|
emptyElement(element);
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public XmlStringBuilder condAttribute(boolean condition, String name, String value) {
|
|
|
|
if (condition) {
|
|
|
|
attribute(name, value);
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2014-03-20 14:35:38 +01:00
|
|
|
@Override
|
|
|
|
public XmlStringBuilder append(CharSequence csq) {
|
2014-03-21 09:51:52 +01:00
|
|
|
assert csq != null;
|
2014-03-20 14:35:38 +01:00
|
|
|
sb.append(csq);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public XmlStringBuilder append(CharSequence csq, int start, int end) {
|
2014-03-21 09:51:52 +01:00
|
|
|
assert csq != null;
|
2014-03-20 14:35:38 +01:00
|
|
|
sb.append(csq, start, end);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public XmlStringBuilder append(char c) {
|
|
|
|
sb.append(c);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int length() {
|
|
|
|
return sb.length();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public char charAt(int index) {
|
|
|
|
return sb.charAt(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public CharSequence subSequence(int start, int end) {
|
|
|
|
return sb.subSequence(start, end);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString() {
|
|
|
|
return sb.toString();
|
|
|
|
}
|
2014-06-19 11:48:01 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean equals(Object other) {
|
2014-08-25 13:43:44 +02:00
|
|
|
if (!(other instanceof CharSequence)) {
|
2014-06-19 11:48:01 +02:00
|
|
|
return false;
|
|
|
|
}
|
2014-08-25 13:43:44 +02:00
|
|
|
CharSequence otherCharSequenceBuilder = (CharSequence) other;
|
|
|
|
return toString().equals(otherCharSequenceBuilder.toString());
|
2014-06-19 11:48:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int hashCode() {
|
|
|
|
return toString().hashCode();
|
|
|
|
}
|
2014-03-20 14:35:38 +01:00
|
|
|
}
|