logo separator

[mkgmap-dev] [PATCH 04/14] Refactor to pass Way's as objects.

From Jeffrey C. Ollie jeff at ocjtech.us on Thu Sep 9 21:12:04 BST 2010

From: Scott Crosby <scrosby at cs.rice.edu>

---
 .../me/parabola/splitter/DensityMapCollector.java  |   12 +----
 src/uk/me/parabola/splitter/MapProcessor.java      |   32 +----------
 src/uk/me/parabola/splitter/NodeCollector.java     |   11 +----
 src/uk/me/parabola/splitter/OSMParser.java         |   10 ++--
 src/uk/me/parabola/splitter/SplitProcessor.java    |   58 ++++++++------------
 5 files changed, 32 insertions(+), 91 deletions(-)

diff --git a/src/uk/me/parabola/splitter/DensityMapCollector.java b/src/uk/me/parabola/splitter/DensityMapCollector.java
index ef13a01..b4a5953 100644
--- a/src/uk/me/parabola/splitter/DensityMapCollector.java
+++ b/src/uk/me/parabola/splitter/DensityMapCollector.java
@@ -56,29 +56,19 @@ class DensityMapCollector implements MapCollector {
 	}
 
 	@Override
-	public void startWay(int id) {}
-
-	@Override
 	public void startRelation(int id) {}
 
-
-	@Override
-	public void wayTag(String key, String value) {}
-
 	@Override
 	public void relationTag(String key, String value) {}
 
 	@Override
-	public void wayNode(int nodeId) {}
-
-	@Override
 	public void relationNode(int nodeId, String role) {}
 
 	@Override
 	public void relationWay(int wayId, String role) {}
 
 	@Override
-	public void endWay() {}
+	public void processWay(Way w) {}
 
 	@Override
 	public void endRelation() {}
diff --git a/src/uk/me/parabola/splitter/MapProcessor.java b/src/uk/me/parabola/splitter/MapProcessor.java
index 536bcb1..b179d85 100644
--- a/src/uk/me/parabola/splitter/MapProcessor.java
+++ b/src/uk/me/parabola/splitter/MapProcessor.java
@@ -34,12 +34,6 @@ public interface MapProcessor {
 	void boundTag(Area bounds);
 
 	/**
-	 * Called when a way is encountered.
-	 * @param id the way's ID.
-	 */
-	void startWay(int id);
-
-	/**
 	 * Called when a relation is encountered.
 	 * @param id the relation's ID.
 	 */
@@ -52,15 +46,6 @@ public interface MapProcessor {
 	void processNode(Node n);
 
 	/**
-	 * Called when a tag is encountered on a way. This method will be
-	 * called for every tag associated with the way that was specified
-	 * in the most recent call to {@link #startWay(int)}.
-	 * @param key the tag's key.
-	 * @param value the tag's value.
-	 */
-	void wayTag(String key, String value);
-
-	/**
 	 * Called when a tag is encountered on a relation. This method will
 	 * be called for every tag associated with the relation that was
 	 * specified in the most recent call to {@link #startRelation(int)}.
@@ -70,14 +55,6 @@ public interface MapProcessor {
 	void relationTag(String key, String value);
 
 	/**
-	 * Called when a reference to a node is encountered within a way. This
-	 * method will be called for every node associated with the way that was
-	 * specified in the most recent call to {@link #startWay(int)} .
-	 * @param nodeId the ID of the node.
-	 */
-	void wayNode(int nodeId);
-
-	/**
 	 * Called when a reference to a node is encountered within a relation.
 	 * This method will be called for every node that is associated with the
 	 * relation that was specified in the most recent call to {@link #startRelation(int)} .
@@ -93,13 +70,8 @@ public interface MapProcessor {
 	 */
 	void relationWay(int wayId, String role);
 
-	/**
-	 * Called when processing is complete for a way. This method will be called once
-	 * there is no further data available for the way specified in the most recent
-	 * call to {@link #startWay(int)}.
-	 */
-	void endWay();
-
+	void processWay(Way w);
+	
 	/**
 	 * Called when processing is complete for a relation. This method will be called once
 	 * there is no further data available for the relation specified in the most recent
diff --git a/src/uk/me/parabola/splitter/NodeCollector.java b/src/uk/me/parabola/splitter/NodeCollector.java
index 6556ee6..2607d18 100644
--- a/src/uk/me/parabola/splitter/NodeCollector.java
+++ b/src/uk/me/parabola/splitter/NodeCollector.java
@@ -49,28 +49,19 @@ class NodeCollector implements MapCollector {
 	}
 
 	@Override
-	public void startWay(int id) {}
-
-	@Override
 	public void startRelation(int id) {}
 
 	@Override
-	public void wayTag(String key, String value) {}
-
-	@Override
 	public void relationTag(String key, String value) {}
 
 	@Override
-	public void wayNode(int nodeId) {}
-
-	@Override
 	public void relationNode(int nodeId, String role) {}
 
 	@Override
 	public void relationWay(int wayId, String role) {}
 
 	@Override
-	public void endWay() {}
+	public void processWay(Way w) {}
 
 	@Override
 	public void endRelation() {}
diff --git a/src/uk/me/parabola/splitter/OSMParser.java b/src/uk/me/parabola/splitter/OSMParser.java
index 80f0c29..081bc83 100644
--- a/src/uk/me/parabola/splitter/OSMParser.java
+++ b/src/uk/me/parabola/splitter/OSMParser.java
@@ -30,6 +30,7 @@ class OSMParser extends AbstractXppParser implements MapReader {
 	}
 
 	private Node currentNode = new Node();	
+	private Way currentWay = new Way();	
 
 	private final MapProcessor processor;
 
@@ -147,7 +148,8 @@ class OSMParser extends AbstractXppParser implements MapReader {
 	}
 
 	private void startWay() {
-		processor.startWay(getIntAttr("id"));
+		currentWay = new Way();
+		currentWay.set(getIntAttr("id"));
 		state = State.Way;
 	}
 
@@ -164,9 +166,9 @@ class OSMParser extends AbstractXppParser implements MapReader {
 
 	private void processWay(CharSequence name) {
 		if (name.equals("nd")) {
-			processor.wayNode(getIntAttr("ref"));
+			currentWay.addRef(getIntAttr("ref"));
 		} else if (name.equals("tag")) {
-			processor.wayTag(getAttr("k"), getAttr("v"));
+			currentWay.addTag(getAttr("k"), getAttr("v"));
 		}
 	}
 
@@ -248,7 +250,7 @@ class OSMParser extends AbstractXppParser implements MapReader {
 		} else if (state == State.Way) {
 			if (name.equals("way")) {
 				if (!startNodeOnly)
-					processor.endWay();
+					processor.processWay(currentWay);
 				state = State.None;
 				wayCount++;
 				if (wayCount % WAY_STATUS_UPDATE_THRESHOLD == 0) {
diff --git a/src/uk/me/parabola/splitter/SplitProcessor.java b/src/uk/me/parabola/splitter/SplitProcessor.java
index f02c1af..693ebc5 100644
--- a/src/uk/me/parabola/splitter/SplitProcessor.java
+++ b/src/uk/me/parabola/splitter/SplitProcessor.java
@@ -34,8 +34,6 @@ class SplitProcessor implements MapProcessor {
 	private final ArrayList<Thread> workerThreads;
 
 	private int currentNodeAreaSet;
-
-	private Way currentWay = new Way();
 	private BitSet currentWayAreaSet;
 
 	private Relation currentRelation = new Relation();
@@ -76,45 +74,16 @@ class SplitProcessor implements MapProcessor {
 	}
 
 	@Override
-	public void startWay(int id) {
-		currentWay.set(id);
-	}
-
-	@Override
 	public void startRelation(int id) {
 		currentRelation.set(id);
 	}
 
 	@Override
-	public void wayTag(String key, String value) {
-		currentWay.addTag(key, value);
-	}
-
-	@Override
 	public void relationTag(String key, String value) {
 		currentRelation.addTag(key, value);
 	}
 
 	@Override
-	public void wayNode(int id) {
-		// Get the list of areas that the node is in.  A node may be in
-		// more than one area because of overlap.
-		int set = coords.get(id);
-
-		// add the list of areas to the currentWayAreaSet
-		if (set != 0) {
-			int mask = 0xff;
-			for (int slot = 0; slot < 4; slot++, mask <<= 8) {
-				int val = (set & mask) >>> (slot * 8);
-				if (val == 0)
-					break;
-				currentWayAreaSet.set(val - 1);
-			}
-		}
-		currentWay.addRef(id);
-	}
-
-	@Override
 	public void relationNode(int id, String role) {
 		{
 			currentRelation.addMember("node", id, role);
@@ -171,13 +140,30 @@ class SplitProcessor implements MapProcessor {
 	}
 
 	@Override
-	public void endWay() {
+	public void processWay(Way w) {
+
+		for (int id: w.getRefs().asArray()) {
+			// Get the list of areas that the node is in.  A node may be in
+			// more than one area because of overlap.
+			int set = coords.get(id);
+
+			// add the list of areas to the currentWayAreaSet
+			if (set != 0) {
+				int mask = 0xff;
+				for (int slot = 0; slot < 4; slot++, mask <<= 8) {
+					int val = (set & mask) >>> (slot * 8);
+				if (val == 0)
+					break;
+				currentWayAreaSet.set(val - 1);
+				}
+			}
+		}
+		
 		try {
-			writeWay();
-			currentWay = new Way();
+			writeWay(w);
 			currentWayAreaSet.clear();
 		} catch (IOException e) {
-			throw new RuntimeException("failed to write way " + currentWay.getId(), e);
+			throw new RuntimeException("failed to write way " + w.getId(), e);
 		}
 	}
 
@@ -237,7 +223,7 @@ class SplitProcessor implements MapProcessor {
 
 	private boolean seenWay;
 
-	private void writeWay() throws IOException {
+	private void writeWay(Way currentWay) throws IOException {
 		if (!seenWay) {
 			seenWay = true;
 			System.out.println("Writing ways " + new Date());
-- 
1.7.2.3




More information about the mkgmap-dev mailing list