/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2003-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.data.postgis.attributeio; import java.io.IOException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import org.geotools.data.DataSourceException; import org.geotools.data.jdbc.attributeio.AttributeIO; import org.geotools.geometry.jts.WKTReader2; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; import com.vividsolutions.jts.io.WKTWriter; /** * An attribute IO object that can read and write geometries encoded into * EWKT format. * * @since @2.4.1 Read/Write EWKT * @author jgarnett * @source $URL$ */ public class EWKTAttributeIO implements AttributeIO { WKTReader reader; WKTWriter writer; /** * Lazily initialize the WKTReader */ private WKTReader getWKTReader() { if (reader == null) { reader = new WKTReader2(); } return reader; } /** * Lazily initialize the WKTWriter * */ private WKTWriter getWKTWriter() { if (writer == null) { writer = new WKTWriter(); } return writer; } /** * @see org.geotools.data.jdbc.attributeio.AttributeIO#read(java.sql.ResultSet, * int) */ public Object read(ResultSet rs, int position) throws IOException { try { String wkt = rs.getString(position); if (wkt == null || wkt.equals("")) { return null; } int srid = 0; // unknown! // we must be in EWKT mode int split = wkt.indexOf(";"); srid = Integer.parseInt( wkt.substring(5,split)); wkt = wkt.substring(split+1); Geometry geom = getWKTReader().read(wkt); geom.setSRID( srid ); return geom; } catch (SQLException e) { throw new DataSourceException("Sql reading problem", e); } catch (ParseException e) { throw new DataSourceException("Could not parse WKT", e); } } /** * @see org.geotools.data.jdbc.attributeio.AttributeIO#write(java.sql.ResultSet, * int, java.lang.Object) */ public void write(ResultSet rs, int position, Object value) throws IOException { try { if (value == null) { rs.updateNull(position); } else { Geometry g = (Geometry) value; String wkt = getWKTWriter().write(g); String ewkt = "SRID="+g.getSRID()+";"+wkt; rs.updateString(position, ewkt); } } catch (Exception e) { throw new DataSourceException("Sql writing problem", e); } } /** * @see org.geotools.data.jdbc.attributeio.AttributeIO#write(java.sql.ResultSet, * int, java.lang.Object) */ public void write(PreparedStatement ps, int position, Object value) throws IOException { try { if (value == null) { ps.setNull(position, Types.VARCHAR); } else { Geometry g = (Geometry) value; String wkt = getWKTWriter().write(g); String ewkt = "SRID="+g.getSRID()+";"+wkt; ps.setString(position, ewkt); } } catch (Exception e) { throw new DataSourceException("Sql writing problem", e); } } }