cc.warlock.core.configuration.TreeConfigurationProvider.java Source code

Java tutorial

Introduction

Here is the source code for cc.warlock.core.configuration.TreeConfigurationProvider.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.configuration;

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

import org.dom4j.Element;

@SuppressWarnings("unchecked")
public abstract class TreeConfigurationProvider implements IConfigurationProvider {

    protected TreeConfigurationProvider parentProvider = null;
    protected ArrayList<IConfigurationProvider> childProviders = new ArrayList<IConfigurationProvider>();
    protected ArrayList<Element> unhandledElements = new ArrayList<Element>();
    protected String elementName;
    protected boolean handleChildren = false;

    public TreeConfigurationProvider(String elementName) {
        this.elementName = elementName;
    }

    protected void setHandleChildren(boolean handleChildren) {
        this.handleChildren = handleChildren;
    }

    public void addChildProvider(IConfigurationProvider provider) {
        childProviders.add(provider);

        if (provider instanceof TreeConfigurationProvider) {
            ((TreeConfigurationProvider) provider).parentProvider = this;
        }

        parseUnhandledElements();
    }

    protected void parseUnhandledElements() {
        if (handleChildren) {
            for (Iterator<Element> iter = unhandledElements.iterator(); iter.hasNext();) {
                Element element = iter.next();
                for (IConfigurationProvider provider : childProviders) {
                    if (provider.supportsElement(element)) {
                        provider.parseElement(element);
                        iter.remove();
                    }
                }
            }
        }
    }

    protected Element element;

    public void parseElement(Element element) {
        this.element = element;

        parseData();

        for (Element subElement : (List<Element>) element.elements()) {
            if (handleChildren) {
                unhandledElements.add(subElement);

                parseUnhandledElements();
            } else {
                parseChild(subElement);
            }
        }
    }

    /**
     * Extenders should override this method if they intend to handle their own child nodes
     * @param child a child element
     */
    protected void parseChild(Element child) {
    }

    protected static boolean booleanValue(Element element, String attr) {
        return Boolean.parseBoolean(element.attributeValue(attr));
    }

    protected boolean booleanValue(String attr) {
        return booleanValue(element, attr);
    }

    protected static int intValue(Element element, String attr) {
        return Integer.parseInt(element.attributeValue(attr));
    }

    protected int intValue(String attr) {
        return intValue(element, attr);
    }

    protected String stringValue(Element element, String attr) {
        return element.attributeValue(attr);
    }

    protected String stringValue(String attr) {
        return stringValue(element, attr);
    }

    protected Enum<?> enumValue(Class<? extends Enum> enumClass, String attr) {
        return Enum.valueOf(enumClass, stringValue(attr));
    }

    protected abstract void parseData();

    public boolean supportsElement(Element element) {
        return element.getName().equals(elementName);
    }

    public List<Element> getTopLevelElements() {
        ArrayList<Element> elements = new ArrayList<Element>();

        saveTo(elements);

        return elements;
    }

    public TreeConfigurationProvider getParentProvider() {
        return parentProvider;
    }

    protected abstract void saveTo(List<Element> elements);
}