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 <[email protected]> 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);
