in util-app/src/main/scala/com/twitter/app/LoadService.scala [150:203]
private[this] def loadImpls[T](iface: Class[T], ifaceName: String): Seq[T] = {
val loader = iface.getClassLoader
val denied: Set[String] = loadServiceDenied()
val cp = new LoadServiceClassPath()
val whenAbsent = new JFunction[ClassLoader, Seq[ClassPath.LoadServiceInfo]] {
def apply(loader: ClassLoader): Seq[ClassPath.LoadServiceInfo] = {
cp.browse(loader).toSeq
}
}
val classNames = for {
info <- cache.computeIfAbsent(loader, whenAbsent) if info.iface == ifaceName
className <- info.lines
} yield className
val classNamesFromResources = for {
rsc <- loader.getResources("META-INF/services/" + ifaceName).asScala
line <- cp.readLines(Source.fromURL(rsc, "UTF-8"))
} yield line
(classNames ++ classNamesFromResources).distinct
.filterNot { className =>
val isDenied = denied.contains(className)
if (isDenied)
log.info(s"LoadService: skipped $className due to deny list flag")
isDenied
}
.flatMap { className =>
val cls = Class.forName(className)
if (!iface.isAssignableFrom(cls))
throw new ServiceConfigurationError(s"$className not a subclass of $ifaceName")
log.log(
Level.FINE,
s"LoadService: loaded instance of class $className for requested service $ifaceName"
)
try {
val instance = cls.newInstance().asInstanceOf[T]
Some(instance)
} catch {
case NonFatal(ex) =>
log.log(
Level.SEVERE,
s"LoadService: failed to instantiate '$className' for the requested "
+ s"service '$ifaceName'",
ex
)
None
}
}
}