This makes sure to keep the reverse lookup code in sync
when objects are added or deleted from data sets.


---

 core-dave/./src/org/openstreetmap/josm/data/osm/visitor/AddVisitor.java    |   
12 +++++-
 core-dave/./src/org/openstreetmap/josm/data/osm/visitor/DeleteVisitor.java |   
11 +++++
 core-dave/./src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java  |   
19 ++++------
 3 files changed, 31 insertions(+), 11 deletions(-)

diff -puN 
./src/org/openstreetmap/josm/data/osm/visitor/AddVisitor.java~rl-visitors 
./src/org/openstreetmap/josm/data/osm/visitor/AddVisitor.java
--- 
core/./src/org/openstreetmap/josm/data/osm/visitor/AddVisitor.java~rl-visitors  
    2008-05-03 12:08:45.000000000 -0700
+++ core-dave/./src/org/openstreetmap/josm/data/osm/visitor/AddVisitor.java     
2008-05-03 12:08:45.000000000 -0700
@@ -2,6 +2,7 @@
 package org.openstreetmap.josm.data.osm.visitor;
 
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Way;
@@ -20,12 +21,21 @@ public class AddVisitor implements Visit
        public AddVisitor(DataSet ds) {
                this.ds = ds;
        }
-       
+       public void fixId(OsmPrimitive osm)
+       {
+               if (osm.id < 0)
+                       osm.id = 0;
+       }
+       boolean debugme = false;
        public void visit(Node n) {
+               fixId(n);
                ds.nodes.add(n);
        }
        public void visit(Way w) {
+               fixId(w);
                ds.ways.add(w);
+               for (Node n : w.nodes)
+                       ds.rl.addWayToNodeMap(n, w);
        }
        public void visit(Relation e) {
                ds.relations.add(e);
diff -puN 
./src/org/openstreetmap/josm/data/osm/visitor/DeleteVisitor.java~rl-visitors 
./src/org/openstreetmap/josm/data/osm/visitor/DeleteVisitor.java
--- 
core/./src/org/openstreetmap/josm/data/osm/visitor/DeleteVisitor.java~rl-visitors
   2008-05-03 12:08:45.000000000 -0700
+++ core-dave/./src/org/openstreetmap/josm/data/osm/visitor/DeleteVisitor.java  
2008-05-03 12:08:45.000000000 -0700
@@ -1,11 +1,14 @@
 // License: GPL. Copyright 2007 by Immanuel Scholz and others
 package org.openstreetmap.josm.data.osm.visitor;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Way;
 
+import java.util.*;
+
 /**
  * Visitor, that adds the visited object to the dataset given at constructor.
  * 
@@ -22,10 +25,18 @@ public class DeleteVisitor implements Vi
        }
        
        public void visit(Node n) {
+               List<Way> ways = ds.rl.waysUsingNode(n);
+               if (ways.size() != 0) {
+                       Main.debug("error: removed node from data set while 
still in use by ways:");
+                       for (Way w : ways)
+                               Main.debug("   way: " + w.id);
+               }
                ds.nodes.remove(n);
        }
        public void visit(Way w) {
                ds.ways.remove(w);
+               ds.rl.removeWay(w);
+               Main.debug("DeleteVisitor() Way: " + w.id);
        }
        public void visit(Relation e) {
                ds.relations.remove(e);
diff -puN 
./src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java~rl-visitors 
./src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java
--- 
core/./src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java~rl-visitors
    2008-05-03 12:08:45.000000000 -0700
+++ core-dave/./src/org/openstreetmap/josm/data/osm/visitor/MergeVisitor.java   
2008-05-03 12:08:45.000000000 -0700
@@ -8,6 +8,9 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
 
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.ReplaceNodeInWayCommand;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
@@ -104,18 +107,14 @@ public class MergeVisitor implements Vis
        }
 
        private void fixWay(Way w) {
-           boolean replacedSomething = false;
-           LinkedList<Node> newNodes = new LinkedList<Node>();
-           for (Node n : w.nodes) {
+           for (int i = 0; i < w.nodes.size(); i++) {
+               Node n = w.nodes.get(i);
                Node otherN = (Node) merged.get(n);
-               newNodes.add(otherN == null ? n : otherN);
-               if (otherN != null)
-                       replacedSomething = true;
+               if (otherN == null)
+                       continue;
+               Command c = new ReplaceNodeInWayCommand(w, n, otherN, i);
+               c.executeCommand();
            }
-           if (replacedSomething) {
-               w.nodes.clear();
-               w.nodes.addAll(newNodes);
-               }
     }
 
        private void fixRelation(Relation r) {
_

_______________________________________________
josm-dev mailing list
josm-dev@openstreetmap.org
http://lists.openstreetmap.org/cgi-bin/mailman/listinfo/josm-dev

Reply via email to