diff options
author | Christopher Vogt <oss.nsp@cvogt.org> | 2016-03-11 22:36:31 -0500 |
---|---|---|
committer | Christopher Vogt <oss.nsp@cvogt.org> | 2016-03-11 22:36:31 -0500 |
commit | 984a5f1f0f27d191695feeb3410968f2f35f8fc8 (patch) | |
tree | 56fd09257ebf8ff020fbb6a86c1ca529fa548da7 /stage1 | |
parent | b408b441569dc165f4d41b048ff64253695a491d (diff) | |
download | cbt-984a5f1f0f27d191695feeb3410968f2f35f8fc8.tar.gz cbt-984a5f1f0f27d191695feeb3410968f2f35f8fc8.tar.bz2 cbt-984a5f1f0f27d191695feeb3410968f2f35f8fc8.zip |
Split ClassLoader classes into separate files and a few fixes
Diffstat (limited to 'stage1')
-rw-r--r-- | stage1/ClassLoaderCache.scala | 25 | ||||
-rw-r--r-- | stage1/MultiClassLoader.scala | 24 | ||||
-rw-r--r-- | stage1/Stage1Lib.scala | 8 | ||||
-rw-r--r-- | stage1/URLClassLoader.scala | 22 | ||||
-rw-r--r-- | stage1/classloader.scala | 64 |
5 files changed, 79 insertions, 64 deletions
diff --git a/stage1/ClassLoaderCache.scala b/stage1/ClassLoaderCache.scala new file mode 100644 index 0000000..ec343f4 --- /dev/null +++ b/stage1/ClassLoaderCache.scala @@ -0,0 +1,25 @@ +package cbt + +import java.net._ + +object ClassLoaderCache{ + private val cache = NailgunLauncher.classLoaderCache + def get( classpath: ClassPath )(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 { + logger.resolver("CACHE MISS: "++key) + val cl = new cbt.URLClassLoader( classpath, ClassLoader.getSystemClassLoader ) + cache.put( key, cl ) + cl + } + } + def remove( classpath: ClassPath ) = { + val key = classpath.strings.sorted.mkString(":") + cache.remove( key ) + } +} diff --git a/stage1/MultiClassLoader.scala b/stage1/MultiClassLoader.scala new file mode 100644 index 0000000..de9bd32 --- /dev/null +++ b/stage1/MultiClassLoader.scala @@ -0,0 +1,24 @@ +/* +package cbt +import java.net._ +import scala.util.Try + +import scala.collection.immutable.Seq + + +class MultiClassLoader(parents: Seq[ClassLoader]) extends ClassLoader { + override def loadClass(name: String) = { + //System.err.println("LOADING CLASS "++name); + val c = parents.toStream.map{ + parent => + Try{ + parent.loadClass(name) + }.map(Option[Class[_]](_)).recover{ + case _:ClassNotFoundException => None + }.get + }.find(_.isDefined).flatten + c.getOrElse( ClassLoader.getSystemClassLoader.loadClass(name) ) + } + override def toString = "MultiClassLoader(" ++ parents.mkString(",") ++ ")" +} +*/ diff --git a/stage1/Stage1Lib.scala b/stage1/Stage1Lib.scala index 1ad3030..67ae049 100644 --- a/stage1/Stage1Lib.scala +++ b/stage1/Stage1Lib.scala @@ -190,6 +190,11 @@ class Stage1Lib( val logger: Logger ) extends BaseLib{ } def trapExitCode( code: => Unit ): ExitCode = { + /* + Doesn't seem to work reliably. Seems like the Security manager is not always + reset properly. Maybe some non-thread-safety issue or some Nailgun interaction. + + val old: Option[SecurityManager] = Option(System.getSecurityManager()) try{ val securityManager = new SecurityManager{ @@ -217,6 +222,9 @@ class Stage1Lib( val logger: Logger ) extends BaseLib{ } finally { System.setSecurityManager(old.getOrElse(null)) } + */ + code + ExitCode.Success } } diff --git a/stage1/URLClassLoader.scala b/stage1/URLClassLoader.scala new file mode 100644 index 0000000..870f186 --- /dev/null +++ b/stage1/URLClassLoader.scala @@ -0,0 +1,22 @@ +package cbt + +import java.net._ + +case class URLClassLoader(classPath: ClassPath, parent: ClassLoader) + extends java.net.URLClassLoader( + classPath.strings.map( + 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)" + ) +} diff --git a/stage1/classloader.scala b/stage1/classloader.scala deleted file mode 100644 index 50e33a2..0000000 --- a/stage1/classloader.scala +++ /dev/null @@ -1,64 +0,0 @@ -package cbt -import java.io._ -import java.net._ -import java.nio.file._ -import scala.util.Try - -import scala.collection.immutable.Seq - -object ClassLoaderCache{ - private val cache = NailgunLauncher.classLoaderCache - def get( classpath: ClassPath )(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 { - logger.resolver("CACHE MISS: "++key) - val cl = new cbt.URLClassLoader( classpath, ClassLoader.getSystemClassLoader ) - cache.put( key, cl ) - cl - } - } - 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); - val c = parents.toStream.map{ - parent => - Try{ - parent.loadClass(name) - }.map(Option[Class[_]](_)).recover{ - case _:ClassNotFoundException => None - }.get - }.find(_.isDefined).flatten - c.getOrElse( ClassLoader.getSystemClassLoader.loadClass(name) ) - } - 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) - ).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)" - ) -} |