Skip to content

Commit 958198b

Browse files
author
Sam Pullara
committed
add a scalaobjecthandler that doesnt require the twitter libraries
1 parent 2dbe941 commit 958198b

2 files changed

Lines changed: 96 additions & 2 deletions

File tree

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.twitter.mustache
2+
3+
import collection.JavaConversions._
4+
import com.github.mustachejava.Iteration
5+
import com.github.mustachejava.reflect.ReflectionObjectHandler
6+
import java.io.Writer
7+
import java.lang.reflect.{Field, Method}
8+
9+
/**
10+
* Plain old scala handler that doesn't depend on Twitter libraries.
11+
*/
12+
class ScalaObjectHandler extends ReflectionObjectHandler {
13+
14+
// Allow any method or field
15+
override def checkMethod(member: Method) {}
16+
17+
override def checkField(member: Field) {}
18+
19+
override def coerce(value: Object) = {
20+
value match {
21+
case m: Map[_, _] => asJavaMap(m)
22+
case o: Option[_] => o match {
23+
case Some(some: Object) => coerce(some)
24+
case None => null
25+
}
26+
case _ => value
27+
}
28+
}
29+
30+
override def iterate(iteration: Iteration, writer: Writer, value: Object, scopes: Array[Object]) = {
31+
value match {
32+
case t: Traversable[AnyRef] => {
33+
var newWriter = writer
34+
t map {
35+
next =>
36+
newWriter = iteration.next(newWriter, coerce(next), scopes)
37+
}
38+
newWriter
39+
}
40+
case n: Number => if (n == 0) writer else iteration.next(writer, coerce(value), scopes)
41+
case _ => super.iterate(iteration, writer, value, scopes)
42+
}
43+
}
44+
45+
override def falsey(iteration: Iteration, writer: Writer, value: Object, scopes: Array[Object]) = {
46+
value match {
47+
case t: Traversable[AnyRef] => {
48+
if (t.isEmpty) {
49+
iteration.next(writer, value, scopes)
50+
} else {
51+
writer
52+
}
53+
}
54+
case n: Number => if (n == 0) iteration.next(writer, coerce(value), scopes) else writer
55+
case _ => super.falsey(iteration, writer, value, scopes)
56+
}
57+
}
58+
}

compiler/src/test/scala/com/twitter/mustache/ObjectHandlerTest.scala

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ package com.twitter.mustache
33
import com.github.mustachejava.DefaultMustacheFactory
44
import com.twitter.util.FuturePool
55
import java.io.{StringWriter, StringReader}
6-
import java.util.concurrent.Executors
6+
import java.util.concurrent.{Callable, Executors}
77
import org.junit.{Assert, Test}
88

99
class ObjectHandlerTest {
1010
@Test
11-
def testHandler() {
11+
def testTwitterHandler() {
1212
val pool = Executors.newCachedThreadPool()
1313
val futurePool = FuturePool(pool)
1414
val mf = new DefaultMustacheFactory()
@@ -43,4 +43,40 @@ class ObjectHandlerTest {
4343
writer.close()
4444
Assert.assertEquals("Hello, world!?!\nGoodbye, thanks for all the fish!!?test\n", sw.toString)
4545
}
46+
47+
@Test
48+
def testScalaHandler() {
49+
val pool = Executors.newCachedThreadPool()
50+
val mf = new DefaultMustacheFactory()
51+
mf.setObjectHandler(new TwitterObjectHandler)
52+
mf.setExecutorService(pool)
53+
val m = mf.compile(
54+
new StringReader("{{#list}}{{optionalHello}}, {{futureWorld}}!" +
55+
"{{#test}}?{{/test}}{{^test}}!{{/test}}{{#num}}?{{/num}}{{^num}}!{{/num}}" +
56+
"{{#map}}{{value}}{{/map}}\n{{/list}}"),
57+
"helloworld"
58+
)
59+
val sw = new StringWriter
60+
val writer = m.execute(sw, new {
61+
val list = Seq(new {
62+
lazy val optionalHello = Some("Hello")
63+
val futureWorld = pool.submit(new Callable[String] {
64+
def call(): String = "world"
65+
})
66+
val test = true
67+
val num = 0
68+
}, new {
69+
val optionalHello = Some("Goodbye")
70+
val futureWorld = pool.submit(new Callable[String] {
71+
def call(): String = "thanks for all the fish"
72+
})
73+
lazy val test = false
74+
val map = Map(("value", "test"))
75+
val num = 1
76+
})
77+
})
78+
// You must use close if you use concurrent latched writers
79+
writer.close()
80+
Assert.assertEquals("Hello, world!?!\nGoodbye, thanks for all the fish!!?test\n", sw.toString)
81+
}
4682
}

0 commit comments

Comments
 (0)