// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.pgsimple.v0_6; import java.util.HashMap; import java.util.Map; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; import org.openstreetmap.osmosis.core.container.v0_6.ChangeContainer; import org.openstreetmap.osmosis.core.database.DatabaseLoginCredentials; import org.openstreetmap.osmosis.core.database.DatabasePreferences; import org.openstreetmap.osmosis.pgsimple.common.DatabaseContext; import org.openstreetmap.osmosis.pgsimple.common.SchemaVersionValidator; import org.openstreetmap.osmosis.pgsimple.v0_6.impl.ActionChangeWriter; import org.openstreetmap.osmosis.pgsimple.v0_6.impl.ChangeWriter; import org.openstreetmap.osmosis.core.task.common.ChangeAction; import org.openstreetmap.osmosis.core.task.v0_6.ChangeSink; /** * A change sink writing to database tables. This aims to be suitable for * running at regular intervals with database overhead proportional to changeset * size. * * @author Brett Henderson */ public class PostgreSqlChangeWriter implements ChangeSink { private ChangeWriter changeWriter; private Map<ChangeAction, ActionChangeWriter> actionWriterMap; private DatabaseContext dbCtx; private SchemaVersionValidator schemaVersionValidator; /** * Creates a new instance. * * @param loginCredentials * Contains all information required to connect to the database. * @param preferences * Contains preferences configuring database behaviour. */ public PostgreSqlChangeWriter(DatabaseLoginCredentials loginCredentials, DatabasePreferences preferences) { dbCtx = new DatabaseContext(loginCredentials); changeWriter = new ChangeWriter(dbCtx); actionWriterMap = new HashMap<ChangeAction, ActionChangeWriter>(); actionWriterMap.put(ChangeAction.Create, new ActionChangeWriter(changeWriter, ChangeAction.Create)); actionWriterMap.put(ChangeAction.Modify, new ActionChangeWriter(changeWriter, ChangeAction.Modify)); actionWriterMap.put(ChangeAction.Delete, new ActionChangeWriter(changeWriter, ChangeAction.Delete)); schemaVersionValidator = new SchemaVersionValidator(dbCtx, preferences); } /** * {@inheritDoc} */ public void initialize(Map<String, Object> metaData) { // Do nothing. } /** * {@inheritDoc} */ public void process(ChangeContainer change) { ChangeAction action; // Verify that the schema version is supported. schemaVersionValidator.validateVersion(PostgreSqlVersionConstants.SCHEMA_VERSION); action = change.getAction(); if (!actionWriterMap.containsKey(action)) { throw new OsmosisRuntimeException("The action " + action + " is unrecognized."); } // Process the entity using the action writer appropriate for the change // action. change.getEntityContainer().process(actionWriterMap.get(action)); } /** * {@inheritDoc} */ public void complete() { changeWriter.complete(); dbCtx.commit(); } /** * {@inheritDoc} */ public void close() { changeWriter.release(); dbCtx.close(); } }