aboutsummaryrefslogtreecommitdiff
path: root/stage1/classloader.scala
blob: 6f2213b7da6be6c7e676a6babad4cda150f84d07 (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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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 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)
    } 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 )
      cl
    }
  }
  def remove( path: String ) = cache.remove( path )
}
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)"   
  )
  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)
    }
  }*/
}