From 95b00fd00f3fd454b5d76f18102153779e648519 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Sun, 25 Jan 2015 01:11:03 -0500 Subject: [PATCH] add CachedFileStorage This uses lastModified of all files to cache FileStorage instance. Preview should get much faster on larger pamflets. --- app/src/main/scala/app.scala | 4 ++-- library/src/main/scala/storage.scala | 32 +++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/app/src/main/scala/app.scala b/app/src/main/scala/app.scala index b2ca7084..aebb8d97 100644 --- a/app/src/main/scala/app.scala +++ b/app/src/main/scala/app.scala @@ -12,7 +12,7 @@ object Pamflet { def main(args: Array[String]) { System.exit(run(args)) } - private def storage(dir: File) = FileStorage(dir) + private def storage(dir: File) = CachedFileStorage(dir) def run(args: Array[String]) = { args match { case Array(Dir(input), Dir(output)) => @@ -34,7 +34,7 @@ object Pamflet { 1 } } - def preview(dir: File) = { + def preview(dir: File): Int = { Preview(storage(dir).globalized).run { server => unfiltered.util.Browser.open( "http://127.0.0.1:%d/".format(server.portBindings.head.port) diff --git a/library/src/main/scala/storage.scala b/library/src/main/scala/storage.scala index 89c7c69e..8ec79dee 100644 --- a/library/src/main/scala/storage.scala +++ b/library/src/main/scala/storage.scala @@ -1,14 +1,44 @@ package pamflet import java.io.File +import java.nio.charset.Charset import com.tristanhunt.knockoff._ import collection.immutable.Map -import java.nio.charset.Charset +import collection.concurrent.TrieMap trait Storage { def globalized: Globalized } +/** Cache FileStorage based on the last modified time. + * This should make previewing much faster on large pamflets. + */ +case class CachedFileStorage(base: File) extends Storage { + def allFiles(f0: File): Seq[File] = + f0.listFiles.toVector flatMap { + case dir if dir.isDirectory => allFiles(dir) + case f => Vector(f) + } + def maxLastModified(f0: File): Long = + (allFiles(f0) map {_.lastModified}).max + + def globalized = { + val lm = maxLastModified(base) + CachedFileStorage.cache.get(base) match { + case Some((lm0, gl0)) if lm == lm0 => gl0 + case _ => + val st = FileStorage(base) + val gl = st.globalized + CachedFileStorage.cache(base) = (lm, gl) + gl + } + } +} + +object CachedFileStorage { + val cache: TrieMap[File, (Long, Globalized)] = TrieMap() +} + case class FileStorage(base: File) extends Storage { def propFile(dir: File): Option[File] = new File(dir, "template.properties") match {