Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
DOM.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
8#include "Stroika/Foundation/Execution/Exceptions.h"
9#include "Stroika/Foundation/Memory/Common.h"
12#include "Stroika/Foundation/Streams/MemoryStream.h"
13#include "Stroika/Foundation/Streams/TextToBinary.h"
14
15#include "Providers/IProvider.h"
16#include "Schema.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
32/*
33 ********************************************************************************
34 ********************** XPath::XPathExpressionNotSupported **********************
35 ********************************************************************************
36 */
37XPath::XPathExpressionNotSupported::XPathExpressionNotSupported ()
38 : Execution::RuntimeErrorException<> ("XPath implementation doesn't support that XML expression"_k)
39{
40}
41
42/*
43 ********************************************************************************
44 ********************** XPath::Expression::Options ******************************
45 ********************************************************************************
46 */
47String XPath::Expression::Options::ToString () const
48{
50 sb << "{"sv;
51 sb << "Namespaces: "sv << fNamespaces;
52 if (fResultTypeIndex) {
53 sb << ", ResultTypeIndex: "sv << fResultTypeIndex;
54 }
55 sb << ", Ordered: "sv << fOrdered;
56 sb << ", Snapshot: "sv << fSnapshot;
57 sb << "}"sv;
58 return sb;
59}
60
61/*
62 ********************************************************************************
63 ************************** XPath::Expression ***********************************
64 ********************************************************************************
65 */
66namespace {
67 struct XPathExpRep_ : XPath::Expression ::IRep {
68 String fExpression_;
69 XPath::Expression::Options fOptions_;
70 XPathExpRep_ (String&& e, const XPath::Expression::Options& o)
71 : fExpression_{move (e)}
72 , fOptions_{o}
73 {
74 }
75 virtual String GetExpression () const override
76 {
77 return fExpression_;
78 }
79 virtual XPath::Expression::Options GetOptions () const override
80 {
81 return fOptions_;
82 }
83 };
84}
85XPath::Expression::Expression (String&& e, const Options& o)
86 : fRep_{make_shared<XPathExpRep_> (move (e), o)}
87{
88}
89
90String XPath::Expression::ToString () const
91{
92 AssertNotNull (fRep_);
94 sb << "{"sv;
95 sb << "expression: "sv << fRep_->GetExpression ();
96 sb << ", options: "sv << fRep_->GetOptions ();
97 sb << "}"sv;
98 return sb;
99}
100
101/*
102 ********************************************************************************
103 ****************************** Element::IRep ***********************************
104 ********************************************************************************
105 */
106Element::Ptr Element::IRep::GetChildElementByID (const String& id) const
107{
108 for (Node::Ptr c : this->GetChildren ()) {
109 static const String kID_ = "id"s;
110 if (Element::Ptr e = Element::Ptr{c}; e != nullptr) {
111 if (e.GetAttribute (kID_) == id) {
112 return e;
113 }
114 }
115 }
116 return Element::Ptr{nullptr};
117}
118
119/*
120 ********************************************************************************
121 ********************************* Node::Ptr ************************************
122 ********************************************************************************
123 */
124String Node::Ptr::ToString () const
125{
126 if (PeekRep () == nullptr) {
127 return "nullptr"sv;
128 }
129 Streams::MemoryStream::Ptr m = Streams::MemoryStream::New<byte> ();
130 GetRep ()->Write (m, DOM::SerializationOptions{});
132}
133
134auto Element::Ptr::GetChild (const NameWithNamespace& eltName) const -> Ptr
135{
136 for (Element::Ptr c : GetChildElements ()) {
137 if (c.GetName () == eltName) {
138 return c;
139 }
140 }
141 return Ptr{nullptr};
142}
143
144/*
145 ********************************************************************************
146 *************************** DOM::Document::Ptr *********************************
147 ********************************************************************************
148 */
149void Document::Ptr::Validate (const Schema::Ptr& schema) const
150{
151 RequireNotNull (schema);
152 RequireNotNull (fRep_);
153 fRep_->Validate (schema);
154}
155
156String Document::Ptr::ToString () const
157{
158 if (fRep_ == nullptr) {
159 return "nullptr"sv;
160 }
161 Streams::MemoryStream::Ptr m = Streams::MemoryStream::New<byte> ();
162 fRep_->Write (m, DOM::SerializationOptions{});
164}
165
166/*
167 ********************************************************************************
168 *************************** DOM::Document::New *********************************
169 ********************************************************************************
170 */
171Document::Ptr Document::New (const Providers::IDOMProvider& p)
172{
173 return Document::Ptr{p.DocumentFactory (nullptr, nullptr)};
174}
175
176Document::Ptr Document::New (const Providers::IDOMProvider& p, const NameWithNamespace& documentElementName)
177{
178 Document::Ptr doc{New (p)};
179 doc.ReplaceRootElement (documentElementName);
180 return doc;
181}
182
183Document::Ptr Document::New (const Providers::IDOMProvider& p, const Streams::InputStream::Ptr<byte>& in)
184{
185 return Document::Ptr{p.DocumentFactory (in, nullptr)};
186}
187
188Document::Ptr Document::New (const Providers::IDOMProvider& p, const Streams::InputStream::Ptr<byte>& in, const Schema::Ptr& schemaToValidateAgainstWhileReading)
189{
190 return Document::Ptr{p.DocumentFactory (in, schemaToValidateAgainstWhileReading)};
191}
192
193Document::Ptr Document::New (const Providers::IDOMProvider& p, const String& in)
194{
195 return New (p, Streams::TextToBinary::Reader::New (in), nullptr);
196}
197
198Document::Ptr Document::New (const Providers::IDOMProvider& p, const String& in, const Schema::Ptr& schemaToValidateAgainstWhileReading)
199{
200 return New (p, Streams::TextToBinary::Reader::New (in), schemaToValidateAgainstWhileReading);
201}
202
203Document::Ptr Document::New (const Providers::IDOMProvider& p, const Ptr& clone)
204{
205 // provider-specific impl COULD possibly be done more efficiently...
206 Streams::MemoryStream::Ptr m = Streams::MemoryStream::New<byte> ();
207 clone.Write (m);
208 return New (p, m);
209}
210
211#if qStroika_Foundation_DataExchange_XML_SupportDOM
212Document::Ptr Document::New ()
213{
214 static const XML::Providers::IDOMProvider* kDefaultProvider_ = XML::Providers::kDefaultProvider ();
215 return New (*kDefaultProvider_);
216}
217
218Document::Ptr Document::New (const NameWithNamespace& documentElementName)
219{
220 static const XML::Providers::IDOMProvider* kDefaultProvider_ = XML::Providers::kDefaultProvider ();
221 return New (*kDefaultProvider_, documentElementName);
222}
223
224Document::Ptr Document::New (const Streams::InputStream::Ptr<byte>& in)
225{
226 return New (in, nullptr);
227}
228
229Document::Ptr Document::New (const Streams::InputStream::Ptr<byte>& in, const Schema::Ptr& schema)
230{
231 static const XML::Providers::IDOMProvider* kDefaultProvider_ = XML::Providers::kDefaultProvider ();
232 return New (*kDefaultProvider_, in, schema);
233}
234
235Document::Ptr Document::New (const String& in)
236{
237 return New (Streams::TextToBinary::Reader::New (in), nullptr);
238}
239
240Document::Ptr Document::New (const String& in, const Schema::Ptr& schema)
241{
242 return New (Streams::TextToBinary::Reader::New (in), schema);
243}
244
245Document::Ptr Document::New (const Ptr& clone)
246{
247 static const XML::Providers::IDOMProvider* kDefaultProvider_ = XML::Providers::kDefaultProvider ();
248 return New (*kDefaultProvider_, clone);
249}
250#endif
#define AssertNotNull(p)
Definition Assertions.h:333
#define RequireNotNull(p)
Definition Assertions.h:347
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:149
nonvirtual Ptr GetChild(const NameWithNamespace &eltName) const
Definition DOM.cpp:134
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 ...