(refs #341) Migrate slick session.

This commit is contained in:
shimamoto
2014-06-27 08:48:58 +09:00
parent d2c94909cb
commit 9ee739d102
4 changed files with 19 additions and 4 deletions

View File

@@ -9,6 +9,7 @@ import org.scalatra.json._
import org.json4s._ import org.json4s._
import jp.sf.amateras.scalatra.forms._ import jp.sf.amateras.scalatra.forms._
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
import slick.jdbc.JdbcBackend
import model.Account import model.Account
import service.{SystemSettingsService, AccountService} import service.{SystemSettingsService, AccountService}
import javax.servlet.http.{HttpServletResponse, HttpServletRequest} import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
@@ -24,6 +25,10 @@ abstract class ControllerBase extends ScalatraFilter
implicit val jsonFormats = DefaultFormats implicit val jsonFormats = DefaultFormats
// Convert to slick session.
implicit def request2Session(implicit request: HttpServletRequest): JdbcBackend#Session =
request.getAttribute(Keys.Request.DBSession).asInstanceOf[JdbcBackend#Session]
// Don't set content type via Accept header. // Don't set content type via Accept header.
override def format(implicit request: HttpServletRequest) = "" override def format(implicit request: HttpServletRequest) = ""

View File

@@ -5,6 +5,7 @@ import javax.servlet.http._
import service.{SystemSettingsService, AccountService, RepositoryService} import service.{SystemSettingsService, AccountService, RepositoryService}
import model.Account import model.Account
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import slick.jdbc.JdbcBackend
import util.Implicits._ import util.Implicits._
import util.ControlUtil._ import util.ControlUtil._
import util.Keys import util.Keys
@@ -23,6 +24,7 @@ class BasicAuthenticationFilter extends Filter with RepositoryService with Accou
def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = { def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = {
val request = req.asInstanceOf[HttpServletRequest] val request = req.asInstanceOf[HttpServletRequest]
val response = res.asInstanceOf[HttpServletResponse] val response = res.asInstanceOf[HttpServletResponse]
implicit val session = req.getAttribute(Keys.Request.DBSession).asInstanceOf[JdbcBackend#Session]
val wrappedResponse = new HttpServletResponseWrapper(response){ val wrappedResponse = new HttpServletResponseWrapper(response){
override def setCharacterEncoding(encoding: String) = {} override def setCharacterEncoding(encoding: String) = {}
@@ -65,7 +67,8 @@ class BasicAuthenticationFilter extends Filter with RepositoryService with Accou
} }
} }
private def getWritableUser(username: String, password: String, repository: RepositoryService.RepositoryInfo): Option[Account] = private def getWritableUser(username: String, password: String, repository: RepositoryService.RepositoryInfo)
(implicit session: JdbcBackend#Session): Option[Account] =
authenticate(loadSystemSettings(), username, password) match { authenticate(loadSystemSettings(), username, password) match {
case x @ Some(account) if(hasWritePermission(repository.owner, repository.name, x)) => x case x @ Some(account) if(hasWritePermission(repository.owner, repository.name, x)) => x
case _ => None case _ => None

View File

@@ -3,6 +3,7 @@ package servlet
import javax.servlet._ import javax.servlet._
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
import util.Keys
/** /**
* Controls the transaction with the open session in view pattern. * Controls the transaction with the open session in view pattern.
@@ -20,8 +21,9 @@ class TransactionFilter extends Filter {
// assets don't need transaction // assets don't need transaction
chain.doFilter(req, res) chain.doFilter(req, res)
} else { } else {
Database(req.getServletContext) withTransaction { Database(req.getServletContext) withTransaction { session =>
logger.debug("begin transaction") logger.debug("begin transaction")
req.setAttribute(Keys.Request.DBSession, session)
chain.doFilter(req, res) chain.doFilter(req, res)
logger.debug("end transaction") logger.debug("end transaction")
} }
@@ -31,8 +33,8 @@ class TransactionFilter extends Filter {
} }
object Database { object Database {
def apply(context: ServletContext): scala.slick.session.Database = def apply(context: ServletContext): slick.jdbc.JdbcBackend.Database =
scala.slick.session.Database.forURL(context.getInitParameter("db.url"), slick.jdbc.JdbcBackend.Database.forURL(context.getInitParameter("db.url"),
context.getInitParameter("db.user"), context.getInitParameter("db.user"),
context.getInitParameter("db.password")) context.getInitParameter("db.password"))
} }

View File

@@ -61,6 +61,11 @@ object Keys {
*/ */
object Request { object Request {
/**
* Request key for the Slick Session.
*/
val DBSession = "DB_SESSION"
/** /**
* Request key for the Ajax request flag. * Request key for the Ajax request flag.
*/ */