From ae7c3b4bd8c7e1eca36dd5963d2b28dfad43bda2 Mon Sep 17 00:00:00 2001 From: Vincent Hennebert Date: Thu, 20 Oct 2011 15:38:54 +0000 Subject: [PATCH] Cache the schema for the XML namespace to a local directory. This avoids downloading it from the W3C website every time the IF test cases are run. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1186858 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 26 ++++- .../fop/intermediate/AbstractIFTestCase.java | 1 + .../fop/intermediate/XMLSchemaResolver.java | 94 +++++++++++++++++++ 3 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 test/java/org/apache/fop/intermediate/XMLSchemaResolver.java diff --git a/build.xml b/build.xml index a7e548a53..542ff25de 100644 --- a/build.xml +++ b/build.xml @@ -836,11 +836,29 @@ list of possible build targets. - - + + + + + + + + + - - + + + diff --git a/test/java/org/apache/fop/intermediate/AbstractIFTestCase.java b/test/java/org/apache/fop/intermediate/AbstractIFTestCase.java index 77662a5a9..7bdebd706 100644 --- a/test/java/org/apache/fop/intermediate/AbstractIFTestCase.java +++ b/test/java/org/apache/fop/intermediate/AbstractIFTestCase.java @@ -71,6 +71,7 @@ abstract class AbstractIFTestCase extends AbstractIntermediateTestCase { } }); + sFactory.setResourceResolver(XMLSchemaResolver.getInstance()); File ifSchemaFile = new File( "src/documentation/intermediate-format-ng/fop-intermediate-format-ng.xsd"); ifSchema = sFactory.newSchema(ifSchemaFile); diff --git a/test/java/org/apache/fop/intermediate/XMLSchemaResolver.java b/test/java/org/apache/fop/intermediate/XMLSchemaResolver.java new file mode 100644 index 000000000..566e79f71 --- /dev/null +++ b/test/java/org/apache/fop/intermediate/XMLSchemaResolver.java @@ -0,0 +1,94 @@ +/* + * 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. + */ + +/* $Id$ */ + +package org.apache.fop.intermediate; + +import java.io.InputStream; +import java.util.MissingResourceException; + +import javax.xml.XMLConstants; + +import org.w3c.dom.bootstrap.DOMImplementationRegistry; +import org.w3c.dom.ls.DOMImplementationLS; +import org.w3c.dom.ls.LSInput; +import org.w3c.dom.ls.LSResourceResolver; + +/** + * A resource resolver that returns a cached instance of the XML Schema, that can normally + * be found at {@linkplain http://www.w3.org/2001/xml.xsd}. This can be used to avoid + * unnecessary connection to the W3C website. + */ +final class XMLSchemaResolver implements LSResourceResolver { + + private static final String XML_SCHEMA_SYSTEM_ID = "http://www.w3.org/2001/xml.xsd"; + + private static final LSInput XML_SCHEMA_INPUT; + + private static final XMLSchemaResolver INSTANCE = new XMLSchemaResolver(); + + private XMLSchemaResolver() { } + + static { + DOMImplementationRegistry registry = getDOMImplementationRegistry(); + DOMImplementationLS impl + = (DOMImplementationLS) registry.getDOMImplementation("LS 3.0"); + XML_SCHEMA_INPUT = impl.createLSInput(); + InputStream xmlSchema = loadXMLSchema(); + XML_SCHEMA_INPUT.setByteStream(xmlSchema); + } + + private static DOMImplementationRegistry getDOMImplementationRegistry() { + try { + return DOMImplementationRegistry.newInstance(); + } catch (ClassCastException e) { + throw new ExceptionInInitializerError(e); + } catch (ClassNotFoundException e) { + throw new ExceptionInInitializerError(e); + } catch (InstantiationException e) { + throw new ExceptionInInitializerError(e); + } catch (IllegalAccessException e) { + throw new ExceptionInInitializerError(e); + } + } + + private static InputStream loadXMLSchema() { + String xmlSchemaResource = "xml.xsd"; + InputStream xmlSchema = XMLSchemaResolver.class.getResourceAsStream(xmlSchemaResource); + if (xmlSchema == null) { + throw new MissingResourceException("Schema for XML namespace not found." + + " Did you run ant junit-intermediate-format?", + XMLSchemaResolver.class.getName(), xmlSchemaResource); + } + return xmlSchema; + } + + public static XMLSchemaResolver getInstance() { + return INSTANCE; + } + + public LSInput resolveResource(String type, String namespaceURI, String publicId, + String systemId, String baseURI) { + if (XMLConstants.XML_NS_URI.equals(namespaceURI) && XML_SCHEMA_SYSTEM_ID.equals(systemId)) { + return XML_SCHEMA_INPUT; + } else { + return null; + } + } + +} -- 2.39.5