Skip to content

Commit

Permalink
Look for layouts in /WEB-INF/layouts/default.*. #87
Browse files Browse the repository at this point in the history
  • Loading branch information
rossabaker committed Aug 18, 2011
1 parent 1a80c4b commit 2a26abe
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
29 changes: 29 additions & 0 deletions scalate/src/main/scala/org/scalatra/scalate/ScalateSupport.scala
Expand Up @@ -5,9 +5,17 @@ import java.io.PrintWriter
import javax.servlet.{ServletContext, ServletConfig, FilterConfig}
import javax.servlet.http.{HttpServletResponse, HttpServletRequest}
import org.fusesource.scalate.TemplateEngine
import org.fusesource.scalate.layout.DefaultLayoutStrategy
import org.fusesource.scalate.servlet.{ServletRenderContext, ServletTemplateEngine}
import java.lang.Throwable

object ScalateSupport {
val DefaultLayouts = Seq(
"/WEB-INF/layouts/default",
"/WEB-INF/scalate/layouts/default"
)
}

trait ScalateSupport extends ScalatraKernel {
protected var templateEngine: TemplateEngine = _

Expand All @@ -28,13 +36,34 @@ trait ScalateSupport extends ScalatraKernel {
new TemplateEngine with ScalatraTemplateEngine
}

/**
* A TemplateEngine integrated with Scalatra.
*
* A ScalatraTemplateEngine looks for layouts in `/WEB-INF/layouts` before
* searching the default `/WEB-INF/scalate/layouts`.
*/
trait ScalatraTemplateEngine {
this: TemplateEngine =>

/**
* Returns a ServletRenderContext constructed from the current
* request and response.
*/
override def createRenderContext(uri: String, out: PrintWriter) =
ScalateSupport.this.createRenderContext

/**
* Delegates to the ScalatraKernel's isDevelopmentMode flag.
*/
override def isDevelopmentMode = ScalateSupport.this.isDevelopmentMode

{
val layouts = for {
base <- ScalateSupport.DefaultLayouts
extension <- TemplateEngine.templateTypes
} yield ("%s.%s".format(base, extension))
layoutStrategy = new DefaultLayoutStrategy(this, layouts:_*)
}
}

def createRenderContext: ServletRenderContext =
Expand Down
Expand Up @@ -3,13 +3,15 @@ package scalate

import test.specs2.ScalatraSpec
import org.fusesource.scalate.{TemplateSource, Binding}
import org.fusesource.scalate.layout.DefaultLayoutStrategy

class ScalateSupportSpec extends ScalatraSpec { def is =
"ScalateSupport should" ^
"render uncaught errors with 500.scaml" ! e1^
"not throw a NullPointerException for trivial requests" ! e2^
"render a simple template" ! e3^
"render a simple template with params" ! e4
"looks for layouts in /WEB-INF/layouts" ! e5

addServlet(new ScalatraServlet with ScalateSupport {

Expand All @@ -29,6 +31,10 @@ class ScalateSupportSpec extends ScalatraSpec { def is =
renderTemplate("/params.jade", "foo" -> "Configurable")
}

get("/layout-strategy") {
templateEngine.layoutStrategy.asInstanceOf[DefaultLayoutStrategy].defaultLayouts mkString ";"
}

}, "/*")

def e1 = get("/barf") {
Expand All @@ -46,4 +52,19 @@ class ScalateSupportSpec extends ScalatraSpec { def is =
def e4 = get("/params") {
body must_== "<div>Configurable template</div>\n"
}

// Testing the default layouts is going to be hard, but we can at least
// verify that it's looking in the right place.
def e5 = get("/layout-strategy") {
body.split(";") must_== Array(
"/WEB-INF/layout/default.jade",
"/WEB-INF/layout/default.mustache",
"/WEB-INF/layout/default.scaml",
"/WEB-INF/layout/default.ssp",
"/WEB-INF/scalate/layout/default.jade",
"/WEB-INF/scalate/layout/default.mustache",
"/WEB-INF/scalate/layout/default.scaml",
"/WEB-INF/scalate/layout/default.ssp"
)
}
}

0 comments on commit 2a26abe

Please sign in to comment.