Skip to content

v0.2.53..v0.2.54 changeset OsmXmlChangesetFileWriter.cpp

Garret Voltz edited this page Mar 31, 2020 · 1 revision
diff --git a/hoot-core/src/main/cpp/hoot/core/io/OsmXmlChangesetFileWriter.cpp b/hoot-core/src/main/cpp/hoot/core/io/OsmXmlChangesetFileWriter.cpp
index 9fe8687..6dfc4b4 100644
--- a/hoot-core/src/main/cpp/hoot/core/io/OsmXmlChangesetFileWriter.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/io/OsmXmlChangesetFileWriter.cpp
@@ -173,14 +173,13 @@ void OsmXmlChangesetFileWriter::write(const QString& path,
         switch (type)
         {
           case ElementType::Node:
-            _writeNode(writer, std::dynamic_pointer_cast<const Node>(_change.getElement()));
+            _writeNode(writer, _change.getElement(), _change.getPreviousElement());
             break;
           case ElementType::Way:
-            _writeWay(writer, std::dynamic_pointer_cast<const Way>(_change.getElement()));
+            _writeWay(writer, _change.getElement(), _change.getPreviousElement());
             break;
           case ElementType::Relation:
-            _writeRelation(
-              writer, std::dynamic_pointer_cast<const Relation>(_change.getElement()));
+            _writeRelation(writer, _change.getElement(), _change.getPreviousElement());
             break;
           default:
             throw IllegalArgumentException("Unexpected element type.");
@@ -210,8 +209,10 @@ void OsmXmlChangesetFileWriter::write(const QString& path,
   LOG_DEBUG("Changeset written to: " << path << "...");
 }
 
-void OsmXmlChangesetFileWriter::_writeNode(QXmlStreamWriter& writer, ConstNodePtr n)
+void OsmXmlChangesetFileWriter::_writeNode(QXmlStreamWriter& writer, ConstElementPtr node, ConstElementPtr previous)
 {
+  ConstNodePtr n = dynamic_pointer_cast<const Node>(node);
+  ConstNodePtr pn = dynamic_pointer_cast<const Node>(previous);
   LOG_TRACE("Writing change for " << n << "...");
 
   writer.writeStartElement("node");
@@ -238,6 +239,11 @@ void OsmXmlChangesetFileWriter::_writeNode(QXmlStreamWriter& writer, ConstNodePt
       QString("Elements being modified or deleted in an .osc changeset must always have a ") +
       QString("version greater than zero: ") + n->getElementId().toString());
   }
+  else if (pn && pn->getVersion() < n->getVersion())
+  {
+    //  Previous node contains a version from the API and should be preserved
+    version = pn->getVersion();
+  }
   else
     version = n->getVersion();
   LOG_VART(version);
@@ -260,8 +266,10 @@ void OsmXmlChangesetFileWriter::_writeNode(QXmlStreamWriter& writer, ConstNodePt
   writer.writeEndElement();
 }
 
-void OsmXmlChangesetFileWriter::_writeWay(QXmlStreamWriter& writer, ConstWayPtr w)
+void OsmXmlChangesetFileWriter::_writeWay(QXmlStreamWriter& writer, ConstElementPtr way, ConstElementPtr previous)
 {
+  ConstWayPtr w = dynamic_pointer_cast<const Way>(way);
+  ConstWayPtr pw = dynamic_pointer_cast<const Way>(previous);
   LOG_TRACE("Writing change for " << w << "...");
 
   writer.writeStartElement("way");
@@ -287,6 +295,11 @@ void OsmXmlChangesetFileWriter::_writeWay(QXmlStreamWriter& writer, ConstWayPtr
       QString("Elements being modified or deleted in an .osc changeset must always have a ") +
       QString("version greater than zero: ")  + w->getElementId().toString());
   }
+  else if (pw && pw->getVersion() < w->getVersion())
+  {
+    //  Previous way contains a version from the API and should be preserved
+    version = pw->getVersion();
+  }
   else
     version = w->getVersion();
   LOG_VART(version);
@@ -321,8 +334,10 @@ void OsmXmlChangesetFileWriter::_writeWay(QXmlStreamWriter& writer, ConstWayPtr
   writer.writeEndElement();
 }
 
-void OsmXmlChangesetFileWriter::_writeRelation(QXmlStreamWriter& writer, ConstRelationPtr r)
+void OsmXmlChangesetFileWriter::_writeRelation(QXmlStreamWriter& writer, ConstElementPtr relation, ConstElementPtr previous)
 {
+  ConstRelationPtr r = dynamic_pointer_cast<const Relation>(relation);
+  ConstRelationPtr pr = dynamic_pointer_cast<const Relation>(previous);
   LOG_TRACE("Writing change for " << r << "...");
 
   writer.writeStartElement("relation");
@@ -348,6 +363,11 @@ void OsmXmlChangesetFileWriter::_writeRelation(QXmlStreamWriter& writer, ConstRe
       QString("Elements being modified or deleted in an .osc changeset must always have a ") +
       QString("version greater than zero: ") + r->getElementId().toString());
   }
+  else if (pr && pr->getVersion() < r->getVersion())
+  {
+    //  Previous relation contains a version from the API and should be preserved
+    version = pr->getVersion();
+  }
   else
     version = r->getVersion();
   LOG_VART(version);
Clone this wiki locally