blob: aba746412a594de4088f046d6c97227c56129399 [file]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ValidatingXSRTests.checkin;
import org.apache.xmlbeans.*;
import org.apache.xmlbeans.impl.validator.ValidatingXMLStreamReader;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.openuri.testNumerals.DocDocument;
import tools.util.JarUtil;
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
import javax.xml.stream.Location;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collection;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class ValidatingXMLStreamReaderTests {
private final static String URI_NUMERALS = "http://openuri.org/testNumerals";
@ParameterizedTest
@ValueSource(strings = {
"xbean/xmlobject/enumtest.xml",
"xbean/xmlobject/nameworld.xml",
"xbean/misc/xmldsig-core-schema.xsd"
//"xbean/misc/signature-example.xml"
})
void testValidateDoc(String doc) throws FileNotFoundException, XMLStreamException, Exception {
File file = JarUtil.getResourceFromJarasFile(doc);
ValidatingXMLStreamReader valXsr = new ValidatingXMLStreamReader();
Collection<XmlError> errors = new ArrayList<>();
XMLStreamReader xsr = XmlObject.Factory.parse(new FileInputStream(file)).newXMLStreamReader();
valXsr.init(xsr, true, null /* validate an entire document */,
XmlBeans.typeLoaderForClassLoader(ValidatingXMLStreamReader.class.getClassLoader()),
null,
errors);
while (valXsr.hasNext()) {
valXsr.next();
}
assertTrue(valXsr.isValid(), "File '" + file.getName() + "' is invalid.");
}
@Test
void testValidateGlobalAtt1() throws XMLStreamException {
XmlObject xo = XmlObject.Factory.newInstance();
try (XmlCursor xc = xo.newCursor()) {
xc.toNextToken();
xc.insertAttributeWithValue("price", URI_NUMERALS, "23.5");
}
XMLStreamReader xsr = xo.newXMLStreamReader(new XmlOptions().setSaveOuter());
Collection<XmlError> errors = new ArrayList<>();
ValidatingXMLStreamReader valXsr = new ValidatingXMLStreamReader();
valXsr.init(xsr, false, null,
XmlBeans.typeLoaderForClassLoader(ValidatingXMLStreamReader.class.getClassLoader()),
null, errors);
while (valXsr.hasNext()) {
valXsr.next();
}
assertTrue(valXsr.isValid(), "Global attribute validation is broken.");
}
@Test
void testValidateGlobalAtt2() throws XMLStreamException {
XMLStreamReader xsr = new TestXSR();
Collection<XmlError> errors = new ArrayList<>();
ValidatingXMLStreamReader valXsr = new ValidatingXMLStreamReader();
valXsr.init(xsr, false, null,
XmlBeans.typeLoaderForClassLoader(ValidatingXMLStreamReader.class.getClassLoader()),
null, errors);
while (valXsr.hasNext()) {
valXsr.next();
}
assertTrue(valXsr.isValid(), "Global attribute validation 2 is broken.");
}
private static class TestXSR implements XMLStreamReader {
private int _state = 0;
public Object getProperty(String name) throws IllegalArgumentException {
return null;
}
public int next() throws XMLStreamException {
int state = _state;
_state++;
switch (state) {
case 0:
return XMLEvent.START_DOCUMENT;
case 1:
return XMLEvent.ATTRIBUTE;
}
return XMLEvent.END_DOCUMENT;
}
public void require(int type, String namespaceURI, String localName) throws XMLStreamException {
}
public String getElementText() throws XMLStreamException {
return null;
}
public int nextTag() throws XMLStreamException {
return next();
}
public boolean hasNext() throws XMLStreamException {
return _state < 3;
}
public void close() throws XMLStreamException {
}
public String getNamespaceURI(String prefix) {
if ("".equals(prefix)) {
return URI_NUMERALS;
}
return null;
}
public boolean isStartElement() {
return false;
}
public boolean isEndElement() {
return false;
}
public boolean isCharacters() {
return false;
}
public boolean isWhiteSpace() {
return false;
}
public String getAttributeValue(String namespaceURI, String localName) {
if (URI_NUMERALS.equals(namespaceURI) && "price".equals(localName)) {
return "5";
}
throw new IllegalStateException();
}
public int getAttributeCount() {
return 1;
}
public QName getAttributeName(int index) {
if (index == 0) {
return new QName(URI_NUMERALS, "price");
}
throw new IllegalStateException();
}
public String getAttributeNamespace(int index) {
if (index == 0) {
return URI_NUMERALS;
}
throw new IllegalStateException();
}
public String getAttributeLocalName(int index) {
if (index == 0) {
return "price";
}
throw new IllegalStateException();
}
public String getAttributePrefix(int index) {
if (index == 0) {
return "";
}
throw new IllegalStateException();
}
public String getAttributeType(int index) {
if (index == 0) {
return "CDATA";
}
throw new IllegalStateException();
}
public String getAttributeValue(int index) {
if (index == 0) {
return "8.7654321";
}
throw new IllegalStateException();
}
public boolean isAttributeSpecified(int index) {
if (index == 0) {
return true;
}
throw new IllegalStateException();
}
public int getNamespaceCount() {
return 0;
}
public String getNamespacePrefix(int index) {
return null;
}
public String getNamespaceURI(int index) {
return null;
}
public NamespaceContext getNamespaceContext() {
return null;
}
public int getEventType() {
return XMLEvent.ATTRIBUTE;
}
public String getText() {
return null;
}
public char[] getTextCharacters() {
return new char[0];
}
public int getTextCharacters(int sourceStart, char[] target, int targetStart, int length) throws XMLStreamException {
return 0;
}
public int getTextStart() {
return 0;
}
public int getTextLength() {
return 0;
}
public String getEncoding() {
return null;
}
public boolean hasText() {
return false;
}
public Location getLocation() {
return null;
}
public QName getName() {
return null;
}
public String getLocalName() {
return null;
}
public boolean hasName() {
return false;
}
public String getNamespaceURI() {
return null;
}
public String getPrefix() {
return null;
}
public String getVersion() {
return null;
}
public boolean isStandalone() {
return false;
}
public boolean standaloneSet() {
return false;
}
public String getCharacterEncodingScheme() {
return null;
}
public String getPITarget() {
return null;
}
public String getPIData() {
return null;
}
}
@Test
void testValidateContent1() throws XMLStreamException {
XmlObject xo = XmlObject.Factory.newInstance();
XmlCursor xc = xo.newCursor();
xc.toNextToken();
xc.insertElementWithText("int", URI_NUMERALS, "5");
xc.insertElementWithText("float", URI_NUMERALS, "7.654321");
XMLStreamReader xsr = xo.newXMLStreamReader();
Collection<XmlError> errors = new ArrayList<>();
ValidatingXMLStreamReader valXsr = new ValidatingXMLStreamReader();
valXsr.init(xsr, true, DocDocument.Doc.type,
XmlBeans.typeLoaderForClassLoader(ValidatingXMLStreamReader.class.getClassLoader()),
null, errors);
int depth = 0;
while (valXsr.hasNext()) {
if (valXsr.getEventType() == XMLEvent.END_ELEMENT && ++depth >= 2) {
break;
}
valXsr.next();
}
assertTrue(valXsr.isValid(), "Content1 validation is broken.");
}
@Test
void testValidateContent2() throws XMLStreamException {
String doc = "<doc xmlns='" + URI_NUMERALS + "'><int>5</int><float>7.654321</float></doc>";
XMLStreamReader xsr = null;
try {
xsr = XmlObject.Factory.parse(doc).newXMLStreamReader();
} catch (XmlException e) {
throw new XMLStreamException(e);
}
xsr.nextTag();
Collection<XmlError> errors = new ArrayList<>();
ValidatingXMLStreamReader valXsr = new ValidatingXMLStreamReader();
valXsr.init(xsr, false, DocDocument.Doc.type,
XmlBeans.typeLoaderForClassLoader(ValidatingXMLStreamReader.class.getClassLoader()),
null, errors);
int depth = 0;
while (valXsr.hasNext()) {
if (valXsr.next() == XMLEvent.END_ELEMENT && ++depth >= 2) {
break;
}
}
assertTrue(valXsr.isValid(), "Content2 validation is broken.");
}
}