Stop me if you've heard this one before: I'm an idiot.
You know how it goes. Add a log message; fix the code. Well of course
one more recompile of everything and a restart of IDE /et viola/ it all
works as expected.
My apologies to all,
rjs
Still looking forward to an API the doesn't use String for UR[IL] but
what we have does work.
rj.
On 04/18/2012 09:54 AM, mehdi houshmand wrote:
Oh no, I wasn't suggesting you change to the
FontManager.setFontBaseURL(), I was just noting that the method is
overridden. Could you provide a full stack trace, it might be
interesting to note where that exception is coming from?
Also, just to expedite the process, try the same thing with trunk, see
what happens. From testing the method call, it should accept spaces in
the String, the FOURIResolver does a lot of URI correction.
Mehdi
On 18 April 2012 16:50, Rob Sargent <[email protected]
<mailto:[email protected]>> wrote:
And my bad too: FOP-1.0 compiled from source of official release
circa 2012-03-01.
You are correct in that I'm working off of FopFactory, but my
debugger takes me to the same setFontBaseURL(String) you list so
I'm not sure switching to FontManager would change anything. (It
will take a moderate effort to switch this: the "long story" is
that we still use older versions of fop (including to 0.20-5 I'm
sorry to say) so that's why I'm using reflection (and classloader
shenanigans to boot).
I have not looked at recent releases for any fixes in this area.
I actually expected a flood of "your doing it wrong, do this
instead"....
rjs
On 04/18/2012 09:19 AM, mehdi houshmand wrote:
Hi Rob,
Ooohh, my bad. I must have misunderstood your concern. This is an
interesting little problem, the only thing I can think if is that
the FopFactory overrides the FontManager.setFontBaseURL(...) method:
this.fontManager = new FontManager() {
/** {@inheritDoc} */
@Override
public void setFontBaseURL(String fontBase) throws
MalformedURLException {
super.setFontBaseURL(getFOURIResolver().checkBaseURL(fontBase));
}
};
But then, you're calling the "setFontBaseURL(...)" method on
FopFactory and not FontManager, so I don't know, maybe someone
else may have an idea. But could you give us all the usuals, what
version of FOP you're using? Have you tried seeing if trunk has
the same issue etc...
Mehdi
On 18 April 2012 15:39, Rob Sargent <[email protected]
<mailto:[email protected]>> wrote:
Thanks Mehdi, looking forward to the API change.
But I'm not sending ".../acres install/...", rather (I
believe) I'm sending ".../acres%20install/..." as the string
URL. Is that not the correct format?
rjs
On 04/18/2012 01:43 AM, mehdi houshmand wrote:
Hi Rob,
Firstly, we are working to change how fop handles file
access and I/O in general. I should note, that we're
unifying all resource acquisition to resolving URIs, not
URLs. The two concepts differ, and it's non-trivial.
See http://wiki.apache.org/xmlgraphics-fop/URIResolution and
http://wiki.apache.org/xmlgraphics-fop/FopFactoryConfiguration.
Secondly, there are some misnomers in the names of these
resource finders. The issue you're seeing is that
"/d1/rework/acres install/ac47/eclipe/plugins" while it is a
valid URL, it is not a valid URI. The
FopFactory.setFontBaseURL(...) method delegates to the
FOURIResolver to validate the String given and parses it as
a URL NOT a URL. That is why you're seeing this problem.
Mehdi
On 17 April 2012 23:58, Rob Sargent <[email protected]
<mailto:[email protected]>> wrote:
Seems to me FopFactory.setFontBaseURL(String s) is broken?
Forgive the reflection calls (long story).
File fontsdir = new File(bundlePath + fopHome +
"/fonts");
URL fontsURL = fontsdir.toURI().toURL();
setFontBaseURLMethod.invoke(fopFactory,
fontsURL.toExternalForm());
works fine when the directory is, shall we say, normal,
but if the directory has a space the method appears to
eat the "%20".
Caused by: java.net.MalformedURLException: Illegal
character in path at index 23: file:///d1/rework/acres
install/ac47/eclipse/plugins/com.amirsys.console_4.6.0/fop/fop100/fop/fonts/
bundlePath=/d1/rework/acres install/ac47/eclipe/plugins
fopHome=com.amirsys.console_4.6.0/fop/fop100/fop
I've written a test jig to see what File.toURI().toURL()
does:
import java.net.URL;
import java.io.File;
public class FileURL {
public static void main(String[] args) {
try {
File f = new File(args[0]);
URL furl = f.toURI().toURL();
System.out.println(furl.toString());
System.out.println(furl.toExternalForm());
}
catch (java.net.MalformedURLException mue) {
mue.printStackTrace();
}
}
}
And that reports what I expected, an encoded path:
java -cp . FileURL /d1/rework/acres\ install/ac47
file:/d1/rework/acres%20install/ac47/
file:/d1/rework/acres%20install/ac47/
I hope someone has a better plan.
I do think that the FOP api should be changed to take a
URL rather than a string, but that's for another day.