blob: 34831ea153f1cb86e0ab8b1aa03ee1c941c3e69d (
plain) (
tree)
|
|
package cbt
import java.net._
import scala.collection.JavaConverters._
// do not make this a case class, required object identity equality
class MultiClassLoader(final val parents: Seq[ClassLoader])(implicit val logger: Logger) extends ClassLoader(null) with CachingClassLoader{
override def findClass(name: String) = {
parents.find( parent =>
try{
null != parent.loadClass(name) // FIXME: is it correct to just ignore the resolve argument here?
} catch {
case _:ClassNotFoundException => false
}
).map(
_.loadClass(name)
).getOrElse( null )
}
// FIXME: is there more than findClass and findResource that needs to be dispatched?
override def findResource(name: String): URL = {
parents.foldLeft(null: URL)(
(acc, parent) => if( acc == null ) parent.getResource(name) else acc
)
}
override def findResources(name: String): java.util.Enumeration[URL] = {
java.util.Collections.enumeration(
parents.flatMap( _.getResources(name).asScala ).asJava
)
}
override def toString = (
scala.Console.BLUE
++ super.toString
++ scala.Console.RESET
++ "("
++ (
if(parents.nonEmpty)(
"\n" ++ parents.map(_.toString).mkString(",\n").split("\n").map(" "++_).mkString("\n") ++ "\n"
) else ""
) ++")"
)
}
|