view flys-client/src/main/java/de/intevation/flys/client/server/meta/Converter.java @ 4241:49cb65d5932d

Improved the historical discharge calculation. The calculation now creates new HistoricalWQKms (new subclass of WQKms). Those WQKms are used to create new facets from (new) type 'HistoricalDischargeCurveFacet'. The chart generator is improved to support those facets.
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 24 Oct 2012 14:34:35 +0200
parents b21840188264
children 823c8afa1335
line wrap: on
line source
package de.intevation.flys.client.server.meta;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Attr;
import org.w3c.dom.NamedNodeMap;

import org.apache.log4j.Logger;

import de.intevation.flys.client.shared.model.DataCageTree;
import de.intevation.flys.client.shared.model.DataCageNode;
import de.intevation.flys.client.shared.model.AttrList;

import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

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

/**
 * Converts document parts (meta-data xml) to datacagenodes/trees,
 * which are shown in datacage widgets.
 */
public class Converter
{
    private static final Logger logger = Logger.getLogger(Converter.class);


    public interface NodeConverter
    {
        DataCageNode convert(Element node, Converter converter);

    } // interface NodeConverter

    public static class NameConverter implements NodeConverter {
        public DataCageNode convert(Element node, Converter converter) {
            //System.err.println("NameConverter called");
            DataCageNode out = new DataCageNode(
                node.getAttribute("name"),
                toAttrList(node.getAttributes()));
            converter.convertChildren(out, node);
            return out;
        }
    } // class NameConverter

    public static class I18NConverter implements NodeConverter {
        public DataCageNode convert(Element node, Converter converter) {
            //System.err.println("I18NConverter called");

            String name = node.getLocalName();
            String desc = node.hasAttribute("description")
                ? node.getAttribute("description")
                : "${" + name + "}";

            DataCageNode out =
                new DataCageNode(name, desc, toAttrList(node.getAttributes()));

            converter.convertChildren(out, node);
            return out;
        }
    } // I18NConverter

    private static Map<String, NodeConverter> converters = new HashMap<String, NodeConverter>();

    public static final NodeConverter NAME_CONVERTER = new NameConverter();
    public static final NodeConverter I18N_CONVERTER = new I18NConverter();

    static {
        converters.put("river",      NAME_CONVERTER);
        converters.put("gauge",      NAME_CONVERTER);
        converters.put("historical", NAME_CONVERTER);
        converters.put("column",     NAME_CONVERTER);
    }


    /** Trivial constructor. */
    public Converter() {
    }


    public DataCageTree convert(Document document) {
        logger.debug("convert called");
        //System.err.println(XMLUtils.toString(document));

        ArrayList<DataCageNode> roots = new ArrayList<DataCageNode>();
        NodeList nodes = document.getChildNodes();
        for (int i = 0, N = nodes.getLength(); i < N; ++i) {
            Node node = nodes.item(i);
            if (node.getNodeType() == Node.ELEMENT_NODE) {
                logger.debug("search for name: " + node.getLocalName());
                NodeConverter converter = converters.get(node.getLocalName());
                if (converter == null) {
                    converter = I18N_CONVERTER;
                }
                roots.add(converter.convert((Element)node, this));
            }
        }
        return roots.isEmpty()
            ? new DataCageTree()
            : new DataCageTree(roots.get(0));
    }

    protected void convertChildren(DataCageNode parent, Element sub) {
        //System.err.println("convertChildren called");
        NodeList children = sub.getChildNodes();
        for (int i = 0, N = children.getLength(); i < N; ++i) {
            Node child = children.item(i);
            if (child.getNodeType() == Node.ELEMENT_NODE) {
                String name = child.getLocalName();
                NodeConverter converter = converters.get(name);
                if (converter == null) {
                    converter = I18N_CONVERTER;
                }
                DataCageNode son = converter.convert(
                    (Element)child, this);
                parent.addChild(son);

            if (((Element)child).hasAttribute("description"))
                logger.debug("nwd: " + ((Element)child).getAttribute("description"));
            }
        } // for all children
    }


    /**
     * Creates key/value pairs from Nodes Attributes.
     */
    public static AttrList toAttrList(NamedNodeMap nodeMap) {
        if (nodeMap == null) {
            return null;
        }
        int N = nodeMap.getLength();

        if (N == 0) {
            return null;
        }

        AttrList result = new AttrList(N);

        for (int i = 0; i < N; ++i) {
            Node node = nodeMap.item(i);
            if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
                Attr   attr  = (Attr)node;
                String key   = attr.getName();
                String value = attr.getValue();
                result.add(key, value);
            }
        }

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

http://dive4elements.wald.intevation.org