]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Cache the schema for the XML namespace to a local directory. This avoids downloading...
authorVincent Hennebert <vhennebert@apache.org>
Thu, 20 Oct 2011 15:38:54 +0000 (15:38 +0000)
committerVincent Hennebert <vhennebert@apache.org>
Thu, 20 Oct 2011 15:38:54 +0000 (15:38 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1186858 13f79535-47bb-0310-9956-ffa450edef68

build.xml
test/java/org/apache/fop/intermediate/AbstractIFTestCase.java
test/java/org/apache/fop/intermediate/XMLSchemaResolver.java [new file with mode: 0644]

index a7e548a53e433be8557da1cef128b00c4f6c780c..542ff25de1b669a3e0ab455ee529ae7f57d52aa4 100644 (file)
--- a/build.xml
+++ b/build.xml
@@ -836,11 +836,29 @@ list of possible build targets.
   <target name="junit-area-tree-xml-format" depends="junit-compile" description="Runs FOP's area tree XML format JUnit tests" if="xmlunit.present">
     <junit-run title="area tree XML format" testsuite="org.apache.fop.intermediate.AreaTreeXMLFormatTestSuite" outfile="TEST-area-tree-xml-format"/>
   </target>
-  <target name="junit-intermediate-layout" depends="junit-compile" if="xmlunit.present">
-    <junit-run title="intermediate format from layout tests" testsuite="org.apache.fop.intermediate.LayoutIFTestSuite" outfile="TEST-intermediate-format-from-layout"/>
+  <target name="junit-intermediate-layout" depends="junit-compile,setup-xml-schema" 
+    if="xmlunit.present">
+    <junit-run title="intermediate format from layout tests" 
+      testsuite="org.apache.fop.intermediate.LayoutIFTestSuite" 
+      outfile="TEST-intermediate-format-from-layout"/>
+  </target>
+  <target name="setup-xml-schema">
+    <local name="cache-dir"/>
+    <property name="cache-dir" value="${basedir}/.cache/junit/intermediate"/>
+    <mkdir dir="${cache-dir}"/>
+    <get src="http://www.w3.org/2001/xml.xsd"
+      dest="${cache-dir}/xml.xsd"
+      usetimestamp="true"/>
+    <copy file="${cache-dir}/xml.xsd" 
+      todir="${build.dir}/test-classes/org/apache/fop/intermediate"/>
   </target>
-  <target name="junit-intermediate-format" depends="junit-compile,junit-intermediate-layout" description="Runs FOP's intermediate format JUnit tests" if="xmlunit.present">
-    <junit-run title="intermediate format" testsuite="org.apache.fop.intermediate.IntermediateFormatTestSuite" outfile="TEST-intermediate-format"/>
+
+  <target name="junit-intermediate-format" 
+    depends="junit-compile,setup-xml-schema,junit-intermediate-layout"
+    description="Runs FOP's intermediate format JUnit tests" if="xmlunit.present">
+    <junit-run title="intermediate format" 
+      testsuite="org.apache.fop.intermediate.IntermediateFormatTestSuite" 
+      outfile="TEST-intermediate-format"/>
   </target>
   <target name="junit-events" depends="junit-compile" description="Runs FOP's event JUnit tests" if="junit.present">
     <junit-run title="event" basedir="test/events" testsuite="org.apache.fop.events.EventProcessingTestCase" outfile="TEST-events"/>
index 77662a5a9172be68590edce6a10a9f64865c8b0e..7bdebd706e8c540c256e2c6ccd174ffdee49dc37 100644 (file)
@@ -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 (file)
index 0000000..566e79f
--- /dev/null
@@ -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;
+        }
+    }
+
+}