/scalate-spring-mvc/src/main/scala/org/fusesource/scalate/spring/view/ScalateView.scala

http://github.com/scalate/scalate · Scala · 131 lines · 88 code · 26 blank · 17 comment · 2 complexity · d3f888f8263f0a775cfef02465b1716c MD5 · raw file

  1. /**
  2. * Copyright (C) 2009-2011 the original author or authors.
  3. * See the notice.md file distributed with this work for additional
  4. * information regarding copyright ownership.
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. package org.fusesource.scalate.spring.view
  19. import _root_.java.util.Locale
  20. import _root_.javax.servlet.http.HttpServletRequest
  21. import _root_.javax.servlet.http.HttpServletResponse
  22. import _root_.org.fusesource.scalate.RenderContext
  23. import _root_.org.fusesource.scalate.servlet.ServletRenderContext
  24. import _root_.org.fusesource.scalate.servlet.ServletTemplateEngine
  25. import _root_.scala.collection.JavaConverters._
  26. import _root_.org.fusesource.scalate.TemplateException
  27. import _root_.org.springframework.web.servlet.view.{ AbstractView, AbstractTemplateView }
  28. import _root_.org.slf4j.LoggerFactory
  29. import org.fusesource.scalate.util.ResourceNotFoundException
  30. trait ScalateRenderStrategy {
  31. protected val log = LoggerFactory.getLogger(getClass)
  32. def render(context: ServletRenderContext, model: Map[String, Any]): Unit
  33. }
  34. trait LayoutScalateRenderStrategy
  35. extends AbstractTemplateView
  36. with ScalateRenderStrategy {
  37. def templateEngine: ServletTemplateEngine
  38. def render(context: ServletRenderContext, model: Map[String, Any]): Unit = {
  39. log.debug("Rendering view with name '" + getUrl + "' with model " + model)
  40. for ((key, value) <- model) {
  41. context.attributes(key) = value
  42. }
  43. templateEngine.layout(getUrl, context)
  44. }
  45. }
  46. trait DefaultScalateRenderStrategy
  47. extends AbstractTemplateView
  48. with ScalateRenderStrategy {
  49. override def render(context: ServletRenderContext, model: Map[String, Any]): Unit = {
  50. log.debug("Rendering view with name '" + getUrl + "' with model " + model)
  51. context.render(getUrl, model)
  52. }
  53. }
  54. trait ViewScalateRenderStrategy
  55. extends ScalateRenderStrategy {
  56. override def render(context: ServletRenderContext, model: Map[String, Any]): Unit = {
  57. log.debug("Rendering with model " + model)
  58. val it = model.get("it")
  59. if (it.isEmpty)
  60. throw new TemplateException("No 'it' model object specified. Cannot render request")
  61. context.view(it.get.asInstanceOf[AnyRef])
  62. }
  63. }
  64. trait AbstractScalateView extends AbstractView {
  65. var templateEngine: ServletTemplateEngine = _
  66. def checkResource(locale: Locale): Boolean
  67. }
  68. class ScalateUrlView
  69. extends AbstractTemplateView
  70. with AbstractScalateView
  71. with LayoutScalateRenderStrategy {
  72. override def renderMergedTemplateModel(
  73. model: java.util.Map[String, Object],
  74. request: HttpServletRequest,
  75. response: HttpServletResponse): Unit = {
  76. val context = new ServletRenderContext(templateEngine, request, response, getServletContext)
  77. RenderContext.using(context) {
  78. render(context, model.asInstanceOf[java.util.Map[String, Any]].asScala.toMap)
  79. }
  80. }
  81. override def checkResource(locale: Locale): Boolean = try {
  82. log.debug("Checking for resource " + getUrl)
  83. templateEngine.load(getUrl)
  84. true
  85. } catch {
  86. case e: ResourceNotFoundException => {
  87. log.info("Could not find resource " + getUrl)
  88. false
  89. }
  90. }
  91. }
  92. class ScalateView
  93. extends AbstractScalateView
  94. with ViewScalateRenderStrategy {
  95. override def checkResource(locale: Locale) = true
  96. override def renderMergedOutputModel(
  97. model: java.util.Map[String, Object],
  98. request: HttpServletRequest,
  99. response: HttpServletResponse): Unit = {
  100. val context = new ServletRenderContext(templateEngine, request, response, getServletContext)
  101. RenderContext.using(context) {
  102. render(context, model.asInstanceOf[java.util.Map[String, Any]].asScala.toMap)
  103. }
  104. }
  105. }