Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package josm 0.0.svn5267+dfsg1-2.

It fixes #682315 which, even if not RC, would make the package almost unusable
in wheezy.

OpenStreetMap has undergone a license change in its data, so some data was
removed/hidden, and the current JOSM in wheezy is unable to deal with that. The
reporter proposed to package a newer upstream version, but I managed to
backport the needed fixes to the version in wheezy.

Please find the diff attached (there are also some patch renames there, sorry
for the noise).

unblock josm/0.0.svn5267+dfsg1-2

Thanks for your work,
David

-- 
 . ''`.   Debian developer | http://wiki.debian.org/DavidPaleino
 : :'  : Linuxer #334216 --|-- http://www.hanskalabs.net/
 `. `'`  GPG: 1392B174 ----|---- http://deb.li/dapal
   `-   2BAB C625 4E66 E7B8 450A C3E1 E6AA 9017 1392 B174
diff --git a/debian/changelog b/debian/changelog
index e879535..f548210 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+josm (0.0.svn5267+dfsg1-2) unstable; urgency=low
+
+  * Backported patches from upstream repository, to handle recent
+    OSM license change (Closes: #682315)
+      - 06-handle_redacted_objects.patch
+      - 07-handle_deleted_nodes_without_coordinates.patch
+
+ -- David Paleino <da...@debian.org>  Mon, 23 Jul 2012 10:16:59 +0200
+
 josm (0.0.svn5267+dfsg1-1) unstable; urgency=low
 
   * New tested snapshot
diff --git a/debian/patches/10-build.patch b/debian/patches/00-build.patch
similarity index 100%
rename from debian/patches/10-build.patch
rename to debian/patches/00-build.patch
diff --git a/debian/patches/20-bts.patch b/debian/patches/01-bts.patch
similarity index 100%
rename from debian/patches/20-bts.patch
rename to debian/patches/01-bts.patch
diff --git a/debian/patches/40-elemstyles.patch b/debian/patches/02-elemstyles.patch
similarity index 100%
rename from debian/patches/40-elemstyles.patch
rename to debian/patches/02-elemstyles.patch
diff --git a/debian/patches/70-default_look_and_feel.patch b/debian/patches/03-default_look_and_feel.patch
similarity index 100%
rename from debian/patches/70-default_look_and_feel.patch
rename to debian/patches/03-default_look_and_feel.patch
diff --git a/debian/patches/80-fix_images.patch b/debian/patches/04-fix_images.patch
similarity index 100%
rename from debian/patches/80-fix_images.patch
rename to debian/patches/04-fix_images.patch
diff --git a/debian/patches/90-fix_version.patch b/debian/patches/05-fix_version.patch
similarity index 100%
rename from debian/patches/90-fix_version.patch
rename to debian/patches/05-fix_version.patch
diff --git a/debian/patches/06-handle_redacted_objects.patch b/debian/patches/06-handle_redacted_objects.patch
new file mode 100644
index 0000000..3ce0066
--- /dev/null
+++ b/debian/patches/06-handle_redacted_objects.patch
@@ -0,0 +1,46 @@
+From: Don-vip
+Subject: handle redacted objects resulting from OSM License change process
+Origin: upstream, http://josm.openstreetmap.de/changeset/5339/josm
+ upstream, http://josm.openstreetmap.de/changeset/5340/josm
+Bug-Debian: http://bugs.debian.org/682315
+
+---
+ src/org/openstreetmap/josm/data/osm/history/History.java        |   14 ++++++++++
+ src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java |    5 +++
+ 2 files changed, 19 insertions(+)
+
+--- josm.orig/src/org/openstreetmap/josm/data/osm/history/History.java
++++ josm/src/org/openstreetmap/josm/data/osm/history/History.java
+@@ -230,4 +230,18 @@ public class History{
+     public OsmPrimitiveType getType() {
+         return type;
+     }
++
++    @Override
++    public String toString() {
++        String result = "History ["
++                + (type != null ? "type=" + type + ", " : "") + "id=" + id;
++        if (versions != null) {
++            result += ", versions=\n";
++            for (HistoryOsmPrimitive v : versions) {
++                result += "\t" + v + ",\n";
++            }
++        }
++        result += "]";
++        return result;
++    }
+ }
+--- josm.orig/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
++++ josm/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
+@@ -161,6 +161,11 @@ public class HistoryBrowserModel extends
+         if (history.getByVersion(primitive.getVersion()) != null)
+             return primitive.isModified();
+ 
++        // if latest version from history is higher than a non existing primitive version,
++        // that means this version has been redacted and the primitive cannot be used.
++        if (history.getLatest().getVersion() > primitive.getVersion())
++            return false;
++
+         // latest has a higher version than one of the primitives
+         // in the history (probably because the history got out of sync
+         // with uploaded data) -> show the primitive as latest
diff --git a/debian/patches/07-handle_deleted_nodes_without_coordinates.patch b/debian/patches/07-handle_deleted_nodes_without_coordinates.patch
new file mode 100644
index 0000000..0c68898
--- /dev/null
+++ b/debian/patches/07-handle_deleted_nodes_without_coordinates.patch
@@ -0,0 +1,503 @@
+From: Frederik Ramm <frede...@remote.org>
+ Don-vip
+Subject: Handle deleted nodes without coordinates after recent OSM API change
+Origin: upstream, http://josm.openstreetmap.de/changeset/5326/josm
+ upstream, http://josm.openstreetmap.de/changeset/5328/josm
+ upstream, http://josm.openstreetmap.de/changeset/5332/josm
+ upstream, http://josm.openstreetmap.de/changeset/5333/josm
+ upstream, http://josm.openstreetmap.de/changeset/5334/josm
+ upstream, http://josm.openstreetmap.de/changeset/5346/josm
+ upstream, http://josm.openstreetmap.de/changeset/5349/josm
+ upstream, http://josm.openstreetmap.de/changeset/5350/josm
+ upstream, http://josm.openstreetmap.de/changeset/5351/josm
+ upstream, http://josm.openstreetmap.de/changeset/5356/josm
+Bug-Debian: http://bugs.debian.org/682315
+
+---
+ src/org/openstreetmap/josm/data/osm/DataSetMerger.java                      |   17 +++--
+ src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java             |   10 +--
+ src/org/openstreetmap/josm/data/osm/Node.java                               |   17 ++---
+ src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java |   14 ++--
+ src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java         |   27 +++++---
+ src/org/openstreetmap/josm/gui/DefaultNameFormatter.java                    |   18 +++--
+ src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java          |   14 ++--
+ src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java            |   32 +++++++---
+ src/org/openstreetmap/josm/io/GeoJSONWriter.java                            |    4 -
+ src/org/openstreetmap/josm/io/OsmChangesetContentParser.java                |   13 ++--
+ src/org/openstreetmap/josm/io/OsmHistoryReader.java                         |   13 ++--
+ src/org/openstreetmap/josm/io/OsmReader.java                                |    6 +
+ src/org/openstreetmap/josm/io/OsmWriter.java                                |    4 -
+ 13 files changed, 118 insertions(+), 71 deletions(-)
+
+--- josm.orig/src/org/openstreetmap/josm/data/osm/Node.java
++++ josm/src/org/openstreetmap/josm/data/osm/Node.java
+@@ -33,16 +33,12 @@ public final class Node extends OsmPrimi
+ 
+     @Override
+     public final void setCoor(LatLon coor) {
+-        if(coor != null){
+-            updateCoor(coor, null);
+-        }
++        updateCoor(coor, null);
+     }
+ 
+     @Override
+     public final void setEastNorth(EastNorth eastNorth) {
+-        if(eastNorth != null) {
+-            updateCoor(null, eastNorth);
+-        }
++        updateCoor(null, eastNorth);
+     }
+ 
+     private void updateCoor(LatLon coor, EastNorth eastNorth) {
+@@ -112,8 +108,11 @@ public final class Node extends OsmPrimi
+             this.lon = ll.lon();
+             this.east = eastNorth.east();
+             this.north = eastNorth.north();
+-        } else
+-            throw new IllegalArgumentException();
++        } else {
++            this.lat = Double.NaN;
++            this.lon = Double.NaN;
++            invalidateEastNorthCache();
++        }
+     }
+ 
+     protected Node(long id, boolean allowNegative) {
+@@ -177,7 +176,7 @@ public final class Node extends OsmPrimi
+     @Override
+     void setDataset(DataSet dataSet) {
+         super.setDataset(dataSet);
+-        if (!isIncomplete() && (getCoor() == null || getEastNorth() == null))
++        if (!isIncomplete() && isVisible() && (getCoor() == null || getEastNorth() == null))
+             throw new DataIntegrityProblemException("Complete node with null coordinates: " + toString() + get3892DebugInfo());
+     }
+ 
+--- josm.orig/src/org/openstreetmap/josm/io/OsmReader.java
++++ josm/src/org/openstreetmap/josm/io/OsmReader.java
+@@ -177,7 +177,11 @@ public class OsmReader extends AbstractR
+ 
+     protected Node parseNode() throws XMLStreamException {
+         NodeData nd = new NodeData();
+-        nd.setCoor(new LatLon(Double.parseDouble(parser.getAttributeValue(null, "lat")), Double.parseDouble(parser.getAttributeValue(null, "lon"))));
++        String lat = parser.getAttributeValue(null, "lat");
++        String lon = parser.getAttributeValue(null, "lon");
++        if (lat != null && lon != null) {
++            nd.setCoor(new LatLon(Double.parseDouble(lat), Double.parseDouble(lon)));
++        }
+         readCommon(nd);
+         Node n = new Node(nd.getId(), nd.getVersion());
+         n.setVisible(nd.isVisible());
+--- josm.orig/src/org/openstreetmap/josm/io/OsmWriter.java
++++ josm/src/org/openstreetmap/josm/io/OsmWriter.java
+@@ -135,7 +135,9 @@ public class OsmWriter extends XmlWriter
+     public void visit(INode n) {
+         if (n.isIncomplete()) return;
+         addCommon(n, "node");
+-        out.print(" lat='"+n.getCoor().lat()+"' lon='"+n.getCoor().lon()+"'");
++        if (n.getCoor() != null) {
++            out.print(" lat='"+n.getCoor().lat()+"' lon='"+n.getCoor().lon()+"'");
++        }
+         if (!withBody) {
+             out.println("/>");
+         } else {
+--- josm.orig/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java
++++ josm/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java
+@@ -18,6 +18,7 @@ import java.util.Set;
+ 
+ import org.openstreetmap.josm.Main;
+ import org.openstreetmap.josm.data.coor.CoordinateFormat;
++import org.openstreetmap.josm.data.coor.LatLon;
+ import org.openstreetmap.josm.data.osm.Changeset;
+ import org.openstreetmap.josm.data.osm.IPrimitive;
+ import org.openstreetmap.josm.data.osm.IRelation;
+@@ -178,7 +179,9 @@ public class DefaultNameFormatter implem
+             } else {
+                 preset.nameTemplate.appendText(name, node);
+             }
+-            name.append(" \u200E(").append(node.getCoor().latToString(CoordinateFormat.getDefaultFormat())).append(", ").append(node.getCoor().lonToString(CoordinateFormat.getDefaultFormat())).append(")");
++            if (node.getCoor() != null) {
++                name.append(" \u200E(").append(node.getCoor().latToString(CoordinateFormat.getDefaultFormat())).append(", ").append(node.getCoor().lonToString(CoordinateFormat.getDefaultFormat())).append(")");
++            }
+         }
+         decorateNameWithId(name, node);
+ 
+@@ -553,11 +556,14 @@ public class DefaultNameFormatter implem
+         } else {
+             sb.append(name);
+         }
+-        sb.append(" (")
+-        .append(node.getCoords().latToString(CoordinateFormat.getDefaultFormat()))
+-        .append(", ")
+-        .append(node.getCoords().lonToString(CoordinateFormat.getDefaultFormat()))
+-        .append(")");
++        LatLon coord = node.getCoords();
++        if (coord != null) {
++            sb.append(" (")
++            .append(coord.latToString(CoordinateFormat.getDefaultFormat()))
++            .append(", ")
++            .append(coord.lonToString(CoordinateFormat.getDefaultFormat()))
++            .append(")");
++        }
+         decorateNameWithId(sb, node);
+         return sb.toString();
+     }
+--- josm.orig/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
++++ josm/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
+@@ -272,12 +272,14 @@ public class InspectPrimitiveDialog exte
+         }
+ 
+         void addCoordinates(Node n) {
+-            add(tr("Coordinates: "),
+-                    Double.toString(n.getCoor().lat()), ", ",
+-                    Double.toString(n.getCoor().lon()));
+-            add(tr("Coordinates (projected): "),
+-                    Double.toString(n.getEastNorth().east()), ", ",
+-                    Double.toString(n.getEastNorth().north()));
++            if (n.getCoor() != null) {
++                add(tr("Coordinates: "),
++                        Double.toString(n.getCoor().lat()), ", ",
++                        Double.toString(n.getCoor().lon()));
++                add(tr("Coordinates (projected): "),
++                        Double.toString(n.getEastNorth().east()), ", ",
++                        Double.toString(n.getEastNorth().north()));
++            }
+         }
+ 
+         void addReferrers(StringBuilder s, OsmPrimitive o) {
+--- josm.orig/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java
++++ josm/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java
+@@ -69,7 +69,7 @@ public class DatasetConsistencyTest {
+ 
+     public void checkCompleteNodesWithoutCoordinates() {
+         for (Node node:dataSet.getNodes()) {
+-            if (!node.isIncomplete() && (node.getCoor() == null || node.getEastNorth() == null)) {
++            if (!node.isIncomplete() && node.isVisible() && (node.getCoor() == null || node.getEastNorth() == null)) {
+                 printError("COMPLETE WITHOUT COORDINATES", "%s is not incomplete but has null coordinates", node);
+             }
+         }
+@@ -79,9 +79,11 @@ public class DatasetConsistencyTest {
+         for (Node n:dataSet.getNodes()) {
+             if (!n.isIncomplete() && !n.isDeleted()) {
+                 LatLon c = n.getCoor();
+-                BBox box = new BBox(new LatLon(c.lat() - 0.0001, c.lon() - 0.0001), new LatLon(c.lat() + 0.0001, c.lon() + 0.0001));
+-                if (!dataSet.searchNodes(box).contains(n)) {
+-                    printError("SEARCH NODES", "%s not found using Dataset.searchNodes()", n);
++                if (c != null) {
++                    BBox box = new BBox(new LatLon(c.lat() - 0.0001, c.lon() - 0.0001), new LatLon(c.lat() + 0.0001, c.lon() + 0.0001));
++                    if (!dataSet.searchNodes(box).contains(n)) {
++                        printError("SEARCH NODES", "%s not found using Dataset.searchNodes()", n);
++                    }
+                 }
+             }
+         }
+--- josm.orig/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
++++ josm/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
+@@ -14,6 +14,7 @@ import javax.swing.JLabel;
+ import javax.swing.JPanel;
+ 
+ import org.openstreetmap.josm.data.coor.CoordinateFormat;
++import org.openstreetmap.josm.data.coor.LatLon;
+ import org.openstreetmap.josm.data.osm.history.HistoryNode;
+ import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
+ import org.openstreetmap.josm.gui.NavigatableComponent;
+@@ -255,19 +256,24 @@ public class CoordinateInfoViewer extend
+             HistoryNode node = (HistoryNode)p;
+             HistoryNode oppositeNode = (HistoryNode) opposite;
+ 
++            LatLon coord = node.getCoords();
++            LatLon oppositeCoord = oppositeNode.getCoords();
++
+             // display the coordinates
+             //
+-            lblLat.setText(node.getCoords().latToString(CoordinateFormat.DECIMAL_DEGREES));
+-            lblLon.setText(node.getCoords().lonToString(CoordinateFormat.DECIMAL_DEGREES));
++            lblLat.setText(coord != null ? coord.latToString(CoordinateFormat.DECIMAL_DEGREES) : tr("(none)"));
++            lblLon.setText(coord != null ? coord.lonToString(CoordinateFormat.DECIMAL_DEGREES) : tr("(none)"));
+ 
+             // update background color to reflect differences in the coordinates
+             //
+-            if (node.getCoords().lat() == oppositeNode.getCoords().lat()) {
++            if (coord == oppositeCoord ||
++                    (coord != null && oppositeCoord != null && coord.lat() == oppositeCoord.lat())) {
+                 lblLat.setBackground(Color.WHITE);
+             } else {
+                 lblLat.setBackground(BGCOLOR_DIFFERENCE);
+             }
+-            if (node.getCoords().lon() == oppositeNode.getCoords().lon()) {
++            if (coord == oppositeCoord ||
++                    (coord != null && oppositeCoord != null && coord.lon() == oppositeCoord.lon())) {
+                 lblLon.setBackground(Color.WHITE);
+             } else {
+                 lblLon.setBackground(BGCOLOR_DIFFERENCE);
+@@ -321,15 +327,23 @@ public class CoordinateInfoViewer extend
+             HistoryNode node = (HistoryNode) p;
+             HistoryNode oppositeNode = (HistoryNode) opposite;
+ 
++            LatLon coord = node.getCoords();
++            LatLon oppositeCoord = oppositeNode.getCoords();
++
+             // update distance
+             //
+-            double distance = node.getCoords().greatCircleDistance(oppositeNode.getCoords());
+-            if (distance > 0) {
+-                lblDistance.setBackground(BGCOLOR_DIFFERENCE);
++            if (coord != null && oppositeCoord != null) {
++                double distance = coord.greatCircleDistance(oppositeNode.getCoords());
++                if (distance > 0) {
++                    lblDistance.setBackground(BGCOLOR_DIFFERENCE);
++                } else {
++                    lblDistance.setBackground(Color.WHITE);
++                }
++                lblDistance.setText(NavigatableComponent.getDistText(distance));
+             } else {
+-                lblDistance.setBackground(Color.WHITE);
++                lblDistance.setBackground(coord != oppositeCoord ? BGCOLOR_DIFFERENCE : Color.WHITE);
++                lblDistance.setText(tr("(none)"));
+             }
+-            lblDistance.setText(NavigatableComponent.getDistText(distance));
+         }
+     }
+ }
+--- josm.orig/src/org/openstreetmap/josm/io/GeoJSONWriter.java
++++ josm/src/org/openstreetmap/josm/io/GeoJSONWriter.java
+@@ -103,6 +103,8 @@ public class GeoJSONWriter implements Vi
+     }
+ 
+     protected void appendCoord(LatLon c) {
+-        out.append("[").append(c.lon()).append(", ").append(c.lat()).append("]");
++        if (c != null) {
++            out.append("[").append(c.lon()).append(", ").append(c.lat()).append("]");
++        }
+     }
+ }
+--- josm.orig/src/org/openstreetmap/josm/io/OsmChangesetContentParser.java
++++ josm/src/org/openstreetmap/josm/io/OsmChangesetContentParser.java
+@@ -102,16 +102,16 @@ public class OsmChangesetContentParser {
+             return l;
+         }
+ 
+-        protected Double getMandatoryAttributeDouble(Attributes attr, String name) throws SAXException{
++        protected Double getAttributeDouble(Attributes attr, String name) throws SAXException{
+             String v = attr.getValue(name);
+             if (v == null) {
+-                throwException(tr("Missing mandatory attribute ''{0}''.", name));
++                return null;
+             }
+             double d = 0.0;
+             try {
+                 d = Double.parseDouble(v);
+             } catch(NumberFormatException e) {
+-                throwException(tr("Illegal value for mandatory attribute ''{0}'' of type double. Got ''{1}''.", name, v));
++                throwException(tr("Illegal value for attribute ''{0}'' of type double. Got ''{1}''.", name, v));
+             }
+             return d;
+         }
+@@ -159,10 +159,11 @@ public class OsmChangesetContentParser {
+             Date timestamp = DateUtils.fromString(v);
+             HistoryOsmPrimitive primitive = null;
+             if (type.equals(OsmPrimitiveType.NODE)) {
+-                double lat = getMandatoryAttributeDouble(atts, "lat");
+-                double lon = getMandatoryAttributeDouble(atts, "lon");
++                Double lat = getAttributeDouble(atts, "lat");
++                Double lon = getAttributeDouble(atts, "lon");
++                LatLon coor = (lat != null && lon != null) ? new LatLon(lat,lon) : null;
+                 primitive = new HistoryNode(
+-                        id,version,visible,user,changesetId,timestamp, new LatLon(lat,lon)
++                        id,version,visible,user,changesetId,timestamp,coor
+                 );
+ 
+             } else if (type.equals(OsmPrimitiveType.WAY)) {
+--- josm.orig/src/org/openstreetmap/josm/io/OsmHistoryReader.java
++++ josm/src/org/openstreetmap/josm/io/OsmHistoryReader.java
+@@ -98,16 +98,16 @@ public class OsmHistoryReader {
+             return l;
+         }
+ 
+-        protected Double getMandatoryAttributeDouble(Attributes attr, String name) throws SAXException{
++        protected Double getAttributeDouble(Attributes attr, String name) throws SAXException{
+             String v = attr.getValue(name);
+             if (v == null) {
+-                throwException(tr("Missing mandatory attribute ''{0}''.", name));
++                return null;
+             }
+             double d = 0.0;
+             try {
+                 d = Double.parseDouble(v);
+             } catch(NumberFormatException e) {
+-                throwException(tr("Illegal value for mandatory attribute ''{0}'' of type double. Got ''{1}''.", name, v));
++                throwException(tr("Illegal value for attribute ''{0}'' of type double. Got ''{1}''.", name, v));
+             }
+             return d;
+         }
+@@ -153,10 +153,11 @@ public class OsmHistoryReader {
+             Date timestamp = DateUtils.fromString(v);
+             HistoryOsmPrimitive primitive = null;
+             if (type.equals(OsmPrimitiveType.NODE)) {
+-                double lat = getMandatoryAttributeDouble(atts, "lat");
+-                double lon = getMandatoryAttributeDouble(atts, "lon");
++                Double lat = getAttributeDouble(atts, "lat");
++                Double lon = getAttributeDouble(atts, "lon");
++                LatLon coord = (lat != null && lon != null) ? new LatLon(lat,lon) : null;
+                 primitive = new HistoryNode(
+-                        id,version,visible,user,changesetId,timestamp, new LatLon(lat,lon)
++                        id,version,visible,user,changesetId,timestamp,coord
+                 );
+ 
+             } else if (type.equals(OsmPrimitiveType.WAY)) {
+--- josm.orig/src/org/openstreetmap/josm/data/osm/DataSetMerger.java
++++ josm/src/org/openstreetmap/josm/data/osm/DataSetMerger.java
+@@ -178,8 +178,9 @@ public class DataSetMerger {
+ 
+                 List<OsmPrimitive> referrers = target.getReferrers();
+                 if (referrers.isEmpty()) {
+-                    target.setDeleted(true);
++                    resetPrimitive(target);
+                     target.mergeFrom(source);
++                    target.setDeleted(true);
+                     it.remove();
+                     flag = true;
+                 } else {
+@@ -202,11 +203,7 @@ public class DataSetMerger {
+             // There are some more objects rest in the objectsToDelete set
+             // This can be because of cross-referenced relations.
+             for (OsmPrimitive osm: objectsToDelete) {
+-                if (osm instanceof Way) {
+-                    ((Way) osm).setNodes(null);
+-                } else if (osm instanceof Relation) {
+-                    ((Relation) osm).setMembers(null);
+-                }
++                resetPrimitive(osm);
+             }
+             for (OsmPrimitive osm: objectsToDelete) {
+                 osm.setDeleted(true);
+@@ -215,6 +212,14 @@ public class DataSetMerger {
+         }
+     }
+ 
++    private final void resetPrimitive(OsmPrimitive osm) {
++        if (osm instanceof Way) {
++            ((Way) osm).setNodes(null);
++        } else if (osm instanceof Relation) {
++            ((Relation) osm).setMembers(null);
++        }
++    }
++
+     /**
+      * Merges the node list of a source way onto its target way.
+      *
+--- josm.orig/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
++++ josm/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
+@@ -137,33 +137,33 @@ public class WireframeMapRenderer extend
+            time to iterate through list twice, OTOH does not
+            require changing the colour while painting... */
+         for (final OsmPrimitive osm: data.searchRelations(bbox)) {
+-            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isDisabledAndHidden()) {
++            if (osm.isDrawable() && !ds.isSelected(osm) && !osm.isDisabledAndHidden()) {
+                 osm.visit(this);
+             }
+         }
+ 
+         for (final OsmPrimitive osm:data.searchWays(bbox)){
+-            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isDisabledAndHidden() && osm.isTagged()) {
++            if (osm.isDrawable() && !ds.isSelected(osm) && !osm.isDisabledAndHidden() && osm.isTagged()) {
+                 osm.visit(this);
+             }
+         }
+         displaySegments();
+ 
+         for (final OsmPrimitive osm:data.searchWays(bbox)){
+-            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isDisabledAndHidden() && !osm.isTagged()) {
++            if (osm.isDrawable() && !ds.isSelected(osm) && !osm.isDisabledAndHidden() && !osm.isTagged()) {
+                 osm.visit(this);
+             }
+         }
+         displaySegments();
+         for (final OsmPrimitive osm : data.getSelected()) {
+-            if (!osm.isDeleted()) {
++            if (osm.isDrawable()) {
+                 osm.visit(this);
+             }
+         }
+         displaySegments();
+ 
+         for (final OsmPrimitive osm: data.searchNodes(bbox)) {
+-            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isDisabledAndHidden())
++            if (osm.isDrawable() && !ds.isSelected(osm) && !osm.isDisabledAndHidden())
+             {
+                 osm.visit(this);
+             }
+@@ -343,7 +343,7 @@ public class WireframeMapRenderer extend
+         g.setColor(col);
+ 
+         for (RelationMember m : r.getMembers()) {
+-            if (m.getMember().isIncomplete() || m.getMember().isDeleted()) {
++            if (m.getMember().isIncomplete() || !m.getMember().isDrawable()) {
+                 continue;
+             }
+ 
+@@ -360,7 +360,7 @@ public class WireframeMapRenderer extend
+ 
+                 boolean first = true;
+                 for (Node n : m.getWay().getNodes()) {
+-                    if (n.isIncomplete() || n.isDeleted()) {
++                    if (!n.isDrawable()) {
+                         continue;
+                     }
+                     Point p = nc.getPoint(n);
+--- josm.orig/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java
++++ josm/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java
+@@ -43,35 +43,44 @@ public class DuplicateNode extends Test
+ 
+         double precision = Main.pref.getDouble("validator.duplicatenodes.precision", 0.);
+ 
+-        private LatLon RoundCoord(Node o) {
++        private LatLon roundCoord(LatLon coor) {
+             return new LatLon(
+-                    Math.round(o.getCoor().lat() / precision) * precision,
+-                    Math.round(o.getCoor().lon() / precision) * precision
++                    Math.round(coor.lat() / precision) * precision,
++                    Math.round(coor.lon() / precision) * precision
+                     );
+         }
+ 
+         @SuppressWarnings("unchecked")
+         private LatLon getLatLon(Object o) {
+             if (o instanceof Node) {
++                LatLon coor = ((Node) o).getCoor();
++                if (coor == null)
++                    return null;
+                 if (precision==0)
+-                    return ((Node) o).getCoor().getRoundedToOsmPrecision();
+-                return RoundCoord((Node) o);
++                    return coor.getRoundedToOsmPrecision();
++                return roundCoord(coor);
+             } else if (o instanceof List<?>) {
++                LatLon coor = ((List<Node>) o).get(0).getCoor();
++                if (coor == null)
++                    return null;
+                 if (precision==0)
+-                    return ((List<Node>) o).get(0).getCoor().getRoundedToOsmPrecision();
+-                return RoundCoord(((List<Node>) o).get(0));
++                    return coor.getRoundedToOsmPrecision();
++                return roundCoord(coor);
+             } else
+                 throw new AssertionError();
+         }
+ 
+         @Override
+         public boolean equals(Object k, Object t) {
+-            return getLatLon(k).equals(getLatLon(t));
++            LatLon coorK = getLatLon(k);
++            LatLon coorT = getLatLon(t);
++            return coorK == coorT || (coorK != null && coorT != null && coorK.equals(coorT));
+         }
+ 
+         @Override
+         public int getHashCode(Object k) {
+-            return getLatLon(k).hashCode();
++            LatLon coorK = getLatLon(k);
++            return coorK == null ? 0 : coorK.hashCode();
+         }
+     }
+ 
diff --git a/debian/patches/series b/debian/patches/series
index eacd6fc..8bdaa91 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,7 +1,9 @@
-10-build.patch
-20-bts.patch
-40-elemstyles.patch
-70-default_look_and_feel.patch
-80-fix_images.patch
-90-fix_version.patch
+00-build.patch
+01-bts.patch
+02-elemstyles.patch
+03-default_look_and_feel.patch
+04-fix_images.patch
+05-fix_version.patch
 #100-fix_SlippyMapBBoxChooser.patch
+06-handle_redacted_objects.patch
+07-handle_deleted_nodes_without_coordinates.patch

Attachment: signature.asc
Description: PGP signature

Reply via email to