Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package jp.t2v.lab.play2.stackc

import javax.inject.Inject

import play.api.mvc._

import scala.collection.concurrent.TrieMap
import scala.concurrent.{Future, ExecutionContext}
import scala.concurrent.{ExecutionContext, Future}
import scala.util.{Failure, Success}
import scala.util.control.{NonFatal, ControlThrowable}
import scala.util.control.{ControlThrowable, NonFatal}

@Inject
trait StackableController {
self: Controller =>
self: AbstractController =>

final class StackActionBuilder(params: Attribute[_]*) extends ActionBuilder[RequestWithAttributes] {
final class StackActionBuilder[B](override val parser: BodyParser[B], params: Attribute[_]*) extends ActionBuilder[RequestWithAttributes, B] {
def invokeBlock[A](req: Request[A], block: (RequestWithAttributes[A]) => Future[Result]): Future[Result] = {
val request = new RequestWithAttributes(req, new TrieMap[RequestAttributeKey[_], Any] ++= params.map(_.toTuple))
try {
Expand All @@ -19,15 +23,18 @@ trait StackableController {
case NonFatal(e) => cleanupOnFailed(request, e); throw e
}
}
override protected def executionContext: ExecutionContext = self.controllerComponents.executionContext
}

final def AsyncStack[A](p: BodyParser[A], params: Attribute[_]*)(f: RequestWithAttributes[A] => Future[Result]): Action[A] = new StackActionBuilder(params: _*).async(p)(f)
final def AsyncStack(params: Attribute[_]*)(f: RequestWithAttributes[AnyContent] => Future[Result]): Action[AnyContent] = new StackActionBuilder(params: _*).async(f)
final def AsyncStack(f: RequestWithAttributes[AnyContent] => Future[Result]): Action[AnyContent] = new StackActionBuilder().async(f)
private lazy val defaultBodyParser = self.controllerComponents.parsers.default

final def AsyncStack[A](p: BodyParser[A], params: Attribute[_]*)(f: RequestWithAttributes[A] => Future[Result]): Action[A] = new StackActionBuilder(p, params: _*).async(p)(f)
final def AsyncStack(params: Attribute[_]*)(f: RequestWithAttributes[AnyContent] => Future[Result]): Action[AnyContent] = new StackActionBuilder[AnyContent](defaultBodyParser, params: _*).async(f)
final def AsyncStack(f: RequestWithAttributes[AnyContent] => Future[Result]): Action[AnyContent] = new StackActionBuilder[AnyContent](defaultBodyParser).async(f)

final def StackAction[A](p: BodyParser[A], params: Attribute[_]*)(f: RequestWithAttributes[A] => Result): Action[A] = new StackActionBuilder(params: _*).apply(p)(f)
final def StackAction(params: Attribute[_]*)(f: RequestWithAttributes[AnyContent] => Result): Action[AnyContent] = new StackActionBuilder(params: _*).apply(f)
final def StackAction(f: RequestWithAttributes[AnyContent] => Result): Action[AnyContent] = new StackActionBuilder().apply(f)
final def StackAction[A](p: BodyParser[A], params: Attribute[_]*)(f: RequestWithAttributes[A] => Result): Action[A] = new StackActionBuilder(p, params: _*).apply(p)(f)
final def StackAction(params: Attribute[_]*)(f: RequestWithAttributes[AnyContent] => Result): Action[AnyContent] = new StackActionBuilder[AnyContent](defaultBodyParser, params: _*).apply(f)
final def StackAction(f: RequestWithAttributes[AnyContent] => Result): Action[AnyContent] = new StackActionBuilder[AnyContent](defaultBodyParser).apply(f)

def proceed[A](request: RequestWithAttributes[A])(f: RequestWithAttributes[A] => Future[Result]): Future[Result] = f(request)

Expand Down
17 changes: 9 additions & 8 deletions project/Build.scala
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import sbt._
import Keys._
import play.sbt.routes.RoutesKeys.routesGenerator
import play.routes.compiler.StaticRoutesGenerator
import play.routes.compiler.{InjectedRoutesGenerator, StaticRoutesGenerator}

object StackableControllerProjects extends Build {

lazy val _organization = "jp.t2v"

lazy val _version = "0.6.0-SNAPSHOT"
lazy val _version = "0.7.0-SNAPSHOT"

def _publishTo(v: String) = {
val nexus = "https://oss.sonatype.org/"
Expand Down Expand Up @@ -44,7 +44,7 @@ object StackableControllerProjects extends Build {
</developers>
}

val Scala211 = "2.11.7"
val Scala211 = "2.11.11"

lazy val core = Project(
id = "core",
Expand All @@ -54,7 +54,7 @@ object StackableControllerProjects extends Build {
name := "stackable-controller",
version := _version,
scalaVersion := Scala211,
crossScalaVersions := Scala211 :: Nil,
crossScalaVersions := Seq(Scala211, "2.12.6"),
publishTo <<= version { (v: String) => _publishTo(v) },
publishMavenStyle := true,
resolvers ++= _resolvers,
Expand All @@ -73,14 +73,15 @@ object StackableControllerProjects extends Build {
version := _version,
scalaVersion := Scala211,
resolvers ++= _resolvers,
routesGenerator := StaticRoutesGenerator,
routesGenerator := InjectedRoutesGenerator,
libraryDependencies ++= Seq(
play.sbt.Play.autoImport.jdbc,
play.sbt.Play.autoImport.guice,
play.sbt.Play.autoImport.specs2 % "test",
"com.typesafe.play" %% "play" % play.core.PlayVersion.current,
"org.scalikejdbc" %% "scalikejdbc" % "2.3.5",
"org.scalikejdbc" %% "scalikejdbc-config" % "2.3.5",
"org.scalikejdbc" %% "scalikejdbc-play-initializer" % "2.5.0",
"org.scalikejdbc" %% "scalikejdbc" % "3.0.0",
"org.scalikejdbc" %% "scalikejdbc-config" % "3.0.0",
"org.scalikejdbc" %% "scalikejdbc-play-initializer" % "2.6.0",
"org.slf4j" % "slf4j-simple" % "[1.7,)"
)
) dependsOn(core)
Expand Down
2 changes: 1 addition & 1 deletion project/build.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
sbt.version=0.13.11
sbt.version=0.13.15
2 changes: 1 addition & 1 deletion project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.0")
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.0")

scalacOptions ++= Seq("-deprecation", "-language:_", "-unchecked")
4 changes: 3 additions & 1 deletion sample/app/controllers/Application.scala
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package controllers

import javax.inject.Inject

import play.api.mvc._
import models._
import views._
import controllers.stack._
import jp.t2v.lab.play2.stackc.RequestWithAttributes

object Application extends Controller with DBSessionElement with LoggingElement {
class Application @Inject() (cc: ControllerComponents) extends AbstractController(cc) with DBSessionElement with LoggingElement {

def index = Action {
Ok(views.html.index("Your new application is ready."))
Expand Down
12 changes: 8 additions & 4 deletions sample/app/controllers/stack/DBSessionElement.scala
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package controllers.stack

import play.api.mvc.{Result, Controller}
import javax.inject.Inject

import jp.t2v.lab.play2.stackc.{RequestAttributeKey, RequestWithAttributes, StackableController}
import play.api.mvc.{AbstractController, Result}
import scalikejdbc._
import jp.t2v.lab.play2.stackc.{RequestWithAttributes, RequestAttributeKey, StackableController}
import scala.concurrent.Future

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

@Inject
trait DBSessionElement extends StackableController {
self: Controller =>
self: AbstractController =>

case object DBSessionKey extends RequestAttributeKey[DBSession]

Expand Down
7 changes: 5 additions & 2 deletions sample/app/controllers/stack/LoggingElement.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package controllers.stack

import play.api.mvc.{Result, Controller}
import javax.inject.Inject

import jp.t2v.lab.play2.stackc.{RequestWithAttributes, StackableController}
import play.api.Logger
import play.api.mvc.{AbstractController, InjectedController, Result}

@Inject
trait LoggingElement extends StackableController {
self: Controller =>
self: AbstractController =>

override def cleanupOnSucceeded[A](req: RequestWithAttributes[A], res: Option[Result]): Unit = {
res.map { result =>
Expand Down
2 changes: 1 addition & 1 deletion sample/app/views/index.scala.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

@main("Welcome to Play 2.1") {

@play20.welcome(message)
@message

}