Stroika Library 3.0d23x
 
Loading...
Searching...
No Matches
DOM.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2026. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
10#include "Stroika/Foundation/Execution/Exceptions.h"
12#include "Stroika/Foundation/Memory/Common.h"
15#include "Stroika/Foundation/Streams/MemoryStream.h"
16#include "Stroika/Foundation/Streams/TextToBinary.h"
17
18#include "DOM.h"
19
20using std::byte;
21
22using namespace Stroika::Foundation;
25using namespace Stroika::Foundation::Debug;
26using namespace Stroika::Foundation::Execution;
27using namespace Stroika::Foundation::Memory;
28using namespace Stroika::Foundation::DataExchange::XML;
29using namespace Stroika::Foundation::DataExchange::XML::DOM;
30using namespace Stroika::Foundation::DataExchange::XML::DOM::Document;
31
32using Memory::MakeSharedPtr;
33
34/*
35 ********************************************************************************
36 ********************** XPath::XPathExpressionNotSupported **********************
37 ********************************************************************************
38 */
39XPath::XPathExpressionNotSupported::XPathExpressionNotSupported ()
40 : Execution::RuntimeErrorException<> ("XPath implementation doesn't support that XML expression"_k)
41{
42}
43
44/*
45 ********************************************************************************
46 ********************** XPath::Expression::Options ******************************
47 ********************************************************************************
48 */
49String XPath::Expression::Options::ToString () const
50{
52 sb << "{"sv;
53 sb << "Namespaces: "sv << fNamespaces;
54 if (fResultTypeIndex) {
55 sb << ", ResultTypeIndex: "sv << fResultTypeIndex;
56 }
57 sb << ", Ordered: "sv << fOrdered;
58 sb << ", Snapshot: "sv << fSnapshot;
59 sb << "}"sv;
60 return sb;
61}
62
63/*
64 ********************************************************************************
65 ************************** XPath::Expression ***********************************
66 ********************************************************************************
67 */
68namespace {
69 struct XPathExpRep_ final : XPath::Expression ::IRep {
70 String fExpression_;
71 XPath::Expression::Options fOptions_;
72 XPathExpRep_ (String&& e, const XPath::Expression::Options& o)
73 : fExpression_{move (e)}
74 , fOptions_{o}
75 {
76 }
77 virtual String GetExpression () const override
78 {
79 return fExpression_;
80 }
81 virtual XPath::Expression::Options GetOptions () const override
82 {
83 return fOptions_;
84 }
85 };
86}
87XPath::Expression::Expression (String&& e, const Options& o)
88 : fRep_{MakeSharedPtr<XPathExpRep_> (move (e), o)}
89{
90}
91
92String XPath::Expression::ToString () const
93{
94 AssertNotNull (fRep_);
96 sb << "{"sv;
97 sb << "expression: "sv << fRep_->GetExpression ();
98 sb << ", options: "sv << fRep_->GetOptions ();
99 sb << "}"sv;
100 return sb;
101}
102
103/*
104 ********************************************************************************
105 ****************************** Element::IRep ***********************************
106 ********************************************************************************
107 */
108Element::Ptr Element::IRep::GetChildElementByID (const String& id) const
109{
110 for (Node::Ptr c : this->GetChildren ()) {
111 static const String kID_ = "id"s;
112 if (Element::Ptr e = Element::Ptr{c}; e != nullptr) {
113 if (e.GetAttribute (kID_) == id) {
114 return e;
115 }
116 }
117 }
118 return Element::Ptr{nullptr};
119}
120
121/*
122 ********************************************************************************
123 ********************************* Node::Ptr ************************************
124 ********************************************************************************
125 */
126String Node::Ptr::ToString () const
127{
128 if (PeekRep () == nullptr) {
129 return "nullptr"sv;
130 }
131 Streams::MemoryStream::Ptr m = Streams::MemoryStream::New<byte> ();
132 GetRep ()->Write (m, DOM::SerializationOptions{});
134}
135
136auto Element::Ptr::GetChild (const NameWithNamespace& eltName) const -> Ptr
137{
138 for (Element::Ptr c : GetChildElements ()) {
139 if (c.GetName () == eltName) {
140 return c;
141 }
142 }
143 return Ptr{nullptr};
144}
145
146/*
147 ********************************************************************************
148 *************************** DOM::Document::Ptr *********************************
149 ********************************************************************************
150 */
151void Document::Ptr::Validate (const Schema::Ptr& schema) const
152{
153 RequireNotNull (schema);
154 RequireNotNull (fRep_);
155 fRep_->Validate (schema);
156}
157
158String Document::Ptr::ToString () const
159{
160 if (fRep_ == nullptr) {
161 return "nullptr"sv;
162 }
163 Streams::MemoryStream::Ptr m = Streams::MemoryStream::New<byte> ();
164 fRep_->Write (m, DOM::SerializationOptions{});
166}
167
168/*
169 ********************************************************************************
170 *************************** DOM::Document::New *********************************
171 ********************************************************************************
172 */
173Document::Ptr Document::New (const Providers::IDOMProvider& p)
174{
175 return Document::Ptr{p.DocumentFactory (nullptr, nullptr)};
176}
177
178Document::Ptr Document::New (const Providers::IDOMProvider& p, const NameWithNamespace& documentElementName)
179{
180 Document::Ptr doc{New (p)};
181 doc.ReplaceRootElement (documentElementName);
182 return doc;
183}
184
185Document::Ptr Document::New (const Providers::IDOMProvider& p, const Streams::InputStream::Ptr<byte>& in)
186{
187 return Document::Ptr{p.DocumentFactory (in, nullptr)};
188}
189
190Document::Ptr Document::New (const Providers::IDOMProvider& p, const Streams::InputStream::Ptr<byte>& in, const Schema::Ptr& schemaToValidateAgainstWhileReading)
191{
192 return Document::Ptr{p.DocumentFactory (in, schemaToValidateAgainstWhileReading)};
193}
194
195Document::Ptr Document::New (const Providers::IDOMProvider& p, const String& in)
196{
197 return New (p, Streams::TextToBinary::Reader::New (in), nullptr);
198}
199
200Document::Ptr Document::New (const Providers::IDOMProvider& p, const String& in, const Schema::Ptr& schemaToValidateAgainstWhileReading)
201{
202 return New (p, Streams::TextToBinary::Reader::New (in), schemaToValidateAgainstWhileReading);
203}
204
205Document::Ptr Document::New (const Providers::IDOMProvider& p, const Ptr& clone)
206{
207 // provider-specific impl COULD possibly be done more efficiently...
208 Streams::MemoryStream::Ptr m = Streams::MemoryStream::New<byte> ();
209 clone.Write (m);
210 return New (p, m);
211}
212
213#if qStroika_Foundation_DataExchange_XML_SupportDOM
214Document::Ptr Document::New ()
215{
216 static const XML::Providers::IDOMProvider* kDefaultProvider_ = XML::Providers::kDefaultProvider ();
217 return New (*kDefaultProvider_);
218}
219
220Document::Ptr Document::New (const NameWithNamespace& documentElementName)
221{
222 static const XML::Providers::IDOMProvider* kDefaultProvider_ = XML::Providers::kDefaultProvider ();
223 return New (*kDefaultProvider_, documentElementName);
224}
225
226Document::Ptr Document::New (const Streams::InputStream::Ptr<byte>& in)
227{
228 return New (in, nullptr);
229}
230
231Document::Ptr Document::New (const Streams::InputStream::Ptr<byte>& in, const Schema::Ptr& schema)
232{
233 static const XML::Providers::IDOMProvider* kDefaultProvider_ = XML::Providers::kDefaultProvider ();
234 return New (*kDefaultProvider_, in, schema);
235}
236
237Document::Ptr Document::New (const String& in)
238{
239 return New (Streams::TextToBinary::Reader::New (in), nullptr);
240}
241
242Document::Ptr Document::New (const String& in, const Schema::Ptr& schema)
243{
244 return New (Streams::TextToBinary::Reader::New (in), schema);
245}
246
247Document::Ptr Document::New (const Ptr& clone)
248{
249 static const XML::Providers::IDOMProvider* kDefaultProvider_ = XML::Providers::kDefaultProvider ();
250 return New (*kDefaultProvider_, clone);
251}
252#endif
#define AssertNotNull(p)
Definition Assertions.h:333
#define RequireNotNull(p)
Definition Assertions.h:347
auto MakeSharedPtr(ARGS_TYPE &&... args) -> shared_ptr< T >
same as make_shared, but if type T has block allocation, then use block allocation for the 'shared pa...
Similar to String, but intended to more efficiently construct a String. Mutable type (String is large...
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
Document::Ptr is create with Document::New, and is a smart pointer to a DOM document object.
Definition DOM.h:651
nonvirtual void Validate(const Schema::Ptr &schema) const
Definition DOM.cpp:151
nonvirtual Ptr GetChild(const NameWithNamespace &eltName) const
Definition DOM.cpp:136
Node::Ptr is a smart pointer to a Node::IRep.
Definition DOM.h:210
InputStream<>::Ptr is Smart pointer (with abstract Rep) class defining the interface to reading from ...
nonvirtual String ReadAll(size_t upTo=numeric_limits< size_t >::max()) const
Ptr New(const InputStream::Ptr< byte > &src, optional< AutomaticCodeCvtFlags > codeCvtFlags={}, optional< SeekableFlag > seekable={}, ReadAhead readAhead=eReadAheadAllowed)
Create an InputStream::Ptr<Character> from the arguments (usually binary source) - which can be used ...