ingo@105: /*
ingo@105: * Copyright (c) 2011 by Intevation GmbH
ingo@105: *
ingo@105: * This program is free software under the LGPL (>=v2.1)
ingo@105: * Read the file LGPL.txt coming with the software for details
ingo@105: * or visit http://www.gnu.org/licenses/ if it does not exist.
ingo@105: */
ingo@105: package de.intevation.artifactdatabase.state;
ingo@105:
ingo@105: import java.util.HashMap;
ingo@105: import java.util.Map;
ingo@105:
ingo@106: import javax.xml.xpath.XPathConstants;
ingo@106:
ingo@105: import org.w3c.dom.Document;
ingo@205: import org.w3c.dom.Element;
ingo@105: import org.w3c.dom.Node;
ingo@105:
ingo@105: import de.intevation.artifacts.CallContext;
ingo@105:
ingo@106: import de.intevation.artifacts.common.utils.XMLUtils;
ingo@106:
ingo@105: import de.intevation.artifactdatabase.data.StateData;
ingo@105:
ingo@105:
ingo@105: /**
ingo@105: * An abstract implementation of a {@link State}. It implements some basic
ingo@105: * methods that return the id, description and data. The methods
ingo@105: * describe()
and setup()
depend on the concrete class
ingo@105: * and need to be implemented by those.
ingo@105: */
ingo@105: public abstract class AbstractState implements State {
ingo@105:
ingo@106: /** The XPath to the ID of the state relative to the state node in the
ingo@106: * configuration. */
ingo@106: public static final String XPATH_ID = "@id";
ingo@106:
ingo@106: /** The XPath to the description of the state relative to the state node in
ingo@106: * the configuration. */
ingo@106: public static final String XPATH_DESCRIPTION = "@description";
ingo@106:
ingo@106:
ingo@105: /** The ID of the state. */
ingo@105: protected String id;
ingo@105:
ingo@105: /** The description of the state. */
ingo@105: protected String description;
ingo@105:
ingo@105: /** The data provided by this state. */
ingo@105: protected Map data;
ingo@105:
ingo@105:
ingo@205: public AbstractState() {
ingo@205: }
ingo@205:
ingo@205:
ingo@105: /**
ingo@105: * The default constructor.
ingo@105: *
ingo@105: * @param id The ID of the state.
ingo@105: * @param description The description of the state.
ingo@105: */
ingo@105: public AbstractState(String id, String description) {
ingo@105: this.id = id;
ingo@105: this.description = description;
ingo@105: }
ingo@105:
ingo@105:
ingo@105: /**
ingo@105: * Returns the ID of the state.
ingo@105: *
ingo@105: * @return the ID of the state.
ingo@105: */
ingo@105: public String getID() {
ingo@105: return id;
ingo@105: }
ingo@105:
ingo@105:
ingo@105: /**
ingo@105: * Set the ID of the state.
ingo@105: *
ingo@105: * @param id The ID of the state.
ingo@105: */
ingo@105: public void setID(String id) {
ingo@105: this.id = id;
ingo@105: }
ingo@105:
ingo@105:
ingo@105: /**
ingo@105: * Returns the description of the state.
ingo@105: *
ingo@105: * @return the description of the state.
ingo@105: */
ingo@105: public String getDescription() {
ingo@105: return description;
ingo@105: }
ingo@105:
ingo@105:
ingo@105: /**
ingo@105: * Set the description of the state.
ingo@105: *
ingo@105: * @param description The description of the state.
ingo@105: */
ingo@105: public void setDescription(String description) {
ingo@105: this.description = description;
ingo@105: }
ingo@105:
ingo@105:
ingo@105: /**
ingo@105: * Returns the data of the state.
ingo@105: *
ingo@105: * @return the data of the state.
ingo@105: */
ingo@105: public Map getData() {
ingo@105: return data;
ingo@105: }
ingo@105:
ingo@105:
ingo@105: /**
ingo@105: * Add new data to the state. NOTE: If there is already an object existing
ingo@105: * with the key name, this object is overwritten by the new value.
ingo@105: *
ingo@105: * @param name The name of the data object.
ingo@105: * @param StateData The data object.
ingo@105: */
ingo@105: public void addData(String name, StateData data) {
ingo@105: if (this.data == null) {
ingo@105: this.data = new HashMap();
ingo@105: }
ingo@105:
ingo@105: this.data.put(name, data);
ingo@105: }
ingo@105:
ingo@105:
ingo@105: /**
ingo@106: * Initialize the state based on the state node in the configuration.
ingo@105: *
ingo@105: * @param config The state configuration node.
ingo@105: */
ingo@106: public void setup(Node config) {
ingo@106: id = (String) XMLUtils.xpath(config, XPATH_ID, XPathConstants.STRING);
ingo@106:
ingo@106: description = (String) XMLUtils.xpath(
ingo@106: config, XPATH_DESCRIPTION, XPathConstants.STRING);
ingo@106: }
ingo@105:
ingo@105:
ingo@105: /**
ingo@105: * Describes the UI of the state. This method needs to be implemented by
ingo@105: * concrete subclasses.
ingo@105: *
ingo@105: * @param document Describe doucment.
ingo@105: * @param rootNode Parent node for all new elements.
ingo@105: * @param context The CallContext.
ingo@105: * @param uuid The uuid of an artifact.
ingo@105: */
ingo@205: public abstract Element describe(
ingo@105: Document document,
ingo@105: Node rootNode,
ingo@105: CallContext context,
ingo@105: String uuid
ingo@105: );
ingo@105: }
ingo@105: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :