package xsbt.boot
import BootConfiguration.{FjbgPackage, IvyPackage, JLinePackagePath, SbtBootPackage, ScalaPackage}
import scala.collection.immutable.Stream
private[boot] final class BootFilteredLoader(parent: ClassLoader) extends ClassLoader(parent)
{
@throws(classOf[ClassNotFoundException])
override final def loadClass(className: String, resolve: Boolean): Class[_] =
{
if(className.startsWith(ScalaPackage) || className.startsWith(IvyPackage) || className.startsWith(SbtBootPackage) || className.startsWith(FjbgPackage))
throw new ClassNotFoundException(className)
else
super.loadClass(className, resolve)
}
override def getResources(name: String) = if(includeResource(name)) super.getResources(name) else excludedLoader.getResources(name)
override def getResource(name: String) = if(includeResource(name)) super.getResource(name) else excludedLoader.getResource(name)
def includeResource(name: String) = name.startsWith(JLinePackagePath)
private val excludedLoader = Loaders(parent.getParent).head
}
object Loaders
{
def apply(loader: ClassLoader): Stream[ClassLoader] =
{
def loaders(loader: ClassLoader, accum: Stream[ClassLoader]): Stream[ClassLoader] =
if(loader eq null) accum else loaders(loader.getParent, Stream.cons(loader, accum))
loaders(loader, Stream.empty)
}
}