view gnv/src/main/java/de/intevation/gnv/action/mapviewer/parser/XMLExternalCallParser.java @ 402:b88e881e8e94

Added the first Implementation (not complete and not ready to use) for the Interface from the MapViewer to the GNV gnv/trunk@573 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Tim Englich <tim.englich@intevation.de>
date Tue, 19 Jan 2010 14:47:36 +0000
parents
children 15ac78a91d1b
line wrap: on
line source
/**
 *
 */
package de.intevation.gnv.action.mapviewer.parser;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;


import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import de.intevation.gnv.artifactdatabase.objects.map.DefaultLayer;
import de.intevation.gnv.artifactdatabase.objects.map.DefaultMapService;
import de.intevation.gnv.artifactdatabase.objects.map.Layer;
import de.intevation.gnv.artifactdatabase.objects.map.MapService;
import de.intevation.gnv.util.XMLUtils;

/**
 * @author Tim Englich <tim.englich@intevation.de>
 *
 */
public class XMLExternalCallParser implements ExternalCallParser {
    
    /**
     * the logger, used to log exceptions and additonaly information
     */
    private static Logger log = Logger.getLogger(XMLExternalCallParser.class);
    
    private static String XPATH_GEOMETRY = "/gnviewer/location/data";
    private static String XPATH_SRS = "/gnviewer/location/srs";
    private static String XPATH_MAPSERVICES_NODESET = "/gnviewer/mapservices/mapservice";
    private static String XPATH_LAYER = "layer";
    private static String ATTRIBUTE_ID = "id";
    private static String ATTRIBUTE_NAME = "name";
    private static String ATTRIBUTE_TYPE = "type";
    private static String ATTRIBUTE_URL = "url";
    
    private String geometry = null;
    private String srs = null;
    
    private Collection<MapService> mapServices = null;
    
    private InputStream inputStream = null;

    /**
     * Constructor
     */
    public XMLExternalCallParser(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    /**
     * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#getGeometry()
     */
    public String getGeometry() {
        return this.geometry;
    }

    /**
     * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#getMapServices()
     */
    public Collection<MapService> getMapServices() {
        return this.mapServices;
    }

    /**
     * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#parse()
     */
    public void parse() throws ExternalCallParserException {
        if (inputStream != null){
            XMLUtils xmlUtils = new XMLUtils();
            Document document = xmlUtils.readDocument(this.inputStream);
            if (document != null){
                
                this.geometry = xmlUtils.getStringXPath(document, XPATH_GEOMETRY);
                this.srs = xmlUtils.getStringXPath(document, XPATH_SRS);
                NodeList mapservicesNodes = 
                      xmlUtils.getNodeSetXPath(document, XPATH_MAPSERVICES_NODESET);
                if (mapservicesNodes != null){
                    this.mapServices = new ArrayList<MapService>(mapservicesNodes.getLength());
                    for (int i = 0; i < mapservicesNodes.getLength(); i++){
                        Element mapserviceNode = (Element)mapservicesNodes.item(i);
                        String mapserviceID = mapserviceNode.getAttribute(ATTRIBUTE_ID);
                        String mapserviceType = mapserviceNode.getAttribute(ATTRIBUTE_TYPE);
                        String mapserviceUrl = mapserviceNode.getAttribute(ATTRIBUTE_URL);
                        NodeList layerNodes = xmlUtils.getNodeSetXPath(mapserviceNode, XPATH_LAYER);
                        Collection<Layer> layer = null;
                        if (layerNodes != null && layerNodes.getLength() > 0){
                            layer = new  ArrayList<Layer>(layerNodes.getLength());
                            layer = this.extractLayer(layer, null, layerNodes);
                        }else{
                            log.debug("No Layer given for this Mapservice");
                        }
                        MapService mapService = 
                             new DefaultMapService(mapserviceID, layer,
                                                   mapserviceType, mapserviceUrl);
                        this.mapServices.add(mapService);
                    }
                    
                }else{
                    String errMsg = "XML-Document does not contain any Mapservices which are required.";
                    log.error(errMsg);
                    throw new ExternalCallParserException(errMsg);
                }
                
            }else{
                String errMsg = "XML-Document could not be read from InputStream.";
                log.error(errMsg);
                throw new ExternalCallParserException(errMsg);
            }
        }else{
            String errMsg = "No InputStream given for parsing the Call.";
            log.error(errMsg);
            throw new ExternalCallParserException(errMsg);
        }
    }
    
    /**
     * This Method extracts all Layers and put them into the Collection.
     * @param layer
     * @param groupId
     * @param layerNodes
     * @return
     */
    private Collection<Layer> extractLayer(Collection<Layer> layer, String groupId, NodeList layerNodes){
        XMLUtils xmlUtils = new XMLUtils();
        for (int i = 0; i < layerNodes.getLength(); i++){
            Element layerNode = (Element)layerNodes.item(i);
            String id = layerNode.getAttribute(ATTRIBUTE_ID);
            String name = layerNode.getAttribute(ATTRIBUTE_NAME);
            NodeList localLayerNodes = xmlUtils.getNodeSetXPath(layerNode, XPATH_LAYER);
            Layer tmpLayer = new DefaultLayer(id, name, 
                                              (localLayerNodes != null && 
                                               localLayerNodes.getLength() > 0), 
                                              groupId);
            layer.add(tmpLayer);
            if (localLayerNodes != null && localLayerNodes.getLength() > 0){
                layer = this.extractLayer(layer, id, localLayerNodes);
            }
        }
        return layer;
    }

    /**
     * @see de.intevation.gnv.action.mapviewer.parser.ExternalCallParser#getSRS()
     */
    public String getSRS() {
        return this.srs;
    }

}

http://dive4elements.wald.intevation.org