logo separator

[mkgmap-dev] [PATCH 05/14] Refactor to pass Relations as objects.

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

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

---
 .../me/parabola/splitter/DensityMapCollector.java  |   14 +------
 src/uk/me/parabola/splitter/MapProcessor.java      |   39 +------------------
 src/uk/me/parabola/splitter/NodeCollector.java     |   14 +------
 src/uk/me/parabola/splitter/OSMParser.java         |   14 +++---
 src/uk/me/parabola/splitter/SplitProcessor.java    |   41 +++++++++-----------
 5 files changed, 29 insertions(+), 93 deletions(-)

diff --git a/src/uk/me/parabola/splitter/DensityMapCollector.java b/src/uk/me/parabola/splitter/DensityMapCollector.java
index b4a5953..b94eda8 100644
--- a/src/uk/me/parabola/splitter/DensityMapCollector.java
+++ b/src/uk/me/parabola/splitter/DensityMapCollector.java
@@ -56,22 +56,10 @@ class DensityMapCollector implements MapCollector {
 	}
 
 	@Override
-	public void startRelation(int id) {}
-
-	@Override
-	public void relationTag(String key, String value) {}
-
-	@Override
-	public void relationNode(int nodeId, String role) {}
-
-	@Override
-	public void relationWay(int wayId, String role) {}
-
-	@Override
 	public void processWay(Way w) {}
 
 	@Override
-	public void endRelation() {}
+	public void processRelation(Relation r) {}
 
 	@Override
 	public void endMap() {}
diff --git a/src/uk/me/parabola/splitter/MapProcessor.java b/src/uk/me/parabola/splitter/MapProcessor.java
index b179d85..2bd020f 100644
--- a/src/uk/me/parabola/splitter/MapProcessor.java
+++ b/src/uk/me/parabola/splitter/MapProcessor.java
@@ -33,51 +33,16 @@ public interface MapProcessor {
 	 */
 	void boundTag(Area bounds);
 
-	/**
-	 * Called when a relation is encountered.
-	 * @param id the relation's ID.
-	 */
-	void startRelation(int id);
 
-	
 	/**
 	 * Called when a whole node has been processed. 
 	*/
 	void processNode(Node n);
 
-	/**
-	 * 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)}.
-	 * @param key the tag's key.
-	 * @param value the tag's value.
-	 */
-	void relationTag(String key, String value);
-
-	/**
-	 * 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)} .
-	 * @param nodeId the ID of the node.
-	 */
-	void relationNode(int nodeId, String role);
-
-	/**
-	 * Called when a reference to a way is encountered within a relation.
-	 * This method will be called for every way that is associated with the relation
-	 * that was specified in the most recent call to {@link #startRelation(int)} .
-	 * @param nodeId the ID of the node.
-	 */
-	void relationWay(int wayId, String role);
-
 	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
-	 * call to {@link #startRelation(int)}.
-	 */
-	void endRelation();
+	void processRelation(Relation w);
+
 
 	/**
 	 * Called once the entire map has finished processing.
diff --git a/src/uk/me/parabola/splitter/NodeCollector.java b/src/uk/me/parabola/splitter/NodeCollector.java
index 2607d18..409545f 100644
--- a/src/uk/me/parabola/splitter/NodeCollector.java
+++ b/src/uk/me/parabola/splitter/NodeCollector.java
@@ -49,22 +49,10 @@ class NodeCollector implements MapCollector {
 	}
 
 	@Override
-	public void startRelation(int id) {}
-
-	@Override
-	public void relationTag(String key, String value) {}
-
-	@Override
-	public void relationNode(int nodeId, String role) {}
-
-	@Override
-	public void relationWay(int wayId, String role) {}
-
-	@Override
 	public void processWay(Way w) {}
 
 	@Override
-	public void endRelation() {}
+	public void processRelation(Relation r) {}
 
 	@Override
 	public void endMap() {}
diff --git a/src/uk/me/parabola/splitter/OSMParser.java b/src/uk/me/parabola/splitter/OSMParser.java
index 081bc83..50569be 100644
--- a/src/uk/me/parabola/splitter/OSMParser.java
+++ b/src/uk/me/parabola/splitter/OSMParser.java
@@ -31,6 +31,7 @@ class OSMParser extends AbstractXppParser implements MapReader {
 
 	private Node currentNode = new Node();	
 	private Way currentWay = new Way();	
+	private Relation currentRelation = new Relation();	
 
 	private final MapProcessor processor;
 
@@ -154,7 +155,8 @@ class OSMParser extends AbstractXppParser implements MapReader {
 	}
 
 	private void startRelation() {
-		processor.startRelation(getIntAttr("id"));
+		currentRelation = new Relation();
+		currentRelation.set(getIntAttr("id"));
 		state = State.Relation;
 	}
 
@@ -174,15 +176,13 @@ class OSMParser extends AbstractXppParser implements MapReader {
 
 	private void processRelation(CharSequence name) {
 		if (name.equals("tag")) {
-			processor.relationTag(getAttr("k"), getAttr("v"));
+			currentRelation.addTag(getAttr("k"), getAttr("v"));
 		} else if (name.equals("member")) {
 			String type = getAttr("type");
 			int id = getIntAttr("ref");
 			String role = getAttr("role");
-			if ("node".equals(type)) {
-				processor.relationNode(id, role);
-			} else if ("way".equals(type)) {
-				processor.relationWay(id, role);
+			if ("node".equals(type) || "way".equals(type)) {
+				currentRelation.addMember(type, id, role);
 			}
 		}
 	}
@@ -260,7 +260,7 @@ class OSMParser extends AbstractXppParser implements MapReader {
 		} else if (state == State.Relation) {
 			if (name.equals("relation")) {
 				if (!startNodeOnly)
-					processor.endRelation();
+					processor.processRelation(currentRelation);
 				state = State.None;
 				relationCount++;
 				if (relationCount % RELATION_STATUS_UPDATE_THRESHOLD == 0) {
diff --git a/src/uk/me/parabola/splitter/SplitProcessor.java b/src/uk/me/parabola/splitter/SplitProcessor.java
index 693ebc5..24d23db 100644
--- a/src/uk/me/parabola/splitter/SplitProcessor.java
+++ b/src/uk/me/parabola/splitter/SplitProcessor.java
@@ -19,6 +19,8 @@ import java.util.Date;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.BlockingQueue;
 
+import uk.me.parabola.splitter.Relation.Member;
+
 /**
  * Splits a map into multiple areas.
  */
@@ -35,8 +37,6 @@ class SplitProcessor implements MapProcessor {
 
 	private int currentNodeAreaSet;
 	private BitSet currentWayAreaSet;
-
-	private Relation currentRelation = new Relation();
 	private BitSet currentRelAreaSet;
 	
 	private final int maxThreads;
@@ -73,20 +73,8 @@ class SplitProcessor implements MapProcessor {
 	public void boundTag(Area bounds) {
 	}
 
-	@Override
-	public void startRelation(int id) {
-		currentRelation.set(id);
-	}
-
-	@Override
-	public void relationTag(String key, String value) {
-		currentRelation.addTag(key, value);
-	}
-
-	@Override
-	public void relationNode(int id, String role) {
+	private void relationNode(int id, String role) {
 		{
-			currentRelation.addMember("node", id, role);
 			int set = coords.get(id);
 			if (set != 0) {
 				int mask = 0xff;
@@ -101,11 +89,9 @@ class SplitProcessor implements MapProcessor {
 		}
 	}
 
-	@Override
-	public void relationWay(int id, String role) {
+	private void relationWay(int id, String role) {
 		{
 			long[] bigSet;
-			currentRelation.addMember("way", id, role);
 			int set = ways.get(id);
 			if (set != 0) {
 				int mask = 0xff;
@@ -168,13 +154,22 @@ class SplitProcessor implements MapProcessor {
 	}
 
 	@Override
-	public void endRelation() {
+	public void processRelation(Relation r) {
 		try {
-			writeRelation();
-			currentRelation = new Relation();
+			for (Member mem : r.getMembers()) {
+				String role = mem.getRole();
+				int id = mem.getRef();
+				if (mem.getType().equals("node")) {
+					relationNode(id,role);
+				} else if (mem.getType().equals("way")){
+					relationWay(id,role);
+				}			
+			}
+			
+			writeRelation(r);
 			currentRelAreaSet.clear();
 		} catch (IOException e) {
-			throw new RuntimeException("failed to write relation " + currentRelation.getId(), e);
+			throw new RuntimeException("failed to write relation " + r.getId(), e);
 		}
 	}
 
@@ -262,7 +257,7 @@ class SplitProcessor implements MapProcessor {
 
 	private boolean seenRel;
 
-	private void writeRelation() throws IOException {
+	private void writeRelation(Relation currentRelation) throws IOException {
 		if (!seenRel) {
 			seenRel = true;
 			System.out.println("Writing relations " + new Date());
-- 
1.7.2.3




More information about the mkgmap-dev mailing list