|
|
@@ -24,6 +24,9 @@ import java.io.InputStream; |
|
|
|
import java.net.URI; |
|
|
|
import java.net.URISyntaxException; |
|
|
|
|
|
|
|
import org.apache.commons.logging.Log; |
|
|
|
import org.apache.commons.logging.LogFactory; |
|
|
|
|
|
|
|
import org.apache.fop.apps.io.InternalResourceResolver; |
|
|
|
|
|
|
|
/** |
|
|
@@ -31,8 +34,11 @@ import org.apache.fop.apps.io.InternalResourceResolver; |
|
|
|
*/ |
|
|
|
public final class AFPResourceAccessor { |
|
|
|
|
|
|
|
private static final Log log = LogFactory.getLog(AFPResourceAccessor.class); |
|
|
|
|
|
|
|
private final InternalResourceResolver resourceResolver; |
|
|
|
private final String baseURI; |
|
|
|
private final URI baseURI; |
|
|
|
private final URIResolver uriResolver; |
|
|
|
|
|
|
|
/** |
|
|
|
* Constructor for resource to be accessed via the {@link org.apache.fop.apps.FOUserAgent}. This |
|
|
@@ -45,7 +51,23 @@ public final class AFPResourceAccessor { |
|
|
|
*/ |
|
|
|
public AFPResourceAccessor(InternalResourceResolver resourceResolver, String baseURI) { |
|
|
|
this.resourceResolver = resourceResolver; |
|
|
|
this.baseURI = baseURI; |
|
|
|
URI actualBaseURI = null; |
|
|
|
URIResolver uriResolver; |
|
|
|
if (baseURI == null) { |
|
|
|
actualBaseURI = null; |
|
|
|
uriResolver = new NullBaseURIResolver(); |
|
|
|
} else { |
|
|
|
try { |
|
|
|
actualBaseURI = InternalResourceResolver.getBaseURI(baseURI); |
|
|
|
uriResolver = new BaseURIResolver(); |
|
|
|
} catch (URISyntaxException use) { |
|
|
|
log.error("The URI given \"" + baseURI + "\" is invalid: " + use.getMessage()); |
|
|
|
actualBaseURI = null; |
|
|
|
uriResolver = new NullBaseURIResolver(); |
|
|
|
} |
|
|
|
} |
|
|
|
this.baseURI = actualBaseURI; |
|
|
|
this.uriResolver = uriResolver; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@@ -57,18 +79,6 @@ public final class AFPResourceAccessor { |
|
|
|
this(resourceResolver, null); |
|
|
|
} |
|
|
|
|
|
|
|
private URI getResourceURI(URI uri) { |
|
|
|
if (baseURI == null) { |
|
|
|
return uri; |
|
|
|
} |
|
|
|
try { |
|
|
|
URI baseURI = InternalResourceResolver.getBaseURI(this.baseURI); |
|
|
|
return baseURI.resolve(uri); |
|
|
|
} catch (URISyntaxException use) { |
|
|
|
return uri; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Creates an {@link InputStream} given a URI. |
|
|
|
* |
|
|
@@ -77,6 +87,44 @@ public final class AFPResourceAccessor { |
|
|
|
* @throws IOException if an I/O error occurs while creating the InputStream. |
|
|
|
*/ |
|
|
|
public InputStream createInputStream(URI uri) throws IOException { |
|
|
|
return resourceResolver.getResource(getResourceURI(uri)); |
|
|
|
return resourceResolver.getResource(uriResolver.resolveURI(uri)); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Returns the resolved URI, given the URI of a resource. |
|
|
|
* |
|
|
|
* @param uri the resource URI |
|
|
|
* @return the resolved URI |
|
|
|
*/ |
|
|
|
public URI resolveURI(String uri) { |
|
|
|
return uriResolver.resolveURI(uri); |
|
|
|
} |
|
|
|
|
|
|
|
private interface URIResolver { |
|
|
|
URI resolveURI(URI uri); |
|
|
|
|
|
|
|
URI resolveURI(String uri); |
|
|
|
} |
|
|
|
|
|
|
|
private final class NullBaseURIResolver implements URIResolver { |
|
|
|
|
|
|
|
public URI resolveURI(URI uri) { |
|
|
|
return uri; |
|
|
|
} |
|
|
|
|
|
|
|
public URI resolveURI(String uri) { |
|
|
|
return URI.create("./" + uri.trim()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private final class BaseURIResolver implements URIResolver { |
|
|
|
|
|
|
|
public URI resolveURI(URI uri) { |
|
|
|
return baseURI.resolve(uri); |
|
|
|
} |
|
|
|
|
|
|
|
public URI resolveURI(String uri) { |
|
|
|
return baseURI.resolve(uri.trim()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |