You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-dev@xmlgraphics.apache.org by "Beat Hörmann (Jira)" <ji...@apache.org> on 2022/02/22 18:24:00 UTC

[jira] [Commented] (FOP-2861) Allow resource loading from jar: URI

    [ https://issues.apache.org/jira/browse/FOP-2861?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17496264#comment-17496264 ] 

Beat Hörmann commented on FOP-2861:
-----------------------------------

In version 2.6 "jar:file:..."-URIs worked, maybe due to the hack Ole mentioned in "comment 30/Mar/21 10:23". However, current source code for 2.6 doesn't contain this hack. Could it be that the binaries of 2.6 and the corresponding sources are not in sync? Anyway, I switched to 2.7 and the very same and long lasting problem appears again.

Why FOP uses "InternalResourceResolver" for resolving relative font-URLs, e.g. "<font embed-url="arial.ttf">", instead of just using the custom resource solver that I pass as the second argument of the "org.apache.fop.apps.FopFactoryBuilder(URI defaultBaseURI, ResourceResolver resourceResolver)" factory method? FOP uses this custom resource solver for resolving the relative URL of an image in a fo-file and in such a case I can perfectly handle the known issue  by just providing my custom resource solver which returns

public Resource getResource(URI uri) throws IOException {
   return new Resource(new URL(scheme, null, -1, schemelessURI.resolve(uri).toString()).openStream());
}

whenever the scheme is equal to "jar". (Of course, scheme = baseURI.getScheme(); and schemelessURI = URI.create(baseURI.getRawSchemeSpecificPart()); .)

If FOP 2.7 would just resolve relative font-Urls the same way as relative-Image-Urls I would be saved. Currently, I'm stuck with 2.7 because my deliveries to my customers are war-/jar-files and I need to reference fonts.

> Allow resource loading from jar: URI
> ------------------------------------
>
>                 Key: FOP-2861
>                 URL: https://issues.apache.org/jira/browse/FOP-2861
>             Project: FOP
>          Issue Type: Improvement
>    Affects Versions: 2.0, 2.1, 2.2, 2.3, 2.4, 2.6
>            Reporter: Ole Sandum
>            Priority: Major
>         Attachments: FopResourceResolver.java, uri_resolve.diff, uri_resolve_decoded.diff
>
>
> We would like to load our FOP config.xml along with related fonts and hyphenation files using  the common classloader URL, e.g.:
> {{  URL configXml = getClass().getResource("config.xml");}}
> {{  FopConfParser confParser = }}
> {{      new FopConfParser(configXml.openStream(), configXml.toURI());}}
> This makes for easy deployment, and works nicely as long as classes and resources are loaded from separate files, i.e. from file:/some/path/config.xml URIs. However, it fails when classes and resources are packaged and loaded directly from a jar, i.e. from jar:file:/some/archive.jar!/path/config.xml URIs, as is the case when deploying with JWS or running an all-in-one executable jar, as it will fail to properly resolve the related font and hyphenation file URIs. 
> See [https://github.com/osandum/fop-test.git] for a test to illustrate.
> This is a consequence of a long standing issue (reported in [https://bugs.openjdk.java.net/browse/JDK-8020755)] that URI.resolve(childUri) doesn't work as expected on jar:file: URIs.
> In this case, it can be easily remedied by a work-around to the call in InternalResourceResolver.resolveFromBase(URI uri). Patch attached.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)