ingo@356: package de.intevation.flys.artifacts.transitions;
ingo@356: 
ingo@356: import javax.xml.xpath.XPathConstants;
ingo@356: 
ingo@356: import org.apache.log4j.Logger;
ingo@356: 
ingo@356: import org.w3c.dom.Node;
ingo@356: 
ingo@356: import de.intevation.artifacts.Artifact;
ingo@356: 
ingo@356: import de.intevation.artifactdatabase.data.StateData;
ingo@356: import de.intevation.artifactdatabase.state.State;
ingo@356: 
ingo@356: import de.intevation.artifacts.common.utils.XMLUtils;
ingo@356: 
ingo@356: import de.intevation.flys.artifacts.FLYSArtifact;
ingo@356: 
ingo@356: 
ingo@356: /**
ingo@356:  * This transition compares data objects with a <i>equal</i> or <i>notequal</i>
ingo@356:  * operator.
ingo@356:  *
ingo@356:  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
ingo@356:  */
ingo@356: public class ValueCompareTransition extends DefaultTransition {
ingo@356: 
ingo@356:     /** The logger that is used in this transition.*/
ingo@356:     private static Logger log = Logger.getLogger(ValueCompareTransition.class);
ingo@356: 
ingo@356: 
ingo@356:     /** XPath that points to the condition's operator.*/
ingo@356:     public static final String XPATH_OPERATOR = "condition/@operator";
ingo@356: 
ingo@356:     /** XPath that points to the condition's value.*/
ingo@356:     public static final String XPATH_VALUE    = "condition/@value";
ingo@356: 
ingo@356:     /** XPath that points  to the condition's dataname.*/
ingo@356:     public static final String XPATH_DATANAME = "condition/@data";
ingo@356: 
ingo@356:     /** The value of the 'equal' operator.*/
ingo@356:     public static final String OPERATOR_EQUAL = "equal";
ingo@356: 
ingo@356:     /** The value of the 'not equal' operator.*/
ingo@356:     public static final String OPERATOR_NOTEQUAL = "notequal";
ingo@356: 
ingo@356: 
ingo@356:     /** The operator.*/
ingo@356:     protected String operator;
ingo@356: 
ingo@356:     /** The value used for comparison.*/
ingo@356:     protected String value;
ingo@356: 
ingo@356:     /** The name of the data used for the comparison.*/
ingo@356:     protected String dataname;
ingo@356: 
ingo@356: 
ingo@356: 
ingo@356:     public ValueCompareTransition() {
ingo@356:     }
ingo@356: 
ingo@356: 
ingo@356:     public ValueCompareTransition(String from, String to) {
ingo@356:         super(from, to);
ingo@356:     }
ingo@356: 
ingo@356: 
ingo@356:     @Override
ingo@356:     public void init(Node config) {
ingo@356:         log.debug("ValueCompareTransition.init");
ingo@356: 
ingo@356:         String tmp = (String) XMLUtils.xpath(
ingo@356:             config,
ingo@356:             XPATH_OPERATOR,
ingo@356:             XPathConstants.STRING);
ingo@356:         operator = tmp.trim().toLowerCase();
ingo@356: 
ingo@356:         value = (String) XMLUtils.xpath(
ingo@356:             config,
ingo@356:             XPATH_VALUE,
ingo@356:             XPathConstants.STRING);
ingo@356: 
ingo@356:         dataname = (String) XMLUtils.xpath(
ingo@356:             config,
ingo@356:             XPATH_DATANAME,
ingo@356:             XPathConstants.STRING);
ingo@356:     }
ingo@356: 
ingo@356: 
ingo@356:     @Override
ingo@356:     public boolean isValid(Artifact artifact, State a, State b) {
ingo@356:         log.debug("ValueCompareTransition.isValid");
ingo@356: 
ingo@356:         FLYSArtifact flysArtifact = (FLYSArtifact) artifact;
ingo@356: 
ingo@356:         StateData dataObj = flysArtifact.getData(dataname);
ingo@356:         String    dataVal = dataObj != null ? (String) dataObj.getValue() : "";
ingo@356: 
ingo@356:         if (log.isDebugEnabled()) {
ingo@356:             log.debug("Compare settings:");
ingo@356:             log.debug("-- dataname: " + dataname);
ingo@356:             log.debug("-- operator: " + operator);
ingo@356:             log.debug("-- compare value: " + value);
ingo@356:             log.debug("-- state value: " + dataVal);
ingo@356:         }
ingo@356: 
ingo@356:         if (operator.equals(OPERATOR_EQUAL)) {
ingo@356:             return value.equals(dataVal);
ingo@356:         }
ingo@356:         else if (operator.equals(OPERATOR_NOTEQUAL)) {
ingo@356:             return !(value.equals(dataVal));
ingo@356:         }
ingo@356: 
ingo@356:         log.error("Wrong operator set! No comparison takes place.");
ingo@356: 
ingo@356:         return false;
ingo@356:     }
ingo@356: }
ingo@356: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :