aboutsummaryrefslogtreecommitdiff
path: root/stage1/classloader.scala
diff options
context:
space:
mode:
Diffstat (limited to 'stage1/classloader.scala')
-rw-r--r--stage1/classloader.scala55
1 files changed, 27 insertions, 28 deletions
diff --git a/stage1/classloader.scala b/stage1/classloader.scala
index 6f2213b..3293dd1 100644
--- a/stage1/classloader.scala
+++ b/stage1/classloader.scala
@@ -8,25 +8,29 @@ import scala.collection.immutable.Seq
object ClassLoaderCache{
private val cache = NailgunLauncher.classLoaderCache
- def classLoader( path: String, parent: ClassLoader ): ClassLoader = {
- def realpath( name: String ) = Paths.get(new File(name).getAbsolutePath).normalize.toString
- val normalized = realpath(path)
- if( cache.containsKey(normalized) ){
- //println("FOUND: "+normalized)
- cache.get(normalized)
+ def classLoader( classpath: ClassPath, parent: ClassLoader )(implicit logger: Logger): ClassLoader
+ = cache.synchronized{
+ val lib = new Stage1Lib(logger)
+ val key = classpath.strings.sorted.mkString(":")
+ if( cache.containsKey(key) ){
+ logger.resolver("CACHE HIT: "++key)
+ cache.get(key)
} else {
- //println("PUTTING: "+normalized)
- //Try(???).recover{ case e=>e.printStackTrace}
- val cl = new cbt.URLClassLoader( ClassPath(Seq(new File(normalized))), parent )
- cache.put( normalized, cl )
+ logger.resolver("CACHE MISS: "++key)
+ val cl = new cbt.URLClassLoader( classpath, parent )
+ cache.put( key, cl )
cl
}
}
- def remove( path: String ) = cache.remove( path )
+ def remove( classpath: ClassPath ) = {
+ val key = classpath.strings.sorted.mkString(":")
+ cache.remove( key )
+ }
}
+/*
class MultiClassLoader(parents: Seq[ClassLoader]) extends ClassLoader {
override def loadClass(name: String) = {
- //System.err.println("LOADING CLASS "+name);
+ //System.err.println("LOADING CLASS "++name);
val c = parents.toStream.map{
parent =>
Try{
@@ -37,29 +41,24 @@ class MultiClassLoader(parents: Seq[ClassLoader]) extends ClassLoader {
}.find(_.isDefined).flatten
c.getOrElse( ClassLoader.getSystemClassLoader.loadClass(name) )
}
- override def toString = "MultiClassLoader(" + parents.mkString(",") + ")"
+ override def toString = "MultiClassLoader(" ++ parents.mkString(",") ++ ")"
}
+*/
case class URLClassLoader(classPath: ClassPath, parent: ClassLoader)
extends java.net.URLClassLoader(
classPath.strings.map(
- path => new URL("file:"+path)
+ path => new URL("file:"++path)
).toArray,
parent
){
override def toString = (
- scala.Console.BLUE + "cbt.URLClassLoader" + scala.Console.RESET + "(\n " + getURLs.map(_.toString).sorted.mkString(",\n ")
- + (if(getParent() != ClassLoader.getSystemClassLoader()) ",\n" + getParent().toString.split("\n").map(" "+_).mkString("\n") else "")
- + "\n)"
+ scala.Console.BLUE ++ "cbt.URLClassLoader" ++ scala.Console.RESET
+ ++ "(\n " ++ getURLs.map(_.toString).sorted.mkString(",\n ")
+ ++ (
+ if(getParent() != ClassLoader.getSystemClassLoader())
+ ",\n" ++ getParent().toString.split("\n").map(" "++_).mkString("\n")
+ else ""
+ )
+ ++ "\n)"
)
- import scala.language.existentials
- /*override def loadClass(name: String): Class[_] = {
- //System.err.println("LOADING CLASS "+name+" in "+this);
- try{
- super.loadClass(name)
- } catch {
- case e: ClassNotFoundException =>
- // FIXME: Shouldn't this happen automatically?
- parent.loadClass(name)
- }
- }*/
}