Add method for request cache to app.Context.

This commit is contained in:
takezoe
2013-07-11 11:20:56 +09:00
parent f104fab593
commit 07dd459f3c
2 changed files with 19 additions and 6 deletions

View File

@@ -95,7 +95,23 @@ abstract class ControllerBase extends ScalatraFilter
/**
* Context object for the current request.
*/
case class Context(path: String, loginAccount: Option[Account], currentUrl: String, request: HttpServletRequest)
case class Context(path: String, loginAccount: Option[Account], currentUrl: String, request: HttpServletRequest){
/**
* Get object from cache.
*
* If object has not been cached with the specified key then retrieves by given action.
* Cached object are available during a request.
*/
def cache[A](key: String)(action: => A): A = {
Option(request.getAttribute("cache." + key).asInstanceOf[A]).getOrElse {
val newObject = action
request.setAttribute("cache." + key, newObject)
newObject
}
}
}
/**
* Base trait for controllers which manages account information.

View File

@@ -81,11 +81,8 @@ object helpers {
* Looks up Gravatar if avatar icon has not been configured in user settings.
*/
def avatar(userName: String, size: Int, tooltip: Boolean = false)(implicit context: app.Context): Html = {
val account = Option(context.request.getAttribute("cache.account." + userName).asInstanceOf[model.Account]).orElse {
new AccountService {}.getAccountByUserName(userName).map { account =>
context.request.setAttribute("cache.account." + userName, account)
account
}
val account = context.cache(s"account.${userName}"){
new AccountService {}.getAccountByUserName(userName)
}
val src = account.collect { case account if(account.image.isEmpty) =>
s"""http://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress)}?s=${size}"""