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 java.io.IOException; rrenkert@25: rrenkert@25: import org.apache.log4j.Logger; rrenkert@25: rrenkert@25: import com.esri.arcgis.carto.ILayer; rrenkert@25: import com.esri.arcgis.carto.IMap; rrenkert@25: import com.esri.arcgis.carto.MapDocument; rrenkert@25: import com.esri.arcgis.carto.FeatureLayer; aheinecke@315: import com.esri.arcgis.carto.CompositeGraphicsLayer; rrenkert@36: import com.esri.arcgis.carto.GdbRasterCatalogLayer; rrenkert@25: import com.esri.arcgis.carto.IFeatureRenderer; rrenkert@25: import com.esri.arcgis.carto.SimpleRenderer; rrenkert@25: import com.esri.arcgis.carto.ClassBreaksRenderer; rrenkert@25: import com.esri.arcgis.carto.UniqueValueRenderer; vc11884admin@148: import com.esri.arcgis.carto.GroupLayer; aheinecke@301: import com.esri.arcgis.carto.WMSMapLayer; aheinecke@301: import com.esri.arcgis.carto.WMSGroupLayer; aheinecke@301: import com.esri.arcgis.carto.WMSLayer; aheinecke@303: import com.esri.arcgis.carto.RasterLayer; aheinecke@315: import com.esri.arcgis.carto.IGraphicsLayerProxy; aheinecke@315: import com.esri.arcgis.carto.IGraphicsLayer; rrenkert@25: rrenkert@27: import org.w3c.dom.Document; rrenkert@27: import org.w3c.dom.Element; rrenkert@27: rrenkert@33: import de.intevation.mxd.ArcGISInitializer; rrenkert@33: import de.intevation.mxd.utils.MapToXMLUtils; rrenkert@33: rrenkert@25: /** rrenkert@25: * The MXD file reader. rrenkert@25: * rrenkert@25: * @author Raimund Renkert rrenkert@25: */ rrenkert@43: public class MXDReader rrenkert@43: implements IReader { rrenkert@43: /** rrenkert@43: * The Logger. rrenkert@43: */ rrenkert@43: private static final Logger logger = Logger.getLogger(MXDReader.class); rrenkert@25: rrenkert@43: /** rrenkert@43: * Private member. rrenkert@43: */ rrenkert@25: private String filename = ""; rrenkert@25: private ArcGISInitializer initializer = null; rrenkert@40: private MapToXMLUtils util; rrenkert@25: private IMap map; rrenkert@118: private int invalidLayerCount; rrenkert@25: rrenkert@181: /** rrenkert@181: * Default constructor. rrenkert@181: */ rrenkert@43: public MXDReader() rrenkert@43: throws IOException { rrenkert@25: logger.debug("constructor()"); rrenkert@25: initializer = new ArcGISInitializer(); rrenkert@40: util = new MapToXMLUtils(); rrenkert@118: invalidLayerCount = 0; rrenkert@25: } rrenkert@25: rrenkert@25: rrenkert@25: /** rrenkert@25: * Initialize the ArcGIS Objects. rrenkert@25: */ rrenkert@43: public boolean init() rrenkert@43: throws IOException { rrenkert@25: logger.debug("init()"); rrenkert@103: if(!initializer.initArcGIS()) { rrenkert@103: return false; rrenkert@103: } rrenkert@103: if(!initializer.initArcGISLicenses()) { rrenkert@103: return false; rrenkert@103: } rrenkert@25: return true; rrenkert@25: } rrenkert@25: rrenkert@25: /** rrenkert@25: * Shutdown the ArcGIS Objects. rrenkert@25: */ rrenkert@43: public boolean shutdown() rrenkert@43: throws IOException { rrenkert@25: logger.debug("shutdown()"); rrenkert@43: if(initializer == null) { rrenkert@25: throw new IOException("Faild to shutdown!"); rrenkert@25: } rrenkert@43: else { rrenkert@25: initializer.shutdownArcGIS(); rrenkert@25: return true; rrenkert@25: } rrenkert@25: } rrenkert@25: rrenkert@25: /** rrenkert@25: * Set the path and filename to the MXD-File. rrenkert@181: * rrenkert@181: * @param name The MXD filename. rrenkert@25: */ rrenkert@43: public void setFilename(String name) { rrenkert@25: logger.debug("setFilename()"); rrenkert@25: filename = name; rrenkert@25: } rrenkert@25: rrenkert@181: /** rrenkert@181: * Get the map document from MXD. rrenkert@181: */ rrenkert@43: private void openMapDocument() rrenkert@43: throws IOException { rrenkert@27: MapDocument m = new MapDocument(); rrenkert@43: if(!m.isMapDocument(filename)) { rrenkert@27: throw new IOException(filename + " is not a map!"); rrenkert@27: } rrenkert@27: m.open(filename, null); rrenkert@27: map = m.getMap(0); rrenkert@27: } rrenkert@43: rrenkert@25: /** rrenkert@25: * Read the MXD file content. rrenkert@25: */ rrenkert@43: public boolean read() rrenkert@121: throws Exception { rrenkert@25: logger.debug("read()"); aheinecke@312: if(filename.isEmpty()) { rrenkert@25: throw new IOException("Please set filename!"); rrenkert@25: } aheinecke@313: util.addFilename(filename); aheinecke@313: openMapDocument(); aheinecke@313: MapReader mreader; aheinecke@313: try { aheinecke@313: mreader = new MapReader (map); aheinecke@313: mreader.setUtil(util); aheinecke@313: mreader.read(); aheinecke@313: aheinecke@313: } aheinecke@313: catch(Exception e) { aheinecke@313: throw e; aheinecke@313: } aheinecke@315: try { aheinecke@315: IGraphicsLayer grLayer = (IGraphicsLayer) map.getActiveGraphicsLayer(); aheinecke@315: if (map.getActiveGraphicsLayer() instanceof CompositeGraphicsLayer) { aheinecke@315: CompositeGraphicsLayerReader lr = new CompositeGraphicsLayerReader(grLayer); aheinecke@315: lr.setUtil(util); aheinecke@315: Element graphicsLayers = lr.read(); aheinecke@315: } else { aheinecke@315: logger.debug("Not a known graphics layer type: " + aheinecke@315: grLayer.getClass().toString()); aheinecke@315: } aheinecke@315: } aheinecke@315: catch(Exception e) { aheinecke@315: logger.debug("Error reading graphics layer"); aheinecke@315: logger.debug(e); aheinecke@315: } aheinecke@313: aheinecke@313: for(int i = 0; i < map.getLayerCount();i++) { aheinecke@313: ILayer layer = map.getLayer(i); rrenkert@40: try { aheinecke@313: if (layer instanceof FeatureLayer) { aheinecke@313: FeatureLayerReader lr = new FeatureLayerReader(layer); aheinecke@313: lr.setUtil(util); aheinecke@313: Element layerElement = lr.read(); aheinecke@313: if (layerElement == null) { aheinecke@313: continue; aheinecke@313: } aheinecke@313: IFeatureRenderer renderer = aheinecke@313: ((FeatureLayer)layer).getRenderer(); aheinecke@313: IRendererReader rreader; aheinecke@313: if(renderer instanceof SimpleRenderer) { aheinecke@313: rreader = new SimpleRendererReader(renderer); aheinecke@313: rreader.setParent(layerElement); aheinecke@313: rreader.setUtil(util); aheinecke@313: rreader.read(); aheinecke@313: } aheinecke@313: else if(renderer instanceof ClassBreaksRenderer) { aheinecke@313: rreader = new ClassBreakRendererReader(renderer); aheinecke@313: rreader.setParent(layerElement); aheinecke@313: rreader.setUtil(util); aheinecke@313: rreader.read(); aheinecke@313: } aheinecke@313: else if(renderer instanceof UniqueValueRenderer) { aheinecke@313: rreader = new UniqueValueRendererReader(renderer); aheinecke@313: rreader.setParent(layerElement); aheinecke@313: rreader.setUtil(util); aheinecke@313: rreader.read(); aheinecke@313: } aheinecke@313: else{ aheinecke@313: logger.debug("Not a known renderer type " + aheinecke@313: renderer.getClass().toString()); aheinecke@313: } aheinecke@313: } aheinecke@313: else if(layer instanceof GdbRasterCatalogLayer) { aheinecke@313: GdbRasterCatalogLayerReader gclr = aheinecke@313: new GdbRasterCatalogLayerReader(layer); aheinecke@313: gclr.setUtil(util); aheinecke@313: Element layerElement = gclr.read(); aheinecke@313: IFeatureRenderer renderer = aheinecke@313: ((GdbRasterCatalogLayer)layer).getRenderer(); aheinecke@313: IRendererReader rreader; aheinecke@313: if(renderer instanceof SimpleRenderer) { aheinecke@313: rreader = new SimpleRendererReader(renderer); aheinecke@313: rreader.setParent(layerElement); aheinecke@313: rreader.setUtil(util); aheinecke@313: rreader.read(); aheinecke@313: } aheinecke@313: else if(renderer instanceof ClassBreaksRenderer) { aheinecke@313: rreader = new ClassBreakRendererReader(renderer); aheinecke@313: rreader.setParent(layerElement); aheinecke@313: rreader.setUtil(util); aheinecke@313: rreader.read(); aheinecke@313: } aheinecke@313: else if(renderer instanceof UniqueValueRenderer) { aheinecke@313: rreader = new UniqueValueRendererReader(renderer); aheinecke@313: rreader.setParent(layerElement); aheinecke@313: rreader.setUtil(util); aheinecke@313: rreader.read(); aheinecke@313: } aheinecke@313: else { aheinecke@313: logger.debug("Not a known renderer type " + aheinecke@313: renderer.getClass().toString()); aheinecke@313: } aheinecke@313: } aheinecke@313: else if(layer instanceof GroupLayer) { aheinecke@313: GroupLayerReader gl = new GroupLayerReader(layer); aheinecke@313: gl.setUtil(util); aheinecke@313: Element layerElement = gl.read(""); aheinecke@313: if(layerElement == null) { aheinecke@313: throw new IOException ("Error reading grouplayer."); aheinecke@313: } aheinecke@313: } aheinecke@313: else if(layer instanceof WMSMapLayer) { aheinecke@313: WMSMapLayerReader lr = new WMSMapLayerReader(layer); aheinecke@313: lr.setUtil(util); aheinecke@313: Element layerElement = lr.read(""); aheinecke@313: if(layerElement == null) { aheinecke@313: throw new IOException ("Error reading WMSMapLayer."); aheinecke@313: } aheinecke@313: } aheinecke@313: else if(layer instanceof WMSGroupLayer) { aheinecke@313: WMSGroupLayerReader lr = new WMSGroupLayerReader(layer); aheinecke@313: lr.setUtil(util); aheinecke@313: Element layerElement = lr.read(""); aheinecke@313: if(layerElement == null) { aheinecke@313: throw new IOException ("Error reading WMSGrouplayer."); aheinecke@313: } aheinecke@313: } aheinecke@313: else if(layer instanceof WMSLayer) { aheinecke@313: WMSLayerReader lr = new WMSLayerReader(layer); aheinecke@313: lr.setUtil(util); aheinecke@313: Element layerElement = lr.read(); aheinecke@313: if(layerElement == null) { aheinecke@313: throw new IOException ("Error reading WMSlayer."); aheinecke@313: } aheinecke@313: } aheinecke@313: else if(layer instanceof RasterLayer) { aheinecke@313: RasterLayerReader lr = aheinecke@313: new RasterLayerReader(layer); aheinecke@313: lr.setUtil(util); aheinecke@313: Element layerElement = lr.read(); aheinecke@313: if(layerElement == null) { aheinecke@313: throw new IOException ("Error reading RasterLayer."); aheinecke@313: } aheinecke@313: /* TODO implement support for classes in Raster Layers aheinecke@313: IRasterRenderer renderer = aheinecke@313: ((RasterLayer)layer).getRenderer(); aheinecke@313: IRendererReader rreader; aheinecke@313: if(renderer instanceof SimpleRenderer) { aheinecke@313: rreader = new SimpleRendererReader(renderer); aheinecke@313: rreader.setParent(layerElement); aheinecke@313: rreader.setUtil(util); aheinecke@313: rreader.read(); aheinecke@313: } aheinecke@313: else if(renderer instanceof ClassBreaksRenderer) { aheinecke@313: rreader = new ClassBreakRendererReader(renderer); aheinecke@313: rreader.setParent(layerElement); aheinecke@313: rreader.setUtil(util); aheinecke@313: rreader.read(); aheinecke@313: } aheinecke@313: else if(renderer instanceof UniqueValueRenderer) { aheinecke@313: rreader = new UniqueValueRendererReader(renderer); aheinecke@313: rreader.setParent(layerElement); aheinecke@313: rreader.setUtil(util); aheinecke@313: rreader.read(); aheinecke@313: } aheinecke@313: else { aheinecke@313: logger.debug("Not a known renderer type " + aheinecke@313: renderer.getClass().toString()); aheinecke@313: } aheinecke@313: */ aheinecke@313: } aheinecke@313: else { aheinecke@313: logger.info( aheinecke@313: "Layertype not known: " + aheinecke@313: layer.getClass().toString()); aheinecke@313: } rrenkert@40: } rrenkert@40: catch(Exception e) { aheinecke@313: invalidLayerCount++; aheinecke@313: if(i == 0 && (i + 1) == map.getLayerCount() || aheinecke@313: invalidLayerCount == map.getLayerCount()) { aheinecke@313: throw new IOException( aheinecke@313: "No valid layer in MXD file." + aheinecke@313: " Aborting."); rrenkert@25: } rrenkert@25: } rrenkert@25: } rrenkert@25: return true; rrenkert@25: } rrenkert@25: rrenkert@43: /** rrenkert@43: * Get the root DOM document. rrenkert@43: */ rrenkert@43: public Document getMapDocument() { rrenkert@27: logger.debug("getMapDocument()"); rrenkert@40: return util.getDocument(); rrenkert@25: } rrenkert@25: } rrenkert@25: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :