|
Play Framework/Scala example source code file (ServerSSLEngine.scala)
The ServerSSLEngine.scala Play Framework example source code
/*
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package play.core.server.ssl
import play.server.api.{ SSLEngineProvider => ScalaSSLEngineProvider }
import play.server.{ SSLEngineProvider => JavaSSLEngineProvider }
import java.lang.reflect.Constructor
import play.core.ApplicationProvider
/**
* This singleton object looks for a class of {{play.server.api.SSLEngineProvider}} or {{play.server.SSLEngineProvider}}
* in the system property <pre>play.http.sslengineprovider</pre>. if there is no instance found, it uses
* DefaultSSLEngineProvider.
*
* If the class of {{SSLEngineProvider}} defined has a constructor with {{play.core.ApplicationProvider}} (for Scala) or
* {{play.server.ApplicationProvider}} (for Java), then an application provider is passed in when a new instance of the
* class is created.
*/
object ServerSSLEngine {
def createSSLEngineProvider(applicationProvider: ApplicationProvider): JavaSSLEngineProvider = {
val providerClassName = Option(System.getProperty("play.http.sslengineprovider")).getOrElse(classOf[DefaultSSLEngineProvider].getName)
val classLoader = applicationProvider.get.map(_.classloader).getOrElse(this.getClass.getClassLoader)
val providerClass = classLoader.loadClass(providerClassName)
// NOTE: this is not like instanceof. With isAssignableFrom, the subclass should be on the right.
providerClass match {
case i if classOf[ScalaSSLEngineProvider].isAssignableFrom(providerClass) =>
createScalaSSLEngineProvider(i.asInstanceOf[Class[ScalaSSLEngineProvider]], applicationProvider)
case s if classOf[JavaSSLEngineProvider].isAssignableFrom(providerClass) =>
createJavaSSLEngineProvider(s.asInstanceOf[Class[JavaSSLEngineProvider]], applicationProvider)
case _ =>
throw new ClassCastException("Must define play.server.api.SSLEngineProvider or play.server.SSLEngineProvider as interface!")
}
}
private def createJavaSSLEngineProvider(providerClass: Class[JavaSSLEngineProvider],
applicationProvider: ApplicationProvider): JavaSSLEngineProvider = {
var providerArgsConstructor: Constructor[_] = null
var noArgsConstructor: Constructor[_] = null
for (constructor <- providerClass.getConstructors) {
val parameterTypes = constructor.getParameterTypes
if (parameterTypes.length == 0) {
noArgsConstructor = constructor
} else if (parameterTypes.length == 1 && classOf[play.server.ApplicationProvider].isAssignableFrom(parameterTypes(0))) {
providerArgsConstructor = constructor
}
}
if (providerArgsConstructor != null) {
val javaApplication = applicationProvider.get.map(a => new play.Application(a)).getOrElse(null)
val javaAppProvider = new play.server.ApplicationProvider(javaApplication, applicationProvider.path)
return providerArgsConstructor.newInstance(javaAppProvider).asInstanceOf[JavaSSLEngineProvider]
}
if (noArgsConstructor != null) {
return noArgsConstructor.newInstance().asInstanceOf[play.server.SSLEngineProvider]
}
throw new ClassCastException("No constructor with (appProvider:play.server.ApplicationProvider) or no-args constructor defined!")
}
private def createScalaSSLEngineProvider(providerClass: Class[ScalaSSLEngineProvider],
applicationProvider: ApplicationProvider): ScalaSSLEngineProvider = {
var providerArgsConstructor: Constructor[ScalaSSLEngineProvider] = null
var noArgsConstructor: Constructor[ScalaSSLEngineProvider] = null
for (constructor <- providerClass.getConstructors) {
val parameterTypes = 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]]
}
}
if (providerArgsConstructor != null) {
return providerArgsConstructor.newInstance(applicationProvider)
}
if (noArgsConstructor != null) {
return noArgsConstructor.newInstance()
}
throw new ClassCastException("No constructor with (appProvider:play.core.ApplicationProvider) or no-args constructor defined!")
}
}
Other Play Framework source code examplesHere is a short list of links related to this Play Framework ServerSSLEngine.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.