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:53 UTC
[incubator-baremaps] 01/07: Replace visitor pattern by instanceof and sealed classes
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 c7464ad8ae1d947480622258741052d46c4bfa24
Author: Bertil Chapuis <bc...@gmail.com>
AuthorDate: Tue Nov 22 01:03:53 2022 +0100
Replace visitor pattern by instanceof and sealed classes
---
.../apache/baremaps/database/ImportService.java | 2 +
.../baremaps/database/SaveChangeConsumer.java | 58 +++++++---------------
.../openstreetmap/function/BlockConsumer.java | 10 ++--
.../openstreetmap/function/BlockFunction.java | 10 ++--
.../openstreetmap/function/EntityConsumer.java | 16 ++++--
.../openstreetmap/function/EntityFunction.java | 16 ++++--
.../apache/baremaps/openstreetmap/model/Block.java | 26 ++--------
.../apache/baremaps/openstreetmap/model/Bound.java | 16 +-----
.../baremaps/openstreetmap/model/DataBlock.java | 15 +-----
.../baremaps/openstreetmap/model/Element.java | 5 +-
.../baremaps/openstreetmap/model/Entity.java | 13 ++---
.../baremaps/openstreetmap/model/Header.java | 14 +-----
.../baremaps/openstreetmap/model/HeaderBlock.java | 16 +-----
.../apache/baremaps/openstreetmap/model/Node.java | 14 ------
.../baremaps/openstreetmap/model/Relation.java | 14 ------
.../apache/baremaps/openstreetmap/model/Way.java | 14 ------
.../openstreetmap/pbf/PbfEntityReader.java | 15 +++++-
17 files changed, 90 insertions(+), 184 deletions(-)
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/database/ImportService.java b/baremaps-core/src/main/java/org/apache/baremaps/database/ImportService.java
index c4bb15ac..1710f8d1 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/database/ImportService.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/database/ImportService.java
@@ -27,6 +27,7 @@ import org.apache.baremaps.database.repository.HeaderRepository;
import org.apache.baremaps.database.repository.Repository;
import org.apache.baremaps.openstreetmap.function.BlockEntityConsumer;
import org.apache.baremaps.openstreetmap.function.CreateGeometryConsumer;
+import org.apache.baremaps.openstreetmap.function.EntityConsumer;
import org.apache.baremaps.openstreetmap.function.ReprojectEntityConsumer;
import org.apache.baremaps.openstreetmap.model.Block;
import org.apache.baremaps.openstreetmap.model.Entity;
@@ -77,4 +78,5 @@ public class ImportService implements Callable<Void> {
}
return null;
}
+
}
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 b2160266..d8146b58 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
@@ -16,7 +16,6 @@ package org.apache.baremaps.database;
import org.apache.baremaps.database.repository.Repository;
import org.apache.baremaps.openstreetmap.function.ChangeConsumer;
-import org.apache.baremaps.openstreetmap.function.EntityConsumerAdapter;
import org.apache.baremaps.openstreetmap.model.Change;
import org.apache.baremaps.openstreetmap.model.Entity;
import org.apache.baremaps.openstreetmap.model.Node;
@@ -48,46 +47,27 @@ public class SaveChangeConsumer implements ChangeConsumer {
@Override
public void match(Change change) throws Exception {
for (Entity entity : change.getEntities()) {
- entity.visit(new EntityConsumerAdapter() {
- @Override
- public void match(Node node) throws Exception {
- switch (change.getType()) {
- case CREATE:
- case MODIFY:
- nodeRepository.put(node);
- break;
- case DELETE:
- nodeRepository.delete(node.getId());
- break;
+ switch (change.getType()) {
+ case CREATE:
+ case MODIFY:
+ if (entity instanceof Node node) {
+ nodeRepository.put(node);
+ } else if (entity instanceof Way way) {
+ wayRepository.put(way);
+ } else if (entity instanceof Relation relation) {
+ relationRepository.put(relation);
}
- }
-
- @Override
- public void match(Way way) throws Exception {
- switch (change.getType()) {
- case CREATE:
- case MODIFY:
- wayRepository.put(way);
- break;
- case DELETE:
- wayRepository.delete(way.getId());
- break;
- }
- }
-
- @Override
- public void match(Relation relation) throws Exception {
- switch (change.getType()) {
- case CREATE:
- case MODIFY:
- relationRepository.put(relation);
- break;
- case DELETE:
- relationRepository.delete(relation.getId());
- break;
+ break;
+ case DELETE:
+ if (entity instanceof Node node) {
+ nodeRepository.delete(node.getId());
+ } else if (entity instanceof Way way) {
+ wayRepository.delete(way.getId());
+ } else if (entity instanceof Relation relation) {
+ relationRepository.delete(relation.getId());
}
- }
- });
+ break;
+ }
}
}
}
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/BlockConsumer.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/BlockConsumer.java
index cd320d89..70b6a8cd 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/BlockConsumer.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/BlockConsumer.java
@@ -27,9 +27,13 @@ public interface BlockConsumer extends Consumer<Block> {
@Override
default void accept(Block block) {
try {
- block.visit(this);
- } catch (StreamException e) {
- throw e;
+ if (block instanceof HeaderBlock headerBlock) {
+ match(headerBlock);
+ } else if (block instanceof DataBlock dataBlock) {
+ match(dataBlock);
+ } else {
+ throw new StreamException("Unknown block type.");
+ }
} catch (Exception e) {
throw new StreamException(e);
}
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/BlockFunction.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/BlockFunction.java
index 8c5bc871..17303b4c 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/BlockFunction.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/BlockFunction.java
@@ -31,9 +31,13 @@ public interface BlockFunction<T> extends Function<Block, T> {
@Override
default T apply(Block block) {
try {
- return block.visit(this);
- } catch (StreamException e) {
- throw e;
+ if (block instanceof HeaderBlock headerBlock) {
+ return match(headerBlock);
+ } else if (block instanceof DataBlock dataBlock) {
+ return match(dataBlock);
+ } else {
+ throw new StreamException("Unknown block type.");
+ }
} catch (Exception e) {
throw new StreamException(e);
}
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/EntityConsumer.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/EntityConsumer.java
index 7890ada8..1ba0eb3d 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/EntityConsumer.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/EntityConsumer.java
@@ -30,9 +30,19 @@ public interface EntityConsumer extends Consumer<Entity> {
@Override
default void accept(Entity entity) {
try {
- entity.visit(this);
- } catch (StreamException e) {
- throw e;
+ if (entity instanceof Node node) {
+ match(node);
+ } else if (entity instanceof Way way) {
+ match(way);
+ } else if (entity instanceof Relation relation) {
+ match(relation);
+ } else if (entity instanceof Header header) {
+ match(header);
+ } else if (entity instanceof Bound bound) {
+ match(bound);
+ } else {
+ throw new StreamException("Unknown entity type.");
+ }
} catch (Exception e) {
throw new StreamException(e);
}
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/EntityFunction.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/EntityFunction.java
index 6861418c..a2ec7913 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/EntityFunction.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/EntityFunction.java
@@ -34,9 +34,19 @@ public interface EntityFunction<T> extends Function<Entity, T> {
@Override
default T apply(Entity entity) {
try {
- return entity.visit(this);
- } catch (StreamException e) {
- throw e;
+ if (entity instanceof Node node) {
+ return match(node);
+ } else if (entity instanceof Way way) {
+ return match(way);
+ } else if (entity instanceof Relation relation) {
+ return match(relation);
+ } else if (entity instanceof Header header) {
+ return match(header);
+ } else if (entity instanceof Bound bound) {
+ return match(bound);
+ } else {
+ throw new StreamException("Unknown entity type.");
+ }
} catch (Exception e) {
throw new StreamException(e);
}
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 47e10bb7..5a3d6cf6 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
@@ -13,12 +13,11 @@
package org.apache.baremaps.openstreetmap.model;
-
-import org.apache.baremaps.openstreetmap.function.BlockConsumer;
-import org.apache.baremaps.openstreetmap.function.BlockFunction;
-
/** Represents a block of data in an OpenStreetMap dataset. */
-public abstract class Block {
+public abstract sealed
+class Block
+permits HeaderBlock, DataBlock
+{
private final Blob blob;
@@ -40,21 +39,4 @@ public abstract class Block {
return blob;
}
- /**
- * Accepts the specified block consumer.
- *
- * @param consumer the consumer
- * @throws Exception
- */
- public abstract void visit(BlockConsumer consumer) throws Exception;
-
- /**
- * Applies the specified block function.
- *
- * @param function the function
- * @param <T> the return type of the function
- * @return the function result
- * @throws Exception
- */
- public abstract <T> T visit(BlockFunction<T> function) throws Exception;
}
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 1fa39ea9..d6358ac7 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
@@ -16,11 +16,9 @@ package org.apache.baremaps.openstreetmap.model;
import java.util.Objects;
import java.util.StringJoiner;
-import org.apache.baremaps.openstreetmap.function.EntityConsumer;
-import org.apache.baremaps.openstreetmap.function.EntityFunction;
/** Represents the bounds of an OpenStreetMap dataset. */
-public class Bound implements Entity {
+public final class Bound implements Entity {
private final double maxLat;
@@ -81,18 +79,6 @@ public class Bound implements Entity {
return minLon;
}
- /** {@inheritDoc} */
- @Override
- public void visit(EntityConsumer consumer) throws Exception {
- consumer.match(this);
- }
-
- /** {@inheritDoc} */
- @Override
- public <T> T visit(EntityFunction<T> function) throws Exception {
- return function.match(this);
- }
-
/** {@inheritDoc} */
@Override
public boolean equals(Object o) {
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 1bb88aee..5fa79205 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
@@ -15,11 +15,9 @@ package org.apache.baremaps.openstreetmap.model;
import java.util.List;
-import org.apache.baremaps.openstreetmap.function.BlockConsumer;
-import org.apache.baremaps.openstreetmap.function.BlockFunction;
/** Represents a data block in an OpenStreetMap dataset. */
-public class DataBlock extends Block {
+public final class DataBlock extends Block {
private final List<Node> denseNodes;
private final List<Node> nodes;
@@ -80,15 +78,4 @@ public class DataBlock extends Block {
return relations;
}
- /** {@inheritDoc} */
- @Override
- public void visit(BlockConsumer consumer) throws Exception {
- consumer.match(this);
- }
-
- /** {@inheritDoc} */
- @Override
- public <T> T visit(BlockFunction<T> function) throws Exception {
- return function.match(this);
- }
}
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 f1a19d44..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
@@ -23,7 +23,10 @@ import org.locationtech.jts.geom.Geometry;
* Represents an element in an OpenStreetMap dataset. Elements are a basis to model the physical
* world.
*/
-public abstract class Element implements Entity {
+public sealed
+abstract class Element implements Entity
+permits Node, Way, Relation
+{
protected final long id;
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Entity.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Entity.java
index 26a2d97f..561f1a20 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Entity.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Entity.java
@@ -14,18 +14,13 @@ package org.apache.baremaps.openstreetmap.model;
-import org.apache.baremaps.openstreetmap.function.EntityConsumer;
-import org.apache.baremaps.openstreetmap.function.EntityFunction;
-
/**
* Represents an entity in an OpenStreetMap dataset. Entities are a basis to model all the objects
* in OpenStreetMap.
*/
-public interface Entity {
-
- /** Visits the entity with the provided entity consumer. */
- void visit(EntityConsumer consumer) throws Exception;
+public sealed
+interface Entity
+permits Header, Bound, Element
+{
- /** Visits the entity with the provided entity function. */
- <T> T visit(EntityFunction<T> function) throws Exception;
}
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 9f3aa9ea..3661315d 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
@@ -17,11 +17,9 @@ package org.apache.baremaps.openstreetmap.model;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.StringJoiner;
-import org.apache.baremaps.openstreetmap.function.EntityConsumer;
-import org.apache.baremaps.openstreetmap.function.EntityFunction;
/** Represents a header entity in an OpenStreetMap dataset. */
-public class Header implements Entity {
+public final class Header implements Entity {
private final Long replicationSequenceNumber;
private final LocalDateTime replicationTimestamp;
@@ -92,16 +90,6 @@ public class Header implements Entity {
return writingProgram;
}
- @Override
- public void visit(EntityConsumer consumer) throws Exception {
- consumer.match(this);
- }
-
- @Override
- public <T> T visit(EntityFunction<T> function) throws Exception {
- return function.match(this);
- }
-
@Override
public boolean equals(Object o) {
if (this == o) {
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 c046ce0d..69a067af 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
@@ -14,11 +14,8 @@ package org.apache.baremaps.openstreetmap.model;
-import org.apache.baremaps.openstreetmap.function.BlockConsumer;
-import org.apache.baremaps.openstreetmap.function.BlockFunction;
-
/** Represents a header block in an OpenStreetMap dataset. */
-public class HeaderBlock extends Block {
+public final class HeaderBlock extends Block {
private final Header header;
@@ -55,15 +52,4 @@ public class HeaderBlock extends Block {
return bound;
}
- /** {@inheritDoc} */
- @Override
- public void visit(BlockConsumer consumer) throws Exception {
- consumer.match(this);
- }
-
- /** {@inheritDoc} */
- @Override
- public <T> T visit(BlockFunction<T> function) throws Exception {
- return function.match(this);
- }
}
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Node.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Node.java
index a98845ef..7444bac4 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Node.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Node.java
@@ -17,8 +17,6 @@ package org.apache.baremaps.openstreetmap.model;
import java.util.Map;
import java.util.Objects;
import java.util.StringJoiner;
-import org.apache.baremaps.openstreetmap.function.EntityConsumer;
-import org.apache.baremaps.openstreetmap.function.EntityFunction;
import org.locationtech.jts.geom.Geometry;
/** Represents a node element in an OpenStreetMap dataset. */
@@ -78,18 +76,6 @@ public final class Node extends Element {
return lat;
}
- /** {@inheritDoc} */
- @Override
- public void visit(EntityConsumer consumer) throws Exception {
- consumer.match(this);
- }
-
- /** {@inheritDoc} */
- @Override
- public <T> T visit(EntityFunction<T> function) throws Exception {
- return function.match(this);
- }
-
/** {@inheritDoc} */
@Override
public boolean equals(Object o) {
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Relation.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Relation.java
index 00ce47af..653f2a1d 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Relation.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Relation.java
@@ -18,8 +18,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.StringJoiner;
-import org.apache.baremaps.openstreetmap.function.EntityConsumer;
-import org.apache.baremaps.openstreetmap.function.EntityFunction;
import org.locationtech.jts.geom.Geometry;
/** Represents a relation element in an OpenStreetMap dataset. */
@@ -64,18 +62,6 @@ public final class Relation extends Element {
return members;
}
- /** {@inheritDoc} */
- @Override
- public void visit(EntityConsumer consumer) throws Exception {
- consumer.match(this);
- }
-
- /** {@inheritDoc} */
- @Override
- public <T> T visit(EntityFunction<T> function) throws Exception {
- return function.match(this);
- }
-
/** {@inheritDoc} */
@Override
public boolean equals(Object o) {
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Way.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Way.java
index 389980fd..5513b1d5 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Way.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/model/Way.java
@@ -18,8 +18,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.StringJoiner;
-import org.apache.baremaps.openstreetmap.function.EntityConsumer;
-import org.apache.baremaps.openstreetmap.function.EntityFunction;
import org.locationtech.jts.geom.Geometry;
/** Represents a way element in an OpenStreetMap dataset. */
@@ -63,18 +61,6 @@ public final class Way extends Element {
return nodes;
}
- /** {@inheritDoc} */
- @Override
- public void visit(EntityConsumer consumer) throws Exception {
- consumer.match(this);
- }
-
- /** {@inheritDoc} */
- @Override
- public <T> T visit(EntityFunction<T> function) throws Exception {
- return function.match(this);
- }
-
/** {@inheritDoc} */
@Override
public boolean equals(Object o) {
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/PbfEntityReader.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/PbfEntityReader.java
index 4697481d..fb173fea 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/PbfEntityReader.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/pbf/PbfEntityReader.java
@@ -17,8 +17,9 @@ package org.apache.baremaps.openstreetmap.pbf;
import java.io.InputStream;
import java.util.stream.Stream;
import org.apache.baremaps.openstreetmap.OsmReader;
-import org.apache.baremaps.openstreetmap.function.BlockEntityConsumer;
+import org.apache.baremaps.openstreetmap.model.DataBlock;
import org.apache.baremaps.openstreetmap.model.Entity;
+import org.apache.baremaps.openstreetmap.model.HeaderBlock;
import org.apache.baremaps.stream.StreamException;
/** A utility class for flattening the blocks streamed by a {@link PbfBlockReader}. */
@@ -45,7 +46,17 @@ public class PbfEntityReader implements OsmReader<Entity> {
return reader.stream(inputStream).flatMap(block -> {
try {
Stream.Builder<Entity> entities = Stream.builder();
- block.visit(new BlockEntityConsumer(entities::add));
+ if (block instanceof HeaderBlock headerBlock) {
+ entities.add(headerBlock.getHeader());
+ entities.add(headerBlock.getBound());
+ } else if (block instanceof DataBlock dataBlock) {
+ dataBlock.getDenseNodes().forEach(entities::add);
+ dataBlock.getNodes().forEach(entities::add);
+ dataBlock.getWays().forEach(entities::add);
+ dataBlock.getRelations().forEach(entities::add);
+ } else {
+ throw new StreamException("Unknown block type.");
+ }
return entities.build();
} catch (Exception e) {
throw new StreamException(e);