view flys-client/src/main/java/de/intevation/flys/client/server/DataFactory.java @ 5622:b28a6d05e969

Add a new mechanism in mapfish print call to add arbitary data maps Data properties are identified by starting with mapfish-data and they are then split in info value pairs where info can be the description of the information and value the value of the information to be transported in the data map.
author Andre Heinecke <aheinecke@intevation.de>
date Tue, 09 Apr 2013 19:04:32 +0200
parents d0a9acddbea2
children
line wrap: on
line source
package de.intevation.flys.client.server;

import javax.xml.xpath.XPathConstants;

import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import org.apache.log4j.Logger;

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

import de.intevation.flys.client.shared.model.Data;
import de.intevation.flys.client.shared.model.DataItem;
import de.intevation.flys.client.shared.model.DefaultData;
import de.intevation.flys.client.shared.model.DefaultDataItem;
import de.intevation.flys.client.shared.model.DoubleArrayData;
import de.intevation.flys.client.shared.model.IntegerArrayData;
import de.intevation.flys.client.shared.model.IntegerData;
import de.intevation.flys.client.shared.model.IntegerOptionsData;
import de.intevation.flys.client.shared.model.IntegerRangeData;
import de.intevation.flys.client.shared.model.StringData;
import de.intevation.flys.client.shared.model.StringOptionsData;
import de.intevation.flys.client.shared.model.LongRangeData;

import de.intevation.flys.client.shared.model.IntDataItem;

/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class DataFactory {

    private static final Logger logger = Logger.getLogger(DataFactory.class);

    public static final String NS_URI = ArtifactNamespaceContext.NAMESPACE_URI;


    /**
     * Creates a new Data instance based on the <i>art:type</i> attribute of
     * <i>element</i>.
     *
     * @param element The Data element.
     *
     * @return a Data instance.
     */
    public static Data createDataFromElement(Element element) {
        String name  = element.getAttributeNS(NS_URI, "name");
        String type  = element.getAttributeNS(NS_URI, "type");
        String label = element.getAttributeNS(NS_URI, "label");

        label = label != null && label.length() > 0 ? label : name;

        try {
            logger.debug("Create Data instance for: " + name + " | " + type);

            if (type == null || type.length() == 0) {
                return createDefaultData(element, name, label);
            }

            type = type.toLowerCase();

            if (type.equals(StringData.TYPE)) {
                return createStringData(element, name, label);
            }
            else if (type.equals(IntegerData.TYPE)) {
                return createIntegerData(element, name, label);
            }
            else if (type.equals(StringOptionsData.TYPE)) {
                return createStringOptionsData(element, name, label);
            }
            else if (type.equals(IntegerOptionsData.TYPE)) {
                return createIntegerOptionsData(element, name, label);
            }
            else if (type.equals(IntegerRangeData.TYPE)) {
                return createIntegerRangeData(element, name, label);
            }
            else if (type.equals(IntegerArrayData.TYPE)) {
                return createIntegerArrayData(element, name, label);
            }
            else if (type.equals(DoubleArrayData.TYPE)) {
                return createDoubleArrayData(element, name, label);
            }
            else if (type.equals(LongRangeData.TYPE)) {
                return createLongRangeData(element, name, label);
            }
            else {
                return createDefaultData(element, name, label);
            }
        }
        catch (Exception e) {
            logger.error("Error while data creation for: " + name);
        }

        return null;
    }


    /**
     * This method creates a new instance of DefaultData which has no real type
     * set.
     *
     * @param ele The Data element.
     * @param name The name of the Data instance.
     *
     * @return an instance of DefaultData.
     */
    protected static Data createDefaultData(Element ele, String name, String label) {
        logger.debug("Create new DefaultData");
        return new DefaultData(name, label, "default", extractDataItems(ele));
    }


    /**
     * This method creates a new instance of StringData which has a type
     * "string" set.
     *
     * @param ele The Data element.
     * @param name The name of the Data instance.
     *
     * @return an instance of StringData.
     */
    protected static Data createStringData(Element ele, String name, String label) {
        return new StringData(name, label, extractDataItems(ele));
    }


    /**
     * This method creates a new instance of DefaultData which has a type
     * "integer" set.
     *
     * @param ele The Data element.
     * @param name The name of the Data instance.
     *
     * @return an instance of IntegerData.
     */
    protected static Data createIntegerData(Element ele, String name, String label) {
        return new IntegerData(name, label, extractDataItems(ele));
    }


    /**
     * This method creates a new instance of StringOptionsData which has a type
     * "options" set.
     *
     * @param ele The Data element.
     * @param name The name of the Data instance.
     *
     * @return an instance of StringOptionsData.
     */
    protected static Data createStringOptionsData(Element ele, String name, String label) {
        return new StringOptionsData(name, label, extractDataItems(ele));
    }


    /**
     * This method creates a new instance of DefaultData which has a type
     * "intoptions" set.
     *
     * @param ele The Data element.
     * @param name The name of the Data instance.
     *
     * @return an instance of IntegerOptionsData.
     */
    protected static Data createIntegerOptionsData(Element ele, String name, String label) {
        return new IntegerOptionsData(name, label, extractDataItems(ele));
    }


    /**
     * This method creates a new instance of DefaultData which has a type
     * "intrange" set.
     *
     * @param ele The Data element.
     * @param name The name of the Data instance.
     *
     * @return an instance of IntegerRangeData.
     */
    protected static Data createIntegerRangeData(Element ele, String name, String label) {
        DataItem[] items    = extractDataItems(ele);
        String     rawValue = items[0].getStringValue();

        String[] minmax = rawValue.split(";");

        return new IntegerRangeData(
            name,
            label,
            Integer.valueOf(minmax[0]),
            Integer.valueOf(minmax[1]));
    }


    /**
     * This method creates a new instance of DefaultData which has a type
     * "integerarray" set.
     *
     * @param ele The Data element.
     * @param name The name of the Data instance.
     *
     * @return an instance of IntegerArrayData.
     */
    protected static Data createIntegerArrayData(Element ele, String name, String label) {
        IntDataItem[] items    = extractIntDataItems(ele);
        return new IntegerArrayData(name, label, items);
    }


    /**
     * This method creates a new instance of DefaultData which has a type
     * "doublearray" set.
     *
     * @param ele The Data element.
     * @param name The name of the Data instance.
     *
     * @return an instance of DoubleArrayData.
     */
    protected static Data createDoubleArrayData(Element ele, String name, String label) {
        DataItem[] items    = extractDataItems(ele);
        String     rawValue = items[0].getStringValue();

        String[] values  = rawValue.split(";");
        double[] doubles = new double[values.length];

        for (int i = 0; i < values.length; i++) {
            try {
                doubles[i] = Double.valueOf(values[i]);
            }
            catch (NumberFormatException nfe) {
                logger.warn("Error while parsing DoubleArrayData: " + nfe);
            }
        }

        return new DoubleArrayData(name, label, doubles);
    }


    /**
     * This method extracts the art:item elements placed under <i>elements</i>.
     *
     * @param element A data node that contains items.
     *
     * @return a list of DataItems.
     */
    protected static DataItem[] extractDataItems(Element element) {
        NodeList itemList = (NodeList) XMLUtils.xpath(
            element,
            "art:item",
            XPathConstants.NODESET,
            ArtifactNamespaceContext.INSTANCE);

        if (itemList == null || itemList.getLength() == 0) {
            logger.debug("No data items found.");
            return null;
        }

        int count = itemList.getLength();

        DataItem[] items = new DataItem[count];

        logger.debug("There are " + count + " data items in element.");

        for (int i = 0; i < count; i++) {
            Element tmp = (Element) itemList.item(i);

            String value = tmp.getAttributeNS(NS_URI, "value");
            String label = tmp.getAttributeNS(NS_URI, "label");

            logger.debug("Found data item:");
            logger.debug("   label: " + label);
            logger.debug("   value: " + value);

            items[i] = new DefaultDataItem(label, label, value);
        }

        return items;
    }


    /**
     * This method extracts the art:item elements placed under <i>elements</i>.
     *
     * @param element A data node that contains items.
     *
     * @return a list of DataItems.
     */
    protected static IntDataItem[] extractIntDataItems(Element element) {
        NodeList itemList = (NodeList) XMLUtils.xpath(
            element,
            "art:item",
            XPathConstants.NODESET,
            ArtifactNamespaceContext.INSTANCE);

        if (itemList == null || itemList.getLength() == 0) {
            logger.debug("No old data items found.");
            return null;
        }

        int count = itemList.getLength();

        IntDataItem[] items = new IntDataItem[count];

         for (int i = 0; i < count; i++) {
             Element tmp = (Element) itemList.item(i);

             String value = tmp.getAttributeNS(NS_URI, "value");
             String label = tmp.getAttributeNS(NS_URI, "label");

             try {
                 int data = Integer.parseInt(value);
                 items[i] = new IntDataItem(label, label, data);
             }
             catch(NumberFormatException nfe) {
                 logger.debug(nfe, nfe);
             }
         }
         return items;
    }

    /**
     * This method creates a new instance of LongRangeData which has a type
     * "longrange" set.
     *
     * @param ele The Data element.
     * @param name The name of the Data instance.
     *
     * @return an instance of IntegerRangeData.
     */
    protected static Data createLongRangeData(Element ele, String name, String label) {
        DataItem[] items    = extractDataItems(ele);
        String     rawValue = items[0].getStringValue();

        String[] minmax = rawValue.split(";");

        return new LongRangeData(
            name,
            label,
            Long.valueOf(minmax[0]),
            Long.valueOf(minmax[1]));
    }

}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org