// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.pgsnapshot.v0_6.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.openstreetmap.osmosis.core.database.DbFeature;
import org.openstreetmap.osmosis.core.store.Storeable;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
/**
* Provides functionality common to all entity feature daos.
*
* @author Brett Henderson
* @param <Tef>
* The entity feature type to be supported.
* @param <Tdb>
* The entity feature database wrapper type to be used.
*/
public class EntityFeatureDao<Tef extends Storeable, Tdb extends DbFeature<Tef>> {
private EntityFeatureMapper<Tdb> entityFeatureMapper;
private JdbcTemplate jdbcTemplate;
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
/**
* Creates a new instance.
*
* @param jdbcTemplate
* Provides access to the database.
* @param entityFeatureMapper
* Provides entity type specific JDBC support.
*/
protected EntityFeatureDao(JdbcTemplate jdbcTemplate, EntityFeatureMapper<Tdb> entityFeatureMapper) {
this.jdbcTemplate = jdbcTemplate;
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
this.entityFeatureMapper = entityFeatureMapper;
}
/**
* Loads all instances of this feature for the specified entity from the database.
*
* @param entityId
* The unique identifier of the entity.
* @return All instances of this feature type for the entity.
*/
public Collection<Tdb> getAll(long entityId) {
return jdbcTemplate.query(entityFeatureMapper.getSqlSelect("", true, true), new Object[] {entityId},
entityFeatureMapper.getRowMapper());
}
/**
* Loads all instances of this feature for the specified entity from the database.
*
* @param entityId
* The unique identifier of the entity.
* @return All instances of this feature type for the entity.
*/
public Collection<Tef> getAllRaw(long entityId) {
Collection<Tdb> dbFeatures;
Collection<Tef> rawFeatures;
dbFeatures = getAll(entityId);
rawFeatures = new ArrayList<Tef>(dbFeatures.size());
for (Tdb dbFeature : dbFeatures) {
rawFeatures.add(dbFeature.getFeature());
}
return rawFeatures;
}
/**
* Adds the specified features to the database.
*
* @param features
* The features to add.
*/
public void addAll(Collection<Tdb> features) {
Map<String, Object> args;
args = new HashMap<String, Object>();
for (Tdb feature : features) {
args.clear();
entityFeatureMapper.populateParameters(args, feature);
namedParameterJdbcTemplate.update(entityFeatureMapper.getSqlInsert(1), args);
}
}
/**
* Removes the specified feature list from the database.
*
* @param entityId
* The id of the entity to remove.
*/
public void removeList(long entityId) {
jdbcTemplate.update(entityFeatureMapper.getSqlDelete(true), entityId);
}
}