in plugins/src/main/scala/org/apache/toree/plugins/PluginSearcher.scala [102:126]
private def concreteSubclasses(
ancestor: String,
classes: Map[String, ClassInfo],
extraClasses: Map[String, ClassInfo]
): Iterator[ClassInfo] = {
@tailrec def classMatches(
classesToCheck: Seq[ClassInfo]
): Boolean = {
if (classesToCheck.isEmpty) false
else if (classesToCheck.exists(_.name == ancestor)) true
else if (classesToCheck.exists(_.superClassName == ancestor)) true
else if (classesToCheck.exists(_ implements ancestor)) true
else {
val superClasses = classesToCheck.map(_.superClassName)
.flatMap(n => classes.get(n).orElse(extraClasses.get(n)))
val interfaces = classesToCheck.flatMap(_.interfaces)
.flatMap(i => classes.get(i).orElse(extraClasses.get(i)))
classMatches(superClasses ++ interfaces)
}
}
classes.values.toIterator
.filter(_.isConcrete)
.filter(c => classMatches(Seq(c)))
}