rrenkert@243: /* rrenkert@243: * Copyright (c) 2011 by Intevation GmbH, Germany rrenkert@243: * rrenkert@243: * This file is part of MXD2map. rrenkert@243: * rrenkert@243: * This program is free software under the LGPL (>=v2.1) rrenkert@243: * Read the file LICENCE.txt coming with the software for details rrenkert@243: * or visit http://www.gnu.org/licenses/ if it does not exist. rrenkert@243: * rrenkert@243: * MXD2map has been developed on behalf of the rrenkert@243: * Bundesamt fuer Seeschifffahrt und Hydrographie (BSH) in Hamburg rrenkert@243: * by Intevation GmbH. rrenkert@243: * rrenkert@243: * Authors: rrenkert@243: * Raimund Renkert rrenkert@243: * Bjoern Schilberg rrenkert@243: * Stephan Holl rrenkert@243: */ rrenkert@243: rrenkert@33: package de.intevation.mxd.reader; rrenkert@25: rrenkert@25: import org.apache.log4j.Logger; rrenkert@25: rrenkert@25: import com.esri.arcgis.carto.IFeatureRenderer; rrenkert@25: import com.esri.arcgis.display.ISymbol; rrenkert@25: import com.esri.arcgis.carto.UniqueValueRenderer; rrenkert@25: rrenkert@31: import org.w3c.dom.Element; rrenkert@116: import java.io.IOException; rrenkert@31: rrenkert@33: import de.intevation.mxd.utils.MapToXMLUtils; rrenkert@33: rrenkert@25: /** rrenkert@25: * Reads unique vaule renderer information. rrenkert@25: * rrenkert@25: * @author Raimund Renkert rrenkert@25: */ rrenkert@31: public class UniqueValueRendererReader rrenkert@31: implements IRendererReader { rrenkert@25: rrenkert@31: /** rrenkert@31: * The logger. rrenkert@31: */ rrenkert@31: private static final Logger logger = rrenkert@31: Logger.getLogger(FeatureLayerReader.class); rrenkert@25: rrenkert@31: /** rrenkert@31: * Private Member. rrenkert@31: */ rrenkert@31: private UniqueValueRenderer renderer; rrenkert@31: private Element layer; rrenkert@31: private MapToXMLUtils util; rrenkert@25: rrenkert@181: /** rrenkert@181: * Constructor with renderer. rrenkert@181: * rrenkert@181: * @param renderer ArcGIS renderer. rrenkert@181: */ rrenkert@31: public UniqueValueRendererReader(IFeatureRenderer renderer) rrenkert@31: throws Exception { rrenkert@31: logger.debug("constructor()"); rrenkert@31: if (renderer instanceof UniqueValueRenderer) { rrenkert@31: this.renderer = (UniqueValueRenderer)renderer; rrenkert@25: } rrenkert@31: else { rrenkert@31: throw new Exception ("Not an instance of UniqueValueRenderer."); rrenkert@31: } rrenkert@25: } rrenkert@25: rrenkert@31: /** rrenkert@31: * Setter for the parent XML element. rrenkert@31: * rrenkert@31: * @param parent The XML parent node. rrenkert@31: */ rrenkert@31: public void setParent(Element parent) { rrenkert@31: this.layer = parent; rrenkert@31: } rrenkert@31: rrenkert@31: /** rrenkert@31: * Setter for XML document helper. rrenkert@31: * rrenkert@31: * @param util The helper class for storing map information. rrenkert@31: */ rrenkert@31: public void setUtil(MapToXMLUtils util) { rrenkert@31: this.util = util; rrenkert@31: } rrenkert@31: rrenkert@31: /** rrenkert@31: * Reads the renderer attributes. rrenkert@31: * rrenkert@31: * @return The parent XML node. rrenkert@31: */ rrenkert@116: public Element read() { rrenkert@31: logger.debug("read()"); rrenkert@116: int count = 0; rrenkert@116: try { rrenkert@116: count = renderer.getClassCount(); vc11884admin@166: if(renderer.isUseDefaultSymbol()) { vc11884admin@166: count--; vc11884admin@166: } rrenkert@116: } rrenkert@116: catch(IOException ioe) { rrenkert@117: logger.error( rrenkert@117: "Could not read class count."+ rrenkert@117: " Stopped reading renderer."); rrenkert@116: return layer; rrenkert@116: } vc11884admin@151: for(int i = 0; i < count; i++) { rrenkert@74: Element rendererElement = util.addRenderer(layer); rrenkert@73: rrenkert@116: try { rrenkert@116: String value = renderer.getValue(i); raimund@185: value = value.replaceAll(", ", ","); vc11884admin@134: if(value.indexOf(",") > 0) { vc11884admin@134: int j = 0; vc11884admin@134: while(value.indexOf(",") > 0) { vc11884admin@134: String v = value.substring(0, value.indexOf(",")); vc11884admin@134: rendererElement.setAttribute("value_" + j, v); vc11884admin@134: value = value.substring( vc11884admin@134: value.indexOf(",") + 1, vc11884admin@134: value.length()); vc11884admin@134: j++; vc11884admin@134: } vc11884admin@134: rendererElement.setAttribute("value_" + j, value); vc11884admin@134: } vc11884admin@134: else { vc11884admin@134: rendererElement.setAttribute("value", value); vc11884admin@134: } vc11884admin@134: vc11884admin@134: value = renderer.getValue(i); rrenkert@116: rendererElement.setAttribute("name", renderer.esri_getClass(i)); rrenkert@116: rendererElement.setAttribute("description", vc11884admin@134: renderer.getDescription(value)); vc11884admin@134: rrenkert@116: rendererElement.setAttribute("label", renderer.getLabel(value)); rrenkert@74: rendererElement.setAttribute( rrenkert@116: "field_count", rrenkert@116: String.valueOf(renderer.getFieldCount())); rrenkert@116: for(int j = 0; j < renderer.getFieldCount(); j++) { rrenkert@116: rendererElement.setAttribute( rrenkert@116: "expression_field_" + j, rrenkert@116: renderer.getField(j)); rrenkert@116: } rrenkert@116: rendererElement.setAttribute("expression_operator", "="); rrenkert@74: rrenkert@116: ISymbol sym = renderer.getSymbol(value); rrenkert@116: MarkerSymbolReader markerReader = new MarkerSymbolReader(); rrenkert@116: LineSymbolReader lineReader = new LineSymbolReader(); rrenkert@116: FillSymbolReader fillReader = new FillSymbolReader(); rrenkert@116: if(markerReader.canRead(sym)) { rrenkert@116: markerReader.setSymbol(sym); rrenkert@116: markerReader.setUtil(util); rrenkert@116: markerReader.setParent(rendererElement); rrenkert@116: markerReader.read(); rrenkert@116: } rrenkert@116: else if(lineReader.canRead(sym)) { rrenkert@116: lineReader.setSymbol(sym); rrenkert@116: lineReader.setUtil(util); rrenkert@116: lineReader.setParent(rendererElement); rrenkert@116: lineReader.read(); rrenkert@116: } rrenkert@116: else if(fillReader.canRead(sym)) { rrenkert@116: fillReader.setSymbol(sym); rrenkert@116: fillReader.setUtil(util); rrenkert@116: fillReader.setParent(rendererElement); rrenkert@116: fillReader.read(); rrenkert@116: } rrenkert@116: else { rrenkert@116: logger.debug("Not a known symbol type: " + rrenkert@116: sym.getClass().toString()); rrenkert@116: } rrenkert@74: } rrenkert@116: catch(Exception e) { rrenkert@116: logger.error( rrenkert@116: "Could not read unique value data." + rrenkert@116: e.toString()); rrenkert@116: return layer; rrenkert@31: } rrenkert@31: } rrenkert@31: return layer; rrenkert@25: } rrenkert@25: } rrenkert@25: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :