You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@baremaps.apache.org by bc...@apache.org on 2022/11/22 15:22:57 UTC

[incubator-baremaps] 05/07: Replace classes with records

This is an automated email from the ASF dual-hosted git repository.

bchapuis pushed a commit to branch instanceof
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git

commit f4ee9ab02092913b212c8597c90297ddde8110d5
Author: Bertil Chapuis <bc...@gmail.com>
AuthorDate: Tue Nov 22 14:02:39 2022 +0100

    Replace classes with records
---
 .../org/apache/baremaps/database/DiffService.java  |  6 +-
 .../baremaps/database/SaveChangeConsumer.java      |  4 +-
 .../repository/PostgresNodeRepository.java         | 16 ++---
 .../repository/PostgresRelationRepository.java     | 29 ++++----
 .../database/repository/PostgresWayRepository.java | 16 ++---
 .../function/ChangeEntitiesConsumer.java           |  2 +-
 .../function/CreateGeometryConsumer.java           |  6 +-
 .../apache/baremaps/openstreetmap/model/Blob.java  | 37 +---------
 .../apache/baremaps/openstreetmap/model/Block.java | 24 +------
 .../apache/baremaps/openstreetmap/model/Bound.java | 61 +----------------
 .../baremaps/openstreetmap/model/Change.java       | 38 +----------
 .../baremaps/openstreetmap/model/DataBlock.java    | 25 +------
 .../baremaps/openstreetmap/model/Element.java      |  1 -
 .../baremaps/openstreetmap/model/Header.java       | 26 +------
 .../baremaps/openstreetmap/model/HeaderBlock.java  | 19 +-----
 .../apache/baremaps/openstreetmap/model/Info.java  | 61 +----------------
 .../baremaps/openstreetmap/model/Member.java       | 79 +++++-----------------
 .../apache/baremaps/openstreetmap/model/User.java  | 34 +---------
 .../openstreetmap/pbf/DataBlockReader.java         |  2 +-
 .../openstreetmap/pbf/HeaderBlockReader.java       |  2 +-
 .../baremaps/openstreetmap/OpenStreetMapTest.java  |  8 +--
 .../xml/XmlChangeSpliteratorTest.java              |  2 +-
 22 files changed, 74 insertions(+), 424 deletions(-)

diff --git a/baremaps-core/src/main/java/org/apache/baremaps/database/DiffService.java b/baremaps-core/src/main/java/org/apache/baremaps/database/DiffService.java
index 14056fc3..824d46ca 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/database/DiffService.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/database/DiffService.java
@@ -95,7 +95,7 @@ public class DiffService implements Callable<List<Tile>> {
   }
 
   private Stream<Geometry> geometriesForChange(Change change) {
-    switch (change.getType()) {
+    switch (change.type()) {
       case CREATE:
         return geometriesForNextVersion(change);
       case DELETE:
@@ -109,7 +109,7 @@ public class DiffService implements Callable<List<Tile>> {
   }
 
   private Stream<Geometry> geometriesForPreviousVersion(Change change) {
-    return change.getEntities().stream().map(this::geometriesForPreviousVersion)
+    return change.entities().stream().map(this::geometriesForPreviousVersion)
         .flatMap(Optional::stream);
   }
 
@@ -133,7 +133,7 @@ public class DiffService implements Callable<List<Tile>> {
   }
 
   private Stream<Geometry> geometriesForNextVersion(Change change) {
-    return change.getEntities().stream()
+    return change.entities().stream()
         .map(consumeThenReturn(new CreateGeometryConsumer(coordinates, references)))
         .flatMap(new ExtractGeometryFunction().andThen(Optional::stream));
   }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/database/SaveChangeConsumer.java b/baremaps-core/src/main/java/org/apache/baremaps/database/SaveChangeConsumer.java
index 59e4a805..fcd5c98a 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/database/SaveChangeConsumer.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/database/SaveChangeConsumer.java
@@ -49,8 +49,8 @@ public class SaveChangeConsumer implements Consumer<Change> {
   @Override
   public void accept(Change change) {
     try {
-      for (Entity entity : change.getEntities()) {
-        switch (change.getType()) {
+      for (Entity entity : change.entities()) {
+        switch (change.type()) {
           case CREATE:
           case MODIFY:
             if (entity instanceof Node node) {
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresNodeRepository.java b/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresNodeRepository.java
index 726c4d0b..5730ea0c 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresNodeRepository.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresNodeRepository.java
@@ -271,10 +271,10 @@ public class PostgresNodeRepository implements Repository<Long, Node> {
         for (Node value : values) {
           writer.startRow(9);
           writer.writeLong(value.getId());
-          writer.writeInteger(value.getInfo().getVersion());
-          writer.writeInteger(value.getInfo().getUid());
-          writer.writeLocalDateTime(value.getInfo().getTimestamp());
-          writer.writeLong(value.getInfo().getChangeset());
+          writer.writeInteger(value.getInfo().version());
+          writer.writeInteger(value.getInfo().uid());
+          writer.writeLocalDateTime(value.getInfo().timestamp());
+          writer.writeLong(value.getInfo().changeset());
           writer.writeJsonb(PostgresJsonbMapper.toJson(value.getTags()));
           writer.writeDouble(value.getLon());
           writer.writeDouble(value.getLat());
@@ -303,10 +303,10 @@ public class PostgresNodeRepository implements Repository<Long, Node> {
   private void setValue(PreparedStatement statement, Node value)
       throws SQLException, JsonProcessingException {
     statement.setObject(1, value.getId());
-    statement.setObject(2, value.getInfo().getVersion());
-    statement.setObject(3, value.getInfo().getUid());
-    statement.setObject(4, value.getInfo().getTimestamp());
-    statement.setObject(5, value.getInfo().getChangeset());
+    statement.setObject(2, value.getInfo().version());
+    statement.setObject(3, value.getInfo().uid());
+    statement.setObject(4, value.getInfo().timestamp());
+    statement.setObject(5, value.getInfo().changeset());
     statement.setObject(6, PostgresJsonbMapper.toJson(value.getTags()));
     statement.setObject(7, value.getLon());
     statement.setObject(8, value.getLat());
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresRelationRepository.java b/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresRelationRepository.java
index d18411af..e9d25c8c 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresRelationRepository.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresRelationRepository.java
@@ -283,17 +283,16 @@ public class PostgresRelationRepository implements Repository<Long, Relation> {
         for (Relation value : values) {
           writer.startRow(10);
           writer.writeLong(value.getId());
-          writer.writeInteger(value.getInfo().getVersion());
-          writer.writeInteger(value.getInfo().getUid());
-          writer.writeLocalDateTime(value.getInfo().getTimestamp());
-          writer.writeLong(value.getInfo().getChangeset());
+          writer.writeInteger(value.getInfo().version());
+          writer.writeInteger(value.getInfo().uid());
+          writer.writeLocalDateTime(value.getInfo().timestamp());
+          writer.writeLong(value.getInfo().changeset());
           writer.writeJsonb(toJson(value.getTags()));
           writer.writeLongList(
-              value.getMembers().stream().map(Member::getRef).collect(Collectors.toList()));
-          writer.writeIntegerList(value.getMembers().stream().map(Member::getType)
+              value.getMembers().stream().map(Member::ref).collect(Collectors.toList()));
+          writer.writeIntegerList(value.getMembers().stream().map(Member::type)
               .map(MemberType::ordinal).collect(Collectors.toList()));
-          writer
-              .write(value.getMembers().stream().map(Member::getRole).collect(Collectors.toList()));
+          writer.write(value.getMembers().stream().map(Member::role).collect(Collectors.toList()));
           writer.writePostgisGeometry(value.getGeometry());
         }
       }
@@ -324,17 +323,17 @@ public class PostgresRelationRepository implements Repository<Long, Relation> {
   private void setValue(PreparedStatement statement, Relation value)
       throws SQLException, JsonProcessingException {
     statement.setObject(1, value.getId());
-    statement.setObject(2, value.getInfo().getVersion());
-    statement.setObject(3, value.getInfo().getUid());
-    statement.setObject(4, value.getInfo().getTimestamp());
-    statement.setObject(5, value.getInfo().getChangeset());
+    statement.setObject(2, value.getInfo().version());
+    statement.setObject(3, value.getInfo().uid());
+    statement.setObject(4, value.getInfo().timestamp());
+    statement.setObject(5, value.getInfo().changeset());
     statement.setObject(6, toJson(value.getTags()));
-    Object[] refs = value.getMembers().stream().map(Member::getRef).toArray();
+    Object[] refs = value.getMembers().stream().map(Member::ref).toArray();
     statement.setObject(7, statement.getConnection().createArrayOf("bigint", refs));
     Object[] types =
-        value.getMembers().stream().map(Member::getType).map(MemberType::ordinal).toArray();
+        value.getMembers().stream().map(Member::type).map(MemberType::ordinal).toArray();
     statement.setObject(8, statement.getConnection().createArrayOf("int", types));
-    Object[] roles = value.getMembers().stream().map(Member::getRole).toArray();
+    Object[] roles = value.getMembers().stream().map(Member::role).toArray();
     statement.setObject(9, statement.getConnection().createArrayOf("varchar", roles));
     statement.setBytes(10, GeometryUtils.serialize(value.getGeometry()));
   }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresWayRepository.java b/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresWayRepository.java
index a198458a..ff8120f6 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresWayRepository.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/database/repository/PostgresWayRepository.java
@@ -273,10 +273,10 @@ public class PostgresWayRepository implements Repository<Long, Way> {
         for (Way value : values) {
           writer.startRow(8);
           writer.writeLong(value.getId());
-          writer.writeInteger(value.getInfo().getVersion());
-          writer.writeInteger(value.getInfo().getUid());
-          writer.writeLocalDateTime(value.getInfo().getTimestamp());
-          writer.writeLong(value.getInfo().getChangeset());
+          writer.writeInteger(value.getInfo().version());
+          writer.writeInteger(value.getInfo().uid());
+          writer.writeLocalDateTime(value.getInfo().timestamp());
+          writer.writeLong(value.getInfo().changeset());
           writer.writeJsonb(PostgresJsonbMapper.toJson(value.getTags()));
           writer.writeLongList(value.getNodes());
           writer.writePostgisGeometry(value.getGeometry());
@@ -307,10 +307,10 @@ public class PostgresWayRepository implements Repository<Long, Way> {
   private void setValue(PreparedStatement statement, Way value)
       throws SQLException, JsonProcessingException {
     statement.setObject(1, value.getId());
-    statement.setObject(2, value.getInfo().getVersion());
-    statement.setObject(3, value.getInfo().getUid());
-    statement.setObject(4, value.getInfo().getTimestamp());
-    statement.setObject(5, value.getInfo().getChangeset());
+    statement.setObject(2, value.getInfo().version());
+    statement.setObject(3, value.getInfo().uid());
+    statement.setObject(4, value.getInfo().timestamp());
+    statement.setObject(5, value.getInfo().changeset());
     statement.setObject(6, PostgresJsonbMapper.toJson(value.getTags()));
     statement.setObject(7, value.getNodes().stream().mapToLong(Long::longValue).toArray());
     statement.setBytes(8, GeometryUtils.serialize(value.getGeometry()));
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/ChangeEntitiesConsumer.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/ChangeEntitiesConsumer.java
index 85928875..9fb9e79d 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/ChangeEntitiesConsumer.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/ChangeEntitiesConsumer.java
@@ -36,6 +36,6 @@ public class ChangeEntitiesConsumer implements Consumer<Change> {
   /** {@inheritDoc} */
   @Override
   public void accept(Change change) {
-    change.getEntities().forEach(consumer);
+    change.entities().forEach(consumer);
   }
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/CreateGeometryConsumer.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/CreateGeometryConsumer.java
index 4d1f0595..389d4fc4 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/CreateGeometryConsumer.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/CreateGeometryConsumer.java
@@ -186,8 +186,8 @@ public class CreateGeometryConsumer implements Consumer<Entity> {
   private Set<Polygon> createPolygons(Relation relation, String role) {
     Set<Polygon> polygons = new HashSet<>();
     LineMerger lineMerger = new LineMerger();
-    relation.getMembers().stream().filter(m -> Member.MemberType.WAY.equals(m.getType()))
-        .filter(m -> role.equals(m.getRole())).forEach(member -> {
+    relation.getMembers().stream().filter(m -> Member.MemberType.WAY.equals(m.type()))
+        .filter(m -> role.equals(m.role())).forEach(member -> {
           LineString line = createLine(member);
           if (line.isClosed()) {
             Polygon polygon = geometryFactory.createPolygon(line.getCoordinates());
@@ -208,7 +208,7 @@ public class CreateGeometryConsumer implements Consumer<Entity> {
 
   private LineString createLine(Member member) {
     try {
-      List<Long> refs = this.references.get(member.getRef());
+      List<Long> refs = this.references.get(member.ref());
       List<Coordinate> coords = refs.stream().map(coordinates::get).toList();
       Coordinate[] array = coords.toArray(new Coordinate[coords.size()]);
       return geometryFactory.createLineString(array);
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Blob.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Blob.java
index e3974a32..bac41042 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Blob.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Blob.java
@@ -23,33 +23,7 @@ import org.apache.baremaps.osm.binary.Fileformat;
 import org.apache.baremaps.osm.binary.Fileformat.BlobHeader;
 
 /** Represents a raw blob of data in an OpenStreetMap dataset. */
-public class Blob {
-
-  private final BlobHeader header;
-  private final byte[] rawData;
-  private final int size;
-
-  /**
-   * Constructs a OpenStreetMap {@code Blob}.
-   *
-   * @param header the header
-   * @param rawData the raw data
-   * @param size the size
-   */
-  public Blob(BlobHeader header, byte[] rawData, int size) {
-    this.header = header;
-    this.rawData = rawData;
-    this.size = size;
-  }
-
-  /**
-   * Returns the header.
-   *
-   * @return the header
-   */
-  public BlobHeader header() {
-    return header;
-  }
+public record Blob (BlobHeader header, byte[] rawData, int size) {
 
   /**
    * Returns the data.
@@ -74,15 +48,6 @@ public class Blob {
     }
   }
 
-  /**
-   * Returns the size.
-   *
-   * @return the size
-   */
-  public long size() {
-    return size;
-  }
-
   /** {@inheritDoc} */
   @Override
   public String toString() {
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Block.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Block.java
index 5a3d6cf6..6c32b173 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Block.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Block.java
@@ -14,29 +14,9 @@ package org.apache.baremaps.openstreetmap.model;
 
 
 /** Represents a block of data in an OpenStreetMap dataset. */
-public abstract sealed
-class Block
+public sealed
+interface Block
 permits HeaderBlock, DataBlock
 {
 
-  private final Blob blob;
-
-  /**
-   * Constructs an OpenStreetMap {@code Block} with the specified {@code Blob}.
-   *
-   * @param blob the blob
-   */
-  protected Block(Blob blob) {
-    this.blob = blob;
-  }
-
-  /**
-   * Returns the blob.
-   *
-   * @return the blob
-   */
-  public Blob getBlob() {
-    return blob;
-  }
-
 }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Bound.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Bound.java
index d6358ac7..37c5f9b8 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Bound.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Bound.java
@@ -18,66 +18,7 @@ import java.util.Objects;
 import java.util.StringJoiner;
 
 /** Represents the bounds of an OpenStreetMap dataset. */
-public final class Bound implements Entity {
-
-  private final double maxLat;
-
-  private final double maxLon;
-
-  private final double minLat;
-
-  private final double minLon;
-
-  /**
-   * Consturcts a {@code Bound} with the specified limits.
-   *
-   * @param maxLat the max latitude
-   * @param maxLon the max longitude
-   * @param minLat the min latitude
-   * @param minLon the max longitude
-   */
-  public Bound(double maxLat, double maxLon, double minLat, double minLon) {
-    this.maxLat = maxLat;
-    this.maxLon = maxLon;
-    this.minLat = minLat;
-    this.minLon = minLon;
-  }
-
-  /**
-   * Returns the max latitude.
-   *
-   * @return the max latitude
-   */
-  public double getMaxLat() {
-    return maxLat;
-  }
-
-  /**
-   * Returns the max longitude.
-   *
-   * @return the max longitude
-   */
-  public double getMaxLon() {
-    return maxLon;
-  }
-
-  /**
-   * Returns the min latitude.
-   *
-   * @return the min latitude
-   */
-  public double getMinLat() {
-    return minLat;
-  }
-
-  /**
-   * Returns the min longitude.
-   *
-   * @return the min longitude
-   */
-  public double getMinLon() {
-    return minLon;
-  }
+public record Bound(double maxLat, double maxLon, double minLat, double minLon) implements Entity {
 
   /** {@inheritDoc} */
   @Override
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Change.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Change.java
index c8c8d354..4006e1a8 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Change.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Change.java
@@ -18,43 +18,11 @@ import java.util.List;
 import java.util.StringJoiner;
 
 /** Represents a change in an OpenStreetMap dataset. */
-public final class Change {
+public record Change(ChangeType type,List<Entity>entities){
 
-  public enum ChangeType {
-    DELETE, CREATE, MODIFY
-  }
-
-  private final ChangeType type;
-
-  private final List<Entity> entities;
-
-  /**
-   * Constructs an OpenStreetMap change.
-   *
-   * @param type the type of the change
-   * @param entities the entities affected by the change
-   */
-  public Change(ChangeType type, List<Entity> entities) {
-    this.type = type;
-    this.entities = entities;
-  }
-
-  /**
-   * Returns the type of the change.
-   *
-   * @return the type of the change
-   */
-  public ChangeType getType() {
-    return type;
-  }
+public enum ChangeType {
+  DELETE, CREATE, MODIFY
 
-  /**
-   * Returns the entities affected by the change.
-   *
-   * @return the entities affected by the change
-   */
-  public List<Entity> getEntities() {
-    return entities;
   }
 
   /** {@inheritDoc} */
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/DataBlock.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/DataBlock.java
index 5fa79205..4940436f 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/DataBlock.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/DataBlock.java
@@ -17,30 +17,7 @@ package org.apache.baremaps.openstreetmap.model;
 import java.util.List;
 
 /** Represents a data block in an OpenStreetMap dataset. */
-public final class DataBlock extends Block {
-
-  private final List<Node> denseNodes;
-  private final List<Node> nodes;
-  private final List<Way> ways;
-  private final List<Relation> relations;
-
-  /**
-   * Constructs an OpenStreetMap {@code DataBlock} with the specified parameters.
-   *
-   * @param blob the blob
-   * @param denseNodes the dense nodes
-   * @param nodes the nodes
-   * @param ways the ways
-   * @param relations the relations
-   */
-  public DataBlock(Blob blob, List<Node> denseNodes, List<Node> nodes, List<Way> ways,
-      List<Relation> relations) {
-    super(blob);
-    this.denseNodes = denseNodes;
-    this.nodes = nodes;
-    this.ways = ways;
-    this.relations = relations;
-  }
+public record DataBlock(List<Node> denseNodes, List<Node> nodes, List<Way> ways, List<Relation> relations) implements Block {
 
   /**
    * Returns the dense nodes.
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Element.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Element.java
index 52200f87..d8b3b5e4 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Element.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Element.java
@@ -24,7 +24,6 @@ import org.locationtech.jts.geom.Geometry;
  * world.
  */
 public sealed
-
 abstract class Element implements Entity
 permits Node, Way, Relation
 {
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Header.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Header.java
index 3661315d..85ff2b78 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Header.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Header.java
@@ -19,31 +19,7 @@ import java.util.Objects;
 import java.util.StringJoiner;
 
 /** Represents a header entity in an OpenStreetMap dataset. */
-public final class Header implements Entity {
-
-  private final Long replicationSequenceNumber;
-  private final LocalDateTime replicationTimestamp;
-  private final String replicationUrl;
-  private final String source;
-  private final String writingProgram;
-
-  /**
-   * Constructs an OpenStreetMap {@code Header} based on the specified parameters.
-   *
-   * @param replicationSequenceNumber the replication sequence number
-   * @param replicationTimestamp the replication timestamp
-   * @param replicationUrl the replication url
-   * @param source the source
-   * @param writingProgram the writing program
-   */
-  public Header(Long replicationSequenceNumber, LocalDateTime replicationTimestamp,
-      String replicationUrl, String source, String writingProgram) {
-    this.replicationTimestamp = replicationTimestamp;
-    this.replicationSequenceNumber = replicationSequenceNumber;
-    this.replicationUrl = replicationUrl;
-    this.source = source;
-    this.writingProgram = writingProgram;
-  }
+public record Header(Long replicationSequenceNumber, LocalDateTime replicationTimestamp,String replicationUrl,String source,String writingProgram) implements Entity {
 
   /**
    * Returns the replication timestamp.
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/HeaderBlock.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/HeaderBlock.java
index 69a067af..4d98efad 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/HeaderBlock.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/HeaderBlock.java
@@ -15,24 +15,7 @@ package org.apache.baremaps.openstreetmap.model;
 
 
 /** Represents a header block in an OpenStreetMap dataset. */
-public final class HeaderBlock extends Block {
-
-  private final Header header;
-
-  private final Bound bound;
-
-  /**
-   * Constructs an OpenStreetMap {@code HeaderBlock} with the specified parameters.
-   *
-   * @param blob the blob
-   * @param header the header
-   * @param bound the bound
-   */
-  public HeaderBlock(Blob blob, Header header, Bound bound) {
-    super(blob);
-    this.header = header;
-    this.bound = bound;
-  }
+public record HeaderBlock(Header header, Bound bound) implements Block {
 
   /**
    * Returns the header.
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Info.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Info.java
index cd0bd2bc..ab62f98f 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Info.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Info.java
@@ -19,66 +19,7 @@ import java.util.Objects;
 import java.util.StringJoiner;
 
 /** Represents all the metadata associated to an element in an OpenStreetMap dataset. */
-public class Info {
-
-  protected final int version;
-
-  protected final LocalDateTime timestamp;
-
-  protected final long changeset;
-
-  protected final int uid;
-
-  /**
-   * Constructs an OpenStreetMap {@code Info} with the specified metadata.
-   *
-   * @param version the version
-   * @param timestamp the timestamp
-   * @param changeset the changeset
-   * @param uid the user id
-   */
-  public Info(int version, LocalDateTime timestamp, long changeset, int uid) {
-    this.version = version;
-    this.timestamp = timestamp;
-    this.changeset = changeset;
-    this.uid = uid;
-  }
-
-  /**
-   * Returns the version.
-   *
-   * @return the version
-   */
-  public int getVersion() {
-    return version;
-  }
-
-  /**
-   * Returns the timestamp.
-   *
-   * @return the timestamp
-   */
-  public LocalDateTime getTimestamp() {
-    return timestamp;
-  }
-
-  /**
-   * Returns the changeset.
-   *
-   * @return the changeset
-   */
-  public long getChangeset() {
-    return changeset;
-  }
-
-  /**
-   * Returns the user id.
-   *
-   * @return the user id
-   */
-  public int getUid() {
-    return uid;
-  }
+public record Info(int version, LocalDateTime timestamp, long changeset, int uid) {
 
   /** {@inheritDoc} */
   @Override
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Member.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Member.java
index aab6d912..e4ad3606 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Member.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Member.java
@@ -12,77 +12,30 @@
 
 package org.apache.baremaps.openstreetmap.model;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+
 
 import com.google.common.base.Objects;
 import java.util.StringJoiner;
 
 /** Represents a member of a relation in an OpenStreetMap dataset. */
-public final class Member {
-
-  public enum MemberType {
-    NODE, WAY, RELATION;
-
-    public static MemberType forNumber(int value) {
-      switch (value) {
-        case 0:
-          return NODE;
-        case 1:
-          return WAY;
-        case 2:
-          return RELATION;
-        default:
-          throw new IllegalArgumentException();
-      }
+public record Member(long ref,MemberType type,String role){
+
+public enum MemberType {
+  NODE, WAY, RELATION;
+
+  public static MemberType forNumber(int value) {
+    switch (value) {
+      case 0:
+        return NODE;
+      case 1:
+        return WAY;
+      case 2:
+        return RELATION;
+      default:
+        throw new IllegalArgumentException();
     }
   }
 
-  private final long ref;
-
-  private final MemberType type;
-
-  private final String role;
-
-  /**
-   * Constructs a {@code Member} of an OpenStreetMap relation.
-   *
-   * @param ref the relation id
-   * @param type the member type
-   * @param role the member role
-   */
-  public Member(long ref, MemberType type, String role) {
-    checkNotNull(type);
-    checkNotNull(role);
-    this.ref = ref;
-    this.type = type;
-    this.role = role;
-  }
-
-  /**
-   * Returns the relation id.
-   *
-   * @return the relation id
-   */
-  public long getRef() {
-    return ref;
-  }
-
-  /**
-   * Returns the member type.
-   *
-   * @return the member type
-   */
-  public MemberType getType() {
-    return type;
-  }
-
-  /**
-   * Returns the member role.
-   *
-   * @return the member role
-   */
-  public String getRole() {
-    return role;
   }
 
   /** {@inheritDoc} */
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/User.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/User.java
index 620ea939..2a291347 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/User.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/User.java
@@ -17,42 +17,10 @@ package org.apache.baremaps.openstreetmap.model;
 import com.google.common.base.Objects;
 
 /** Represents the author of an objet in an OpenStreetMap dataset. */
-public final class User {
+public record User (int id, String name) {
 
   public static final User NO_USER = new User(-1, "");
 
-  private final int id;
-  private final String name;
-
-  /**
-   * Constructs an OpenStreetMap {@code User} with the specified parameters.
-   *
-   * @param id the id
-   * @param name the name
-   */
-  public User(int id, String name) {
-    this.id = id;
-    this.name = name;
-  }
-
-  /**
-   * Returns the id.
-   *
-   * @return the id
-   */
-  public int getId() {
-    return id;
-  }
-
-  /**
-   * Returns the name.
-   *
-   * @return the name
-   */
-  public String getName() {
-    return name;
-  }
-
   /** {@inheritDoc} */
   @Override
   public boolean equals(Object o) {
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/DataBlockReader.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/DataBlockReader.java
index e8834ff4..62f5902b 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/DataBlockReader.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/DataBlockReader.java
@@ -83,7 +83,7 @@ class DataBlockReader {
     readWays(ways::add);
     List<Relation> relations = new ArrayList<>();
     readRelations(relations::add);
-    return new DataBlock(blob, denseNodes, nodes, ways, relations);
+    return new DataBlock(denseNodes, nodes, ways, relations);
   }
 
   /**
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/HeaderBlockReader.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/HeaderBlockReader.java
index 8d44f776..48e2953f 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/HeaderBlockReader.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/HeaderBlockReader.java
@@ -71,7 +71,7 @@ class HeaderBlockReader {
     double maxLat = headerBBox.getTop() * .000000001;
     Bound bound = new Bound(maxLat, maxLon, minLat, minLon);
 
-    return new HeaderBlock(blob, header, bound);
+    return new HeaderBlock(header, bound);
   }
 
   /**
diff --git a/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/OpenStreetMapTest.java b/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/OpenStreetMapTest.java
index 441b29a1..61b754d1 100644
--- a/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/OpenStreetMapTest.java
+++ b/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/OpenStreetMapTest.java
@@ -156,10 +156,10 @@ class OpenStreetMapTest {
         headers.incrementAndGet();
       } else if (entity instanceof Bound bound) {
         assertNotNull(bound);
-        assertEquals(43.75169, bound.getMaxLat(), 0.000001);
-        assertEquals(7.448637, bound.getMaxLon(), 0.000001);
-        assertEquals(43.72335, bound.getMinLat(), 0.000001);
-        assertEquals(7.409205, bound.getMinLon(), 0.000001);
+        assertEquals(43.75169, bound.maxLat(), 0.000001);
+        assertEquals(7.448637, bound.maxLon(), 0.000001);
+        assertEquals(43.72335, bound.minLat(), 0.000001);
+        assertEquals(7.409205, bound.minLon(), 0.000001);
         bounds.incrementAndGet();
       } else if (entity instanceof Node node) {
         assertNotNull(node);
diff --git a/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/xml/XmlChangeSpliteratorTest.java b/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/xml/XmlChangeSpliteratorTest.java
index 57d680fb..e5c19d4a 100644
--- a/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/xml/XmlChangeSpliteratorTest.java
+++ b/baremaps-core/src/test/java/org/apache/baremaps/openstreetmap/xml/XmlChangeSpliteratorTest.java
@@ -45,7 +45,7 @@ class XmlChangeSpliteratorTest {
       AccumulatingConsumer<Change> accumulator = new AccumulatingConsumer<>();
       spliterator.forEachRemaining(accumulator);
       assertEquals(accumulator.values().size(), 7);
-      assertEquals(accumulator.values().stream().flatMap(change -> change.getEntities().stream())
+      assertEquals(accumulator.values().stream().flatMap(change -> change.entities().stream())
           .collect(Collectors.toList()).size(), 51);
     }
   }