From cdd8a71f2559bbbfa4c7d4cb93933a57399d3405 Mon Sep 17 00:00:00 2001 From: Guillaume Bort Date: Wed, 19 Oct 2011 11:35:14 +0200 Subject: [PATCH] Fix logging --- .gitignore | 1 + .../src/main/java/play/data/DynamicForm.java | 4 +- .../play/src/main/java/play/data/Form.java | 6 +- .../main/java/play/db/ebean/EbeanPlugin.java | 4 + .../src/main/java/play/mvc/Controller.java | 4 - .../play/src/main/resources/conf/logger.xml | 31 ++++++ .../src/main/scala/play/api/Application.scala | 21 ++++ .../src/main/scala/play/api/Exceptions.scala | 2 +- .../play/src/main/scala/play/api/Global.scala | 7 +- .../play/src/main/scala/play/api/Logger.scala | 100 ++++++++++++++++++ .../play/src/main/scala/play/api/Play.scala | 27 +++-- .../play/src/main/scala/play/api/db/DB.scala | 2 +- .../play/api/db/evolutions/Evolutions.scala | 2 +- .../scala/play/core/ApplicationProvider.scala | 3 +- .../src/main/scala/play/core/Invoker.scala | 5 +- .../main/scala/play/core/logger/Logger.scala | 15 --- .../scala/play/core/server/NettyServer.scala | 12 ++- .../main/scala/play/core/server/Server.scala | 14 ++- .../src/main/scala/play/sbt/SbtPlugin.scala | 46 ++++++-- .../views/defaultpages/devError.scala.html | 1 + framework/project/Build.scala | 11 +- .../app/controllers/Application.java | 4 +- .../app/controllers/Authentication.java | 2 +- .../app/controllers/Tasks.java | 6 +- 24 files changed, 264 insertions(+), 66 deletions(-) create mode 100644 framework/play/src/main/resources/conf/logger.xml create mode 100644 framework/play/src/main/scala/play/api/Logger.scala delete mode 100644 framework/play/src/main/scala/play/core/logger/Logger.scala diff --git a/.gitignore b/.gitignore index b6e935d62aa..1f1831e58b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ target/ +logs/ repository/ dist/ *.lock diff --git a/framework/play/src/main/java/play/data/DynamicForm.java b/framework/play/src/main/java/play/data/DynamicForm.java index 3c83ab17674..2a54885ee72 100644 --- a/framework/play/src/main/java/play/data/DynamicForm.java +++ b/framework/play/src/main/java/play/data/DynamicForm.java @@ -21,8 +21,8 @@ public String get(String key) { return (String)get().getData().get(key); } - public DynamicForm bind() { - Form form = super.bind(); + public DynamicForm bindFromRequest() { + Form form = super.bindFromRequest(); return new DynamicForm(form.data, form.errors, form.value); } diff --git a/framework/play/src/main/java/play/data/Form.java b/framework/play/src/main/java/play/data/Form.java index db01b2874c2..78bcc480410 100644 --- a/framework/play/src/main/java/play/data/Form.java +++ b/framework/play/src/main/java/play/data/Form.java @@ -42,10 +42,6 @@ public Form(Class clazz) { this(clazz, new HashMap(), new HashMap>(), None()); } - public Form(T t) { - this((Class)t.getClass(), new HashMap(), new HashMap>(), Some(t)); - } - public Form(Class clazz, Map data, Map> errors, Option value) { this.backedType = clazz; this.data = data; @@ -58,7 +54,7 @@ public Form(Class clazz, Map data, Map bind() { + public Form bindFromRequest() { Map data = new HashMap(); Map urlFormEncoded = play.mvc.Controller.request().urlFormEncoded(); for(String key: urlFormEncoded.keySet()) { diff --git a/framework/play/src/main/java/play/db/ebean/EbeanPlugin.java b/framework/play/src/main/java/play/db/ebean/EbeanPlugin.java index c520b044d78..9eb0a7e18bc 100644 --- a/framework/play/src/main/java/play/db/ebean/EbeanPlugin.java +++ b/framework/play/src/main/java/play/db/ebean/EbeanPlugin.java @@ -83,6 +83,10 @@ public void onStart() { } + public void onStop() { + //com.avaje.ebeaninternal.server.lib.ShutdownManager.shutdown(); + } + public static String generateEvolutionScript(EbeanServer server, ServerConfig config) { DdlGenerator ddl = new DdlGenerator((SpiEbeanServer)server, config.getDatabasePlatform(), config); String ups = ddl.generateCreateDdl(); diff --git a/framework/play/src/main/java/play/mvc/Controller.java b/framework/play/src/main/java/play/mvc/Controller.java index 262eb124577..73c078ba3a6 100644 --- a/framework/play/src/main/java/play/mvc/Controller.java +++ b/framework/play/src/main/java/play/mvc/Controller.java @@ -58,10 +58,6 @@ public static Form form(Class clazz) { return new Form(clazz); } - public static Form form(T t) { - return new Form(t); - } - // -- Results public static Result TODO = new Todo(); diff --git a/framework/play/src/main/resources/conf/logger.xml b/framework/play/src/main/resources/conf/logger.xml new file mode 100644 index 00000000000..0c9c5f56803 --- /dev/null +++ b/framework/play/src/main/resources/conf/logger.xml @@ -0,0 +1,31 @@ + + + + + + ${application.home}/logs/application.log + + %date - [%level] - from %logger in %thread %n%message%n%xException%n + + + + + + %coloredLevel %logger{15} - %message%n%xException{5} + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/play/src/main/scala/play/api/Application.scala b/framework/play/src/main/scala/play/api/Application.scala index 3834d7c2a55..8275ad7a234 100644 --- a/framework/play/src/main/scala/play/api/Application.scala +++ b/framework/play/src/main/scala/play/api/Application.scala @@ -27,6 +27,13 @@ import scala.collection.JavaConverters._ */ case class Application(path: File, classloader: ApplicationClassLoader, sources: Option[SourceMapper], mode: Play.Mode.Mode) { + // Reconfigure logger + Logger.configure( + getExistingFile("conf/logger.xml").map(_.toURI.toURL).getOrElse { + resource("conf/logger.xml").getOrElse(null) + }, + Map("application.home" -> path.getAbsolutePath)) + /** * The global settings used by this application. * @see play.api.GlobalSettings @@ -174,4 +181,18 @@ case class Application(path: File, classloader: ApplicationClassLoader, sources: .setScanners(new scanners.TypeAnnotationsScanner())).getStore.getTypesAnnotatedWith(annotation.getName).asScala.toSet } + def resource(name: String): Option[java.net.URL] = { + Option(classloader.getResource(Option(name).map { + case s if s.startsWith("/") => s.drop(1) + case s => s + }.get)) + } + + def resourceAsStream(name: String): Option[InputStream] = { + Option(classloader.getResourceAsStream(Option(name).map { + case s if s.startsWith("/") => s.drop(1) + case s => s + }.get)) + } + } \ No newline at end of file diff --git a/framework/play/src/main/scala/play/api/Exceptions.scala b/framework/play/src/main/scala/play/api/Exceptions.scala index ebd95acd77a..1b56320d8bd 100644 --- a/framework/play/src/main/scala/play/api/Exceptions.scala +++ b/framework/play/src/main/scala/play/api/Exceptions.scala @@ -2,7 +2,7 @@ package play.api import java.io.File -case class PlayException(title: String, description: String, cause: Option[Throwable] = None) extends RuntimeException("%s -> %s".format(title, description), cause.orNull) { +case class PlayException(title: String, description: String, cause: Option[Throwable] = None) extends RuntimeException("%s [%s]".format(title, description), cause.orNull) { val id = "x" } diff --git a/framework/play/src/main/scala/play/api/Global.scala b/framework/play/src/main/scala/play/api/Global.scala index 5d8fc5d8ac6..8b3d7f770d0 100644 --- a/framework/play/src/main/scala/play/api/Global.scala +++ b/framework/play/src/main/scala/play/api/Global.scala @@ -19,7 +19,12 @@ trait GlobalSettings { router.actionFor(request) } - def onError(ex: Throwable): Result = { + def onError(request: RequestHeader, ex: Throwable): Result = { + Logger.error( + """ + | + |! Internal server error, for request [%s] -> + |""".stripMargin.format(request), ex) InternalServerError(Option(Play._currentApp).map { case app if app.mode == Play.Mode.Dev => views.html.defaultpages.devError.f case app => views.html.defaultpages.error.f diff --git a/framework/play/src/main/scala/play/api/Logger.scala b/framework/play/src/main/scala/play/api/Logger.scala new file mode 100644 index 00000000000..7b610046582 --- /dev/null +++ b/framework/play/src/main/scala/play/api/Logger.scala @@ -0,0 +1,100 @@ +package play.api + +import org.slf4j.{ LoggerFactory, Logger => Slf4jLogger } + +trait LoggerLike { + + val logger: Slf4jLogger + + lazy val isTraceEnabled = logger.isTraceEnabled + lazy val isDebugEnabled = logger.isDebugEnabled + lazy val isInfoEnabled = logger.isInfoEnabled + lazy val isWarnEnabled = logger.isWarnEnabled + lazy val isErrorEnabled = logger.isWarnEnabled + + def trace(message: String) { logger.trace(message) } + def trace(message: String, error: Throwable) { logger.trace(message, error) } + + def debug(message: String) { logger.debug(message) } + def debug(message: String, error: Throwable) { logger.debug(message, error) } + + def info(message: String) { logger.info(message) } + def info(message: String, error: Throwable) { logger.info(message, error) } + + def warn(message: String) { logger.warn(message) } + def warn(message: String, error: Throwable) { logger.warn(message, error) } + + def error(message: String) { logger.error(message) } + def error(message: String, error: Throwable) { logger.error(message, error) } + +} + +class Logger(val logger: Slf4jLogger) extends LoggerLike + +object Logger extends LoggerLike { + + val logger = LoggerFactory.getLogger("application") + + def apply(name: String) = new Logger(LoggerFactory.getLogger(name)) + def apply[T](clazz: Class[T]) = new Logger(LoggerFactory.getLogger(clazz)) + + def configure(configFile: java.net.URL, properties: Map[String, String] = Map.empty) = { + + // Redirect JUL -> SL4J + { + import org.slf4j.bridge._ + import java.util.logging._ + + Option(java.util.logging.Logger.getLogger("")).map { root => + root.setLevel(Level.FINEST) + root.getHandlers.foreach(root.removeHandler(_)) + } + + SLF4JBridgeHandler.install() + } + + // Configure logback + { + import org.slf4j._ + + import ch.qos.logback.classic.joran._ + import ch.qos.logback.core.util._ + import ch.qos.logback.classic._ + + val ctx = LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext] + try { + val configurator = new JoranConfigurator + configurator.setContext(ctx) + ctx.reset + properties.map { + case (name, value) => ctx.putProperty(name, value) + } + configurator.doConfigure(configFile) + } catch { + case _ => + } + + StatusPrinter.printInCaseOfErrorsOrWarnings(ctx) + } + + } + +} + +import ch.qos.logback.classic._ +import ch.qos.logback.classic.spi._ +import ch.qos.logback.classic.pattern._ + +class ColoredLevel extends ClassicConverter { + + def convert(event: ILoggingEvent) = { + event.getLevel match { + case Level.TRACE => "[\u001b[0;35mtrace\u001b[m]" + case Level.DEBUG => "[\u001b[0;36mdebug\u001b[m]" + case Level.INFO => "[\u001b[0;37minfo\u001b[m]" + case Level.WARN => "[\u001b[0;33mwarn\u001b[m]" + case Level.ERROR => "[\u001b[0;31merror\u001b[m]" + } + } + +} \ No newline at end of file diff --git a/framework/play/src/main/scala/play/api/Play.scala b/framework/play/src/main/scala/play/api/Play.scala index 00b43b814fa..979d0881596 100644 --- a/framework/play/src/main/scala/play/api/Play.scala +++ b/framework/play/src/main/scala/play/api/Play.scala @@ -24,25 +24,32 @@ object Play { def start(app: Application) { // First stop previous app if exists - Option(_currentApp).map { - _.plugins.values.foreach { p => - try { p.onStop } catch { case _ => } - } - } + stop() _currentApp = app - println("Application has restarted") + if (app.mode == Mode.Dev) { + println() + println(new jline.ANSIBuffer().magenta("--- (RELOAD) ---")) + println() + } app.plugins.values.foreach(_.onStart) + Logger("play").info("Application is started") + + } + + def stop() { + Option(_currentApp).map { + _.plugins.values.foreach { p => + try { p.onStop } catch { case _ => } + } + } } def resourceAsStream(name: String)(implicit app: Application): Option[InputStream] = { - Option(app.classloader.getResourceAsStream(Option(name).map { - case s if s.startsWith("/") => s.drop(1) - case s => s - }.get)) + app.resourceAsStream(name) } def getFile(subPath: String)(implicit app: Application) = app.getFile(subPath) diff --git a/framework/play/src/main/scala/play/api/db/DB.scala b/framework/play/src/main/scala/play/api/db/DB.scala index e96fa5aa673..f0dbfc53159 100644 --- a/framework/play/src/main/scala/play/api/db/DB.scala +++ b/framework/play/src/main/scala/play/api/db/DB.scala @@ -120,7 +120,7 @@ class DBPlugin(app: Application) extends Plugin { case (name, (ds, config)) => { try { ds.getConnection.close() - println("database:" + name + " connected at " + ds.getJdbcUrl) + Logger("play").info("database [" + name + "] connected at " + ds.getJdbcUrl) } catch { case e => { throw app.configuration.reportError(config, "Cannot connect to database at [" + ds.getJdbcUrl + "]", Some(e.getCause)) diff --git a/framework/play/src/main/scala/play/api/db/evolutions/Evolutions.scala b/framework/play/src/main/scala/play/api/db/evolutions/Evolutions.scala index c9a66ccf39e..8bf6ddf4836 100644 --- a/framework/play/src/main/scala/play/api/db/evolutions/Evolutions.scala +++ b/framework/play/src/main/scala/play/api/db/evolutions/Evolutions.scala @@ -321,7 +321,7 @@ object OfflineEvolutions { Configuration.fromFile(new File(applicationPath, "conf/application.conf")).sub("db." + dbName), classloader))) val script = Evolutions.evolutionScript(api, applicationPath, dbName) - println("Applying evolution script for database '" + dbName + "':\n\n" + Evolutions.toHumanReadableScript(script)) + Logger("play").warn("Applying evolution script for database '" + dbName + "':\n\n" + Evolutions.toHumanReadableScript(script)) Evolutions.applyScript(api, dbName, script) diff --git a/framework/play/src/main/scala/play/core/ApplicationProvider.scala b/framework/play/src/main/scala/play/core/ApplicationProvider.scala index 8079f614a4a..51dcacdc683 100644 --- a/framework/play/src/main/scala/play/core/ApplicationProvider.scala +++ b/framework/play/src/main/scala/play/core/ApplicationProvider.scala @@ -53,7 +53,8 @@ class StaticApplication(applicationPath: File) extends ApplicationProvider { abstract class ReloadableApplication(applicationPath: File) extends ApplicationProvider { - Logger.log("Running the application from SBT, auto-reloading is enabled") + println() + println("Running the application from SBT, auto-reloading is enabled") var lastState: Either[PlayException, Application] = Left(PlayException("Not initialized", "?")) diff --git a/framework/play/src/main/scala/play/core/Invoker.scala b/framework/play/src/main/scala/play/core/Invoker.scala index 698a16db5c4..62b7d5a005f 100644 --- a/framework/play/src/main/scala/play/core/Invoker.scala +++ b/framework/play/src/main/scala/play/core/Invoker.scala @@ -50,10 +50,9 @@ class Invoker extends Actor { } } catch { case e => try { - e.printStackTrace() - app.global.onError(e) + app.global.onError(request, e) } catch { - case e => DefaultGlobal.onError(e) + case e => DefaultGlobal.onError(request, e) } } diff --git a/framework/play/src/main/scala/play/core/logger/Logger.scala b/framework/play/src/main/scala/play/core/logger/Logger.scala deleted file mode 100644 index 206000796e9..00000000000 --- a/framework/play/src/main/scala/play/core/logger/Logger.scala +++ /dev/null @@ -1,15 +0,0 @@ -package play.core.logger - -trait Logging { - - def log(msg: String) - -} - -object Logger extends Logging { - - def log(msg: String) { - println("[info] " + msg) - } - -} \ No newline at end of file diff --git a/framework/play/src/main/scala/play/core/server/NettyServer.scala b/framework/play/src/main/scala/play/core/server/NettyServer.scala index 2eab4d1324e..6b45199221d 100644 --- a/framework/play/src/main/scala/play/core/server/NettyServer.scala +++ b/framework/play/src/main/scala/play/core/server/NettyServer.scala @@ -405,10 +405,11 @@ class NettyServer(appProvider: ApplicationProvider) extends Server { allChannels.add(bootstrap.bind(new java.net.InetSocketAddress(9000))) - Logger.log("Listening for HTTP on port 9000...") + Logger("play").info("Listening for HTTP on port 9000...") def stop() { - Logger.log("Stopping Play server...") + Play.stop() + Logger("play").warn("Stopping server...") allChannels.close().awaitUninterruptibly() bootstrap.releaseExternalResources() } @@ -429,11 +430,11 @@ object NettyServer { val pidFile = new File(applicationPath, "RUNNING_PID") if (pidFile.exists) { - Logger.log("This application is already running (Or delete the RUNNING_PID file).") + println("This application is already running (Or delete the RUNNING_PID file).") System.exit(-1) } - Logger.log("Process ID is " + pid) + println("Process ID is " + pid) new FileOutputStream(pidFile).write(pid.getBytes) Runtime.getRuntime.addShutdownHook(new Thread { @@ -448,7 +449,8 @@ object NettyServer { new StaticApplication(applicationPath)) } catch { case e => { - Logger.log("Oops, cannot start the server -> " + e.getMessage) + println("Oops, cannot start the server.") + e.printStackTrace() System.exit(-1) } } diff --git a/framework/play/src/main/scala/play/core/server/Server.scala b/framework/play/src/main/scala/play/core/server/Server.scala index 5da360d52ba..e560edb05b2 100644 --- a/framework/play/src/main/scala/play/core/server/Server.scala +++ b/framework/play/src/main/scala/play/core/server/Server.scala @@ -1,10 +1,21 @@ package play.core.server + import play.api._ import play.core._ import play.api.mvc._ trait Server { + // First delete the default log file for a fresh start + scalax.file.Path(new java.io.File(applicationProvider.path, "logs/application.log")).delete() + + // Configure the logger for the first time + Logger.configure( + Option(new java.io.File(applicationProvider.path, "conf/logger.xml")).filter(_.exists).map(_.toURI.toURL).getOrElse { + this.getClass.getClassLoader.getResource("conf/logger.xml") + }, + Map("application.home" -> applicationProvider.path.getAbsolutePath)) + import akka.actor._ import akka.actor.Actor._ import akka.routing.Routing._ @@ -28,11 +39,10 @@ trait Server { Exception.allCatch[Either[Throwable, (Action[Any], Application)]] .either(sendAction) .joinRight - .left.map(e => DefaultGlobal.onError(e)) + .left.map(e => DefaultGlobal.onError(rqHeader, e)) }.joinRight } - def errorResult(e: Throwable): Result = DefaultGlobal.onError(e) def invoke[A](request: Request[A], response: Response, action: Action[A], app: Application) = invoker ! HandleAction(request, response, action, app) diff --git a/framework/play/src/main/scala/play/sbt/SbtPlugin.scala b/framework/play/src/main/scala/play/sbt/SbtPlugin.scala index 5460db1a78b..c8dfcb7368e 100644 --- a/framework/play/src/main/scala/play/sbt/SbtPlugin.scala +++ b/framework/play/src/main/scala/play/sbt/SbtPlugin.scala @@ -334,8 +334,9 @@ object PlayProject extends Plugin { // ----- Internal state used for reloading is kept here - val watchFiles = Seq( - extracted.currentProject.base / "conf" / "application.conf") ++ ((extracted.currentProject.base / "db" / "evolutions") ** "*.sql").get ++ ((extracted.currentProject.base / "conf") ** "messages").get + val watchFiles = { + ((extracted.currentProject.base / "db" / "evolutions") ** "*.sql").get ++ ((extracted.currentProject.base / "conf") ** "*").get + } var forceReload = false var currentProducts = Map.empty[java.io.File, Long] @@ -436,15 +437,21 @@ object PlayProject extends Plugin { val JavacErrorPosition = """\[error\](\s*)\^\s*""".r Project.evaluateTask(streamsManager, state).get.toEither.right.toOption.map { streamsManager => + var first: (Option[(String, String, String)], Option[Int]) = (None, None) var parsed: (Option[(String, String, String)], Option[Int]) = (None, None) Output.lastLines(i.node.get.asInstanceOf[ScopedKey[_]], streamsManager).map(_.replace(scala.Console.RESET, "")).map(_.replace(scala.Console.RED, "")).collect { case JavacError(file, line, message) => parsed = Some((file, line, message)) -> None case JavacErrorInfo(key, message) => parsed._1.foreach { o => parsed = Some((parsed._1.get._1, parsed._1.get._2, parsed._1.get._3 + " [" + key.trim + ": " + message.trim + "]")) -> None } - case JavacErrorPosition(pos) => parsed = parsed._1 -> Some(pos.size) + case JavacErrorPosition(pos) => { + parsed = parsed._1 -> Some(pos.size) + if (first == (None, None)) { + first = parsed + } + } } - parsed + first }.collect { case (Some(error), maybePosition) => new xsbti.Problem { def message = error._3 @@ -640,13 +647,40 @@ object PlayProject extends Plugin { } - val h2Command = Command.command("h2") { state: State => + val h2Command = Command.command("h2-browser") { state: State => try { org.h2.tools.Server.main() + } catch { + case _ => } state } + val classpathCommand = Command.command("classpath") { state: State => + + val extracted = Project.extract(state) + + Project.evaluateTask(dependencyClasspath in Runtime, state).get.toEither match { + case Left(_) => { + println() + println("Cannot compute the classpath") + println() + state.fail + } + case Right(classpath) => { + println() + println("Here is the computed classpath of your application:") + println() + classpath.foreach { item => + println("\t- " + item.data.getAbsolutePath) + } + println() + state + } + } + + } + // ----- Default settings lazy val defaultSettings = Seq[Setting[_]]( @@ -669,7 +703,7 @@ object PlayProject extends Plugin { sourceGenerators in Compile <+= (sourceDirectory in Compile, sourceManaged in Compile, templatesTypes, templatesImport) map ScalaTemplates, - commands ++= Seq(playCommand, playRunCommand, playStartCommand, playHelpCommand, h2Command), + commands ++= Seq(playCommand, playRunCommand, playStartCommand, playHelpCommand, h2Command, classpathCommand), shellPrompt := playPrompt, diff --git a/framework/play/src/main/scala/views/defaultpages/devError.scala.html b/framework/play/src/main/scala/views/defaultpages/devError.scala.html index d2d68c8ad17..8864559e267 100644 --- a/framework/play/src/main/scala/views/defaultpages/devError.scala.html +++ b/framework/play/src/main/scala/views/defaultpages/devError.scala.html @@ -4,6 +4,7 @@ @error.title +

@error.title

diff --git a/framework/project/Build.scala b/framework/project/Build.scala index 6b6c3675f9a..a238b26486e 100644 --- a/framework/project/Build.scala +++ b/framework/project/Build.scala @@ -106,7 +106,11 @@ object PlayBuild extends Build { val runtime = Seq( "org.jboss.netty" % "netty" % "3.2.4.Final", - "org.slf4j" % "slf4j-api" % "1.6.1", + "org.slf4j" % "slf4j-api" % "1.6.2", + "ch.qos.logback" % "logback-core" % "0.9.30", + "ch.qos.logback" % "logback-classic" % "0.9.30", + "org.slf4j" % "jul-to-slf4j" % "1.6.2", + "org.slf4j" % "jcl-over-slf4j" % "1.6.2", "com.github.scala-incubator.io" %% "scala-io-file" % "0.2.0", "se.scalablesolutions.akka" % "akka-actor" % "1.1.3", "org.avaje" % "ebean" % "2.7.1", @@ -114,9 +118,10 @@ object PlayBuild extends Build { "org.scala-tools" %% "scala-stm" % "0.3", "com.jolbox" % "bonecp" % "0.7.1.RELEASE", "org.yaml" % "snakeyaml" % "1.9", - "commons-beanutils" % "commons-beanutils" % "1.8.3", "org.hibernate" % "hibernate-validator" % "4.2.0.Final", - "org.springframework" % "spring-context" % "3.0.6.RELEASE", + "org.springframework" % "spring-context" % "3.0.6.RELEASE" notTransitive(), + "org.springframework" % "spring-core" % "3.0.6.RELEASE" notTransitive(), + "org.springframework" % "spring-beans" % "3.0.6.RELEASE" notTransitive(), "joda-time" % "joda-time" % "2.0", "mysql" % "mysql-connector-java" % "5.1.17", "javassist" % "javassist" % "3.12.1.GA", diff --git a/samples/simple-dataset/app/controllers/Application.java b/samples/simple-dataset/app/controllers/Application.java index b40b90fb730..a8f9b9ba8f7 100644 --- a/samples/simple-dataset/app/controllers/Application.java +++ b/samples/simple-dataset/app/controllers/Application.java @@ -64,7 +64,7 @@ public static Result edit(Long id) { * @param id Id of the computer to edit */ public static Result update(Long id) { - Form computerForm = form(Computer.class).bind(); + Form computerForm = form(Computer.class).bindFromRequest(); if(computerForm.hasErrors()) { return badRequest(editForm.render(id, computerForm)); } @@ -87,7 +87,7 @@ public static Result create() { * Handle the 'new computer form' submission */ public static Result save() { - Form computerForm = form(Computer.class).bind(); + Form computerForm = form(Computer.class).bindFromRequest(); if(computerForm.hasErrors()) { return badRequest(createForm.render(computerForm)); } diff --git a/samples/todolist-java-ebean/app/controllers/Authentication.java b/samples/todolist-java-ebean/app/controllers/Authentication.java index 71088c0e3b3..872a77f66c1 100644 --- a/samples/todolist-java-ebean/app/controllers/Authentication.java +++ b/samples/todolist-java-ebean/app/controllers/Authentication.java @@ -39,7 +39,7 @@ public static Result login() { } public static Result authenticate() { - Form loginForm = form(Login.class).bind(); + Form loginForm = form(Login.class).bindFromRequest(); if(loginForm.hasErrors()) { return badRequest(login.render(loginForm)); } else { diff --git a/samples/todolist-java-ebean/app/controllers/Tasks.java b/samples/todolist-java-ebean/app/controllers/Tasks.java index 8bffda8b16f..7d3f21b57e1 100644 --- a/samples/todolist-java-ebean/app/controllers/Tasks.java +++ b/samples/todolist-java-ebean/app/controllers/Tasks.java @@ -16,7 +16,7 @@ public static Result list() { } public static Result edit(Long id) { - return ok(form.render(id, form(Task.find.byId(id)))); + return ok(form.render(id, form(Task.class).fill(Task.find.byId(id)))); } public static Result create() { @@ -24,7 +24,7 @@ public static Result create() { } public static Result save() { - Form taskForm = form(Task.class).bind(); + Form taskForm = form(Task.class).bindFromRequest(); if(taskForm.hasErrors()) { return badRequest(form.render(null, taskForm)); } else { @@ -34,7 +34,7 @@ public static Result save() { } public static Result update(Long id) { - Form taskForm = form(Task.class).bind(); + Form taskForm = form(Task.class).bindFromRequest(); if(taskForm.hasErrors()) { return badRequest(form.render(id, taskForm)); } else {