view artifacts/src/main/java/org/dive4elements/river/themes/ThemeMapping.java @ 6931:2c8e5bad8699

Fix NPE in case the artifact does not even have the master attribute Started happening with the new other.wqkms.w attribute condition and official lines in waterlevel calculations
author Andre Heinecke <aheinecke@intevation.de>
date Tue, 27 Aug 2013 18:35:51 +0200
parents af13ceeba52a
children e4606eae8ea5
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.themes;

import org.apache.log4j.Logger;

import java.io.Serializable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.dive4elements.river.artifacts.D4EArtifact;

/**
 * Represents mapping to a theme (including conditions).
 */
public class ThemeMapping implements Serializable {

    /** The logger that is used in this class */
    private static Logger logger = Logger.getLogger(ThemeMapping.class);

    /** Name from which to map. */
    protected String from;

    /** Name to which to map. */
    protected String to;

    /** Given pattern (held against facet description). */
    protected String patternStr;

    /** Given masterAttr pattern (held against masterartifacts attributes). */
    protected String masterAttr;

    /** Given output for which mapping is valid. */
    protected String output;

    protected Pattern pattern;


    public ThemeMapping(String from, String to) {
        this(from, to, null, null, null);
    }


    public ThemeMapping(
        String from,
        String to,
        String patternStr,
        String masterAttr,
        String output)
   {
        this.from       = from;
        this.to         = to;
        this.patternStr = patternStr;
        this.masterAttr = masterAttr;
        this.output     = output;

        this.pattern = Pattern.compile(patternStr);
    }


    public String getFrom() {
        return from;
    }


    /**
     * Get name of theme that is mapped to.
     */
    public String getTo() {
        return to;
    }


    /**
     * Get pattern.
     */
    public String getPatternStr() {
        return patternStr;
    }


    /**
     * Match regular expression against text.
     *
     * @param text string to be matched against.
     * @return true if pattern matches text or pattern is empty.
     */
    public boolean applyPattern(String text) {
        if (patternStr == null || patternStr.length() == 0) {
            return true;
        }
        Matcher m = pattern.matcher(text);

       if (m.matches()) {
           logger.debug("Pattern matches: " + text);
           return true;
       }
       else {
           logger.debug(
               "Pattern '"+ text + "' does not match: " + this.patternStr);
           return false;
       }
    }


    /**
     * Inspects Artifacts data given the masterAttr-condition.
     *
     * The only condition implemented so far is 'key==value', for which
     * the Artifacts data with name "key" has to be of value "value" in order
     * for true to be returned.
     *
     * @param artifact Artifact of which to inspect data.
     * @return true if no condition is specified or condition is met.
     */
    public boolean masterAttrMatches(D4EArtifact artifact) {
        if (masterAttr == null || masterAttr.length() == 0) {
           return true;
        }

        // Operator split.
        String[] parts = masterAttr.split("==");
        if (parts.length != 2) {
            logger.error("ThemeMapping could not parse masterAttr.-condition:_"
                + masterAttr + "_");
            return false;
        }

        // Test.
        String artData = artifact.getDataAsString(parts[0]);
        if (artData != null && artData.equals(parts[1])) {
            logger.debug("Matches master Attribute.");
            return true;
        }
        else {
            logger.debug("Does not match master Attribute.");
            return false;
        }
    }


    /**
     * Returns true if no output condition exists, or the condition is met
     * in parameter output.
     */
    public boolean outputMatches(String output) {
        if (this.output == null || this.output.length() == 0) {
            return true;
        }

        if (this.output.equals(output)) {
            logger.debug("Output matches this mapping: " + output);
            return true;
        }
        else {
            logger.debug("Output '"+ output +"' does not match: "+ this.output);
            return false;
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org