// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.pgsimple.v0_6.impl; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Date; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; import org.openstreetmap.osmosis.core.domain.v0_6.CommonEntityData; import org.openstreetmap.osmosis.core.domain.v0_6.Node; import org.openstreetmap.osmosis.pgsimple.common.PointBuilder; import org.postgis.PGgeometry; import org.postgis.Point; /** * Reads and writes node attributes to jdbc classes. * * @author Brett Henderson */ public class NodeMapper extends EntityMapper<Node> { private PointBuilder pointBuilder; /** * Creates a new instance. */ public NodeMapper() { pointBuilder = new PointBuilder(); } /** * {@inheritDoc} */ @Override public String getEntityName() { return "node"; } /** * {@inheritDoc} */ @Override public ActionDataType getEntityType() { return ActionDataType.NODE; } /** * {@inheritDoc} */ @Override public Class<Node> getEntityClass() { return Node.class; } /** * {@inheritDoc} */ @Override protected String[] getTypeSpecificFieldNames() { return new String[] {"geom"}; } /** * {@inheritDoc} */ @Override public Node parseRecord(ResultSet resultSet) { try { PGgeometry geom; Point point; geom = (PGgeometry) resultSet.getObject("geom"); point = (Point) geom.getGeometry(); return new Node( new CommonEntityData( resultSet.getLong("id"), resultSet.getInt("version"), new Date(resultSet.getTimestamp("tstamp").getTime()), buildUser(resultSet), resultSet.getLong("changeset_id") ), point.y, point.x ); } catch (SQLException e) { throw new OsmosisRuntimeException("Unable to build a node from the current recordset row.", e); } } /** * {@inheritDoc} */ @Override public int populateEntityParameters(PreparedStatement statement, int initialIndex, Node node) { int prmIndex; // Populate the entity level parameters. prmIndex = populateCommonEntityParameters(statement, initialIndex, node); try { // Set the node level parameters. statement.setObject( prmIndex++, new PGgeometry(pointBuilder.createPoint(node.getLatitude(), node.getLongitude()))); } catch (SQLException e) { throw new OsmosisRuntimeException( "Unable to set a prepared statement parameter for node " + node.getId() + ".", e); } return prmIndex; } }