// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.replication.v0_6; import java.io.File; import java.util.Map; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; import org.openstreetmap.osmosis.core.container.v0_6.ChangeContainer; import org.openstreetmap.osmosis.core.sort.v0_6.ChangeForStreamableApplierComparator; import org.openstreetmap.osmosis.core.sort.v0_6.ChangeSorter; import org.openstreetmap.osmosis.core.task.v0_6.ChangeSink; import org.openstreetmap.osmosis.core.task.v0_6.RunnableChangeSource; import org.openstreetmap.osmosis.replication.common.ReplicationState; import org.openstreetmap.osmosis.xml.v0_6.XmlChangeReader; /** * Downloads a set of replication files from a HTTP server, and merges them into a * single output stream. It tracks the intervals covered by the current files * and stores the current timestamp between invocations forming the basis of a * replication mechanism. * * @author Brett Henderson */ public class ReplicationDownloader extends BaseReplicationDownloader implements RunnableChangeSource { private ChangeSorter changeSorter; /** * Creates a new instance. * * @param workingDirectory * The directory containing configuration and tracking files. */ public ReplicationDownloader(File workingDirectory) { super(workingDirectory); // We will sort all contents prior to sending to the sink. This adds overhead that may not // always be required, but provides consistent behaviour. changeSorter = new ChangeSorter(new ChangeForStreamableApplierComparator()); } /** * {@inheritDoc} */ @Override public void setChangeSink(ChangeSink changeSink) { changeSorter.setChangeSink(changeSink); } /** * {@inheritDoc} */ @Override protected void processInitialize(Map<String, Object> metaData) { changeSorter.initialize(metaData); } /** * {@inheritDoc} */ @Override protected void processInitializeState(ReplicationState initialState) { // We don't allow automatic state file initialization for replication // downloading. This is the most common task used by end users to // retrieve replication information. It is very rare that a user would // want to begin from the latest server state file. In most cases // they'll want to begin processing from a known point in time. throw new OsmosisRuntimeException("The local state.txt file doesn't exist." + " See http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage" + "#--read-replication-interval-init_.28--rrii.29" + " for more details on how to create the state.txt file."); } /** * {@inheritDoc} */ @Override protected void processChangeset(XmlChangeReader xmlReader, ReplicationState replicationState) { final ChangeSink localChangeSink = changeSorter; xmlReader.setChangeSink(new ChangeSink() { private ChangeSink suppressedChangeSink = localChangeSink; @Override public void initialize(Map<String, Object> metaData) { // Suppress the call. } @Override public void process(ChangeContainer change) { suppressedChangeSink.process(change); } @Override public void complete() { // Suppress the call. } @Override public void close() { // Suppress the call. } }); xmlReader.run(); } /** * {@inheritDoc} */ @Override protected void processComplete() { changeSorter.complete(); } /** * {@inheritDoc} */ @Override protected void processRelease() { changeSorter.close(); } }