スクリプト可能なオブジェクト ラッパーからネイティブの DateTime を返すことができましたが、スコープとコンテキストへの参照を持つラッパーが必要です。おそらくこれらの参照を渡す必要がない、これを行うためのより良い方法はありますか? (これは JodaTime ライブラリと Sugar JS を使用して Scala に実装されています)
テスト評価
import org.joda.time.DateTime
import org.mozilla.javascript._
object RhinoTest {
val sugarScript = {
val c= Context.enter
val scope = c.initStandardObjects()
c.compileString(FileUtil.readAllText("sugar-1.3.7.min.js"), "sugar", 1, null)
}
def main(args:Array[String]): Unit = {
val cx = Context.enter
val scope = cx.initStandardObjects()
sugarScript.exec(c1, scope)
val testDate = new DateTime(2010,10,10, 0, 0)
val wrapper = Wrapper(Map("date" -> testDate),cx, scope)
ScriptableObject.putProperty(scope, "map", wrapper)
println(c1.evaluateString(scope,"Date.create('Tuesday').isBefore(map.date)", "Source", 1, null))
}
}
そしてラッパークラス
case class Wrapper(map:Map[String,Any], cx:Context, scope:Scriptable) extends ScriptableObject {
def getClassName() = "Wrapper"
override def get(name:String, start:Scriptable):Object =
(map.getOrElse(name, null) match {
case d:DateTime => {
val a = List[AnyRef](d.getMillis.asInstanceOf[java.lang.Long]).toArray
cx.newObject(scope, "Date", a)
}
case a => a
}).asInstanceOf[AnyRef]
}