View Javadoc
1   /*
2    * Portions of this software was developed by employees of the National Institute
3    * of Standards and Technology (NIST), an agency of the Federal Government and is
4    * being made available as a public service. Pursuant to title 17 United States
5    * Code Section 105, works of NIST employees are not subject to copyright
6    * protection in the United States. This software may be subject to foreign
7    * copyright. Permission in the United States and in foreign countries, to the
8    * extent that NIST may hold copyright, to use, copy, modify, create derivative
9    * works, and distribute this software and its documentation without fee is hereby
10   * granted on a non-exclusive basis, provided that this notice and disclaimer
11   * of warranty appears in all copies.
12   *
13   * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER
14   * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY
15   * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF
16   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM
17   * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE
18   * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE.  IN NO EVENT
19   * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT,
20   * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM,
21   * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY,
22   * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR
23   * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT
24   * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER.
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      // assertEquals("test", jsonParser.nextFieldName());
80      // assertEquals(JsonToken.START_OBJECT, jsonParser.nextToken());
81      // assertEquals(JsonToken.FIELD_NAME, jsonParser.nextToken());
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     // assertEquals("test", jsonParser.nextFieldName());
129     // assertEquals(JsonToken.START_OBJECT, jsonParser.nextToken());
130     // assertEquals(JsonToken.FIELD_NAME, jsonParser.nextToken());
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     // assertEquals("test", jsonParser.nextFieldName());
152     // assertEquals(JsonToken.START_OBJECT, jsonParser.nextToken());
153     // assertEquals(JsonToken.FIELD_NAME, jsonParser.nextToken());
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     // assertEquals("test", jsonParser.nextFieldName());
192     // assertEquals(JsonToken.START_OBJECT, jsonParser.nextToken());
193     // assertEquals(JsonToken.FIELD_NAME, jsonParser.nextToken());
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 }