From 15f1298bf17418ba2cc8e00a1a5b6d99db2f1db5 Mon Sep 17 00:00:00 2001 From: Anthony Green Date: Sat, 4 Jun 2005 11:23:29 +0000 Subject: [PATCH] URLClassLoader.java: import gnu.gcj.Core, and gnu.java.net.protocol.core.CoreInputStream. 2005-06-04 Anthony Green * java/net/URLClassLoader.java: import gnu.gcj.Core, and gnu.java.net.protocol.core.CoreInputStream. (CureURLLoader): New class. (CoreResource): New class. (addURLImpl): Add special treatment for the "core" protocol. * gnu/gcj/natCore.cc (find): New method. * gnu/gcj/Core.java (find): New method. From-SVN: r100582 --- libjava/ChangeLog | 10 ++++++ libjava/gnu/gcj/Core.java | 3 ++ libjava/gnu/gcj/natCore.cc | 7 ++++ libjava/java/net/URLClassLoader.java | 65 +++++++++++++++++++++++++++++++++++- 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 9c3960c..0b18f79 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,13 @@ +2005-06-04 Anthony Green + + * java/net/URLClassLoader.java: import gnu.gcj.Core, + and gnu.java.net.protocol.core.CoreInputStream. + (CureURLLoader): New class. + (CoreResource): New class. + (addURLImpl): Add special treatment for the "core" protocol. + * gnu/gcj/natCore.cc (find): New method. + * gnu/gcj/Core.java (find): New method. + 2005-06-03 Keith Seitz * gnu/classpath/jdwp/transport/ITransport.java: New file. diff --git a/libjava/gnu/gcj/Core.java b/libjava/gnu/gcj/Core.java index 80d623c..d3c358e 100644 --- a/libjava/gnu/gcj/Core.java +++ b/libjava/gnu/gcj/Core.java @@ -12,6 +12,9 @@ public class Core { public native static Core create (String name) throws java.io.IOException; + // Same as create, except returns null if not found. + public native static Core find (String name); + public RawData ptr; public int length; diff --git a/libjava/gnu/gcj/natCore.cc b/libjava/gnu/gcj/natCore.cc index bb3fd57..d084b25 100644 --- a/libjava/gnu/gcj/natCore.cc +++ b/libjava/gnu/gcj/natCore.cc @@ -104,6 +104,13 @@ _Jv_create_core (_Jv_core_chain *node, jstring name) } gnu::gcj::Core * +gnu::gcj::Core::find (jstring name) +{ + gnu::gcj::Core *core = _Jv_create_core (root, name); + return core; +} + +gnu::gcj::Core * gnu::gcj::Core::create (jstring name) { gnu::gcj::Core *core = _Jv_create_core (root, name); diff --git a/libjava/java/net/URLClassLoader.java b/libjava/java/net/URLClassLoader.java index 4b95998..e0a9389 100644 --- a/libjava/java/net/URLClassLoader.java +++ b/libjava/java/net/URLClassLoader.java @@ -63,7 +63,8 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.Manifest; import gnu.gcj.runtime.SharedLibHelper; - +import gnu.gcj.Core; +import gnu.java.net.protocol.core.CoreInputStream; /** * A secure class loader that can load classes and resources from @@ -677,6 +678,66 @@ public class URLClassLoader extends SecureClassLoader } } + /** + * A CoreURLLoader is a type of URLLoader + * only loading from core url. + */ + static final class CoreURLLoader extends URLLoader + { + private String dir; + + CoreURLLoader(URLClassLoader classloader, URL url) + { + super(classloader, url); + dir = baseURL.getFile(); + } + + /** get resource with the name "name" in the core url */ + Resource getResource(String name) + { + Core core = Core.find (dir + name); + if (core != null) + return new CoreResource(this, name, core); + return null; + } + } + + static final class CoreResource extends Resource + { + final Core core; + + CoreResource(CoreURLLoader loader, String name, Core core) + { + super(loader, name); + this.core = core; + } + + InputStream getInputStream() throws IOException + { + return new CoreInputStream(core); + } + + public int getLength() + { + return core.length; + } + + public URL getURL() + { + try + { + return new URL(loader.baseURL, name, + loader.classloader.getURLStreamHandler("core")); + } + catch (MalformedURLException e) + { + InternalError ie = new InternalError(); + ie.initCause(e); + throw ie; + } + } + } + // Constructors /** @@ -842,6 +903,8 @@ public class URLClassLoader extends SecureClassLoader loader = new JarURLLoader(this, newUrl); else if ("file".equals(protocol)) loader = new FileURLLoader(this, newUrl); + else if ("core".equals(protocol)) + loader = new CoreURLLoader(this, newUrl); else loader = new RemoteURLLoader(this, newUrl); -- 2.7.4