// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.pgsnapshot.v0_6.impl; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; import java.util.Date; import java.util.Map; import java.util.Map.Entry; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; import org.openstreetmap.osmosis.core.domain.v0_6.CommonEntityData; import org.openstreetmap.osmosis.core.domain.v0_6.Entity; import org.openstreetmap.osmosis.core.domain.v0_6.OsmUser; import org.openstreetmap.osmosis.core.domain.v0_6.Tag; import org.springframework.jdbc.core.RowMapper; /** * Maps database rows into Entity objects. * * @author Brett Henderson * @param <T> * The entity type to be supported. */ public abstract class EntityRowMapper<T extends Entity> implements RowMapper<T> { /** * Creates a new user record based upon the current result set row. * * @param resultSet * The result set to read from. * @return The newly build user object. */ private OsmUser buildUser(ResultSet resultSet) { try { int userId; OsmUser user; userId = resultSet.getInt("user_id"); if (userId == OsmUser.NONE.getId()) { user = OsmUser.NONE; } else { user = new OsmUser( userId, resultSet.getString("user_name") ); } return user; } catch (SQLException e) { throw new OsmosisRuntimeException("Unable to build a user from the current recordset row.", e); } } /** * Retrieves the data common to all entities. * * @param rs * The result set. * @throws SQLException * if a database error is encountered. * @return The common entity data. */ @SuppressWarnings("unchecked") protected CommonEntityData mapCommonEntityData(ResultSet rs) throws SQLException { CommonEntityData entityData; Map<String, String> dbTags; Collection<Tag> tags; entityData = new CommonEntityData( rs.getLong("id"), rs.getInt("version"), new Date(rs.getTimestamp("tstamp").getTime()), buildUser(rs), rs.getLong("changeset_id") ); dbTags = (Map<String, String>) rs.getObject("tags"); if (dbTags != null) { tags = entityData.getTags(); for (Entry<String, String> tagEntry : dbTags.entrySet()) { tags.add(new Tag(tagEntry.getKey(), tagEntry.getValue())); } } return entityData; } }