/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 schema.config; import java.io.File; import java.io.FileNotFoundException; import java.net.URL; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import junit.framework.TestCase; import org.apache.xerces.dom.PSVIElementNSImpl; import org.apache.xerces.impl.Constants; import org.apache.xerces.impl.xs.SchemaGrammar; import org.apache.xerces.xs.ElementPSVI; import org.apache.xerces.xs.ItemPSVI; import org.apache.xerces.xs.XSElementDeclaration; import org.apache.xerces.xs.XSTypeDefinition; import org.w3c.dom.Document; import org.w3c.dom.Node; /** * @author Peter McCracken, IBM * @version $Id$ */ public abstract class BaseTest extends TestCase { protected final static String ROOT_TYPE = Constants.XERCES_PROPERTY_PREFIX + Constants.ROOT_TYPE_DEFINITION_PROPERTY; protected final static String IGNORE_XSI_TYPE = Constants.XERCES_FEATURE_PREFIX + Constants.IGNORE_XSI_TYPE_FEATURE; protected final static String ID_IDREF_CHECKING = Constants.XERCES_FEATURE_PREFIX + Constants.ID_IDREF_CHECKING_FEATURE; protected final static String IDC_CHECKING = Constants.XERCES_FEATURE_PREFIX + Constants.IDC_CHECKING_FEATURE; protected final static String UNPARSED_ENTITY_CHECKING = Constants.XERCES_FEATURE_PREFIX + Constants.UNPARSED_ENTITY_CHECKING_FEATURE; protected final static String USE_GRAMMAR_POOL_ONLY = Constants.XERCES_FEATURE_PREFIX + Constants.USE_GRAMMAR_POOL_ONLY_FEATURE; protected final static String DYNAMIC_VALIDATION = Constants.XERCES_FEATURE_PREFIX + Constants.DYNAMIC_VALIDATION_FEATURE; protected final static String DOCUMENT_CLASS_NAME = Constants.XERCES_PROPERTY_PREFIX + Constants.DOCUMENT_CLASS_NAME_PROPERTY; protected Validator fValidator; protected SpecialCaseErrorHandler fErrorHandler; protected Document fDocument; protected ElementPSVI fRootNode; protected URL fDocumentURL; protected URL fSchemaURL; protected abstract String getSchemaFile(); protected abstract String getXMLDocument(); public BaseTest(String name) { super(name); fErrorHandler = new SpecialCaseErrorHandler(getRelevantErrorIDs()); } protected void setUp() throws Exception { super.setUp(); DocumentBuilderFactory docFactory = DocumentBuilderFactory .newInstance(); docFactory.setAttribute(DOCUMENT_CLASS_NAME, "org.apache.xerces.dom.PSVIDocumentImpl"); docFactory.setNamespaceAware(true); DocumentBuilder builder = docFactory.newDocumentBuilder(); // build the location URL of the document String packageDir = this.getClass().getPackage().getName().replace('.', File.separatorChar); String documentPath = packageDir + "/" + getXMLDocument(); fDocumentURL = ClassLoader.getSystemResource(documentPath); if (fDocumentURL == null) { throw new FileNotFoundException("Couldn't find xml file for test: " + documentPath); } fDocument = builder.parse(fDocumentURL.toExternalForm()); fRootNode = (ElementPSVI) fDocument.getDocumentElement(); SchemaFactory sf = SchemaFactory .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); sf.setFeature(USE_GRAMMAR_POOL_ONLY, getUseGrammarPoolOnly()); String schemaPath = packageDir + "/" + getSchemaFile(); fSchemaURL = ClassLoader.getSystemResource(schemaPath); if (fSchemaURL == null) { throw new FileNotFoundException("Couldn't find schema file for test: " + schemaPath); } Schema schema = sf.newSchema(fSchemaURL); fValidator = schema.newValidator(); fValidator.setErrorHandler(fErrorHandler); fValidator.setFeature(DYNAMIC_VALIDATION, false); } protected void tearDown() throws Exception { super.tearDown(); fValidator = null; fDocument = null; fRootNode = null; fErrorHandler.reset(); } protected void validateDocument() throws Exception { Source source = new DOMSource(fDocument); source.setSystemId(fDocumentURL.toExternalForm()); Result result = new DOMResult(fDocument); fValidator.validate(source, result); } protected void validateFragment() throws Exception { Source source = new DOMSource((Node) fRootNode); source.setSystemId(fDocumentURL.toExternalForm()); Result result = new DOMResult((Node) fRootNode); fValidator.validate(source, result); } protected PSVIElementNSImpl getChild(int n) { int numFound = 0; Node child = ((Node) fRootNode).getFirstChild(); while (child != null) { if (child.getNodeType() == Node.ELEMENT_NODE) { numFound++; if (numFound == n) { return (PSVIElementNSImpl) child; } } child = child.getNextSibling(); } return null; } protected String[] getRelevantErrorIDs() { return new String[] {}; } protected boolean getUseGrammarPoolOnly() { return false; } // specialized asserts protected void assertValidity(short expectedValidity, short actualValidity) { String expectedString = expectedValidity == ItemPSVI.VALIDITY_VALID ? "valid" : (expectedValidity == ItemPSVI.VALIDITY_INVALID ? "invalid" : "notKnown"); String actualString = actualValidity == ItemPSVI.VALIDITY_VALID ? "valid" : (actualValidity == ItemPSVI.VALIDITY_INVALID ? "invalid" : "notKnown"); String message = "{validity} was <" + actualString + "> but it should have been <" + expectedString + ">"; assertEquals(message, expectedValidity, actualValidity); } protected void assertValidationAttempted(short expectedAttempted, short actualAttempted) { String expectedString = expectedAttempted == ItemPSVI.VALIDATION_FULL ? "full" : (expectedAttempted == ItemPSVI.VALIDATION_PARTIAL ? "partial" : "none"); String actualString = actualAttempted == ItemPSVI.VALIDATION_FULL ? "full" : (actualAttempted == ItemPSVI.VALIDATION_PARTIAL ? "partial" : "none"); String message = "{validity} was <" + actualString + "> but it should have been <" + expectedString + ">"; assertEquals(message, expectedAttempted, actualAttempted); } protected void assertElementName(String expectedName, String actualName) { assertEquals("Local name of element declaration is wrong.", expectedName, actualName); } protected void assertElementNull(XSElementDeclaration elem) { assertNull("Element declaration should be null.", elem); } protected void assertElementNamespace(String expectedName, String actualName) { assertEquals("Namespace of element declaration is wrong.", expectedName, actualName); } protected void assertElementNamespaceNull(String actualName) { assertNull("Local name of element declaration should be null.", actualName); } protected void assertTypeName(String expectedName, String actualName) { assertEquals("Local name of type definition is wrong.", expectedName, actualName); } protected void assertTypeNull(XSTypeDefinition type) { assertNull("Type definition should be null.", type); } protected void assertTypeNamespace(String expectedName, String actualName) { assertEquals("Namespace of type definition is wrong.", expectedName, actualName); } protected void assertTypeNamespaceNull(String actualName) { assertNull("Namespace of type definition should be null.", actualName); } protected void assertError(String error) { assertTrue("Error <" + error + "> should have occured, but did not.", fErrorHandler.specialCaseFound(error)); } protected void assertNoError(String error) { assertFalse("Error <" + error + "> should not have occured (but it did)", fErrorHandler .specialCaseFound(error)); } protected void assertAnyType(XSTypeDefinition type) { assertEquals("Type is supposed to be anyType", SchemaGrammar.fAnyType, type); } }