From: Luke H. <ruk...@gm...> - 2006-09-08 20:52:54
|
There's a small bug in Pathname.java (cvs version). My code: Interpreter interpreter = Interpreter.createInstance(); for(int i = 0; i < resources.length; i ++) { java.net.URL resource = Loader.class.getResource(resources[i]); System.out.println(resource.getProtocol() + " + " + resource.getPath()); Load.load(new Pathname(resource), resources[i], true, true, true); } Returns: file + /home/lhope/cvs/takeheart/takeheart/lisp/util.abcl Debugger invoked on condition of type ERROR: Unsupported URL: "file:/path/to/util.abcl" [1] CL-USER(1): The problem seems to be that Pathname.java:75 checks whether URL.getPath() starts with "file:" which it never does. -Luke |
From: Peter G. <pe...@ar...> - 2006-09-09 03:06:51
|
On Sat, 9 Sep 2006 at 06:52:52 +1000, Luke Hope wrote: > There's a small bug in Pathname.java (cvs version). > > My code: > > Interpreter interpreter = Interpreter.createInstance(); > > for(int i = 0; i < resources.length; i ++) { > java.net.URL resource = Loader.class.getResource(resources[i]); > System.out.println(resource.getProtocol() + " + " + resource.getPath()); > Load.load(new Pathname(resource), resources[i], > true, true, true); > } > > Returns: > > file + /home/lhope/cvs/takeheart/takeheart/lisp/util.abcl > Debugger invoked on condition of type ERROR: > Unsupported URL: "file:/path/to/util.abcl" > [1] CL-USER(1): > > The problem seems to be that Pathname.java:75 checks whether > URL.getPath() starts with "file:" which it never does. So, it looks like this code: } else if ("file".equals(protocol)) { String s = url.getPath(); if (s != null && s.startsWith("file:")) { init(s.substring(5)); return; } } should be replaced more or less like so: } else if ("file".equals(protocol)) { String s = url.getPath(); if (s != null) { if (s.startsWith("file:")) { init(s.substring(5)); return; } else { init(s); return; } } } Does that work for you? Does it break anything else? (Does it work on all platforms?) I haven't tested this at all, or even tried to reproduce the problem, but this scenario has the feel of being dependent on the version of Java you're using (which you didn't mention) and/or the OS you're on (which appears to be some flavor of Unix). Not that it really matters, but I don't think I ever intended to support mapping arbitrary URLs to Lisp pathnames; if I'm remembering correctly, the constructor we're talking about was only meant to be used by LOAD-SYSTEM-FILE (Load.java:275). That said, it would certainly be a nice extension, if someone had time to work out the details. -Peter |
From: Luke H. <ruk...@gm...> - 2006-09-09 05:20:28
|
> > > > The problem seems to be that Pathname.java:75 checks whether > > URL.getPath() starts with "file:" which it never does. > Sorry, I should have been more exact, I'm not really used to bug reporting. I'm using sun java version "1.5.0_07" on an Ubuntu linux system, so a very standard java. I haven't tested on Windows and I'm not sure when I will. The goal is to have a java loader which loads abcl files from either the filesystem or jars as necessary, thus my lisp programs can be jarred up, and ready to use directly from an interpreter or through a lisp script. I hacked the code on my end for a little and got the following which works on Linux: String[] files = new String[] { "util.abcl", "invoke.abcl", "swing.abcl" }; for(int i = 0; i < files.length; i ++) { java.net.URL resource = Loader.class.getResource(files[i]); if("file".equals(resource.getProtocol())) { Load.load(new Pathname(resource.getPath()), resource.getPath(), verbose, print, true); } else if("jar".equals(resource.getProtocol())) { String path = resource.getPath(); Load.load(new Pathname(resource), path.substring(path.indexOf("!/") + 2), verbose, print, true); } else { throw new java.lang.RuntimeException("Couldn't load " + resource.toString() + ": Protocol " + resource.getProtocol() + " unsupported."); } } Because the second argument of load has to be hacked anyway, it's probably not worth the trouble fixing the "bug" in the main code. > That said, it would certainly be a nice extension, if someone had time > to work out the details. Ahhhh, well it's possible that later in this project I may be loading lisp files from the web, but I don't have the time to do any more on it now, since my hack worked. (If you want it in examples go ahead. :) ) When I test Windows I'll report back. -Luke |