Posts Tagged ‘Scalatra’
Scalatra, Scalate and Scaml
A while ago I set about creating a webapp for monitoring the status of the various Quartz jobs that we use to keep our main application ticking. It was put together quickly using Simple Build Tool and Scalatra. I needed a templating engine and noticed that Scalatra has support for Scalate (although at the time the support was only experimental). I decided to give it a try. The first step was to add the dependencies for Scalate and Scalatra-Scalate into our build file:
val scalatraScalate = "org.scalatra" % "scalatra-scalate_2.8.0" % "2.0.0.M1" val scalateCore = "org.fusesource.scalate" % "scalate-core" % "1.2"
I soon ran into the Scalatra issue with using Scalate and Logback and instead decided to use Scalate on its own. Referring to the Scalate Embedding Guide, I created an instance of the Scalate TemplateEngine class in a trait that is extended by my Scalatra servlet:
trait ScalateTemplateEngine {
def render(templatePath: String, context: Map[String, Any], response: HttpServletResponse) = {
val templateEngine = new TemplateEngine
val template = templateEngine.load(templatePath)
val buffer = new StringWriter()
val renderContext = new DefaultRenderContext(templateEngine, new PrintWriter(buffer))
context.foreach({case (key, value) => renderContext.attributes(key) = value})
template.render(renderContext)
response.getWriter.write(buffer.toString)
}
}
Then, referring to this excellent blog post, I created an index.scaml file. The scaml file (below) is concise and reasonably readable. The only hiccups I encountered in making it were:
- Figuring out the syntax and correct indenting of the for loop
- Realising that all the values the map are automatically converted to Options (hence the many get calls).
-@ val title: String = "Scheduler"
-@ val header: String = "Scheduler"
-@ val quartzStatus: String = "No quartz status information available"
-@ val scheduledTasks: List[Map[String, String]] = Nil
-@ val quartzInformation: String = "No quartz information available"
!!! 5
%html
%head
%title= title
%body
%h1
!= header
%h5
!= quartzStatus
%table{:border => 1}
%thead
%td Task
%td Status
%td Quantity
%td Last Attempt Start Time
%td Last Attempt Finish Time
%td Last Successful Run Start Time
%td Last Successful Run Finish Time
%td Last Error
%td Action
= for(scheduledTask <- scheduledTasks)
%tbody
%td= scheduledTask.get("name").get
%td= scheduledTask.get("status").get
%td= scheduledTask.get("quantity").get
%td= scheduledTask.get("lastRunStart").get
%td= scheduledTask.get("lastRunFinish").get
%td= scheduledTask.get("lastSuccessStart").get
%td= scheduledTask.get("lastSuccessFinish").get
%td= scheduledTask.get("lastException").get
%td
%form(method="post")
%input(type="submit" name={scheduledTask.get("action").get} value="Run now")