1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.databind.io.xml;
28
29 import static org.junit.jupiter.api.Assertions.assertEquals;
30 import static org.junit.jupiter.api.Assertions.assertFalse;
31 import static org.junit.jupiter.api.Assertions.assertIterableEquals;
32 import static org.junit.jupiter.api.Assertions.assertNotNull;
33 import static org.junit.jupiter.api.Assertions.assertTrue;
34
35 import com.ctc.wstx.stax.WstxInputFactory;
36 import com.fasterxml.jackson.core.JsonParseException;
37
38 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
39 import gov.nist.secauto.metaschema.databind.IBindingContext;
40 import gov.nist.secauto.metaschema.databind.model.AbstractBoundModelTestSupport;
41 import gov.nist.secauto.metaschema.databind.model.IAssemblyClassBinding;
42 import gov.nist.secauto.metaschema.databind.model.IBoundFieldInstance;
43 import gov.nist.secauto.metaschema.databind.model.IBoundFlagInstance;
44 import gov.nist.secauto.metaschema.databind.model.IFieldClassBinding;
45 import gov.nist.secauto.metaschema.databind.model.test.FlaggedAssembly;
46 import gov.nist.secauto.metaschema.databind.model.test.MultiFieldAssembly;
47 import gov.nist.secauto.metaschema.databind.model.test.ValueKeyField;
48
49 import org.codehaus.stax2.XMLEventReader2;
50 import org.junit.jupiter.api.Test;
51
52 import java.io.IOException;
53 import java.io.StringReader;
54 import java.util.Collections;
55
56 import javax.xml.stream.XMLInputFactory;
57 import javax.xml.stream.XMLStreamConstants;
58 import javax.xml.stream.XMLStreamException;
59 import javax.xml.stream.events.StartElement;
60 import javax.xml.stream.events.XMLEvent;
61
62 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
63
64 class XmlParserTest
65 extends AbstractBoundModelTestSupport {
66
67 @Test
68 void testXmlRead() throws IOException, XMLStreamException {
69 String xml = "<test xmlns='https://csrc.nist.gov/ns/test/xml'>"
70 + " <field1>field1value</field1>" + "</test>";
71 XMLInputFactory factory = XMLInputFactory.newInstance();
72 assert factory instanceof WstxInputFactory;
73 XMLEventReader2 eventReader = (XMLEventReader2) factory.createXMLEventReader(new StringReader(xml));
74
75 assertEquals(XMLStreamConstants.START_DOCUMENT, eventReader.nextEvent().getEventType());
76 XMLEvent event = eventReader.nextEvent();
77 assertEquals(XMLStreamConstants.START_ELEMENT, event.getEventType());
78 StartElement start = event.asStartElement();
79
80
81
82
83 assert start != null;
84
85 MetaschemaXmlReader parser = new MetaschemaXmlReader(eventReader);
86
87 IBindingContext bindingContext = getBindingContext();
88
89 IAssemblyClassBinding assembly
90 = ObjectUtils.requireNonNull((IAssemblyClassBinding) bindingContext.getClassBinding(MultiFieldAssembly.class));
91
92 IBoundFieldInstance field1Property
93 = ObjectUtils.requireNonNull((IBoundFieldInstance) assembly.getModelInstanceByName("field1"));
94
95 IBoundFieldInstance field2Property
96 = ObjectUtils.requireNonNull((IBoundFieldInstance) assembly.getModelInstanceByName("field2"));
97
98 MultiFieldAssembly obj = new MultiFieldAssembly();
99
100 assertTrue(parser.readModelInstanceValues(field1Property, obj, start));
101 assertFalse(parser.readModelInstanceValues(field2Property, obj, start));
102
103 assertEquals("field1value", obj.getField1());
104 assertEquals(null, obj.getField2());
105 }
106
107 @Test
108 @SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT")
109 void testXmlReadFlagProperty() throws JsonParseException, IOException, XMLStreamException {
110 String xml = "<flagged-assembly xmlns='https://csrc.nist.gov/ns/test/xml' id='theId' number='1'/>";
111 XMLInputFactory factory = XMLInputFactory.newInstance();
112 assert factory instanceof WstxInputFactory;
113 XMLEventReader2 eventReader = (XMLEventReader2) factory.createXMLEventReader(new StringReader(xml));
114
115 IBindingContext bindingContext = getBindingContext();
116 IAssemblyClassBinding assembly
117 = ObjectUtils.requireNonNull((IAssemblyClassBinding) bindingContext.getClassBinding(FlaggedAssembly.class));
118
119 IBoundFlagInstance idProperty = assembly.getFlagInstanceByName("id");
120 assert idProperty != null;
121
122 assertEquals(XMLStreamConstants.START_DOCUMENT, eventReader.nextEvent().getEventType());
123 XMLEvent event = eventReader.nextEvent();
124 assertEquals(XMLStreamConstants.START_ELEMENT, event.getEventType());
125 StartElement start = event.asStartElement();
126 assert start != null;
127
128
129
130
131
132 MetaschemaXmlReader parser = new MetaschemaXmlReader(eventReader);
133 FlaggedAssembly obj = parser.readDefinitionValue(assembly, null, start);
134
135 assertEquals("theId", obj.getId());
136 }
137
138 @Test
139 void testXmlReadGroupedField() throws JsonParseException, IOException, XMLStreamException {
140 String xml = "<test xmlns='https://csrc.nist.gov/ns/test/xml'>\n"
141 + " <fields2>\n" + " <field2>field2value</field2>\n" + " </fields2>\n" + "</test>";
142 XMLInputFactory factory = XMLInputFactory.newInstance();
143 assert factory instanceof WstxInputFactory;
144 XMLEventReader2 eventReader = (XMLEventReader2) factory.createXMLEventReader(new StringReader(xml));
145
146 assertEquals(XMLStreamConstants.START_DOCUMENT, eventReader.nextEvent().getEventType());
147 XMLEvent event = eventReader.nextEvent();
148 assertEquals(XMLStreamConstants.START_ELEMENT,
149 event.getEventType());
150 StartElement start = event.asStartElement();
151
152
153
154
155 assert start != null;
156
157 MetaschemaXmlReader parser = new MetaschemaXmlReader(eventReader);
158
159 IBindingContext bindingContext = getBindingContext();
160
161 IAssemblyClassBinding assembly
162 = ObjectUtils.requireNonNull((IAssemblyClassBinding) bindingContext.getClassBinding(MultiFieldAssembly.class));
163
164 IBoundFieldInstance field1Property
165 = ObjectUtils.requireNonNull((IBoundFieldInstance) assembly.getModelInstanceByName("field1"));
166
167 IBoundFieldInstance field2Property
168 = ObjectUtils.requireNonNull((IBoundFieldInstance) assembly.getModelInstanceByName("field2"));
169
170 MultiFieldAssembly obj = new MultiFieldAssembly();
171
172 assertFalse(parser.readModelInstanceValues(field1Property, obj, start));
173 assertTrue(parser.readModelInstanceValues(field2Property, obj, start));
174
175 assertEquals(null, obj.getField1());
176 assertIterableEquals(Collections.singleton("field2value"),
177 obj.getField2());
178 }
179
180 @Test
181 void testReadField() throws JsonParseException, IOException, XMLStreamException {
182 String xml = "<simple-field xmlns='http://example.com/ns'>theValue</simple-field>";
183 XMLInputFactory factory = XMLInputFactory.newInstance();
184 assert factory instanceof WstxInputFactory;
185 XMLEventReader2 eventReader = (XMLEventReader2) factory.createXMLEventReader(new StringReader(xml));
186
187 assertEquals(XMLStreamConstants.START_DOCUMENT, eventReader.nextEvent().getEventType());
188 XMLEvent event = eventReader.nextEvent();
189 assertEquals(XMLStreamConstants.START_ELEMENT, event.getEventType());
190 StartElement start = event.asStartElement();
191
192
193
194 assert start != null;
195
196 MetaschemaXmlReader parser = new MetaschemaXmlReader(eventReader);
197
198 IBindingContext bindingContext = getBindingContext();
199
200 IFieldClassBinding field
201 = ObjectUtils.requireNonNull((IFieldClassBinding) bindingContext.getClassBinding(ValueKeyField.class));
202
203 ValueKeyField obj = (ValueKeyField) parser.readDefinitionValue(field, null, start);
204
205 assertNotNull(obj);
206 assertEquals("theValue", obj.getValue());
207 }
208 }