diff --git a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/ReplicationPluginLoader.java b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/ReplicationPluginLoader.java index 8103208d3..99261440e 100644 --- a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/ReplicationPluginLoader.java +++ b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/ReplicationPluginLoader.java @@ -31,7 +31,7 @@ public class ReplicationPluginLoader implements PluginLoader { public Map loadTaskFactories() { Map factoryMap; - factoryMap = new HashMap(); + factoryMap = new HashMap<>(); factoryMap.put("read-change-interval", new IntervalDownloaderFactory()); factoryMap.put("rci", new IntervalDownloaderFactory()); diff --git a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/BaseReplicationDownloader.java b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/BaseReplicationDownloader.java index 6f46093a8..5570d7719 100644 --- a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/BaseReplicationDownloader.java +++ b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/BaseReplicationDownloader.java @@ -40,11 +40,13 @@ public abstract class BaseReplicationDownloader implements RunnableTask { private static final String LOCK_FILE = "download.lock"; private static final String CONFIG_FILE = "configuration.txt"; private static final String LOCAL_STATE_FILE = "state.txt"; + private static final String CUSTOM_SERVER_STATE_FILE = "custom.state.txt"; private File workingDirectory; private ReplicationSequenceFormatter sequenceFormatter; private ServerStateReader serverStateReader; + private boolean single; /** @@ -52,12 +54,15 @@ public abstract class BaseReplicationDownloader implements RunnableTask { * * @param workingDirectory * The directory containing configuration and tracking files. + * @param single + * Set to true if you want to only replicate a single diff file from the server */ - public BaseReplicationDownloader(File workingDirectory) { + public BaseReplicationDownloader(File workingDirectory, boolean single) { this.workingDirectory = workingDirectory; sequenceFormatter = new ReplicationSequenceFormatter(9, 3); serverStateReader = new ServerStateReader(); + this.single = single; } @@ -236,6 +241,12 @@ private ReplicationState download(ReplicationDownloaderConfiguration configurati // Update the local state to reflect the file state just processed. localState = fileReplicationState; + + // if single is set to true it means that we only want to get a single replication file + // and not up to the current one. + if (single) { + break; + } } return localState; @@ -251,6 +262,17 @@ private void runImpl() { // Instantiate utility objects. configuration = new ReplicationDownloaderConfiguration(new File(workingDirectory, CONFIG_FILE)); + + // check for custom server state file + File customServerStateFile = new File(workingDirectory, CUSTOM_SERVER_STATE_FILE); + if (customServerStateFile.exists()) { + serverState = new ReplicationState(new PropertiesPersister(customServerStateFile).loadMap()); + LOG.info(String.format("Reading custom server state. [%s]", serverState.toString())); + } else { + // Obtain the server state. + serverState = serverStateReader.getServerState(configuration.getBaseUrl()); + LOG.info(String.format("Reading current server state. [%s]", serverState.toString())); + } // Obtain the server state. LOG.fine("Reading current server state."); diff --git a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationDownloader.java b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationDownloader.java index 9baec952f..470f386be 100644 --- a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationDownloader.java +++ b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationDownloader.java @@ -32,9 +32,11 @@ public class ReplicationDownloader extends BaseReplicationDownloader implements * * @param workingDirectory * The directory containing configuration and tracking files. + * @param single + * Set to true if you want to only replicate a single diff file from the server */ - public ReplicationDownloader(File workingDirectory) { - super(workingDirectory); + public ReplicationDownloader(File workingDirectory, boolean single) { + super(workingDirectory, single); // We will sort all contents prior to sending to the sink. This adds overhead that may not // always be required, but provides consistent behaviour. diff --git a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationDownloaderFactory.java b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationDownloaderFactory.java index 76b077be2..f8b79e164 100644 --- a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationDownloaderFactory.java +++ b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationDownloaderFactory.java @@ -9,16 +9,21 @@ * The task manager factory for a replication file downloader. */ public class ReplicationDownloaderFactory extends WorkingTaskManagerFactory { + private static final String ARG_SINGLE = "single"; + private static final boolean DEFAULT_SINGLE = false; /** * {@inheritDoc} */ @Override protected TaskManager createTaskManagerImpl(TaskConfiguration taskConfig) { + boolean single = getBooleanArgument(taskConfig, ARG_SINGLE, DEFAULT_SINGLE); + return new RunnableChangeSourceManager( taskConfig.getId(), new ReplicationDownloader( - this.getWorkingDirectory(taskConfig) + this.getWorkingDirectory(taskConfig), + single ), taskConfig.getPipeArgs() ); diff --git a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationFileMerger.java b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationFileMerger.java index f4f03eedd..cbdb9d563 100644 --- a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationFileMerger.java +++ b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationFileMerger.java @@ -42,9 +42,11 @@ public class ReplicationFileMerger extends BaseReplicationDownloader { * * @param workingDirectory * The directory containing configuration and tracking files. + * @param single + * Set to true if you want to only replicate a single diff file from the server */ - public ReplicationFileMerger(File workingDirectory) { - super(workingDirectory); + public ReplicationFileMerger(File workingDirectory, boolean single) { + super(workingDirectory, single); replicationStore = new FileReplicationStore(new File(getWorkingDirectory(), DATA_DIRECTORY), true); diff --git a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationFileMergerFactory.java b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationFileMergerFactory.java index d21a04f37..441000c0b 100644 --- a/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationFileMergerFactory.java +++ b/osmosis-replication/src/main/java/org/openstreetmap/osmosis/replication/v0_6/ReplicationFileMergerFactory.java @@ -10,16 +10,21 @@ * The task manager factory for a replication file merger. */ public class ReplicationFileMergerFactory extends WorkingTaskManagerFactory { - + private static final String ARG_SINGLE = "single"; + private static final boolean DEFAULT_SINGLE = false; + /** * {@inheritDoc} */ @Override protected TaskManager createTaskManagerImpl(TaskConfiguration taskConfig) { + boolean single = getBooleanArgument(taskConfig, ARG_SINGLE, DEFAULT_SINGLE); + return new RunnableTaskManager( taskConfig.getId(), new ReplicationFileMerger( - this.getWorkingDirectory(taskConfig) + this.getWorkingDirectory(taskConfig), + single ), taskConfig.getPipeArgs() );