aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Vogt <oss.nsp@cvogt.org>2016-03-11 22:36:31 -0500
committerChristopher Vogt <oss.nsp@cvogt.org>2016-03-11 22:36:31 -0500
commit984a5f1f0f27d191695feeb3410968f2f35f8fc8 (patch)
tree56fd09257ebf8ff020fbb6a86c1ca529fa548da7
parentb408b441569dc165f4d41b048ff64253695a491d (diff)
downloadcbt-984a5f1f0f27d191695feeb3410968f2f35f8fc8.tar.gz
cbt-984a5f1f0f27d191695feeb3410968f2f35f8fc8.tar.bz2
cbt-984a5f1f0f27d191695feeb3410968f2f35f8fc8.zip
Split ClassLoader classes into separate files and a few fixes
-rw-r--r--stage1/ClassLoaderCache.scala25
-rw-r--r--stage1/MultiClassLoader.scala24
-rw-r--r--stage1/Stage1Lib.scala8
-rw-r--r--stage1/URLClassLoader.scala22
-rw-r--r--stage1/classloader.scala64
-rw-r--r--stage2/BasicBuild.scala4
-rw-r--r--test/build/build.scala7
7 files changed, 85 insertions, 69 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)"
- )
-}
diff --git a/stage2/BasicBuild.scala b/stage2/BasicBuild.scala
index c17bce0..bee58dd 100644
--- a/stage2/BasicBuild.scala
+++ b/stage2/BasicBuild.scala
@@ -15,10 +15,10 @@ import scala.util._
import ammonite.ops.{cwd => _,_}
-class BasicBuild(context: Context) extends Build(context)
+class BasicBuild( context: Context ) extends Build( context )
class Build(val context: Context) extends Dependency with TriggerLoop{
// library available to builds
- final val logger = context.logger
+ implicit final val logger: Logger = context.logger
override final protected val lib: Lib = new Lib(logger)
// ========== general stuff ==========
diff --git a/test/build/build.scala b/test/build/build.scala
index 92a964b..29665a6 100644
--- a/test/build/build.scala
+++ b/test/build/build.scala
@@ -1,5 +1,6 @@
-import scala.collection.immutable.Seq
+import cbt._
import java.io.File
-class Build(context: cbt.Context) extends cbt.Build(context){
- override def dependencies = Seq( cbt.CbtDependency(context.logger) ) ++ super.dependencies
+import scala.collection.immutable.Seq
+class Build(context: cbt.Context) extends BasicBuild(context){
+ override def dependencies = Seq( CbtDependency() ) ++ super.dependencies
}