/** * 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 tests; import java.io.File; import java.io.FileInputStream; import java.net.URL; import java.util.List; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.stream.StreamSource; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.apache.ws.commons.schema.XmlSchema; import org.apache.ws.commons.schema.XmlSchemaCollection; import org.apache.ws.commons.schema.XmlSchemaExternal; import org.apache.ws.commons.schema.XmlSchemaImport; import org.junit.Assert; import org.junit.Test; public class ImportTest extends Assert { @Test public void testSchemaImport() throws Exception { // create a DOM document DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); Document doc = documentBuilderFactory.newDocumentBuilder().parse(Resources.asURI("importBase.xsd")); XmlSchemaCollection schemaCol = new XmlSchemaCollection(); schemaCol.setBaseUri(Resources.TEST_RESOURCES); XmlSchema schema = schemaCol.read(doc, null); assertNotNull(schema); // attempt with slash now schemaCol = new XmlSchemaCollection(); schemaCol.setBaseUri(Resources.TEST_RESOURCES + "/"); schema = schemaCol.read(doc, null); assertNotNull(schema); } /** * variation of above don't set the base uri. * * @throws Exception */ @Test public void testSchemaImport2() throws Exception { File file = new File(Resources.asURI("importBase.xsd")); // create a DOM document DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); Document doc = documentBuilderFactory.newDocumentBuilder().parse(file.toURI().toURL().toString()); XmlSchemaCollection schemaCol = new XmlSchemaCollection(); XmlSchema schema = schemaCol.read(doc, file.toURI().toURL().toString()); assertNotNull(schema); } /** * see whether we can reach the types of the imported schemas. * * @throws Exception */ @Test public void testSchemaImport3() throws Exception { File file = new File(Resources.asURI("importBase.xsd")); // create a DOM document DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); Document doc = documentBuilderFactory.newDocumentBuilder().parse(file.toURI().toURL().toString()); XmlSchemaCollection schemaCol = new XmlSchemaCollection(); XmlSchema schema = schemaCol.read(doc, file.toURI().toURL().toString()); assertNotNull(schema); assertNotNull(schema.getTypeByName(new QName("http://soapinterop.org/xsd2", "SOAPStruct"))); assertNotNull(schema.getElementByName(new QName("http://soapinterop.org/xsd2", "SOAPWrapper"))); } /** * see whether we can parse the imported schemas using relative * directories and paths. * * @throws Exception */ @Test public void testSchemaImport4() throws Exception { //No base works File f = new File(Resources.asURI("XMLSCHEMA-8/a/b/c/s1.xsd")); XmlSchemaCollection schemaCol = new XmlSchemaCollection(); FileInputStream is = new FileInputStream(f); XmlSchema schema = schemaCol.read(new StreamSource(is, f.toURI().toString())); is.close(); assertNotNull(schema); //XMLSCHEMA-8 schemaCol = new XmlSchemaCollection(); String base = f.getParentFile().toString(); schemaCol.setBaseUri(base); is = new FileInputStream(f); schema = schemaCol.read(new StreamSource(is, f.toURI().toString())); is.close(); assertNotNull(schema); } /** * Tests that imports without <tt>schemaLocation</tt> are resolved if the corresponding schemas * have been registered using {@link XmlSchemaCollection#getKnownNamespaceMap()}. */ @Test public void testImportWithKnownNamespace() { XmlSchemaCollection schemaCol = new XmlSchemaCollection(); schemaCol.getKnownNamespaceMap().put("http://www.w3.org/XML/1998/namespace", new XmlSchemaCollection().read(new InputSource(Resources.asURI("xml.xsd")))); XmlSchema schema = schemaCol.read(new InputSource(Resources.asURI("knownNamespace.xsd"))); List<XmlSchemaExternal> externals = schema.getExternals(); assertEquals(1, externals.size()); XmlSchemaImport schemaImport = (XmlSchemaImport)externals.get(0); assertEquals("http://www.w3.org/XML/1998/namespace", schemaImport.getNamespace()); XmlSchema schema2 = schemaImport.getSchema(); assertNotNull(schema2); } /** * Tests that imports are properly resolved when loading a schema from a JAR (as will generally * be the case when loading a schema from the classpath). * * @throws Exception */ @Test public void testImportWithJARURL() throws Exception { String basedir = System.getProperty("basedir"); if (basedir == null) { basedir = "."; } URL jarUrl = new File(basedir, "target/test-zip.zip").toURI().toURL(); URL schemaUrl = new URL("jar:" + jarUrl + "!/test-dir/importBase.xsd"); XmlSchemaCollection schemaCol = new XmlSchemaCollection(); XmlSchema schema = schemaCol.read(new InputSource(schemaUrl.toExternalForm())); assertNotNull(schema); } }