// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.pgsimple.v0_6.impl; import java.util.ArrayList; import java.util.List; import org.openstreetmap.osmosis.core.database.DbOrderedFeature; import org.openstreetmap.osmosis.core.domain.v0_6.Relation; import org.openstreetmap.osmosis.core.domain.v0_6.RelationMember; import org.openstreetmap.osmosis.core.lifecycle.ReleasableIterator; import org.openstreetmap.osmosis.pgsimple.common.DatabaseContext; /** * Performs all relation-specific db operations. * * @author Brett Henderson */ public class RelationDao extends EntityDao<Relation> { private EntityFeatureDao<RelationMember, DbOrderedFeature<RelationMember>> relationMemberDao; /** * Creates a new instance. * * @param dbCtx * The database context to use for accessing the database. * @param actionDao * The dao to use for adding action records to the database. */ public RelationDao(DatabaseContext dbCtx, ActionDao actionDao) { super(dbCtx, new RelationMapper(), actionDao); relationMemberDao = new EntityFeatureDao<RelationMember, DbOrderedFeature<RelationMember>>( dbCtx, new RelationMemberMapper()); } /** * {@inheritDoc} */ @Override protected void loadFeatures(long entityId, Relation entity) { entity.getMembers().addAll(relationMemberDao.getAllRaw(entityId)); } /** * Adds the specified relation member list to the database. * * @param entityId * The identifier of the entity to add these features to. * @param memberList * The list of features to add. */ private void addMembers(long entityId, List<RelationMember> memberList) { List<DbOrderedFeature<RelationMember>> dbList; dbList = new ArrayList<DbOrderedFeature<RelationMember>>(memberList.size()); for (int i = 0; i < memberList.size(); i++) { dbList.add(new DbOrderedFeature<RelationMember>(entityId, memberList.get(i), i)); } relationMemberDao.addAll(dbList); } /** * {@inheritDoc} */ @Override public void addEntity(Relation entity) { super.addEntity(entity); addMembers(entity.getId(), entity.getMembers()); } /** * {@inheritDoc} */ @Override public void modifyEntity(Relation entity) { long relationId; super.modifyEntity(entity); relationId = entity.getId(); relationMemberDao.removeList(relationId); addMembers(entity.getId(), entity.getMembers()); } /** * {@inheritDoc} */ @Override public void removeEntity(long entityId) { relationMemberDao.removeList(entityId); super.removeEntity(entityId); } /** * {@inheritDoc} */ @Override public ReleasableIterator<Relation> iterate() { return new RelationReader(getDatabaseContext()); } }