package play.api.libs.ws.ssl.debug
import java.net.{ URLConnection, URL }
import java.util.jar.{ JarEntry, JarInputStream }
trait ClassFinder {
def logger: org.slf4j.Logger
def initialResource: String
def isValidClass(className: String): Boolean
def findClasses: Set[Class[_]] = {
logger.debug(s"findClasses: using initialResource = ${initialResource}")
val classSet = scala.collection.mutable.Set[Class[_]]()
val classLoader: ClassLoader = Thread.currentThread.getContextClassLoader
val urlToSource: URL = this.getClass.getResource(initialResource)
logger.debug(s"findClasses: urlToSource = ${urlToSource}")
val parts: Array[String] = urlToSource.toString.split("!")
val jarURLString: String = parts(0).replace("jar:", "")
logger.debug(s"findClasses: Loading from ${jarURLString}")
val jar: URL = new URL(jarURLString)
val jarConnection: URLConnection = jar.openConnection
val jis: JarInputStream = new JarInputStream(jarConnection.getInputStream)
try {
var je: JarEntry = jis.getNextJarEntry
while (je != null) {
if (!je.isDirectory) {
var className: String = je.getName.substring(0, je.getName.length - 6)
className = className.replace('/', '.')
if (isValidClass(className)) {
val c: Class[_] = classLoader.loadClass(className)
classSet.add(c)
}
}
je = jis.getNextJarEntry
}
} finally {
jis.close()
}
classSet.toSet
}
}