
skinny.standalone.JettyServer.scala Maven / Gradle / Ivy
package skinny.standalone
import javax.servlet.ServletContextListener
import org.eclipse.jetty.server.Server
import org.eclipse.jetty.servlet.DefaultServlet
import org.eclipse.jetty.webapp.WebAppContext
import skinny.micro.SkinnyListener
import skinny.logging.LoggerProvider
/**
* Jetty server launcher for standalone apps.
*
* see: http://scalatra.org/guides/deployment/standalone.html
*/
trait JettyServer extends LoggerProvider {
def listener(listener: ServletContextListener): JettyServer = {
this.listener = listener
this
}
def port(port: Int): JettyServer = {
_port = port
this
}
def run() = {
start()
server.join
}
def start(): Unit = {
refreshServer()
logger.info(s"Starting Jetty server on port ${port}")
val context = new WebAppContext()
val contextPath = sys.env.get("SKINNY_PREFIX").orElse(getEnvVarOrSysProp("skinny.prefix")).getOrElse("/")
context.setContextPath(contextPath)
context.setWar({
val domain = this.getClass.getProtectionDomain
val location = domain.getCodeSource.getLocation
location.toExternalForm
})
context.addEventListener(listener)
context.addServlet(classOf[DefaultServlet], "/")
server.setHandler(context)
server.start
logger.info(s"Started Jetty server on port ${port}")
}
def stop(): Unit = {
if (server != null) {
server.stop()
}
}
private[this] var server: Server = _
private[this] var listener: ServletContextListener = new SkinnyListener
private[this] var _port: Int = {
// PORT: Heroku default env variable
Option(System.getenv("PORT")).map(_.toInt).getOrElse(8080)
}
private[this] def port: Int = {
val port = sys.env.get("SKINNY_PORT").orElse(getEnvVarOrSysProp("skinny.port")).map(_.toInt).getOrElse(_port)
port
}
private[this] def newServer(port: Int): Server = new Server(port)
private[this] def refreshServer(): Unit = {
if (server != null) {
stop()
server.destroy()
server.synchronized {
server = newServer(port)
}
} else {
server = newServer(port)
}
}
private[this] def getEnvVarOrSysProp(key: String): Option[String] = {
sys.env.get(key).orElse(sys.props.get(key))
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy