aboutsummaryrefslogtreecommitdiff
path: root/stage1/CachingClassLoader.scala
blob: 38c0a1b1461d720c15b6ea168e54d6326602986e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package cbt
import java.net._
import java.util.concurrent.ConcurrentHashMap
import scala.util.Try

trait CachingClassLoader extends ClassLoader{
  def logger: Logger
  val cache = new KeyLockedLazyCache[Option[Class[_]]]( new ConcurrentHashMap[AnyRef,AnyRef], Some(logger) )
  override def loadClass(name: String, resolve: Boolean) = {
    cache.get( name, Try(super.loadClass(name, resolve)).toOption ).getOrElse(null)
  }
  override def loadClass(name: String) = {
    val _class = super.loadClass(name)
    if(_class == null) throw new ClassNotFoundException(name)
    else _class
  }
}