From 72b7fdb38352ea28fd386938a97e6f06cfc3fefe Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Thu, 8 Dec 2022 17:28:01 +0100
Subject: [PATCH] DataItems: serialization refactored

---
 GUI/Model/Data/DataItem.cpp          | 39 ++++++++++---------
 GUI/Model/Data/DataItem.h            |  2 +-
 GUI/Model/Data/IntensityDataItem.cpp |  3 +-
 GUI/Model/Data/SpecularDataItem.cpp  | 57 +++++++++++++---------------
 GUI/Support/XML/UtilXML.cpp          | 12 +-----
 GUI/Support/XML/UtilXML.h            | 11 +-----
 6 files changed, 50 insertions(+), 74 deletions(-)

diff --git a/GUI/Model/Data/DataItem.cpp b/GUI/Model/Data/DataItem.cpp
index 9fea9ff55af..17f7f6429b4 100644
--- a/GUI/Model/Data/DataItem.cpp
+++ b/GUI/Model/Data/DataItem.cpp
@@ -19,7 +19,6 @@
 #include "GUI/Util/Error.h"
 
 namespace {
-
 namespace Tag {
 
 const QString FileName("FileName");
@@ -28,13 +27,6 @@ const QString XAxis("XAxis");
 const QString YAxis("YAxis");
 
 } // namespace Tag
-
-namespace Attrib {
-
-const QString value("value");
-
-} // namespace Attrib
-
 } // namespace
 
 const QString x_axis_default_name = "X [nbins]";
@@ -267,11 +259,13 @@ void DataItem::setAxesRangeToData()
     setUpperY(yMax());
 }
 
-void DataItem::writeBaseData(QXmlStreamWriter *writer) const
+void DataItem::writeBaseData(QXmlStreamWriter* writer) const
 {
+    // In case of changes here update "version" of SpecularDataItem and IntensityDataitem!
+
     // file name
     writer->writeStartElement(Tag::FileName);
-    XML::writeAttribute(writer, Attrib::value, m_fileName);
+    XML::writeAttribute(writer, XML::Attrib::value, m_fileName);
     writer->writeEndElement();
 
     // axes units
@@ -290,28 +284,33 @@ void DataItem::writeBaseData(QXmlStreamWriter *writer) const
     writer->writeEndElement();
 }
 
-void DataItem::readBaseData(QXmlStreamReader* reader)
+void DataItem::readBaseData(QXmlStreamReader* reader, uint version)
 {
+    Q_UNUSED(version)
+    QString name = reader->name().toString();
+
     // file name
-    if (reader->name() == Tag::FileName) {
-        XML::readAttribute(reader, Attrib::value, &m_fileName);
-        XML::gotoEndElementOfTag(reader, Tag::FileName);
+    if (name == Tag::FileName) {
+        XML::readAttribute(reader, XML::Attrib::value, &m_fileName);
+        XML::gotoEndElementOfTag(reader, name);
 
         // axes units
-    } else if (reader->name() == Tag::AxesUnits) {
+    } else if (name == Tag::AxesUnits) {
         m_axesUnits.readFrom(reader);
-        XML::gotoEndElementOfTag(reader, Tag::AxesUnits);
+        XML::gotoEndElementOfTag(reader, name);
 
         // x axis
-    } else if (reader->name() == Tag::XAxis) {
+    } else if (name == Tag::XAxis) {
         m_xAxis->readFrom(reader);
-        XML::gotoEndElementOfTag(reader, Tag::XAxis);
+        XML::gotoEndElementOfTag(reader, name);
 
         // y axis
-    } else if (reader->name() == Tag::YAxis) {
+    } else if (name == Tag::YAxis) {
         m_yAxis->readFrom(reader);
-        XML::gotoEndElementOfTag(reader, Tag::YAxis);
+        XML::gotoEndElementOfTag(reader, name);
 
     } else
         reader->skipCurrentElement();
+
+    XML::gotoEndElementOfTag(reader, name);
 }
diff --git a/GUI/Model/Data/DataItem.h b/GUI/Model/Data/DataItem.h
index e220ee1693a..3d089f21ff1 100644
--- a/GUI/Model/Data/DataItem.h
+++ b/GUI/Model/Data/DataItem.h
@@ -126,7 +126,7 @@ protected:
     virtual void writeTo(QXmlStreamWriter* writer) const = 0;
     virtual void readFrom(QXmlStreamReader* reader) = 0;
     void writeBaseData(QXmlStreamWriter* writer) const;
-    void readBaseData(QXmlStreamReader* reader);
+    void readBaseData(QXmlStreamReader* reader, uint version);
 
 signals:
     void datafieldChanged();
diff --git a/GUI/Model/Data/IntensityDataItem.cpp b/GUI/Model/Data/IntensityDataItem.cpp
index edf7c52b87c..a9762aa87d5 100644
--- a/GUI/Model/Data/IntensityDataItem.cpp
+++ b/GUI/Model/Data/IntensityDataItem.cpp
@@ -338,7 +338,6 @@ void IntensityDataItem::writeTo(QXmlStreamWriter* writer) const
 void IntensityDataItem::readFrom(QXmlStreamReader* reader)
 {
     uint version = XML::readUIntAttribute(reader, XML::Attrib::version);
-    Q_UNUSED(version)
 
     while (reader->readNextStartElement()) {
         QString name = reader->name().toString();
@@ -359,7 +358,7 @@ void IntensityDataItem::readFrom(QXmlStreamReader* reader)
             XML::gotoEndElementOfTag(reader, name);
 
         } else
-            DataItem::readBaseData(reader);
+            DataItem::readBaseData(reader, version);
     }
 }
 
diff --git a/GUI/Model/Data/SpecularDataItem.cpp b/GUI/Model/Data/SpecularDataItem.cpp
index 852217314bc..14aeebd9bc8 100644
--- a/GUI/Model/Data/SpecularDataItem.cpp
+++ b/GUI/Model/Data/SpecularDataItem.cpp
@@ -21,7 +21,6 @@
 #include "GUI/Util/Error.h"
 
 namespace {
-
 namespace Tag {
 
 const QString LineType("LineType");
@@ -32,12 +31,6 @@ const QString ScatterSize("ScatterSize");
 
 } // namespace Tag
 
-namespace Attrib {
-
-const QString value("value");
-
-} // namespace Attrib
-
 // scatters for representation of 1D graphs
 const QMap<QString, QCPScatterStyle::ScatterShape> scatter_map = {
     {"None", QCPScatterStyle::ScatterShape::ssNone},
@@ -215,69 +208,73 @@ void SpecularDataItem::setRealPlotStyle()
 
 void SpecularDataItem::writeTo(QXmlStreamWriter* writer) const
 {
+    XML::writeAttribute(writer, XML::Attrib::version, uint(1));
+
     DataItem::writeBaseData(writer);
 
     // line type
     writer->writeStartElement(Tag::LineType);
-    XML::writeAttribute(writer, Attrib::value, m_lineType);
+    XML::writeAttribute(writer, XML::Attrib::value, m_lineType);
     writer->writeEndElement();
 
     // color
     writer->writeStartElement(Tag::Color);
-    XML::writeAttribute(writer, Attrib::value, m_color.name(QColor::HexArgb));
+    XML::writeAttribute(writer, XML::Attrib::value, m_color.name(QColor::HexArgb));
     writer->writeEndElement();
 
     // thickness
     writer->writeStartElement(Tag::Thickness);
-    XML::writeAttribute(writer, Attrib::value, m_thickness);
+    XML::writeAttribute(writer, XML::Attrib::value, m_thickness);
     writer->writeEndElement();
 
     // scatter type
     writer->writeStartElement(Tag::ScatterType);
-    XML::writeAttribute(writer, Attrib::value, m_scatterType);
+    XML::writeAttribute(writer, XML::Attrib::value, m_scatterType);
     writer->writeEndElement();
 
     // scatter size
     writer->writeStartElement(Tag::ScatterSize);
-    XML::writeAttribute(writer, Attrib::value, m_scatterSize);
+    XML::writeAttribute(writer, XML::Attrib::value, m_scatterSize);
     writer->writeEndElement();
 }
 
 void SpecularDataItem::readFrom(QXmlStreamReader* reader)
 {
+    uint version = XML::readUIntAttribute(reader, XML::Attrib::version);
+
     while (reader->readNextStartElement()) {
+        QString name = reader->name().toString();
 
         // line type
-        if (reader->name() == Tag::LineType) {
-            XML::readAttribute(reader, Attrib::value, &m_lineType);
-            XML::gotoEndElementOfTag(reader, Tag::LineType);
+        if (name == Tag::LineType) {
+            XML::readAttribute(reader, XML::Attrib::value, &m_lineType);
+            XML::gotoEndElementOfTag(reader, name);
 
             // color
-        } else if (reader->name() == Tag::Color) {
+        } else if (name == Tag::Color) {
             QString col;
-            XML::readAttribute(reader, Attrib::value, &col);
+            XML::readAttribute(reader, XML::Attrib::value, &col);
             m_color = QColor(col);
-            XML::gotoEndElementOfTag(reader, Tag::Color);
+            XML::gotoEndElementOfTag(reader, name);
 
             // thickness
-        } else if (reader->name() == Tag::Thickness) {
-            XML::readAttribute(reader, Attrib::value, &m_thickness);
-            XML::gotoEndElementOfTag(reader, Tag::Thickness);
+        } else if (name == Tag::Thickness) {
+            XML::readAttribute(reader, XML::Attrib::value, &m_thickness);
+            XML::gotoEndElementOfTag(reader, name);
 
             // scatter type
-        } else if (reader->name() == Tag::ScatterType) {
-            XML::readAttribute(reader, Attrib::value, &m_scatterType);
-            XML::gotoEndElementOfTag(reader, Tag::ScatterType);
+        } else if (name == Tag::ScatterType) {
+            XML::readAttribute(reader, XML::Attrib::value, &m_scatterType);
+            XML::gotoEndElementOfTag(reader, name);
 
             // scatter size
-        } else if (reader->name() == Tag::ScatterSize) {
-            XML::readAttribute(reader, Attrib::value, &m_scatterSize);
-            XML::gotoEndElementOfTag(reader, Tag::ScatterSize);
+        } else if (name == Tag::ScatterSize) {
+            XML::readAttribute(reader, XML::Attrib::value, &m_scatterSize);
+            XML::gotoEndElementOfTag(reader, name);
 
             // types from base class
-        } else {
-            DataItem::readBaseData(reader);
-        }
+        } else
+            DataItem::readBaseData(reader, version);
     }
 }
 
diff --git a/GUI/Support/XML/UtilXML.cpp b/GUI/Support/XML/UtilXML.cpp
index 6592d5970de..511cbd1e82b 100644
--- a/GUI/Support/XML/UtilXML.cpp
+++ b/GUI/Support/XML/UtilXML.cpp
@@ -126,16 +126,6 @@ void XML::writeAttribute(QXmlStreamWriter* writer, const QString& attributeName,
     writer->writeAttribute(attributeName, QString::number(d));
 }
 
-void XML::writeUid(QXmlStreamWriter* writer, const QString& id)
-{
-    writer->writeAttribute(Tags::Id, id);
-}
-
-void XML::writeUid(QXmlStreamWriter* writer, const QUuid& id)
-{
-    writer->writeAttribute(Tags::Id, id.toString());
-}
-
 void XML::writeVariant(QXmlStreamWriter* writer, QVariant variant, int role)
 {
     ASSERT(writer);
@@ -144,7 +134,7 @@ void XML::writeVariant(QXmlStreamWriter* writer, QVariant variant, int role)
         writer->writeAttribute(Tags::ParameterTypeAttribute, variant.typeName());
         writer->writeAttribute(Tags::ParameterRoleAttribute, QString::number(role));
         writeAttribute(writer, Tags::ParameterValueAttribute, variant);
-        writer->writeEndElement(); // end ParameterTag
+        writer->writeEndElement();
     }
 }
 
diff --git a/GUI/Support/XML/UtilXML.h b/GUI/Support/XML/UtilXML.h
index 33c380db881..b7b2e1f9f21 100644
--- a/GUI/Support/XML/UtilXML.h
+++ b/GUI/Support/XML/UtilXML.h
@@ -20,22 +20,15 @@
 #include <heinz/Complex.h>
 #include <heinz/Vectors3D.h>
 
-class QXmlStreamReader;
-class MessageService;
-class QUuid;
-
-
 namespace XML {
-
 namespace Attrib {
 
-const QString value("value");
 const QString version("version");
+const QString value("value");
 
 } // namespace Attrib
 
 namespace Tags {
-constexpr auto Id("id");
 constexpr auto TagAttribute("Tag");
 constexpr auto ModelTypeAttribute("ModelType");
 constexpr auto DisplayNameAttribute("DisplayName");
@@ -63,8 +56,6 @@ void writeVariant(QXmlStreamWriter* writer, QVariant variant, int role);
 void writeAttribute(QXmlStreamWriter* writer, const QString& attributeName,
                     const QVariant& variant);
 
-void writeUid(QXmlStreamWriter* writer, const QString& id);
-void writeUid(QXmlStreamWriter* writer, const QUuid& id);
 void writeAttribute(QXmlStreamWriter* writer, const QString& attributeName, int d);
 void writeAttribute(QXmlStreamWriter* writer, const QString& attributeName, bool b);
 void writeAttribute(QXmlStreamWriter* writer, const QString& attributeName, unsigned d);
-- 
GitLab