/** * Copyright (c) 2013 itemis AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * itemis AG - initial API and implementation */ package org.eclipse.rmf.tests.serialization.env.xerces; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.List; import java.util.Vector; import javax.xml.XMLConstants; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.apache.xerces.impl.Constants; import org.eclipse.rmf.tests.serialization.env.emf.myreqif.MyreqifPackage; import org.junit.Test; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.SAXParseException; import org.xml.sax.XMLReader; @SuppressWarnings("nls") public class XercesSchemaValidationTests { public static final String DATA_BASEDIR = "resources/input/org.eclipse.rmf.tests.serialization.env/data/"; public static final String MODEL_BASEDIR = "resources/model/"; class MyErrorHandler implements ErrorHandler { public List<SAXParseException> errors = new Vector<SAXParseException>(); public List<SAXParseException> warnings = new Vector<SAXParseException>(); public List<SAXParseException> fatalErrors = new Vector<SAXParseException>(); public void warning(SAXParseException exception) throws SAXException { warnings.add(exception); } public void error(SAXParseException exception) throws SAXException { errors.add(exception); } public void fatalError(SAXParseException exception) throws SAXException { fatalErrors.add(exception); } }; @Test public void testSchemaValidationOnLoadWithValidFile() { String fileName = DATA_BASEDIR + "simple.xml"; try { MyErrorHandler errorHandler = new MyErrorHandler(); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader reader = parser.getXMLReader(); reader.setErrorHandler(errorHandler); reader.setFeature(Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE, true); reader.setFeature(Constants.SAX_FEATURE_PREFIX + Constants.VALIDATION_FEATURE, true); reader.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_VALIDATION_FEATURE, true); reader.setProperty(Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_LANGUAGE, XMLConstants.W3C_XML_SCHEMA_NS_URI); reader.setProperty(Constants.XERCES_PROPERTY_PREFIX + Constants.SCHEMA_LOCATION, MyreqifPackage.eNS_URI + " ../../../model/myreqif.xsd"); reader.parse(fileName); assertEquals(toString(errorHandler.errors), 0, errorHandler.errors.size()); assertEquals(toString(errorHandler.warnings), 0, errorHandler.warnings.size()); assertEquals(toString(errorHandler.fatalErrors), 0, errorHandler.fatalErrors.size()); } catch (SAXException ex) { assertTrue(ex.getMessage(), false); } catch (IOException ex) { assertTrue(ex.getMessage(), false); } catch (ParserConfigurationException ex) { assertTrue(ex.getMessage(), false); } } @Test public void testSchemaValidationOnLoadWithInvalidFile() { String fileName = DATA_BASEDIR + "bare.xml"; try { MyErrorHandler errorHandler = new MyErrorHandler(); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader reader = parser.getXMLReader(); reader.setErrorHandler(errorHandler); reader.setFeature(Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE, true); reader.setFeature(Constants.SAX_FEATURE_PREFIX + Constants.VALIDATION_FEATURE, true); reader.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_VALIDATION_FEATURE, true); reader.setProperty(Constants.JAXP_PROPERTY_PREFIX + Constants.SCHEMA_LANGUAGE, XMLConstants.W3C_XML_SCHEMA_NS_URI); reader.setProperty(Constants.XERCES_PROPERTY_PREFIX + Constants.SCHEMA_LOCATION, MyreqifPackage.eNS_URI + " ../../../model/myreqif.xsd"); reader.parse(fileName); assertEquals(toString(errorHandler.errors), 1, errorHandler.errors.size()); assertEquals(toString(errorHandler.warnings), 0, errorHandler.warnings.size()); assertEquals(toString(errorHandler.fatalErrors), 0, errorHandler.fatalErrors.size()); } catch (SAXException ex) { assertTrue(ex.getMessage(), false); } catch (IOException ex) { assertTrue(ex.getMessage(), false); } catch (ParserConfigurationException ex) { assertTrue(ex.getMessage(), false); } } @Test public void testSchemaValidationWithValidFile() { String fileName = DATA_BASEDIR + "simple.xml"; StreamSource[] schemaDocuments = new StreamSource[] { new StreamSource(MODEL_BASEDIR + "myreqif.xsd") }; Source instanceDocument = new StreamSource(fileName); SchemaFactory sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Schema s; try { s = sf.newSchema(schemaDocuments); Validator v = s.newValidator(); v.validate(instanceDocument); } catch (SAXException ex) { assertTrue(ex.getMessage(), false); } catch (IOException ex) { assertTrue(ex.getMessage(), false); } } @Test public void testSchemaValidationWithInvalidFile() { String fileName = DATA_BASEDIR + "bare.xml"; StreamSource[] schemaDocuments = new StreamSource[] { new StreamSource(MODEL_BASEDIR + "myreqif.xsd") }; Source instanceDocument = new StreamSource(fileName); SchemaFactory sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Schema s; try { s = sf.newSchema(schemaDocuments); Validator v = s.newValidator(); v.validate(instanceDocument); assertTrue(false); } catch (SAXException ex) { assertTrue(ex.getMessage().contains("cvc-complex-type.2.4.a:")); } catch (IOException ex) { assertTrue(ex.getMessage(), false); } } @Test public void testSchemaValidationWithValidToolExtensionsFile() { String fileName = DATA_BASEDIR + "simple_toolExtensions.xml"; StreamSource[] schemaDocuments = new StreamSource[] { new StreamSource(MODEL_BASEDIR + "myreqif.xsd") }; Source instanceDocument = new StreamSource(fileName); SchemaFactory sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Schema s; try { s = sf.newSchema(schemaDocuments); Validator v = s.newValidator(); v.validate(instanceDocument); } catch (SAXException ex) { assertTrue(ex.getMessage(), false); } catch (IOException ex) { assertTrue(false); } } @Test public void testSchemaValidationWithValidRedefinedToolExtensionsFile() { String fileName = DATA_BASEDIR + "simple_toolExtensions_redefinedNsPrefix.xml"; StreamSource[] schemaDocuments = new StreamSource[] { new StreamSource(MODEL_BASEDIR + "myreqif.xsd") }; Source instanceDocument = new StreamSource(fileName); SchemaFactory sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Schema s; try { s = sf.newSchema(schemaDocuments); Validator v = s.newValidator(); v.validate(instanceDocument); } catch (SAXException ex) { assertTrue(ex.getMessage(), false); } catch (IOException ex) { assertTrue(false); } } @Test public void testSchemaValidationQualifiedForm() { String fileName = DATA_BASEDIR + "simple_qualifiedForm.xml"; StreamSource[] schemaDocuments = new StreamSource[] { new StreamSource(MODEL_BASEDIR + "myreqif.xsd") }; Source instanceDocument = new StreamSource(fileName); SchemaFactory sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Schema s; try { s = sf.newSchema(schemaDocuments); Validator v = s.newValidator(); v.validate(instanceDocument); } catch (SAXException ex) { assertTrue(ex.getMessage(), false); } catch (IOException ex) { assertTrue(ex.getMessage(), false); } } @Test public void testSchemaValidationUnqualifiedForm() throws SAXNotRecognizedException, SAXNotSupportedException { String fileName = DATA_BASEDIR + "simple_unqualifiedForm.xml"; StreamSource[] schemaDocuments = new StreamSource[] { new StreamSource(MODEL_BASEDIR + "myreqif.xsd") }; Source instanceDocument = new StreamSource(fileName); SchemaFactory sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); sf.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_FULL_CHECKING, Boolean.TRUE); Schema s; try { s = sf.newSchema(schemaDocuments); Validator v = s.newValidator(); v.validate(instanceDocument); } catch (SAXException ex) { assertTrue(ex.getMessage().contains("cvc-complex-type.2.4.a:")); } catch (IOException ex) { assertTrue(ex.getMessage(), false); } } /** * check if the error in the Xerces XML Validator that raises an error against not resolvable types in the any * section still persists. */ @Test public void testSchemaValidationWithValidToolExtensionsXsiTypeFile() { String fileName = DATA_BASEDIR + "simple_toolExtensions_xsiType.xml"; StreamSource[] schemaDocuments = new StreamSource[] { new StreamSource(MODEL_BASEDIR + "myreqif.xsd") }; Source instanceDocument = new StreamSource(fileName); SchemaFactory sf = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); Schema s; try { s = sf.newSchema(schemaDocuments); Validator v = s.newValidator(); v.validate(instanceDocument); } catch (SAXException ex) { assertTrue(ex.getMessage().contains("cvc-elt.4.2:")); } catch (IOException ex) { assertTrue(false); } } private String toString(List<SAXParseException> exceptions) { StringBuffer buffer = new StringBuffer(); for (SAXParseException exception : exceptions) { buffer.append(exception.getMessage()); buffer.append(" ### "); } return buffer.toString(); } }