diff options
Diffstat (limited to 'src/java/org/apache/fop/afp/util/DefaultFOPResourceAccessor.java')
-rw-r--r-- | src/java/org/apache/fop/afp/util/DefaultFOPResourceAccessor.java | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/src/java/org/apache/fop/afp/util/DefaultFOPResourceAccessor.java b/src/java/org/apache/fop/afp/util/DefaultFOPResourceAccessor.java index 55c8eab7d..97646542b 100644 --- a/src/java/org/apache/fop/afp/util/DefaultFOPResourceAccessor.java +++ b/src/java/org/apache/fop/afp/util/DefaultFOPResourceAccessor.java @@ -19,42 +19,68 @@ package org.apache.fop.afp.util; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URI; +import java.net.URL; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; +import org.apache.commons.io.IOUtils; + import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.apps.FopFactory; +import org.apache.fop.fonts.FontManager; /** * Default implementation of the {@link ResourceAccessor} interface for use inside FOP. */ -public class DefaultFOPResourceAccessor implements ResourceAccessor { +public class DefaultFOPResourceAccessor extends SimpleResourceAccessor { private FOUserAgent userAgent; + private String categoryBaseURI; /** - * Main constructor. + * Constructor for resource to be accessed via the {@link FOUserAgent}. This contructor + * can take two base URIs: the category base URI is the one to use when differentiating between + * normal resources (ex. images) and font resources. So, if fonts need to be accessed, you can + * set the {@link FontManager}'s base URI instead of the one on the {@link FopFactory}. * @param userAgent the FO user agent + * @param categoryBaseURI the category base URI (may be null) + * @param baseURI the custom base URI to resolve relative URIs against (may be null) */ - public DefaultFOPResourceAccessor(FOUserAgent userAgent) { + public DefaultFOPResourceAccessor(FOUserAgent userAgent, String categoryBaseURI, URI baseURI) { + super(baseURI); this.userAgent = userAgent; + this.categoryBaseURI = categoryBaseURI; } /** {@inheritDoc} */ public InputStream createInputStream(URI uri) throws IOException { - Source src = userAgent.resolveURI(uri.toASCIIString()); + //Step 1: resolve against local base URI --> URI + URI resolved = resolveAgainstBase(uri); + + //Step 2: resolve against the user agent --> stream + Source src; + src = userAgent.resolveURI(resolved.toASCIIString(), this.categoryBaseURI); + if (src == null) { - return null; + throw new FileNotFoundException("Resource not found: " + uri.toASCIIString()); } else if (src instanceof StreamSource) { StreamSource ss = (StreamSource)src; InputStream in = ss.getInputStream(); - return in; - } else { - return null; + if (in != null) { + return in; + } + if (ss.getReader() != null) { + //Don't support reader, retry using system ID below + IOUtils.closeQuietly(ss.getReader()); + } } + URL url = new URL(src.getSystemId()); + return url.openStream(); } } |