Rhino,使用scriptableObject包装器返回Native DateTime

时间:2013-01-04 12:51:01

标签: scala rhino

我已经设法从可编写脚本的对象包装器返回Native 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]
}

1 个答案:

答案 0 :(得分:0)

无法自动将Date转换为NativeDate。您必须自己执行转换。

查看类似问题的答案here

  

Rhino默认情况下不会将Java Number和String对象转换为   相应的原始类型。相反,它将它们包装到一个特殊的脚本中   对象的方式与将任何其他JavaObject公开给脚本的方式相同   LiveConnect,它只将原始Java值转换为相应的值   脚本值。要覆盖它,您需要提供自定义   WrapHandler(即将推出的Rhino 1.5R4中的WrapFactory)。

     

JavaScript中的java.util.Date和Date对象是完全不同的   不仅通过他们的API,还通过内部演示。特别是,   脚本中的日期可以保存NaN值,而java.util.Date则不能。对于   这些原因最好留给应用程序来决定如何   将一个转换为另一个。

要考虑的一件事是在运行脚本之前执行转换,避免使用任何包装器:

Object nativeDate = cx.newObject(scope, "Date", new Object[] {new Date().getTime()})
ScriptableObject.putProperty(scope, "date", nativeDate)