diff options
Diffstat (limited to 'stage1/classloader.scala')
-rw-r--r-- | stage1/classloader.scala | 55 |
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) - } - }*/ } |