1 /*!
2  * \copyright Copyright (c) 2014-2021 Governikus GmbH & Co. KG, Germany
3  */
4 
5 #include "PaosParser.h"
6 
7 #include <QDebug>
8 
9 using namespace governikus;
10 
PaosParser(const QString & pMessageName)11 PaosParser::PaosParser(const QString& pMessageName)
12 	: ElementParser(QSharedPointer<QXmlStreamReader>::create())
13 	, mMessageName(pMessageName)
14 	, mMessageID()
15 	, mRelatesTo()
16 {
17 }
18 
19 
~PaosParser()20 PaosParser::~PaosParser()
21 {
22 }
23 
24 
parse(const QByteArray & pXmlData)25 PaosMessage* PaosParser::parse(const QByteArray& pXmlData)
26 {
27 	PaosMessage* message = nullptr;
28 
29 	mXmlReader->addData(pXmlData);
30 
31 	while (readNextStartElement())
32 	{
33 		if (mXmlReader->name() == QLatin1String("Envelope"))
34 		{
35 			if (!assertNoDuplicateElement(message == nullptr))
36 			{
37 				qCWarning(paos) << "Duplicate Envelope element";
38 				delete message;
39 				return nullptr;
40 			}
41 
42 			message = parseEnvelope();
43 
44 			if (message == nullptr)
45 			{
46 				return nullptr;
47 			}
48 		}
49 		else
50 		{
51 			mXmlReader->skipCurrentElement();
52 		}
53 	}
54 
55 	if (mParseError)
56 	{
57 		delete message;
58 		message = nullptr;
59 	}
60 
61 	if (message != nullptr)
62 	{
63 		message->setMessageId(mMessageID);
64 		message->setRelatesTo(mRelatesTo);
65 	}
66 
67 	return message;
68 }
69 
70 
parseEnvelope()71 PaosMessage* PaosParser::parseEnvelope()
72 {
73 	PaosMessage* message = nullptr;
74 
75 	while (readNextStartElement())
76 	{
77 		if (mXmlReader->name() == QLatin1String("Body"))
78 		{
79 			if (assertNoDuplicateElement(message == nullptr))
80 			{
81 				message = parseBody();
82 			}
83 		}
84 		else if (mXmlReader->name() == QLatin1String("Header"))
85 		{
86 			parseHeader();
87 		}
88 		else
89 		{
90 			mXmlReader->skipCurrentElement();
91 		}
92 	}
93 
94 	if (!mParseError && message == nullptr)
95 	{
96 		qCWarning(paos) << "Element Body not found";
97 	}
98 
99 	return message;
100 }
101 
102 
parseHeader()103 void PaosParser::parseHeader()
104 {
105 	while (readNextStartElement())
106 	{
107 		if (mXmlReader->name() == QLatin1String("MessageID"))
108 		{
109 			mMessageID = readElementText();
110 		}
111 		else if (mXmlReader->name() == QLatin1String("RelatesTo"))
112 		{
113 			mRelatesTo = readElementText();
114 		}
115 		else
116 		{
117 			mXmlReader->skipCurrentElement();
118 		}
119 	}
120 }
121 
122 
parseBody()123 PaosMessage* PaosParser::parseBody()
124 {
125 	PaosMessage* message = nullptr;
126 
127 	while (readNextStartElement())
128 	{
129 		if (mXmlReader->name() == mMessageName)
130 		{
131 			if (assertNoDuplicateElement(message == nullptr))
132 			{
133 				message = parseMessage();
134 			}
135 		}
136 		else
137 		{
138 			mXmlReader->skipCurrentElement();
139 		}
140 	}
141 
142 	if (!mParseError && message == nullptr)
143 	{
144 		qCWarning(paos) << "Element" << mMessageName << "not found";
145 	}
146 
147 	return message;
148 }
149