// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.apidb.v0_6.impl;
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.task.v0_6.ChangeSink;
/**
* A mocked replication destination allowing the existing replication state to be loaded and the
* current state maintained. All data processing calls such as process will be ignored.
*/
public class MockReplicationDestination implements ChangeSink {
private boolean stateExists;
private ReplicationState currentState;
private Map<String, String> storedState;
/**
* Creates a new instance with no state.
*/
public MockReplicationDestination() {
stateExists = false;
storedState = new HashMap<String, String>();
}
/**
* Creates a new instance with an initial state.
*
* @param initialState
* The initial replication state.
*/
public MockReplicationDestination(ReplicationState initialState) {
this();
initialState.store(storedState);
stateExists = true;
}
/**
* {@inheritDoc}
*/
public void initialize(Map<String, Object> metaData) {
// Get the replication state from the upstream task.
if (!metaData.containsKey(ReplicationState.META_DATA_KEY)) {
throw new OsmosisRuntimeException(
"No replication state has been provided in metadata key " + ReplicationState.META_DATA_KEY + ".");
}
currentState = (ReplicationState) metaData.get(ReplicationState.META_DATA_KEY);
// Initialise the state from the stored state if it exists and increment
// the sequence number.
if (stateExists) {
currentState.load(storedState);
currentState.setSequenceNumber(currentState.getSequenceNumber() + 1);
}
}
/**
* {@inheritDoc}
*/
@Override
public void process(ChangeContainer change) {
// Do nothing.
}
/**
* {@inheritDoc}
*/
@Override
public void complete() {
currentState.store(storedState);
stateExists = true;
}
/**
* {@inheritDoc}
*/
@Override
public void close() {
// Do nothing.
}
/**
* Returns the current state object tracked internally. This will be a state
* object provided by a caller in the initialize method. It will remain
* available after complete and release have been called.
*
* @return The current state.
*/
public ReplicationState getCurrentState() {
return currentState;
}
}