// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.replicationhttp.v0_6;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.openstreetmap.osmosis.core.container.v0_6.ChangeContainer;
import org.openstreetmap.osmosis.core.container.v0_6.NodeContainer;
import org.openstreetmap.osmosis.core.domain.v0_6.CommonEntityData;
import org.openstreetmap.osmosis.core.domain.v0_6.Node;
import org.openstreetmap.osmosis.core.domain.v0_6.OsmUser;
import org.openstreetmap.osmosis.core.task.common.ChangeAction;
import org.openstreetmap.osmosis.core.task.v0_6.ChangeSink;
import org.openstreetmap.osmosis.core.task.v0_6.ChangeSource;
import org.openstreetmap.osmosis.replication.common.ReplicationState;
/**
* This test task is used for driving test replication data through a
* replication pipeline.
*
* @author Brett Henderson
*/
public class MockReplicationSource implements ChangeSource {
private ChangeSink changeSink;
@Override
public void setChangeSink(ChangeSink changeSink) {
this.changeSink = changeSink;
}
/**
* Sends a replication sequence containing dummy data to the destination.
*/
public void sendSequence() {
// Initialise the replication stream.
ReplicationState state = new ReplicationState();
Map<String, Object> metaData = new HashMap<String, Object>(1);
metaData.put(ReplicationState.META_DATA_KEY, state);
changeSink.initialize(metaData);
// Send the change data unless this is sequence 0 where no data is
// allowed. We'll only send a single record for simplicity.
if (state.getSequenceNumber() > 0) {
// We'll do a create action on the first replication pass, and modify subsequently.
ChangeAction action;
if (state.getSequenceNumber() == 1) {
action = ChangeAction.Create;
} else {
action = ChangeAction.Modify;
}
// Create a change record which data derived from the
// replication sequence number itself.
ChangeContainer change = new ChangeContainer(new NodeContainer(new Node(new CommonEntityData(10,
(int) state.getSequenceNumber(), new Date(state.getSequenceNumber() * 1000), new OsmUser(11,
"test"), state.getSequenceNumber() * 2), state.getSequenceNumber() * 3,
state.getSequenceNumber() * 4)), action);
// Send the record downstream.
changeSink.process(change);
}
state.setTimestamp(new Date(state.getSequenceNumber() * 1000));
changeSink.complete();
}
/**
* Releases all downstream resources.
*/
public void release() {
changeSink.close();
}
}