static void execute()

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()));
    }
  }