package jeql.command.db.driver;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKBReader;
import com.vividsolutions.jts.io.WKTReader;
public class PostgisRowMapper
extends JdbcRowMapper
{
private final WKBReader wkbReader = new WKBReader();
private final WKTReader wktReader = new WKTReader();
public PostgisRowMapper()
{
}
/**
*
* @param rm
* @param colIndex
* @return null if the column type is not handled
* @throws SQLException
*/
protected Class mapColumnType(ResultSetMetaData rsm, int columnIndex)
throws SQLException
{
String dbTypeName = rsm.getColumnTypeName(columnIndex);
if (dbTypeName.equalsIgnoreCase("geometry")
|| dbTypeName.equalsIgnoreCase("bytea"))
return Geometry.class;
if (dbTypeName.equalsIgnoreCase("text"))
return String.class;
return super.mapColumnType(rsm, columnIndex);
}
protected Object mapColumnValue(ResultSet rs, int columnIndex, Class destType)
throws Exception
{
if (destType == Geometry.class) {
// MD- should do some caching here for efficiency
ResultSetMetaData rsm = rs.getMetaData();
String dbTypeName = rsm.getColumnTypeName(columnIndex);
if (dbTypeName.equalsIgnoreCase("geometry")) {
return convertWKBHex(rs.getObject(columnIndex));
}
if (dbTypeName.equalsIgnoreCase("bytea")) {
return convertWKB(rs.getObject(columnIndex));
}
}
return super.mapColumnValue(rs, columnIndex, destType);
}
public Object convertWKT(Object obj) throws IOException, SQLException,
ParseException {
if (obj == null) return null;
String s = obj.toString();
Geometry geom = wktReader.read(s);
return geom;
}
public Object convertWKB(Object obj) throws IOException, SQLException,
ParseException {
if (obj == null) return null;
byte[] bytes = (byte[]) obj;
Geometry geom = wkbReader.read(bytes);
return geom;
}
public Object convertWKBHex(Object obj) throws IOException, SQLException,
ParseException {
if (obj == null) return null;
String hex = obj.toString();
Geometry geom = wkbReader.read(WKBReader.hexToBytes(hex));
// Geometry geom = wkbReader.read(new HexStringInStream(hex));
return geom;
}
}