play.api.inject.guice.GuiceApplicationBuilder.scala Maven / Gradle / Ivy
/*
* Copyright (C) 2009-2016 Lightbend Inc.
*/
package play.api.inject.guice
import com.google.inject.{ Module => GuiceModule }
import play.api.{ Application, Configuration, Environment, Logger, LoggerConfigurator }
/**
* @see compare-to-play.md
*
* A builder for creating Applications using Guice.
*/
final case class GuiceApplicationBuilder(
environment: Environment = Environment.simple(),
configuration: Configuration = Configuration.empty,
modules: Seq[GuiceableModule] = Seq.empty,
overrides: Seq[GuiceableModule] = Seq.empty,
disabled: Seq[Class[_]] = Seq.empty,
binderOptions: Set[BinderOption] = BinderOption.defaults,
eagerly: Boolean = false,
loadConfiguration: Environment => Configuration = Configuration.load,
loadModules: (Environment, Configuration) => Seq[GuiceableModule] = GuiceableModule.loadModules) extends GuiceBuilder[GuiceApplicationBuilder](
environment, configuration, modules, overrides, disabled, binderOptions, eagerly
) {
// extra constructor for creating from Java
def this() = this(environment = Environment.simple())
/**
* Set the initial configuration loader.
* Overrides the default or any previously configured values.
*/
def loadConfig(loader: Environment => Configuration): GuiceApplicationBuilder =
copy(loadConfiguration = loader)
/**
* Set the initial configuration.
* Overrides the default or any previously configured values.
*/
def loadConfig(conf: Configuration): GuiceApplicationBuilder =
loadConfig(env => conf)
/**
* Set the module loader.
* Overrides the default or any previously configured values.
*/
def load(loader: (Environment, Configuration) => Seq[GuiceableModule]): GuiceApplicationBuilder =
copy(loadModules = loader)
/**
* Override the module loader with the given modules.
*/
def load(modules: GuiceableModule*): GuiceApplicationBuilder =
load((env, conf) => modules)
/**
* Create a new Play application Module for an Application using this configured builder.
*/
override def applicationModule(): GuiceModule = {
val initialConfiguration = loadConfiguration(environment)
val appConfiguration = initialConfiguration ++ configuration
LoggerConfigurator(environment.classLoader).foreach {
_.configure(environment)
}
if (shouldDisplayLoggerDeprecationMessage(appConfiguration)) {
Logger.warn("Logger configuration in conf files is deprecated and has no effect. Use a logback configuration file instead.")
}
val loadedModules = loadModules(environment, appConfiguration)
copy(configuration = appConfiguration)
.bindings(loadedModules: _*)
.createModule()
}
/**
* Create a new Play Application using this configured builder.
*/
def build(): Application = injector().instanceOf[Application]
/**
* Internal copy method with defaults.
*/
private def copy(
environment: Environment = environment,
configuration: Configuration = configuration,
modules: Seq[GuiceableModule] = modules,
overrides: Seq[GuiceableModule] = overrides,
disabled: Seq[Class[_]] = disabled,
binderOptions: Set[BinderOption] = binderOptions,
eagerly: Boolean = eagerly,
loadConfiguration: Environment => Configuration = loadConfiguration,
loadModules: (Environment, Configuration) => Seq[GuiceableModule] = loadModules): GuiceApplicationBuilder =
new GuiceApplicationBuilder(environment, configuration, modules, overrides, disabled, binderOptions, eagerly, loadConfiguration, loadModules)
/**
* Implementation of Self creation for GuiceBuilder.
*/
protected def newBuilder(
environment: Environment,
configuration: Configuration,
modules: Seq[GuiceableModule],
overrides: Seq[GuiceableModule],
disabled: Seq[Class[_]],
binderOptions: Set[BinderOption] = binderOptions,
eagerly: Boolean): GuiceApplicationBuilder =
copy(environment, configuration, modules, overrides, disabled, binderOptions, eagerly)
/**
* Checks if the path contains the logger path
* and whether or not one of the keys contains a deprecated value
*
* @param appConfiguration The app configuration
* @return Returns true if one of the keys contains a deprecated value, otherwise false
*/
def shouldDisplayLoggerDeprecationMessage(appConfiguration: Configuration): Boolean = {
import scala.collection.JavaConverters._
import scala.collection.mutable
val deprecatedValues = List("DEBUG", "WARN", "ERROR", "INFO", "TRACE", "OFF")
// Recursively checks each key to see if it contains a deprecated value
def hasDeprecatedValue(values: mutable.Map[String, AnyRef]): Boolean = {
values.exists {
case (_, value: String) if deprecatedValues.contains(value) =>
true
case (_, value: java.util.Map[String, AnyRef]) =>
hasDeprecatedValue(value.asScala)
case _ =>
false
}
}
if (appConfiguration.underlying.hasPath("logger")) {
appConfiguration.underlying.getAnyRef("logger") match {
case value: String =>
hasDeprecatedValue(mutable.Map("logger" -> value))
case value: java.util.Map[String, AnyRef] =>
hasDeprecatedValue(value.asScala)
case _ =>
false
}
} else {
false
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy