package play.api.inject.guice
import com.google.inject.{ Module => GuiceModule }
import play.api.{ Application, Configuration, Environment, GlobalSettings, Logger, OptionalSourceMapper }
import play.api.inject.{ bind, Injector => PlayInjector }
import play.core.{ DefaultWebCommands, WebCommands }
final 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,
loadConfiguration: Environment => Configuration = Configuration.load,
global: Option[GlobalSettings] = None,
loadModules: (Environment, Configuration) => Seq[GuiceableModule] = GuiceableModule.loadModules) extends GuiceBuilder[GuiceApplicationBuilder](
environment, configuration, modules, overrides, disabled
) {
def this() = this(environment = Environment.simple())
def loadConfig(loader: Environment => Configuration): GuiceApplicationBuilder =
copy(loadConfiguration = loader)
def loadConfig(conf: Configuration): GuiceApplicationBuilder =
loadConfig(env => conf)
def global(globalSettings: GlobalSettings): GuiceApplicationBuilder =
copy(global = Option(globalSettings))
def load(loader: (Environment, Configuration) => Seq[GuiceableModule]): GuiceApplicationBuilder =
copy(loadModules = loader)
def load(modules: GuiceableModule*): GuiceApplicationBuilder =
load((env, conf) => modules)
override def applicationModule(): GuiceModule = {
val initialConfiguration = loadConfiguration(environment)
val appConfiguration = initialConfiguration ++ configuration
val globalSettings = global.getOrElse(GlobalSettings(appConfiguration, environment))
Logger.configure(environment)
if (appConfiguration.underlying.hasPath("logger")) {
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: _*)
.bindings(
bind[GlobalSettings] to globalSettings,
bind[OptionalSourceMapper] to new OptionalSourceMapper(None),
bind[WebCommands] to new DefaultWebCommands
).createModule
}
def build(): Application = injector.instanceOf[Application]
private def copy(
environment: Environment = environment,
configuration: Configuration = configuration,
modules: Seq[GuiceableModule] = modules,
overrides: Seq[GuiceableModule] = overrides,
disabled: Seq[Class[_]] = disabled,
loadConfiguration: Environment => Configuration = loadConfiguration,
global: Option[GlobalSettings] = global,
loadModules: (Environment, Configuration) => Seq[GuiceableModule] = loadModules): GuiceApplicationBuilder =
new GuiceApplicationBuilder(environment, configuration, modules, overrides, disabled, loadConfiguration, global, loadModules)
protected def newBuilder(
environment: Environment,
configuration: Configuration,
modules: Seq[GuiceableModule],
overrides: Seq[GuiceableModule],
disabled: Seq[Class[_]]): GuiceApplicationBuilder =
copy(environment, configuration, modules, overrides, disabled)
}