package com.revolsys.gis.postgresql.type;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import com.revolsys.datatype.DataType;
import com.revolsys.datatype.DataTypes;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.jdbc.field.JdbcFieldDefinition;
import com.revolsys.record.Record;
import com.revolsys.record.property.FieldProperties;
public class PostgreSQLGeometryJdbcFieldDefinition extends JdbcFieldDefinition {
private final int axisCount;
private final GeometryFactory geometryFactory;
private final int srid;
public PostgreSQLGeometryJdbcFieldDefinition(final String dbName, final String name,
final DataType dataType, final boolean required, final String description,
final Map<String, Object> properties, final int srid, final int axisCount,
final GeometryFactory geometryFactory) {
super(dbName, name, dataType, -1, 0, 0, required, description, properties);
this.srid = srid;
this.geometryFactory = geometryFactory;
setProperty(FieldProperties.GEOMETRY_FACTORY, geometryFactory);
this.axisCount = axisCount;
}
@Override
public JdbcFieldDefinition clone() {
return new PostgreSQLGeometryJdbcFieldDefinition(getDbName(), getName(), getDataType(),
isRequired(), getDescription(), getProperties(), this.srid, this.axisCount,
this.geometryFactory);
}
public Object getInsertUpdateValue(final Object object) throws SQLException {
if (object == null) {
return null;
} else if (object instanceof Geometry) {
final Geometry geometry = (Geometry)object;
if (geometry.isEmpty()) {
return geometry;
} else {
final DataType dataType = getDataType();
return new PostgreSQLGeometryWrapper(dataType, this.geometryFactory, geometry);
}
} else if (object instanceof BoundingBox) {
BoundingBox boundingBox = (BoundingBox)object;
boundingBox = boundingBox.convert(this.geometryFactory);
return new PostgreSQLBoundingBoxWrapper(boundingBox);
} else {
return object;
}
}
@Override
public int setFieldValueFromResultSet(final ResultSet resultSet, final int columnIndex,
final Record object) throws SQLException {
final Object postgresValue = resultSet.getObject(columnIndex);
final Object value = toJava(postgresValue);
object.setValue(getIndex(), value);
return columnIndex + 1;
}
@Override
public int setInsertPreparedStatementValue(final PreparedStatement statement,
final int parameterIndex, final Record record) throws SQLException {
final String name = getName();
final Object value = record.getValue(name);
final Object jdbcValue = getInsertUpdateValue(value);
if (jdbcValue == null) {
final int sqlType = getSqlType();
statement.setNull(parameterIndex, sqlType);
} else {
statement.setObject(parameterIndex, jdbcValue);
}
return parameterIndex + 1;
}
@Override
public int setPreparedStatementValue(final PreparedStatement statement, final int parameterIndex,
final Object value) throws SQLException {
final Object jdbcValue = toJdbc(value);
if (jdbcValue == null) {
final int sqlType = getSqlType();
statement.setNull(parameterIndex, sqlType);
} else {
statement.setObject(parameterIndex, jdbcValue);
}
return parameterIndex + 1;
}
public Object toJava(final Object object) throws SQLException {
if (object instanceof PostgreSQLGeometryWrapper) {
final PostgreSQLGeometryWrapper geometryType = (PostgreSQLGeometryWrapper)object;
final Geometry geometry = geometryType.getGeometry(this.geometryFactory);
return geometry;
} else {
return object;
}
}
public Object toJdbc(final Object object) throws SQLException {
if (object instanceof Geometry) {
final Geometry geometry = (Geometry)object;
if (geometry.isEmpty()) {
return null;
} else {
final DataType dataType = DataTypes.GEOMETRY;
return new PostgreSQLGeometryWrapper(dataType, this.geometryFactory, geometry);
}
} else if (object instanceof BoundingBox) {
BoundingBox boundingBox = (BoundingBox)object;
boundingBox = boundingBox.convert(this.geometryFactory);
return new PostgreSQLBoundingBoxWrapper(boundingBox);
} else {
return object;
}
}
}