cc.warlock.core.stormfront.xml.StormFrontElement.java Source code

Java tutorial

Introduction

Here is the source code for cc.warlock.core.stormfront.xml.StormFrontElement.java

Source

/**
 * Warlock, the open-source cross-platform game client
 *  
 * Copyright 2008, Warlock LLC, and individual contributors as indicated
 * by the @authors tag. 
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package cc.warlock.core.stormfront.xml;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.commons.lang.StringEscapeUtils;

public class StormFrontElement {

    protected String name;
    protected StormFrontElement parent;
    protected StormFrontAttributeList attributes = new StormFrontAttributeList();
    protected ArrayList<StormFrontElement> elements = new ArrayList<StormFrontElement>();
    protected StringBuffer text = new StringBuffer();

    public StormFrontElement(String name) {
        this.name = name;
    }

    public StormFrontElement(StormFrontElement other, boolean deepCopy) {
        this.name = new String(other.name);
        for (StormFrontAttribute attribute : other.attributes.getList()) {
            attributes.addAttribute(new StormFrontAttribute(attribute));
        }

        if (deepCopy) {
            for (StormFrontElement element : other.elements) {
                addElement(new StormFrontElement(element, deepCopy));
            }
        }

        this.text = other.text == null ? null : new StringBuffer(other.text);
    }

    public void setAttribute(String name, String value) {
        StormFrontAttribute attr = attributes.getAttribute(name);
        if (attr == null) {
            attr = new StormFrontAttribute();
            attributes.addAttribute(attr);
        }

        attr.setName(name);
        attr.setValue(value);
    }

    public void addAttribute(StormFrontAttribute attribute) {
        attributes.addAttribute(attribute);
    }

    public String removeAttribute(StormFrontAttribute attribute) {
        if (attribute != null && attributes.getList().contains(attribute)) {
            attributes.removeAttribute(attribute);
        }
        return null;
    }

    public String removeAttribute(String attributeName) {
        return removeAttribute(attributes.getAttribute(attributeName));
    }

    public String attributeValue(String name) {
        return attributes.getValue(name);
    }

    public StormFrontAttribute attribute(String name) {
        return attributes.getAttribute(name);
    }

    public List<StormFrontAttribute> attributes() {
        return Collections.unmodifiableList(attributes.getList());
    }

    public List<StormFrontElement> elements() {
        return Collections.unmodifiableList(elements);
    }

    public StormFrontElement element(String name) {
        for (StormFrontElement element : elements) {
            if (element.getName().equals(name)) {
                return element;
            }
        }
        return null;
    }

    public void addElement(StormFrontElement element) {
        elements.add(element);
        element.setParent(this);
    }

    public void removeElement(StormFrontElement element) {
        if (elements.remove(element))
            element.setParent(null);
    }

    public void setParent(StormFrontElement parent) {
        this.parent = parent;
    }

    public StormFrontElement getParent() {
        return this.parent;
    }

    public String getName() {
        return this.name;
    }

    public String getText() {
        return StringEscapeUtils.unescapeXml(text.toString());
    }

    public String getTextTrim() {
        StringBuffer textContent = new StringBuffer();
        StringTokenizer tokenizer = new StringTokenizer(getText());

        while (tokenizer.hasMoreTokens()) {
            String str = tokenizer.nextToken();
            textContent.append(str);

            if (tokenizer.hasMoreTokens()) {
                textContent.append(" "); // separator
            }
        }

        return textContent.toString();
    }

    public void appendText(String text) {
        this.text.append(text);
    }

    public void setText(String text) {
        this.text.setLength(0);
        this.text.append(text);
    }

    public String toXML(String prefix, boolean prettyPrint, boolean includeChildren) {
        StringBuffer xml = new StringBuffer();

        xml.append(prefix + "<" + name);
        if (attributes.getList().size() > 0) {
            xml.append(" ");
            for (Iterator<StormFrontAttribute> iter = attributes.getList().iterator(); iter.hasNext();) {
                StormFrontAttribute attribute = iter.next();

                xml.append(attribute.getName());
                xml.append("=");
                xml.append("\"");
                xml.append(StringEscapeUtils.escapeXml(attribute.getValue()));
                xml.append("\"");

                if (iter.hasNext())
                    xml.append(" ");
            }
        }

        boolean hasContent = false;
        if (elements.size() > 0 || getText().length() > 0) {
            hasContent = true;

            xml.append(">");
            if (prettyPrint)
                xml.append("\n");
        }

        if (elements.size() > 0) {
            if (includeChildren) {
                for (StormFrontElement element : elements) {
                    xml.append(element.toXML(prettyPrint ? prefix + "  " : "", prettyPrint, true));
                }
            }
        }
        if (getText().length() > 0) {
            xml.append(StringEscapeUtils.escapeXml(getText()));
        }

        if (hasContent) {
            xml.append(/* FIXME can't do this because it gets passed on as content: prefix +*/ "</" + name + ">");
            if (prettyPrint)
                xml.append("\n");
        } else {
            xml.append("/>");
            if (prettyPrint)
                xml.append("\n");
        }
        return xml.toString();
    }
}