rrenkert@31: /*
rrenkert@31:  * Copyright (c) 2010 by Intevation GmbH
rrenkert@31:  *
rrenkert@31:  * This program is free software under the LGPL (>=v2.1)
rrenkert@31:  * Read the file LGPL.txt coming with the software for details
rrenkert@31:  * or visit http://www.gnu.org/licenses/ if it does not exist.
rrenkert@31:  */
rrenkert@31: package de.intevation.mxd.utils;
rrenkert@31: 
rrenkert@31: import org.apache.log4j.Logger;
rrenkert@31: 
rrenkert@31: import org.w3c.dom.Document;
rrenkert@31: import org.w3c.dom.Element;
rrenkert@31: import org.w3c.dom.NodeList;
vc11884admin@133: import org.w3c.dom.DOMException;
rrenkert@31: 
rrenkert@31: /**
rrenkert@31:  * Utility class to store map information in a XML structure.
rrenkert@31:  *
rrenkert@31:  * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
rrenkert@31:  */
rrenkert@31: public class MapToXMLUtils
rrenkert@31: {
rrenkert@43:     /**
rrenkert@43:      * The logger.
rrenkert@43:      */
rrenkert@43:     private static final Logger logger = Logger.getLogger(MapToXMLUtils.class);
rrenkert@43: 
rrenkert@43:     /**
rrenkert@43:      * Private member.
rrenkert@43:      */
rrenkert@31:     private Document root;
rrenkert@38:     private Element rootElement;
rrenkert@31:     private XMLUtils.ElementCreator creator;
rrenkert@31: 
rrenkert@43: 
rrenkert@31:     public MapToXMLUtils() {
rrenkert@31:         this.root = XMLUtils.newDocument();
rrenkert@31:         creator = new XMLUtils.ElementCreator(root, "", "");
rrenkert@38:         rootElement = creator.create("mxd");
rrenkert@38:         root.appendChild(rootElement);
rrenkert@38:     }
rrenkert@38: 
rrenkert@43:     /**
rrenkert@43:      * Add the mxd filename to the dom.
rrenkert@43:      * @param path Path to the mxdfile.
rrenkert@43:      * @return Currently always true.
rrenkert@43:      */
rrenkert@38:     public boolean addFilename(String path) {
rrenkert@38:         Element file = creator.create("file");
rrenkert@38:         file.setAttribute("name", path);
rrenkert@38:         rootElement.appendChild(file);
rrenkert@38:         return true;
rrenkert@31:     }
rrenkert@31: 
rrenkert@31:     /**
rrenkert@31:      * Create the top level map element.
rrenkert@31:      * @return The new map element.
rrenkert@31:      */
rrenkert@31:     public Element createMap()
rrenkert@31:     throws Exception {
rrenkert@31:         Element map;
rrenkert@31:         NodeList list = root.getElementsByTagName("map");
rrenkert@31:         if(list == null || list.getLength() == 0){
rrenkert@31:             map = creator.create("map");
rrenkert@38:             rootElement.appendChild(map);
rrenkert@31:         }
rrenkert@31:         else if(list.getLength() == 1){
rrenkert@31:             map = (Element)list.item(0);
rrenkert@31:         }
rrenkert@31:         else{
rrenkert@31:             throw new Exception("Error while creating map node.");
rrenkert@31:         }
rrenkert@31:         return map;
rrenkert@31:     }
rrenkert@31: 
rrenkert@31:     /**
rrenkert@31:      * Add a layer element to the map.
rrenkert@31:      * @param name The layer name.
rrenkert@31:      * @return The layer element.
rrenkert@31:      */
rrenkert@31:     public Element addLayer()
rrenkert@31:     throws Exception {
rrenkert@31:         Element node = creator.create("layer");
rrenkert@31:         NodeList list = root.getElementsByTagName("map");
rrenkert@31:         if(list == null || list.getLength() == 0){
rrenkert@31:             throw new Exception("No map node found!");
rrenkert@31:         }
rrenkert@31:         else if(list.getLength() > 1) {
rrenkert@31:             throw new Exception("Found more than one map node." +
rrenkert@31:                                 " This should never happen!");
rrenkert@31:         }
rrenkert@31:         else {
rrenkert@31:             list.item(0).appendChild(node);
rrenkert@31:             return node;
rrenkert@31:         }
rrenkert@31:     }
rrenkert@31: 
rrenkert@31:     /**
vc11884admin@133:      * Remove a layer element from map.
vc11884admin@133:      * @param name The layer name.
vc11884admin@133:      */
vc11884admin@133:     public void removeLayer(Element layerElement) {
vc11884admin@133:         NodeList list = root.getElementsByTagName("map");
vc11884admin@133:         if(list == null || list.getLength() == 0){
vc11884admin@133:             return;
vc11884admin@133:         }
vc11884admin@133:         else if(list.getLength() > 1) {
rrenkert@137:             return;
vc11884admin@133:         }
vc11884admin@133:         else {
rrenkert@137:             try {
vc11884admin@133:                 list.item(0).removeChild(layerElement);
rrenkert@137:             }
rrenkert@137:             catch(DOMException de) {
rrenkert@137:                 return;
rrenkert@137:             }
vc11884admin@133:         }
vc11884admin@133:     }
vc11884admin@133: 
vc11884admin@133:     /**
rrenkert@31:      * Add a renderer element to the map.
rrenkert@31:      * @param layer The parent layer element.
rrenkert@31:      * @return The renderer element.
rrenkert@31:      */
rrenkert@31:     public Element addRenderer(Element layer) {
rrenkert@31:         Element node = creator.create("renderer");
rrenkert@31:         layer.appendChild(node);
rrenkert@31:         return node;
rrenkert@31:     }
rrenkert@31: 
rrenkert@31:     /**
rrenkert@31:      * Add a symbol element to the map.
rrenkert@31:      * @param renderer The parent renderer element.
rrenkert@31:      * @return The symbol element.
rrenkert@31:      */
rrenkert@31:     public Element addSymbol(Element renderer) {
rrenkert@31:         Element node = creator.create("symbol");
rrenkert@31:         renderer.appendChild(node);
rrenkert@31:         return node;
rrenkert@31:     }
rrenkert@180: 
raimund@179:     /**
raimund@179:      * Add a label element to the map.
raimund@179:      * @param layer The parent layer element.
raimund@179:      * @return The label element.
raimund@179:      */
raimund@179:     public Element addLabel(Element layer) {
raimund@179:         Element node = creator.create("label");
raimund@179:         layer.appendChild(node);
raimund@179:         return node;
raimund@179:     }
rrenkert@31: 
rrenkert@31:     /**
rrenkert@31:      * Print out the XML document.
rrenkert@31:      */
rrenkert@31:     public void print() {
rrenkert@31:         XMLUtils.toStream(root, System.out);
rrenkert@31:     }
rrenkert@38: 
rrenkert@43:     /**
rrenkert@43:      * Get the DOM document.
rrenkert@43:      * @return The root document.
rrenkert@43:      */
rrenkert@38:     public Document getDocument() {
rrenkert@38:         return root;
rrenkert@38:     }
rrenkert@31: }