package play.core.server.ssl
import play.core.server.ServerConfig
import play.server.api.{ SSLEngineProvider => ScalaSSLEngineProvider }
import play.server.{ SSLEngineProvider => JavaSSLEngineProvider }
import java.lang.reflect.Constructor
import play.core.ApplicationProvider
object {
def (: ServerConfig, : ApplicationProvider): JavaSSLEngineProvider = {
val = serverConfig.configuration.underlying.getString("play.server.https.engineProvider")
val = applicationProvider.get.map(_.classloader).getOrElse(this.getClass.getClassLoader)
val = classLoader.loadClass(providerClassName)
providerClass match {
case if classOf[ScalaSSLEngineProvider].isAssignableFrom(providerClass) =>
createScalaSSLEngineProvider(i.asInstanceOf[Class[ScalaSSLEngineProvider]], serverConfig, applicationProvider)
case if classOf[JavaSSLEngineProvider].isAssignableFrom(providerClass) =>
createJavaSSLEngineProvider(s.asInstanceOf[Class[JavaSSLEngineProvider]], serverConfig, applicationProvider)
case _ =>
throw new ClassCastException("Must define play.server.api.SSLEngineProvider or play.server.SSLEngineProvider as interface!")
}
}
private def (: Class[JavaSSLEngineProvider],
: ServerConfig, : ApplicationProvider): JavaSSLEngineProvider = {
var : Constructor[_] = null
var : Constructor[_] = null
var : Constructor[_] = null
for ( <- providerClass.getConstructors) {
val = constructor.getParameterTypes
if (parameterTypes.length == 0) {
noArgsConstructor = constructor
} else if (parameterTypes.length == 1 && classOf[play.server.ApplicationProvider].isAssignableFrom(parameterTypes(0))) {
providerArgsConstructor = constructor
} else if (parameterTypes.length == 2 &&
classOf[ServerConfig].isAssignableFrom(parameterTypes(0)) &&
classOf[play.server.ApplicationProvider].isAssignableFrom(parameterTypes(1))) {
serverConfigProviderArgsConstructor = constructor
}
}
def = {
val = applicationProvider.get.map( => a.injector.instanceOf[play.Application]).getOrElse(null)
new play.server.ApplicationProvider(javaApplication)
}
if (serverConfigProviderArgsConstructor != null) {
serverConfigProviderArgsConstructor.newInstance(serverConfig, javaAppProvider).asInstanceOf[JavaSSLEngineProvider]
} else if (providerArgsConstructor != null) {
providerArgsConstructor.newInstance(javaAppProvider).asInstanceOf[JavaSSLEngineProvider]
} else if (noArgsConstructor != null) {
noArgsConstructor.newInstance().asInstanceOf[play.server.SSLEngineProvider]
} else {
throw new ClassCastException("No constructor with (appProvider:play.server.ApplicationProvider) or no-args constructor defined!")
}
}
private def (: Class[ScalaSSLEngineProvider],
: ServerConfig, : ApplicationProvider): ScalaSSLEngineProvider = {
var : Constructor[ScalaSSLEngineProvider] = null
var : Constructor[ScalaSSLEngineProvider] = null
var : Constructor[ScalaSSLEngineProvider] = null
for ( <- providerClass.getConstructors) {
val = constructor.getParameterTypes
if (parameterTypes.length == 0) {
noArgsConstructor = constructor.asInstanceOf[Constructor[ScalaSSLEngineProvider]]
} else if (parameterTypes.length == 1 && classOf[ApplicationProvider].isAssignableFrom(parameterTypes(0))) {
providerArgsConstructor = constructor.asInstanceOf[Constructor[ScalaSSLEngineProvider]]
} else if (parameterTypes.length == 2 &&
classOf[ServerConfig].isAssignableFrom(parameterTypes(0)) &&
classOf[ApplicationProvider].isAssignableFrom(parameterTypes(1))) {
serverConfigProviderArgsConstructor = constructor.asInstanceOf[Constructor[ScalaSSLEngineProvider]]
}
}
if (serverConfigProviderArgsConstructor != null) {
serverConfigProviderArgsConstructor.newInstance(serverConfig, applicationProvider)
} else if (providerArgsConstructor != null) {
providerArgsConstructor.newInstance(applicationProvider)
} else if (noArgsConstructor != null) {
noArgsConstructor.newInstance()
} else {
throw new ClassCastException("No constructor with (appProvider:play.core.ApplicationProvider) or no-args constructor defined!")
}
}
}