Skip to content

Commit

Permalink
Refactor extendibility of WaySegmentParser to avoid derived classes
Browse files Browse the repository at this point in the history
  • Loading branch information
Nakaner committed May 6, 2024
1 parent 2d4859c commit 15dfdae
Showing 1 changed file with 34 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.graphhopper.util.PointList;
import com.graphhopper.util.StopWatch;
import com.graphhopper.util.shapes.GHPoint3D;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -74,14 +75,15 @@ public class WaySegmentParser {
};
private RelationProcessor relationProcessor = (relation, map) -> {
};
private List<ReaderElementHandler> additionalPass2Handlers;
private EdgeHandler edgeHandler = (from, to, pointList, way, nodeTags) ->
System.out.println("edge " + from + "->" + to + " (" + pointList.size() + " points)");
private int workerThreads = 2;

protected final OSMNodeData nodeData;
private final OSMNodeData nodeData;
private Date timestamp;

protected WaySegmentParser(OSMNodeData nodeData) {
private WaySegmentParser(OSMNodeData nodeData) {
this.nodeData = nodeData;
}

Expand All @@ -95,7 +97,9 @@ public void readOSM(File osmFile) {
LOGGER.info("Start reading OSM file: '" + osmFile + "'");
LOGGER.info("pass1 - start");
StopWatch sw1 = StopWatch.started();
readOSM(osmFile, new SkipOptions(true, false, false), new Pass1Handler());
List<ReaderElementHandler> handlers1 = new ArrayList<ReaderElementHandler>(1);
handlers1.add(new Pass1Handler());
readOSM(osmFile, new SkipOptions(true, false, false), handlers1);
LOGGER.info("pass1 - finished, took: {}", sw1.stop().getTimeString());

long nodes = nodeData.getNodeCount();
Expand All @@ -104,7 +108,14 @@ public void readOSM(File osmFile) {

LOGGER.info("pass2 - start");
StopWatch sw2 = new StopWatch().start();
readOSM(osmFile, SkipOptions.none(), new Pass2Handler());
Pass2Handler pass2Handler = new Pass2Handler();
List<ReaderElementHandler> handlers2 = new ArrayList<ReaderElementHandler>(additionalPass2Handlers.size() + 1);
for (ReaderElementHandler h : additionalPass2Handlers) {
h.setNodeDataAccess(nodeId -> pass2Handler.getInternalNodeIdOfOSMNode(nodeId));
}
handlers2.add(pass2Handler);
handlers2.addAll(additionalPass2Handlers);
readOSM(osmFile, SkipOptions.none(), handlers2);
LOGGER.info("pass2 - finished, took: {}", sw2.stop().getTimeString());

nodeData.release();
Expand All @@ -122,7 +133,7 @@ public Date getTimeStamp() {
return timestamp;
}

public class Pass1Handler implements ReaderElementHandler {
private class Pass1Handler implements ReaderElementHandler {
private boolean handledWays;
private boolean handledRelations;
private long wayCounter = 0;
Expand Down Expand Up @@ -182,7 +193,7 @@ public void onFinish() {
}
}

public class Pass2Handler implements ReaderElementHandler {
private class Pass2Handler implements ReaderElementHandler {
private boolean handledNodes;
private boolean handledWays;
private boolean handledRelations;
Expand Down Expand Up @@ -394,7 +405,7 @@ public int getInternalNodeIdOfOSMNode(long nodeOsmId) {
}
}

protected void readOSM(File file, SkipOptions skipOptions, ReaderElementHandler... handlers) {
protected void readOSM(File file, SkipOptions skipOptions, List<ReaderElementHandler> handlers) {
try (OSMInput osmInput = openOsmInputFile(file, skipOptions)) {
ReaderElement elem;
while ((elem = osmInput.getNext()) != null) {
Expand Down Expand Up @@ -425,6 +436,15 @@ public static class Builder {
*/
public Builder(PointAccess pointAccess, Directory directory) {
waySegmentParser = new WaySegmentParser(new OSMNodeData(pointAccess, directory));
waySegmentParser.additionalPass2Handlers = new ArrayList<ReaderElementHandler>();
}

/**
* Register custom handlers to be run in second pass after built-in Pass2Handler.
*/
public Builder registerPass2Handler(ReaderElementHandler handler) {
waySegmentParser.additionalPass2Handlers.add(handler);
return this;
}

/**
Expand Down Expand Up @@ -497,6 +517,10 @@ public WaySegmentParser build() {
}

public interface ReaderElementHandler {
public interface AccessOSMNodeData {
int run(long osmNodeId);
}

default void handleElement(ReaderElement elem) throws ParseException {
switch (elem.getType()) {
case NODE:
Expand Down Expand Up @@ -530,6 +554,9 @@ default void handleFileHeader(OSMFileHeader fileHeader) throws ParseException {

default void onFinish() {
}

default void setNodeDataAccess(AccessOSMNodeData nodeDataAccess) {
}
}

public interface EdgeHandler {
Expand Down

0 comments on commit 15dfdae

Please sign in to comment.