/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.iwave.ext.xml;
import java.util.LinkedList;
import org.apache.commons.lang.text.StrBuilder;
import com.google.common.collect.Lists;
/**
* Simple utility class for building XML strings.
*
* @author jonnymiller
*/
public class XmlStringBuilder {
private StrBuilder sb = new StrBuilder();
private LinkedList<String> elements = Lists.newLinkedList();
private boolean tagOpen = false;
private boolean hasContent = false;
public XmlStringBuilder start(String name) {
closePreviousTag();
elements.push(name);
sb.append("<").append(name);
hasContent = false;
tagOpen = true;
return this;
}
public XmlStringBuilder end() {
if (elements.isEmpty()) {
throw new IllegalStateException("No more elements to end");
}
String name = elements.pop();
if (hasContent) {
sb.append("</").append(name).append(">");
}
else {
sb.append("/>");
}
hasContent = true;
tagOpen = false;
return this;
}
public XmlStringBuilder element(String name, String text) {
return start(name).text(text).end();
}
public XmlStringBuilder element(String name, Object value) {
return element(name, value != null ? value.toString() : "");
}
protected void closePreviousTag() {
if (tagOpen) {
sb.append(">");
hasContent = true;
tagOpen = false;
}
}
public XmlStringBuilder attr(String name, String value) {
if (!tagOpen) {
throw new IllegalStateException("Cannot add attributes after start tag is closed");
}
sb.append(" ").append(name).append("=\"");
XmlUtils.escape(sb, value, true, false);
sb.append("\"");
return this;
}
public XmlStringBuilder text(String text) {
closePreviousTag();
XmlUtils.escape(sb, text, false, false);
hasContent = true;
return this;
}
public String toString() {
return sb.toString();
}
}