view flys-client/src/main/java/de/intevation/flys/client/server/DataFactory.java @ 5818:a4ff4167be1e

Request feature info on all layers and show it as html if the server does not return valid gml. Non queryable layers produce an error message when the request fails. This is good enough
author Andre Heinecke <aheinecke@intevation.de>
date Wed, 24 Apr 2013 17:33:27 +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