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.ILayer; rrenkert@25: import com.esri.arcgis.carto.FeatureLayer; rrenkert@42: import com.esri.arcgis.geodatabase.FeatureClassName; rrenkert@42: import com.esri.arcgis.system.IName; vc11884admin@113: import com.esri.arcgis.system.IPropertySet; rrenkert@29: import org.w3c.dom.Element; rrenkert@29: rrenkert@33: import de.intevation.mxd.utils.MapToXMLUtils; rrenkert@117: import java.io.IOException; rrenkert@33: rrenkert@25: /** rrenkert@43: * Reads Layer information. rrenkert@25: * rrenkert@25: * @author Raimund Renkert rrenkert@25: */ rrenkert@43: public class FeatureLayerReader rrenkert@43: implements ILayerReader { 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: * Privte member. rrenkert@31: */ rrenkert@29: private FeatureLayer layer; rrenkert@31: private MapToXMLUtils util; rrenkert@25: rrenkert@31: rrenkert@31: public FeatureLayerReader(ILayer layer) rrenkert@31: throws Exception { rrenkert@43: if(layer instanceof FeatureLayer) { rrenkert@29: this.layer = (FeatureLayer)layer; rrenkert@43: } rrenkert@43: else { rrenkert@29: throw new Exception("Not an instance of FeatureLayer: " + rrenkert@31: layer.getClass().toString()); rrenkert@43: } rrenkert@25: } rrenkert@25: rrenkert@25: /** rrenkert@31: * Setter for XML document helper. rrenkert@31: * rrenkert@31: * @param util The helper for storing map information. rrenkert@29: */ rrenkert@43: public void setUtil(MapToXMLUtils util) { rrenkert@31: this.util = util; rrenkert@29: } rrenkert@29: rrenkert@29: /** rrenkert@25: * Reads the Layer content. rrenkert@31: * rrenkert@31: * @return The layer XML element. rrenkert@25: */ rrenkert@118: public Element read() rrenkert@118: throws IOException{ rrenkert@25: logger.debug("read()"); rrenkert@117: Element layerElement; rrenkert@117: try { rrenkert@117: layerElement = util.addLayer(); rrenkert@117: } rrenkert@117: catch(Exception e) { rrenkert@117: logger.error("Failed to create DOM-Element for Layer."); rrenkert@118: throw new IOException( rrenkert@118: this.getClass()+toString() + rrenkert@118: "Error creating dom element"); rrenkert@117: } rrenkert@25: rrenkert@117: try { rrenkert@117: layerElement.setAttribute("name", layer.getName()); rrenkert@117: } rrenkert@117: catch(IOException ioe) { rrenkert@117: logger.warn( rrenkert@117: "Could not read name." + rrenkert@117: " Setting name to \"default-layer\""); rrenkert@117: layerElement.setAttribute("name", "default-layer"); rrenkert@117: } rrenkert@117: rrenkert@117: try { rrenkert@117: layerElement.setAttribute("min_scale", rrenkert@117: String.valueOf(layer.getMinimumScale())); rrenkert@117: } rrenkert@117: catch(IOException ioe) { rrenkert@117: logger.warn( rrenkert@117: "Could not read minimum scale." + rrenkert@117: " Setting minimum scale to 0."); rrenkert@117: layerElement.setAttribute("min_scale", "0"); rrenkert@117: } rrenkert@117: rrenkert@117: try { rrenkert@117: layerElement.setAttribute("max_scale", rrenkert@117: String.valueOf(layer.getMaximumScale())); rrenkert@117: } rrenkert@117: catch(IOException ioe) { rrenkert@117: logger.warn( rrenkert@117: "Could not read maximum scale." + rrenkert@117: " Setting maximum scale to 0."); rrenkert@117: layerElement.setAttribute("max_scale", "0"); rrenkert@117: } rrenkert@117: rrenkert@117: try { rrenkert@117: if(layer.isVisible()) { rrenkert@117: layerElement.setAttribute("status", "on"); rrenkert@117: } rrenkert@117: else { rrenkert@117: layerElement.setAttribute("status", "off"); rrenkert@117: } rrenkert@117: } rrenkert@117: catch(IOException ioe) { rrenkert@117: logger.warn( rrenkert@117: "Could not read layer status." + rrenkert@117: " Setting layer status to \"on\"."); rrenkert@31: layerElement.setAttribute("status", "on"); rrenkert@25: } rrenkert@117: rrenkert@117: int type = 0; rrenkert@117: try { rrenkert@117: type = layer.getShapeType(); rrenkert@25: } rrenkert@117: catch(IOException ioe) { rrenkert@117: logger.warn( rrenkert@117: "Could not read shape type." + rrenkert@117: " Setting shape type to \"none\"."); rrenkert@117: type = 0; rrenkert@117: } rrenkert@40: switch (type) { rrenkert@62: case 0: layerElement.setAttribute("type", "none"); break; rrenkert@62: case 1: layerElement.setAttribute("type", "point"); break; rrenkert@62: case 3: layerElement.setAttribute("type", "line"); break; rrenkert@97: case 4: layerElement.setAttribute("type", "polygon"); break; rrenkert@40: } rrenkert@40: rrenkert@117: try { rrenkert@117: layerElement.setAttribute("definition_query", rrenkert@117: layer.getDefinitionExpression()); rrenkert@42: } rrenkert@117: catch(IOException ioe) { rrenkert@117: logger.warn( rrenkert@117: "Could not read definition query." + rrenkert@117: " Setting empty definition query."); rrenkert@117: layerElement.setAttribute("definition_query", ""); rrenkert@117: } rrenkert@117: try { rrenkert@117: IName fcn = layer.getDataSourceName(); rrenkert@117: if(fcn instanceof FeatureClassName) { rrenkert@117: FeatureClassName name = (FeatureClassName)fcn; rrenkert@117: layerElement.setAttribute("data_source", name.getName()); rrenkert@117: } rrenkert@117: else { rrenkert@117: logger.debug ( rrenkert@117: "Unknown FeatureClass name:" + rrenkert@117: fcn.getClass().toString()); rrenkert@117: } rrenkert@117: } rrenkert@117: catch(IOException ioe) { rrenkert@117: logger.warn("Could not read datasource. Stopped reading layer."); rrenkert@118: throw new IOException( rrenkert@118: this.getClass().toString() + rrenkert@118: "Error reading datasource."); rrenkert@100: } rrenkert@31: rrenkert@117: try { rrenkert@117: String datatype = layer.getDataSourceType(); rrenkert@117: if(datatype.equals("Shapefile Feature Class")) { rrenkert@117: layerElement.setAttribute("connection_type", "local"); rrenkert@117: layerElement.setAttribute( rrenkert@117: "workspace", rrenkert@117: layer.getWorkspace().getPathName()); rrenkert@117: } rrenkert@117: else if(datatype.equals("File Geodatabase Feature Class")){ rrenkert@117: layerElement.setAttribute("connection_type", "ogr"); rrenkert@117: layerElement.setAttribute("data", layer.getFeatureClass().getFeatureDataset().getName()); rrenkert@117: layerElement.setAttribute( rrenkert@117: "workspace", rrenkert@117: layer.getWorkspace().getPathName()); rrenkert@100: rrenkert@117: } rrenkert@117: else if(datatype.equals("SDE Feature Class")) { rrenkert@117: IPropertySet set = layer.getWorkspace().getConnectionProperties(); rrenkert@117: Object names[] = new Object[set.getCount()]; rrenkert@117: Object prop[] = new Object[set.getCount()]; rrenkert@117: set.getAllProperties(names, prop); rrenkert@117: layerElement.setAttribute("connection_type", "SDE"); rrenkert@117: for(int i = 0; i < names.length; i++) { rrenkert@117: if(names[i] != null) { rrenkert@117: String[] prop_names = (String[])names[i]; rrenkert@117: for(int j = 0; j < prop_names.length; j++) { rrenkert@117: layerElement.setAttribute( rrenkert@117: prop_names[j].toLowerCase(), rrenkert@117: set.getProperty(prop_names[j]).toString()); rrenkert@117: } vc11884admin@113: } vc11884admin@113: } vc11884admin@130: layerElement.setAttribute( vc11884admin@130: "join_table", vc11884admin@130: layer.getRelationshipClass() vc11884admin@130: .getOriginClass().getAliasName()); vc11884admin@130: layerElement.setAttribute( vc11884admin@130: "join_field", vc11884admin@130: layer.getRelationshipClass().getOriginPrimaryKey()); vc11884admin@130: layerElement.setAttribute( vc11884admin@130: "join_table_target", vc11884admin@130: layer.getRelationshipClass() vc11884admin@130: .getDestinationClass().getAliasName()); vc11884admin@130: layerElement.setAttribute( vc11884admin@130: "join_field_target", vc11884admin@130: layer.getRelationshipClass().getOriginForeignKey()); vc11884admin@113: } rrenkert@100: } rrenkert@117: catch(Exception e) { rrenkert@117: logger.error( rrenkert@117: "Could not read layer datasource." + rrenkert@117: " Stopped reading layer."); rrenkert@118: throw new IOException( rrenkert@118: this.getClass().toString() + rrenkert@118: " Error reading data source."); rrenkert@117: } rrenkert@31: return layerElement; rrenkert@25: } rrenkert@25: } rrenkert@25: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :