/osmosis-apidb/src/main/java/org/openstreetmap/osmosis/apidb/v0_6/ApidbFileReplicator.java

https://github.com/brettch/osmosis · Java · 107 lines · 59 code · 16 blank · 32 comment · 0 complexity · 002b794ce79d2abc26e14f0950528eaa MD5 · raw file

  1. // This software is released into the Public Domain. See copying.txt for details.
  2. package org.openstreetmap.osmosis.apidb.v0_6;
  3. import org.openstreetmap.osmosis.apidb.common.DatabaseContext2;
  4. import org.openstreetmap.osmosis.apidb.v0_6.impl.AllEntityDao;
  5. import org.openstreetmap.osmosis.apidb.v0_6.impl.ReplicationSource;
  6. import org.openstreetmap.osmosis.apidb.v0_6.impl.Replicator;
  7. import org.openstreetmap.osmosis.apidb.v0_6.impl.SchemaVersionValidator;
  8. import org.openstreetmap.osmosis.apidb.v0_6.impl.SystemTimeLoader;
  9. import org.openstreetmap.osmosis.apidb.v0_6.impl.TimeDao;
  10. import org.openstreetmap.osmosis.apidb.v0_6.impl.TransactionDao;
  11. import org.openstreetmap.osmosis.apidb.v0_6.impl.TransactionManager;
  12. import org.openstreetmap.osmosis.core.database.DatabaseLocker;
  13. import org.openstreetmap.osmosis.core.database.DatabaseLoginCredentials;
  14. import org.openstreetmap.osmosis.core.database.DatabasePreferences;
  15. import org.openstreetmap.osmosis.core.task.v0_6.ChangeSink;
  16. import org.openstreetmap.osmosis.core.task.v0_6.RunnableChangeSource;
  17. /**
  18. * Performs replication from an API database into change files.
  19. */
  20. public class ApidbFileReplicator implements RunnableChangeSource {
  21. private DatabaseLoginCredentials loginCredentials;
  22. private DatabasePreferences preferences;
  23. private int iterations;
  24. private int minInterval;
  25. private int maxInterval;
  26. private ChangeSink changeSink;
  27. /**
  28. * Creates a new instance.
  29. *
  30. * @param loginCredentials
  31. * Contains all information required to connect to the database.
  32. * @param preferences
  33. * Contains preferences configuring database behaviour.
  34. * @param iterations
  35. * The number of replication intervals to execute. 0 means
  36. * infinite.
  37. * @param minInterval
  38. * The minimum number of milliseconds between intervals.
  39. * @param maxInterval
  40. * The maximum number of milliseconds between intervals if no new
  41. * data is available. This isn't a hard limit because proces
  42. */
  43. public ApidbFileReplicator(DatabaseLoginCredentials loginCredentials, DatabasePreferences preferences,
  44. int iterations, int minInterval, int maxInterval) {
  45. this.loginCredentials = loginCredentials;
  46. this.preferences = preferences;
  47. this.iterations = iterations;
  48. this.minInterval = minInterval;
  49. this.maxInterval = maxInterval;
  50. }
  51. /**
  52. * {@inheritDoc}
  53. */
  54. @Override
  55. public void setChangeSink(ChangeSink changeSink) {
  56. this.changeSink = changeSink;
  57. }
  58. /**
  59. * Runs the task implementation. This is called by the run method within a transaction.
  60. *
  61. * @param dbCtx
  62. * Used to access the database.
  63. */
  64. protected void runImpl(DatabaseContext2 dbCtx) {
  65. Replicator replicator;
  66. ReplicationSource source;
  67. TransactionManager txnSnapshotLoader;
  68. SystemTimeLoader systemTimeLoader;
  69. new SchemaVersionValidator(loginCredentials, preferences)
  70. .validateVersion(ApidbVersionConstants.SCHEMA_MIGRATIONS);
  71. source = new AllEntityDao(dbCtx.getJdbcTemplate());
  72. txnSnapshotLoader = new TransactionDao(dbCtx);
  73. systemTimeLoader = new TimeDao(dbCtx.getJdbcTemplate());
  74. replicator = new Replicator(source, changeSink, txnSnapshotLoader, systemTimeLoader, iterations, minInterval,
  75. maxInterval);
  76. replicator.replicate();
  77. }
  78. /**
  79. * {@inheritDoc}
  80. */
  81. @Override
  82. public void run() {
  83. try (DatabaseContext2 dbCtx = new DatabaseContext2(loginCredentials);
  84. DatabaseLocker locker = new DatabaseLocker(dbCtx.getDataSource(), false)) {
  85. locker.lockDatabase(this.getClass().getSimpleName());
  86. runImpl(dbCtx);
  87. } catch (final Exception e) {
  88. throw new RuntimeException(e);
  89. }
  90. }
  91. }