in baremaps-core/src/main/java/org/apache/baremaps/tasks/UpdateOsmDatabase.java [106:180]
static void execute(
Map<Long, Coordinate> coordinateMap,
Map<Long, List<Long>> referenceMap,
HeaderRepository headerRepository,
Repository<Long, Node> nodeRepository,
Repository<Long, Way> wayRepository,
Repository<Long, Relation> relationRepository,
Integer databaseSrid,
String replicationUrl) throws IOException, RepositoryException {
// Get the latest header from the database
var header = headerRepository.selectLatest();
// If the replicationUrl is not provided, use the one from the latest header.
if (replicationUrl == null) {
replicationUrl = header.replicationUrl();
}
// Get the sequence number of the latest header
var stateReader = new StateReader(replicationUrl, true);
var sequenceNumber = header.replicationSequenceNumber();
// If the replicationTimestamp is not provided, guess it from the replication timestamp.
if (sequenceNumber <= 0) {
var replicationTimestamp = header.replicationTimestamp();
var state = stateReader.getStateFromTimestamp(replicationTimestamp);
if (state.isPresent()) {
sequenceNumber = state.get().sequenceNumber();
}
}
// Increment the sequence number and get the changeset url
var nextSequenceNumber = sequenceNumber + 1;
var changeUrl = stateReader.getUrl(replicationUrl, nextSequenceNumber, "osc.gz");
logger.info("Updating the database with the changeset: {}", changeUrl);
// Process the changeset and update the database
var buildNodeGeometry = new NodeGeometryBuilder();
var reprojectNodeGeometry = new EntityProjectionTransformer(4326, databaseSrid);
var prepareNodeGeometry =
new ChangeEntitiesHandler(buildNodeGeometry.andThen(reprojectNodeGeometry));
var importNodes = new ChangeElementsImporter<>(Node.class, nodeRepository);
var buildWayGeometry = new WayGeometryBuilder(coordinateMap);
var reprojectWayGeometry = new EntityProjectionTransformer(4326, databaseSrid);
var prepareWayGeometry =
new ChangeEntitiesHandler(buildWayGeometry.andThen(reprojectWayGeometry));
var importWays = new ChangeElementsImporter<>(Way.class, wayRepository);
var buildRelationGeometry = new RelationMultiPolygonBuilder(coordinateMap, referenceMap);
var reprojectRelationGeometry = new EntityProjectionTransformer(4326, databaseSrid);
var prepareRelationGeometry =
new ChangeEntitiesHandler(buildRelationGeometry.andThen(reprojectRelationGeometry));
var importRelations = new ChangeElementsImporter<>(Relation.class, relationRepository);
var entityProcessor = prepareNodeGeometry
.andThen(importNodes)
.andThen(prepareWayGeometry)
.andThen(importWays)
.andThen(prepareRelationGeometry)
.andThen(importRelations);
try (var changeInputStream =
new GZIPInputStream(new BufferedInputStream(changeUrl.openStream()))) {
new XmlChangeReader().read(changeInputStream).forEach(entityProcessor);
}
// Add the new header to the database
var stateUrl = stateReader.getUrl(replicationUrl, nextSequenceNumber, "state.txt");
try (var stateInputStream = new BufferedInputStream(stateUrl.openStream())) {
var state = new StateReader().read(stateInputStream);
headerRepository.put(new Header(state.sequenceNumber(), state.timestamp(),
header.replicationUrl(), header.source(), header.writingProgram()));
}
}