1 /*
2 * Copyright (c) 2011-2015, Intel Corporation
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation and/or
13 * other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors
16 * may be used to endorse or promote products derived from this software without
17 * specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 #include "XmlFileIncluderElement.h"
31 #include "XmlDocSource.h"
32 #include "XmlMemoryDocSink.h"
33 #include "XmlElementSerializingContext.h"
34 #include "ElementLibrary.h"
35 #include <assert.h>
36 #include <fstream>
37
38 #define base CKindElement
CXmlFileIncluderElement(const std::string & strName,const std::string & strKind,bool bValidateWithSchemas,const std::string & schemaBaseUri)39 CXmlFileIncluderElement::CXmlFileIncluderElement(const std::string &strName,
40 const std::string &strKind,
41 bool bValidateWithSchemas,
42 const std::string &schemaBaseUri)
43 : base(strName, strKind), _bValidateSchemasOnStart(bValidateWithSchemas),
44 _schemaBaseUri(schemaBaseUri)
45 {
46 }
47
48 // From IXmlSink
fromXml(const CXmlElement & xmlElement,CXmlSerializingContext & serializingContext)49 bool CXmlFileIncluderElement::fromXml(const CXmlElement &xmlElement,
50 CXmlSerializingContext &serializingContext)
51 {
52 // Context
53 CXmlElementSerializingContext &elementSerializingContext =
54 static_cast<CXmlElementSerializingContext &>(serializingContext);
55
56 // Parse included document
57 std::string strPath;
58 xmlElement.getAttribute("Path", strPath);
59 strPath = CXmlDocSource::mkUri(elementSerializingContext.getXmlUri(), strPath);
60
61 // Instantiate parser
62 std::string strIncludedElementType = getIncludedElementType();
63 {
64 _xmlDoc *doc = CXmlDocSource::mkXmlDoc(strPath, true, true, elementSerializingContext);
65
66 CXmlDocSource docSource(doc, _bValidateSchemasOnStart, strIncludedElementType);
67
68 if (not _schemaBaseUri.empty()) {
69 docSource.setSchemaBaseUri(_schemaBaseUri);
70 }
71
72 if (!docSource.isParsable()) {
73
74 elementSerializingContext.setError("Could not parse document \"" + strPath + "\"");
75
76 return false;
77 }
78
79 // Get top level element
80 CXmlElement childElement;
81
82 docSource.getRootElement(childElement);
83
84 // Create child element
85 CElement *pChild =
86 elementSerializingContext.getElementLibrary()->createElement(childElement);
87
88 if (pChild) {
89
90 // Store created child!
91 getParent()->addChild(pChild);
92 } else {
93
94 elementSerializingContext.setError("Unable to create XML element " +
95 childElement.getPath());
96
97 return false;
98 }
99
100 // Use a doc sink that instantiate the structure from the doc source
101 CXmlMemoryDocSink memorySink(pChild);
102
103 if (!memorySink.process(docSource, elementSerializingContext)) {
104
105 return false;
106 }
107 }
108 // Detach from parent
109 getParent()->removeChild(this);
110
111 // Self destroy
112 delete this;
113
114 return true;
115 }
116
117 // Element type
getIncludedElementType() const118 std::string CXmlFileIncluderElement::getIncludedElementType() const
119 {
120 std::string strKind = getKind();
121
122 std::string::size_type pos = strKind.rfind("Include", std::string::npos);
123
124 assert(pos != std::string::npos);
125
126 return strKind.substr(0, pos);
127 }
128