aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop/afp/util/DefaultFOPResourceAccessor.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/org/apache/fop/afp/util/DefaultFOPResourceAccessor.java')
-rw-r--r--src/java/org/apache/fop/afp/util/DefaultFOPResourceAccessor.java42
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();
}
}