v0.2.48..v0.2.49 changeset OsmXmlChangesetFileWriter.cpp
Garret Voltz edited this page Oct 2, 2019
·
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 cc0f05e..6938714 100644
--- a/hoot-core/src/main/cpp/hoot/core/io/OsmXmlChangesetFileWriter.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/io/OsmXmlChangesetFileWriter.cpp
@@ -47,7 +47,8 @@ OsmXmlChangesetFileWriter::OsmXmlChangesetFileWriter() :
_precision(ConfigOptions().getWriterPrecision()),
_multipleChangesetsWritten(false),
_addTimestamp(ConfigOptions().getChangesetXmlWriterAddTimestamp()),
-_includeDebugTags(ConfigOptions().getWriterIncludeDebugTags())
+_includeDebugTags(ConfigOptions().getWriterIncludeDebugTags()),
+_includeCircularErrorTags(ConfigOptions().getWriterIncludeCircularErrorTags())
{
_stats.resize(Change::Unknown, ElementType::Unknown);
vector<QString> rows( {"Create", "Modify", "Delete"} );
@@ -68,10 +69,18 @@ void OsmXmlChangesetFileWriter::_initIdCounters()
_newElementIdMappings[ElementType::Relation] = QMap<long, long>();
}
-void OsmXmlChangesetFileWriter::write(const QString& path, const ChangesetProviderPtr& cs)
+void OsmXmlChangesetFileWriter::write(const QString& path,
+ const ChangesetProviderPtr& changesetProvider)
+{
+ QList<ChangesetProviderPtr> changesetProviders;
+ changesetProviders.append(changesetProvider);
+ write(path, changesetProviders);
+}
+
+void OsmXmlChangesetFileWriter::write(const QString& path,
+ const QList<ChangesetProviderPtr>& changesetProviders)
{
- LOG_VARD(path);
- LOG_VARD(cs->hasMoreChanges());
+ LOG_DEBUG("Writing changeset to: " << path << "...");
QString filepath = path;
@@ -79,8 +88,6 @@ void OsmXmlChangesetFileWriter::write(const QString& path, const ChangesetProvid
long changesetProgress = 1;
- LOG_INFO("Writing changeset to " << filepath);
-
QFile f;
f.setFileName(filepath);
if (!f.open(QIODevice::WriteOnly | QIODevice::Text))
@@ -99,67 +106,77 @@ void OsmXmlChangesetFileWriter::write(const QString& path, const ChangesetProvid
Change::ChangeType last = Change::Unknown;
- while (cs->hasMoreChanges())
+ for (int i = 0; i < changesetProviders.size(); i++)
{
- LOG_TRACE("Reading next XML change...");
- _change = cs->readNextChange();
- LOG_VART(_change.toString());
- if (_change.getType() != last)
+ LOG_DEBUG(
+ "Derving changes with changeset provider: " << i + 1 << " / " << changesetProviders.size() <<
+ "...");
+
+ ChangesetProviderPtr changesetProvider = changesetProviders.at(i);
+ LOG_VARD(changesetProvider->hasMoreChanges());
+ while (changesetProvider->hasMoreChanges())
{
- if (last != Change::Unknown)
+ LOG_TRACE("Reading next XML change...");
+ _change = changesetProvider->readNextChange();
+ LOG_VART(_change.toString());
+ if (_change.getType() != last)
{
- writer.writeEndElement();
+ if (last != Change::Unknown)
+ {
+ writer.writeEndElement();
+ }
+ switch (_change.getType())
+ {
+ case Change::Create:
+ writer.writeStartElement("create");
+ break;
+ case Change::Delete:
+ writer.writeStartElement("delete");
+ break;
+ case Change::Modify:
+ writer.writeStartElement("modify");
+ break;
+ case Change::Unknown:
+ //see comment in ChangesetDeriver::_nextChange() when
+ //_fromE->getElementId() < _toE->getElementId() as to why we do a no-op here.
+ break;
+ default:
+ throw IllegalArgumentException("Unexpected change type.");
+ }
+ last = _change.getType();
+ LOG_VART(last);
}
- switch (_change.getType())
+
+ if (_change.getType() != Change::Unknown)
{
- case Change::Create:
- writer.writeStartElement("create");
- break;
- case Change::Delete:
- writer.writeStartElement("delete");
- break;
- case Change::Modify:
- writer.writeStartElement("modify");
- break;
- case Change::Unknown:
- //see comment in ChangesetDeriver::_nextChange() when
- //_fromE->getElementId() < _toE->getElementId() as to why we do a no-op here.
- break;
- default:
- throw IllegalArgumentException("Unexpected change type.");
+ ElementType::Type type = _change.getElement()->getElementType().getEnum();
+ switch (type)
+ {
+ case ElementType::Node:
+ _writeNode(writer, std::dynamic_pointer_cast<const Node>(_change.getElement()));
+ break;
+ case ElementType::Way:
+ _writeWay(writer, std::dynamic_pointer_cast<const Way>(_change.getElement()));
+ break;
+ case ElementType::Relation:
+ _writeRelation(
+ writer, std::dynamic_pointer_cast<const Relation>(_change.getElement()));
+ break;
+ default:
+ throw IllegalArgumentException("Unexpected element type.");
+ }
+ changesetProgress++;
+ // Update the stats
+ _stats(last, type)++;
}
- last = _change.getType();
- LOG_VART(last);
}
- if (_change.getType() != Change::Unknown)
+ if (last != Change::Unknown)
{
- ElementType::Type type = _change.getElement()->getElementType().getEnum();
- switch (type)
- {
- case ElementType::Node:
- _writeNode(writer, std::dynamic_pointer_cast<const Node>(_change.getElement()));
- break;
- case ElementType::Way:
- _writeWay(writer, std::dynamic_pointer_cast<const Way>(_change.getElement()));
- break;
- case ElementType::Relation:
- _writeRelation(
- writer, std::dynamic_pointer_cast<const Relation>(_change.getElement()));
- break;
- default:
- throw IllegalArgumentException("Unexpected element type.");
- }
- changesetProgress++;
- // Update the stats
- _stats(last, type)++;
+ writer.writeEndElement();
}
}
- if (last != Change::Unknown)
- {
- writer.writeEndElement();
- }
writer.writeEndElement();
writer.writeEndDocument();
@@ -359,6 +376,9 @@ void OsmXmlChangesetFileWriter::setConfiguration(const Settings &conf)
{
ConfigOptions co(conf);
_precision = co.getWriterPrecision();
+ _addTimestamp = co.getChangesetXmlWriterAddTimestamp();
+ _includeDebugTags = co.getWriterIncludeDebugTags();
+ _includeCircularErrorTags = co.getWriterIncludeCircularErrorTags();
}
void OsmXmlChangesetFileWriter::_writeTags(QXmlStreamWriter& writer, Tags& tags,
@@ -389,11 +409,13 @@ void OsmXmlChangesetFileWriter::_writeTags(QXmlStreamWriter& writer, Tags& tags,
writer.writeEndElement();
}
}
- // Non-nodes always report circular error when requested but nodes only report circular error
- // when there are other tags that aren't debug tags
- if (ConfigOptions().getWriterIncludeCircularErrorTags() && element->hasCircularError() &&
+ // Only report the circular error for changesets when debug tags are turned on, circular error
+ // tags are turned on, and (for nodes) there are other tags that aren't debug tags. This is because
+ // changesets are meant for non-hoot related databases and circular error is a hoot tag
+ if (_includeCircularErrorTags && element->hasCircularError() &&
(element->getElementType() != ElementType::Node ||
- (element->getElementType() == ElementType::Node && tags.getNonDebugCount() > 0)))
+ (element->getElementType() == ElementType::Node && tags.getNonDebugCount() > 0)) &&
+ _includeDebugTags)
{
writer.writeStartElement("tag");
writer.writeAttribute("k", MetadataTags::ErrorCircular());