|
Play Framework/Scala example source code file (DocumentationHandler.scala)
The DocumentationHandler.scala Play Framework example source code
/*
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
*/
package play.docs
import play.api.mvc._
import play.api.http.Status
import play.api.http.HeaderNames
import play.api.libs.iteratee.Enumerator
import play.api.libs.iteratee.Enumeratee
import play.core.{ PlayVersion, BuildDocHandler }
import play.doc.{ FileRepository, PlayDoc, RenderedPage }
import org.apache.commons.io.IOUtils
/**
* Used by the DocumentationApplication class to handle requests for Play documentation.
* Documentation is located in the given repository - either a JAR file or directly from
* the filesystem.
*/
class DocumentationHandler(repo: FileRepository, apiRepo: FileRepository) extends BuildDocHandler {
def this(repo: FileRepository) = this(repo, repo)
val markdownRenderer = new PlayDoc(repo, repo, "resources", PlayVersion.current)
val locator: String => String = new Memoise(name =>
repo.findFileWithName(name).orElse(apiRepo.findFileWithName(name)).getOrElse(name)
)
// Method without Scala types. Required by BuildDocHandler to allow communication
// between code compiled by different versions of Scala
override def maybeHandleDocRequest(request: AnyRef): AnyRef = {
this.maybeHandleDocRequest(request.asInstanceOf[RequestHeader])
}
/**
* Handle the given request if it is a request for documentation content.
*/
def maybeHandleDocRequest(request: RequestHeader): Option[Result] = {
// Assumes caller consumes result, closing entry
def sendFileInline(repo: FileRepository, path: String): Option[Result] = {
import play.api.libs.concurrent.Execution.Implicits.defaultContext
repo.handleFile(path) { handle =>
Result(
ResponseHeader(Status.OK, Map(
HeaderNames.CONTENT_LENGTH -> handle.size.toString,
HeaderNames.CONTENT_TYPE -> play.api.libs.MimeTypes.forFileName(handle.name).getOrElse(play.api.http.ContentTypes.BINARY)
)),
Enumerator.fromStream(handle.is) &> Enumeratee.onIterateeDone(handle.close)
)
}
}
import play.api.mvc.Results._
val documentation = """/@documentation/?""".r
val book = """/@documentation/Book""".r
val apiDoc = """/@documentation/api/(.*)""".r
val wikiResource = """/@documentation/resources/(.*)""".r
val wikiPage = """/@documentation/([^/]*)""".r
request.path match {
case documentation() => {
Some {
Redirect("/@documentation/Home")
}
}
case book() => {
Some {
repo.loadFile("manual/book/Book") { is =>
val lines = IOUtils.toString(is).split('\n').toSeq.map(_.trim)
Ok(views.html.play20.book(lines))
}.getOrElse(NotFound("Resource not found [Book]"))
}
}
case apiDoc(page) => {
Some {
sendFileInline(apiRepo, "api/" + page).getOrElse(NotFound(views.html.play20.manual(page, None, None, locator)))
}
}
case wikiResource(path) => {
Some {
sendFileInline(repo, path).orElse(sendFileInline(apiRepo, path)).getOrElse(NotFound("Resource not found [" + path + "]"))
}
}
case wikiPage(page) => {
Some {
markdownRenderer.renderPage(page) match {
case None => NotFound(views.html.play20.manual(page, None, None, locator))
case Some(RenderedPage(mainPage, None, _)) => Ok(views.html.play20.manual(page, Some(mainPage), None, locator))
case Some(RenderedPage(mainPage, Some(sidebar), _)) => Ok(views.html.play20.manual(page, Some(mainPage), Some(sidebar), locator))
}
}
}
case _ => None
}
}
}
/**
* Memoise a function.
*/
class Memoise[-T, +R](f: T => R) extends (T => R) {
private[this] val cache = scala.collection.mutable.Map.empty[T, R]
def apply(v: T): R = synchronized { cache.getOrElseUpdate(v, f(v)) }
}
Other Play Framework source code examplesHere is a short list of links related to this Play Framework DocumentationHandler.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.