aboutsummaryrefslogtreecommitdiff
path: root/stage1/MultiClassLoader.scala
blob: 34831ea153f1cb86e0ab8b1aa03ee1c941c3e69d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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 ""
      ) ++")"
  )
}