view artifact-database/src/main/java/de/intevation/artifactdatabase/state/AbstractState.java @ 205:2a9591f76270

Changed the return type of a State's describe() method. artifacts/trunk@1462 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Mon, 14 Mar 2011 14:19:28 +0000
parents ece0fdb07975
children 1a3fb29b8b2e
line wrap: on
line source
/*
 * Copyright (c) 2011 by Intevation GmbH
 *
 * This program is free software under the LGPL (>=v2.1)
 * Read the file LGPL.txt coming with the software for details
 * or visit http://www.gnu.org/licenses/ if it does not exist.
 */
package de.intevation.artifactdatabase.state;

import java.util.HashMap;
import java.util.Map;

import javax.xml.xpath.XPathConstants;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import de.intevation.artifacts.CallContext;

import de.intevation.artifacts.common.utils.XMLUtils;

import de.intevation.artifactdatabase.data.StateData;


/**
 * An abstract implementation of a {@link State}. It implements some basic
 * methods that return the id, description and data. The methods
 * <code>describe()</code> and <code>setup()</code> depend on the concrete class
 * and need to be implemented by those.
 */
public abstract class AbstractState implements State {

    /** The XPath to the ID of the state relative to the state node in the
     * configuration. */
    public static final String XPATH_ID = "@id";

    /** The XPath to the description of the state relative to the state node in
     * the configuration. */
    public static final String XPATH_DESCRIPTION = "@description";


    /** The ID of the state. */
    protected String id;

    /** The description of the state. */
    protected String description;

    /** The data provided by this state. */
    protected Map<String, StateData> data;


    public AbstractState() {
    }


    /**
     * The default constructor.
     *
     * @param id The ID of the state.
     * @param description The description of the state.
     */
    public AbstractState(String id, String description) {
        this.id          = id;
        this.description = description;
    }


    /**
     * Returns the ID of the state.
     *
     * @return the ID of the state.
     */
    public String getID() {
        return id;
    }


    /**
     * Set the ID of the state.
     *
     * @param id The ID of the state.
     */
    public void setID(String id) {
        this.id = id;
    }


    /**
     * Returns the description of the state.
     *
     * @return the description of the state.
     */
    public String getDescription() {
        return description;
    }


    /**
     * Set the description of the state.
     *
     * @param description The description of the state.
     */
    public void setDescription(String description) {
        this.description = description;
    }


    /**
     * Returns the data of the state.
     *
     * @return the data of the state.
     */
    public Map<String, StateData> getData() {
        return data;
    }


    /**
     * Add new data to the state. NOTE: If there is already an object existing
     * with the key <i>name</i>, this object is overwritten by the new value.
     *
     * @param name The name of the data object.
     * @param StateData The data object.
     */
    public void addData(String name, StateData data) {
        if (this.data == null) {
            this.data = new HashMap<String, StateData>();
        }

        this.data.put(name, data);
    }


    /**
     * Initialize the state based on the state node in the configuration.
     *
     * @param config The state configuration node.
     */
    public void setup(Node config) {
        id = (String) XMLUtils.xpath(config, XPATH_ID, XPathConstants.STRING);

        description = (String) XMLUtils.xpath(
            config, XPATH_DESCRIPTION, XPathConstants.STRING);
    }


    /**
     * Describes the UI of the state. This method needs to be implemented by
     * concrete subclasses.
     *
     * @param document Describe doucment.
     * @param rootNode Parent node for all new elements.
     * @param context The CallContext.
     * @param uuid The uuid of an artifact.
     */
    public abstract Element describe(
        Document    document,
        Node        rootNode,
        CallContext context,
        String      uuid
    );
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org