diff options
-rw-r--r-- | nailgun_launcher/CBTUrlClassLoader.java | 4 | ||||
-rw-r--r-- | stage1/CachingClassLoader.scala | 9 | ||||
-rw-r--r-- | stage1/MultiClassLoader.scala | 5 |
3 files changed, 13 insertions, 5 deletions
diff --git a/nailgun_launcher/CBTUrlClassLoader.java b/nailgun_launcher/CBTUrlClassLoader.java index c05391b..0ba8a61 100644 --- a/nailgun_launcher/CBTUrlClassLoader.java +++ b/nailgun_launcher/CBTUrlClassLoader.java @@ -3,6 +3,7 @@ import java.io.*; import java.net.*; import java.util.*; import static cbt.Stage0Lib.*; +import java.util.concurrent.ConcurrentHashMap; class CbtURLClassLoader extends java.net.URLClassLoader{ public String toString(){ return ( @@ -15,6 +16,9 @@ class CbtURLClassLoader extends java.net.URLClassLoader{ ); } public Class loadClass(String name) throws ClassNotFoundException{ + Class _class = super.loadClass(name); + if(_class == null) throw new ClassNotFoundException(name); + else return _class; //System.out.println("loadClass("+name+") on \n"+this); return super.loadClass(name); } diff --git a/stage1/CachingClassLoader.scala b/stage1/CachingClassLoader.scala index e75f14c..4ddebda 100644 --- a/stage1/CachingClassLoader.scala +++ b/stage1/CachingClassLoader.scala @@ -5,8 +5,13 @@ import scala.util.Try trait CachingClassLoader extends ClassLoader{ def logger: Logger - val cache = new KeyLockedLazyCache[String,Try[Class[_]]]( new ConcurrentHashMap, new ConcurrentHashMap, Some(logger) ) + val cache = new KeyLockedLazyCache[String,Option[Class[_]]]( new ConcurrentHashMap, new ConcurrentHashMap, Some(logger) ) override def loadClass(name: String, resolve: Boolean) = { - cache.get( name, Try(super.loadClass(name, resolve)) ).get + cache.get( name, Try(super.loadClass(name, resolve)).toOption ).getOrElse(null) + } + override def loadClass(name: String) = { + val _class = super.loadClass(name) + if(_class == null) throw new ClassNotFoundException(name) + else _class } } diff --git a/stage1/MultiClassLoader.scala b/stage1/MultiClassLoader.scala index 5a93a63..cce4cd5 100644 --- a/stage1/MultiClassLoader.scala +++ b/stage1/MultiClassLoader.scala @@ -8,14 +8,13 @@ class MultiClassLoader(parents: Seq[ClassLoader])(implicit val logger: Logger) e override def findClass(name: String) = { parents.find( parent => try{ - parent.loadClass(name) - true + null != parent.loadClass(name) // FIXME: is it correct to just ignore the resolve argument here? } catch { case _:ClassNotFoundException => false } ).map( _.loadClass(name) - ).getOrElse( throw new ClassNotFoundException(name) ) + ).getOrElse( null ) } override def toString = ( scala.Console.BLUE |