import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-
import org.apache.xmlgraphics.util.io.Base64EncodeStream;
-
-import org.apache.fop.util.DataURIResolver;
+import org.apache.xmlgraphics.util.uri.CommonURIResolver;
/**
* Provides FOP specific URI resolution. This is the default URIResolver
- * {@link FOUserAgent} will use unless overidden.
+ * {@link FOUserAgent} will use unless overridden.
*
* @see javax.xml.transform.URIResolver
*/
// log
private Log log = LogFactory.getLog("FOP");
- /** URIResolver for RFC 2397 data URLs */
- private URIResolver dataURIResolver = new DataURIResolver();
+ /** Common URIResolver */
+ private URIResolver commonURIResolver = CommonURIResolver.getInstance();
/** A user settable URI Resolver */
private URIResolver uriResolver = null;
// data URLs can be quite long so evaluate early and don't try to build a File
// (can lead to problems)
- source = dataURIResolver.resolve(href, base);
+ source = commonURIResolver.resolve(href, base);
// Custom uri resolution
if (source == null && uriResolver != null) {
+++ /dev/null
-/*
- * 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.util;
-
-import java.io.ByteArrayInputStream;
-
-import javax.xml.transform.Source;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.URIResolver;
-import javax.xml.transform.stream.StreamSource;
-
-// base64 support for "data" urls
-import org.apache.xmlgraphics.util.io.Base64DecodeStream;
-
-/**
- * Resolves data URLs (described in RFC 2397) returning its data as a StreamSource.
- *
- * @see javax.xml.transform.URIResolver
- * @see <a href="http://www.ietf.org/rfc/rfc2397">RFC 2397</a>
- */
-public class DataURIResolver implements URIResolver {
-
- /**
- * {@inheritDoc}
- */
- public Source resolve(String href, String base) throws TransformerException {
- if (href.startsWith("data:")) {
- return parseDataURI(href);
- } else {
- return null;
- }
- }
-
- /**
- * Parses inline data URIs as generated by MS Word's XML export and FO
- * stylesheet.
- *
- * @see <a href="http://www.ietf.org/rfc/rfc2397">RFC 2397</a>
- */
- private Source parseDataURI(String href) {
- int commaPos = href.indexOf(',');
- // header is of the form data:[<mediatype>][;base64]
- String header = href.substring(0, commaPos);
- String data = href.substring(commaPos + 1);
- if (header.endsWith(";base64")) {
- byte[] bytes = data.getBytes();
- ByteArrayInputStream encodedStream = new ByteArrayInputStream(bytes);
- Base64DecodeStream decodedStream = new Base64DecodeStream(
- encodedStream);
- return new StreamSource(decodedStream);
- } else {
- // Note that this is not quite the full story here. But since we are
- // only interested
- // in base64-encoded binary data, the next line will probably never
- // be called.
- //TODO Handle un-escaping of special URL chars like %20
- return new StreamSource(new java.io.StringReader(data));
- }
- }
-
-}
+++ /dev/null
-/*
- * 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.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.io.Writer;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.xmlgraphics.util.io.Base64EncodeStream;
-
-/**
- * Utility classes for generating RFC 2397 data URLs.
- */
-public class DataURLUtil {
-
- /**
- * Creates a new data URL and returns it as a String.
- * @param in the InputStream to read the data from
- * @param mediatype the MIME type of the content, or null
- * @return the newly created data URL
- * @throws IOException if an I/O error occurs
- */
- public static String createDataURL(InputStream in, String mediatype) throws IOException {
- StringWriter writer = new StringWriter();
- writeDataURL(in, mediatype, writer);
- return writer.toString();
- }
-
- /**
- * Generates a data URL and writes it to a Writer.
- * @param in the InputStream to read the data from
- * @param mediatype the MIME type of the content, or null
- * @param writer the Writer to write to
- * @throws IOException if an I/O error occurs
- */
- public static void writeDataURL(InputStream in, String mediatype, Writer writer)
- throws IOException {
- writer.write("data:");
- if (mediatype != null) {
- writer.write(mediatype);
- }
- writer.write(";base64,");
- Base64EncodeStream out = new Base64EncodeStream(
- new WriterOutputStream(writer, "US-ASCII"));
- IOUtils.copy(in, out);
- out.flush();
- }
-}
+++ /dev/null
-/*
- * 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.util;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-
-/**
- * An OutputStream wrapper for a Writer.
- */
-public class WriterOutputStream extends OutputStream {
-
- private Writer writer;
- private String encoding;
-
- /**
- * Creates a new WriterOutputStream.
- * @param writer the Writer to write to
- */
- public WriterOutputStream(Writer writer) {
- this(writer, null);
- }
-
- /**
- * Creates a new WriterOutputStream.
- * @param writer the Writer to write to
- * @param encoding the encoding to use, or null if the default encoding should be used
- */
- public WriterOutputStream(Writer writer, String encoding) {
- this.writer = writer;
- this.encoding = encoding;
- }
-
- /**
- * {@inheritDoc}
- */
- public void close() throws IOException {
- writer.close();
- }
-
- /**
- * {@inheritDoc}
- */
- public void flush() throws IOException {
- writer.flush();
- }
-
- /**
- * {@inheritDoc}
- */
- public void write(byte[] buf, int offset, int length) throws IOException {
- if (encoding != null) {
- writer.write(new String(buf, offset, length, encoding));
- } else {
- writer.write(new String(buf, offset, length));
- }
- }
-
- /**
- * {@inheritDoc}
- */
- public void write(byte[] buf) throws IOException {
- write(buf, 0, buf.length);
- }
-
- /**
- * {@inheritDoc}
- */
- public void write(int b) throws IOException {
- write(new byte[] {(byte)b});
- }
-
-}
import org.apache.fop.pdf.PDFObjectTestCase;
import org.apache.fop.traits.BorderPropsTestCase;
import org.apache.fop.util.ColorUtilTestCase;
-import org.apache.fop.util.DataURIResolverTestCase;
import org.apache.fop.util.ElementListUtilsTestCase;
import org.apache.fop.util.PDFNumberTestCase;
import org.apache.fop.util.XMLResourceBundleTestCase;
suite.addTest(new TestSuite(ColorUtilTestCase.class));
suite.addTest(new TestSuite(BorderPropsTestCase.class));
suite.addTest(new TestSuite(ElementListUtilsTestCase.class));
- suite.addTest(new TestSuite(DataURIResolverTestCase.class));
suite.addTest(new TestSuite(BasicEventTestCase.class));
suite.addTest(new TestSuite(XMLResourceBundleTestCase.class));
//$JUnit-END$
+++ /dev/null
-/*
- * 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.util;
-
-import java.io.ByteArrayInputStream;
-
-import javax.xml.transform.Source;
-import javax.xml.transform.URIResolver;
-import javax.xml.transform.stream.StreamSource;
-
-import org.apache.commons.io.IOUtils;
-
-import junit.framework.TestCase;
-
-/**
- * Test case for the RFC 2397 data URL/URI resolver.
- */
-public class DataURIResolverTestCase extends TestCase {
-
- private static final byte[] TESTDATA = new byte[] {0, 1, 2, 3, 4, 5};
-
- /**
- * Tests DataURLUtil.
- * @throws Exception if an error occurs
- */
- public void testRFC2397Generator() throws Exception {
- String url = DataURLUtil.createDataURL(new ByteArrayInputStream(TESTDATA), null);
- assertEquals("Generated data URL is wrong", "data:;base64,AAECAwQF", url);
-
- url = DataURLUtil.createDataURL(new ByteArrayInputStream(TESTDATA), "application/pdf");
- assertEquals("Generated data URL is wrong", "data:application/pdf;base64,AAECAwQF", url);
- }
-
- /**
- * Test the URIResolver contract if the protocol doesn't match. Resolver must return null
- * in this case.
- * @throws Exception if an error occurs
- */
- public void testNonMatchingContract() throws Exception {
- URIResolver resolver = new DataURIResolver();
- Source src;
-
- src = resolver.resolve("http://xmlgraphics.apache.org/fop/index.html", null);
- assertNull(src);
-
- src = resolver.resolve("index.html", "http://xmlgraphics.apache.org/fop/");
- assertNull(src);
- }
-
- private static boolean byteCmp(byte[] src, int srcOffset, byte[] cmp) {
- for (int i = 0, c = cmp.length; i < c; i++) {
- if (src[srcOffset + i] != cmp[i]) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Test the DataURIResolver with correct values.
- * @throws Exception if an error occurs
- */
- public void testDataURLHandling() throws Exception {
- URIResolver resolver = new DataURIResolver();
- Source src;
-
- src = resolver.resolve("data:;base64,AAECAwQF", null);
- assertNotNull(src);
- StreamSource streamSource = (StreamSource)src;
- byte[] data = IOUtils.toByteArray(streamSource.getInputStream());
- assertTrue("Decoded data doesn't match the test data", byteCmp(TESTDATA, 0, data));
-
- src = resolver.resolve(
- "data:application/octet-stream;interpreter=fop;base64,AAECAwQF", null);
- assertNotNull(src);
- streamSource = (StreamSource)src;
- assertNotNull(streamSource.getInputStream());
- assertNull(streamSource.getReader());
- data = IOUtils.toByteArray(streamSource.getInputStream());
- assertTrue("Decoded data doesn't match the test data", byteCmp(TESTDATA, 0, data));
-
- src = resolver.resolve("data:,FOP", null);
- assertNotNull(src);
- streamSource = (StreamSource)src;
- assertNull(streamSource.getInputStream());
- assertNotNull(streamSource.getReader());
- String text = IOUtils.toString(streamSource.getReader());
- assertEquals("FOP", text);
-
- /* TODO Un-escaping of special URL chars like %20 hasn't been implemented, yet.
- src = resolver.resolve("data:,A%20brief%20note", null);
- assertNotNull(src);
- streamSource = (StreamSource)src;
- text = IOUtils.toString(streamSource.getReader());
- assertEquals("A brief note", text);
- */
- }
-
-}