You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2010/05/31 21:15:45 UTC
svn commit: r949836 - in /incubator/clerezza/trunk/scala-scripting: ./
script-engine/ script-engine/src/main/resources/OSGI-INF/
script-engine/src/main/scala/org/apache/clerezza/scala/console/
script-engine/src/main/scala/org/apache/clerezza/scala/scri...
Author: reto
Date: Mon May 31 19:15:45 2010
New Revision: 949836
URL: http://svn.apache.org/viewvc?rev=949836&view=rev
Log:
CLEREZZA-221 Actor based interpreter thread
Added:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleContextScalaInterpreter.scala
- copied, changed from r949595, incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/BundleContextScalaInterpreter.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleFS.scala
- copied, changed from r949595, incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/BundleFS.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/InterpreterFactory.scala
- copied, changed from r949595, incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/InterpreterFactory.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/ScriptEngineFactory.scala
- copied, changed from r949595, incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/ScriptEngineFactory.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/Utils.scala
- copied, changed from r949595, incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/Utils.scala
Removed:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/BundleContextScalaInterpreter.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/BundleFS.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/InterpreterFactory.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/InterpreterService.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/Launcher.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/ScriptEngineFactory.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/Utils.scala
Modified:
incubator/clerezza/trunk/scala-scripting/pom.xml
incubator/clerezza/trunk/scala-scripting/script-engine/pom.xml
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/resources/OSGI-INF/serviceComponents.xml
incubator/clerezza/trunk/scala-scripting/tests/src/test/scala/org/apache/clerezza/scala/tests/ScriptEngineFactoryTest.scala
Modified: incubator/clerezza/trunk/scala-scripting/pom.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/pom.xml?rev=949836&r1=949835&r2=949836&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/pom.xml (original)
+++ incubator/clerezza/trunk/scala-scripting/pom.xml Mon May 31 19:15:45 2010
@@ -60,6 +60,12 @@
</goals>
</execution>
</executions>
+ <configuration>
+
+ <args>
+ <arg>-deprecation</arg>
+ </args>
+ </configuration>
</plugin>
</plugins>
</build>
Modified: incubator/clerezza/trunk/scala-scripting/script-engine/pom.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/pom.xml?rev=949836&r1=949835&r2=949836&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/script-engine/pom.xml (original)
+++ incubator/clerezza/trunk/scala-scripting/script-engine/pom.xml Mon May 31 19:15:45 2010
@@ -45,10 +45,10 @@
<configuration>
<instructions>
<Service-Component>OSGI-INF/serviceComponents.xml</Service-Component>
- <Export-Pacakge>org.apache.clerezza.scala.console</Export-Pacakge>
- <Private-Package>org.apache.clerezza.scala.console</Private-Package>
+ <Export-Pacakge>org.apache.clerezza.scala.scripting</Export-Pacakge>
+ <Private-Package>org.apache.clerezza.scala.scripting</Private-Package>
<DynamicImport-Package>*</DynamicImport-Package>
- <Bundle-SymbolicName>org.apache.clerezza.scala.console</Bundle-SymbolicName>
+ <Bundle-SymbolicName>org.apache.clerezza.scala.scripting</Bundle-SymbolicName>
</instructions>
</configuration>
</plugin>
Modified: incubator/clerezza/trunk/scala-scripting/script-engine/src/main/resources/OSGI-INF/serviceComponents.xml
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/src/main/resources/OSGI-INF/serviceComponents.xml?rev=949836&r1=949835&r2=949836&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/script-engine/src/main/resources/OSGI-INF/serviceComponents.xml (original)
+++ incubator/clerezza/trunk/scala-scripting/script-engine/src/main/resources/OSGI-INF/serviceComponents.xml Mon May 31 19:15:45 2010
@@ -1,29 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0">
- <scr:component enabled="true" immediate="true" name="org.apache.clerezza.scala.console.InterpreterService">
- <implementation class="org.apache.clerezza.scala.console.InterpreterService"/>
- <property name="service.pid" value="org.apache.clerezza.scala.console.InterpreterService"/>
- </scr:component>
- <scr:component enabled="true" immediate="true" name="org.apache.clerezza.scala.console.InterpreterFactory">
- <implementation class="org.apache.clerezza.scala.console.InterpreterFactory"/>
+ <!-- <scr:component enabled="true" immediate="true" name="org.apache.clerezza.scala.scripting.InterpreterService">
+ <implementation class="org.apache.clerezza.scala.scripting.InterpreterService"/>
+ <property name="service.pid" value="org.apache.clerezza.scala.scripting.InterpreterService"/>
+ </scr:component> -->
+ <scr:component enabled="true" immediate="true" name="org.apache.clerezza.scala.scripting.InterpreterFactory">
+ <implementation class="org.apache.clerezza.scala.scripting.InterpreterFactory"/>
<service servicefactory="false">
- <provide interface="org.apache.clerezza.scala.console.InterpreterFactory"/>
+ <provide interface="org.apache.clerezza.scala.scripting.InterpreterFactory"/>
</service>
- <property name="service.pid" value="org.apache.clerezza.scala.console.InterpreterFactory"/>
+ <property name="service.pid" value="org.apache.clerezza.scala.scripting.InterpreterFactory"/>
</scr:component>
- <scr:component enabled="true" immediate="true" name="org.apache.clerezza.scala.console.ScriptEngineFactory">
- <implementation class="org.apache.clerezza.scala.console.ScriptEngineFactory"/>
+ <scr:component enabled="true" immediate="true" name="org.apache.clerezza.scala.scripting.ScriptEngineFactory">
+ <implementation class="org.apache.clerezza.scala.scripting.ScriptEngineFactory"/>
<service servicefactory="false">
<provide interface="javax.script.ScriptEngineFactory"/>
</service>
- <property name="service.pid" value="org.apache.clerezza.scala.console.ScriptEngineFactory"/>
+ <property name="service.pid" value="org.apache.clerezza.scala.scripting.ScriptEngineFactory"/>
<reference name="interpreterFactory"
- interface="org.apache.clerezza.scala.console.InterpreterFactory"
+ interface="org.apache.clerezza.scala.scripting.InterpreterFactory"
cardinality="1..1"
bind="bindInterpreterFactory" unbind="unbindInterpreterFactory"/>
</scr:component>
- <!-- <scr:component enabled="true" immediate="true" name="org.apache.clerezza.scala.console.Launcher">
- <implementation class="org.apache.clerezza.scala.console.Launcher"/>
- <property name="service.pid" value="org.apache.clerezza.scala.console.Launcher"/>
+ <!-- <scr:component enabled="true" immediate="true" name="org.apache.clerezza.scala.scripting.Launcher">
+ <implementation class="org.apache.clerezza.scala.scripting.Launcher"/>
+ <property name="service.pid" value="org.apache.clerezza.scala.scripting.Launcher"/>
</scr:component> -->
</components>
Copied: incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleContextScalaInterpreter.scala (from r949595, incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/BundleContextScalaInterpreter.scala)
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleContextScalaInterpreter.scala?p2=incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleContextScalaInterpreter.scala&p1=incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/BundleContextScalaInterpreter.scala&r1=949595&r2=949836&rev=949836&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/BundleContextScalaInterpreter.scala (original)
+++ incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleContextScalaInterpreter.scala Mon May 31 19:15:45 2010
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.clerezza.scala.console;
+package org.apache.clerezza.scala.scripting;
@@ -48,42 +48,41 @@ class BundleContextScalaInterpreter(bund
override lazy val classLoader: AbstractFileClassLoader = {
new AbstractFileClassLoader(virtualDirectory, this.getClass.getClassLoader())
}
- override protected def newCompiler(settings: Settings, reporter: Reporter) = {
- reporter.info(scala.tools.nsc.util.NoPosition, "new Compiler", true)
- settings.outputDirs setSingleOutput virtualDirectory
- new Global(settings, reporter) {
- private lazy val _classPath: ClassPath[AbstractFile] = {
-
- val classPathOrig: ClassPath[AbstractFile] = new PathResolver(settings).result
-
- val classPathAbstractFiles = for (bundle <- bundles;
- val url = bundle.getResource("/");
- if url != null) yield {
- if ("file".equals(url.getProtocol())) {
- new PlainFile(new File(url.toURI()))
- }
- else {
- BundleFS.create(bundle);
- }
+ override protected def newCompiler(settings: Settings, reporter: Reporter) = {
+ settings.outputDirs setSingleOutput virtualDirectory
+ new Global(settings, reporter) {
+ private lazy val _classPath: ClassPath[AbstractFile] = {
+
+ val classPathOrig: ClassPath[AbstractFile] = new PathResolver(settings).result
+
+ val classPathAbstractFiles = for (bundle <- bundles;
+ val url = bundle.getResource("/");
+ if url != null) yield {
+ if ("file".equals(url.getProtocol())) {
+ new PlainFile(new File(url.toURI()))
+ }
+ else {
+ BundleFS.create(bundle);
}
- val classPaths: List[ClassPath[AbstractFile]] = (for (abstractFile <- classPathAbstractFiles)
- yield {
- new DirectoryClassPath(abstractFile, classPathOrig.context)
- }) toList
-
- val classPath = new MergedClassPath[AbstractFile](classPathOrig :: classPaths,
- classPathOrig.context)
- classPath
- }
- override lazy val classPath: ClassPath[_] = {
- _classPath
}
+ val classPaths: List[ClassPath[AbstractFile]] = (for (abstractFile <- classPathAbstractFiles)
+ yield {
+ new DirectoryClassPath(abstractFile, classPathOrig.context)
+ }) toList
+
+ val classPath = new MergedClassPath[AbstractFile](classPathOrig :: classPaths,
+ classPathOrig.context)
+ classPath
+ }
+ override lazy val classPath: ClassPath[_] = {
+ _classPath
+ }
- override def rootLoader: LazyType = {
-
- new loaders.JavaPackageLoader(_classPath)
- }
+ override def rootLoader: LazyType = {
+
+ new loaders.JavaPackageLoader(_classPath)
}
}
}
+}
Copied: incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleFS.scala (from r949595, incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/BundleFS.scala)
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleFS.scala?p2=incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleFS.scala&p1=incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/BundleFS.scala&r1=949595&r2=949836&rev=949836&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/BundleFS.scala (original)
+++ incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleFS.scala Mon May 31 19:15:45 2010
@@ -21,9 +21,9 @@ import scala.tools.nsc.io.AbstractFile
import java.io.{File, InputStream, OutputStream, IOException}
import java.net.URL
import org.osgi.framework.Bundle
-import org.apache.clerezza.scala.console.Utils.{valueOrElse, nullOrElse}
+import org.apache.clerezza.scala.scripting.Utils.{valueOrElse, nullOrElse}
-package org.apache.clerezza.scala.console {
+package org.apache.clerezza.scala.scripting {
Copied: incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/InterpreterFactory.scala (from r949595, incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/InterpreterFactory.scala)
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/InterpreterFactory.scala?p2=incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/InterpreterFactory.scala&p1=incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/InterpreterFactory.scala&r1=949595&r2=949836&rev=949836&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/InterpreterFactory.scala (original)
+++ incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/InterpreterFactory.scala Mon May 31 19:15:45 2010
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.clerezza.scala.console;
+package org.apache.clerezza.scala.scripting;
Copied: incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/ScriptEngineFactory.scala (from r949595, incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/ScriptEngineFactory.scala)
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/ScriptEngineFactory.scala?p2=incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/ScriptEngineFactory.scala&p1=incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/ScriptEngineFactory.scala&r1=949595&r2=949836&rev=949836&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/ScriptEngineFactory.scala (original)
+++ incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/ScriptEngineFactory.scala Mon May 31 19:15:45 2010
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.clerezza.scala.console;
+package org.apache.clerezza.scala.scripting;
@@ -36,8 +36,9 @@ import scala.tools.nsc.reporters.Reporte
import scala.tools.util.PathResolver
import scala.tools.nsc.util.{ClassPath, JavaClassPath}
import javax.script.ScriptContext
-import javax.script.{ScriptEngineFactory => JavaxEngineFactory, ScriptEngine, AbstractScriptEngine, Bindings, SimpleBindings}
-
+import javax.script.{ScriptEngineFactory => JavaxEngineFactory, ScriptEngine, AbstractScriptEngine, Bindings, SimpleBindings, ScriptException}
+import scala.actors.Actor
+import scala.actors.Actor._
class ScriptEngineFactory() extends JavaxEngineFactory {
@@ -98,22 +99,49 @@ class ScriptEngineFactory() extends Jav
}
eval(scriptStringWriter.toString, context)
}
- override def eval(script : String, context : ScriptContext) : Object = {
- //not yet threadsafe
- val jTypeMap : java.util.Map[String, java.lang.reflect.Type] =
- new java.util.HashMap[String, java.lang.reflect.Type]()
- val valueMap = new java.util.HashMap[String, Any]()
- import _root_.scala.collection.JavaConversions._
- for (scope <- context.getScopes;
- if (context.getBindings(scope.intValue) != null);
- entry <- context.getBindings(scope.intValue)) {
- interpreter.bind(entry._1,
- getAccessibleClass(entry._2.getClass).getName, entry._2)
- }
- interpreter.eval[Object](script) match {
- case Some(x) => x
- case None => null
+ lazy val interpreterAction = actor {
+ //not using loop { react {, as this method doesn't seem to guarantee
+ //asynchronous execution
+ //also using react with a final invocation of act() different exception from interprter.bind have been seen
+ while(true) {
+ receive {
+ case (script : String, context : ScriptContext) => {
+ //not yet threadsafe, but the test isn't failing
+ //should pass jobs to actor that guarantees they are executed sequentially
+ //and binding to not inferfere
+ val jTypeMap : java.util.Map[String, java.lang.reflect.Type] =
+ new java.util.HashMap[String, java.lang.reflect.Type]()
+ val valueMap = new java.util.HashMap[String, Any]()
+ import _root_.scala.collection.JavaConversions._
+ for (scope <- context.getScopes;
+ if (context.getBindings(scope.intValue) != null);
+ entry <- context.getBindings(scope.intValue)) {
+ interpreter.bind(entry._1,
+ getAccessibleClass(entry._2.getClass).getName, entry._2)
+ }
+ val result = interpreter.eval[Object](script) match {
+ case Some(x) => x
+ case None => null
+ }
+ if (interpreter.reporter.hasErrors) {
+ throw new ScriptException("some error","script-file",1)
+ }
+ sender ! result
+ }
+ }
+ }
+ }
+
+
+ override def eval(script : String, context : ScriptContext) : Object = {
+ /*val timeout = 180*1000
+ interpreterAction !? (timeout, (script, context)) match {
+ case Some(x : Object) => x
+ case x => throw new RuntimeException("Timeout executing script")
+ }*/
+ interpreterAction !? ((script, context)) match {
+ case x : Object => x
}
}
override def getFactory() = ScriptEngineFactory.this
Copied: incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/Utils.scala (from r949595, incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/Utils.scala)
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/Utils.scala?p2=incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/Utils.scala&p1=incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/Utils.scala&r1=949595&r2=949836&rev=949836&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/console/Utils.scala (original)
+++ incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/Utils.scala Mon May 31 19:15:45 2010
@@ -14,12 +14,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.clerezza.scala.console
+package org.apache.clerezza.scala.scripting
/**
* General purpose utility functions
*/
-object Utils{
+object Utils {
/**
* Evaluate <code>f</code> on <code>s</code> if <code>s</code> is not null.
@@ -27,7 +27,7 @@ object Utils{
* @param f
* @return <code>f(s)</code> if s is not <code>null</code>, <code>null</code> otherwise.
*/
- protected[console] def nullOrElse[S, T](s: S)(f: S => T): T =
+ protected[scripting] def nullOrElse[S, T](s: S)(f: S => T): T =
if (s == null) null.asInstanceOf[T]
else f(s)
@@ -36,7 +36,7 @@ object Utils{
* @param default
* @return <code>t</code> or <code>default</code> if <code>null</code>.
*/
- protected[console] def valueOrElse[T](t: T)(default: => T) =
+ protected[scripting] def valueOrElse[T](t: T)(default: => T) =
if (t == null) default
else t
@@ -46,7 +46,7 @@ object Utils{
* @returns <code>Some(value)</code> if value is not <code>null</code>,
* <code>None</code> otherwise.
*/
- protected[console] def option[T](value: T): Option[T] =
+ protected[scripting] def option[T](value: T): Option[T] =
if (null == value) None else Some(value)
}
Modified: incubator/clerezza/trunk/scala-scripting/tests/src/test/scala/org/apache/clerezza/scala/tests/ScriptEngineFactoryTest.scala
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/tests/src/test/scala/org/apache/clerezza/scala/tests/ScriptEngineFactoryTest.scala?rev=949836&r1=949835&r2=949836&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/tests/src/test/scala/org/apache/clerezza/scala/tests/ScriptEngineFactoryTest.scala (original)
+++ incubator/clerezza/trunk/scala-scripting/tests/src/test/scala/org/apache/clerezza/scala/tests/ScriptEngineFactoryTest.scala Mon May 31 19:15:45 2010
@@ -32,8 +32,10 @@ import org.junit.Before;
import org.junit.Test;
import org.ops4j.pax.exam.Inject;
import org.osgi.framework.BundleContext;
-import javax.script.ScriptEngineFactory
-import org.osgi.util.tracker.ServiceTracker;
+import javax.script.{ScriptEngineFactory, Bindings, ScriptException}
+import org.osgi.util.tracker.ServiceTracker
+import scala.actors.Actor
+import scala.math.random
/**
@@ -50,13 +52,12 @@ class ScriptEngineFactoryTest {
private var webServerExist = false;
- private var scriptEngineFactory: ScriptEngineFactory = null;
+ private var factory: ScriptEngineFactory = null;
@Before
def getService() : Unit = {
/*webServerExist = waitForWebserver();*/
- scriptEngineFactory = waitFor(classOf[ScriptEngineFactory], 300000);
- println("Got: "+scriptEngineFactory)
+ factory = waitFor(classOf[ScriptEngineFactory], 300000);
}
private def waitFor[T](aClass: Class[T], timeout: Long): T = {
@@ -70,9 +71,67 @@ class ScriptEngineFactoryTest {
@Test
def checkEngine(): Unit = {
- Assert.assertNotNull(scriptEngineFactory)
+ Assert.assertNotNull(factory)
+ Assert.assertEquals("Scala Scripting Engine for OSGi", factory.getEngineName);
+ val s = "hello"
+ val engine = factory.getScriptEngine
+ Assert.assertEquals(s, engine.eval("\""+s+"\""))
+ val bindings = engine.createBindings
+ bindings.put("s",s)
+ Assert.assertEquals(s, engine.eval("s", bindings))
}
+ @Test
+ def testConcurrency : Unit = {
+ import scala.actors.Actor._
+ val actorsCount = 5
+ val iterationsCount = 9
+ val testRunner = self
+ for (i <- 1 to actorsCount) {
+ object ValueVerifier extends Actor {
+ def act() {
+ try {
+ for (i <- 1 to iterationsCount) {
+ val s = "r: "+random.toString
+ val engine = factory.getScriptEngine
+ val bindings = engine.createBindings
+ bindings.put("s",s)
+ val script = """
+import scala.math.random
+Thread.sleep((random*10).toInt)
+s"""
+ testRunner ! (s, engine.eval(script, bindings))
+ }
+ } catch {
+ case t => testRunner ! t
+ }
+ }
+ }
+ ValueVerifier.start()
+ }
+ for (i <- 1 to (actorsCount*iterationsCount)) {
+ self.receive {
+ case (expected, got) => {
+ Assert.assertEquals(expected, got)
+ }
+ case t : Throwable => throw t
+ }
+ }
+
+ }
+
+ //This seems hard to realize before https://lampsvn.epfl.ch/trac/scala/ticket/3513 is fixed
+ /*@Test
+ def checkException(): Unit = {
+ val s = """val s="hello"
+ illegal.do"""
+ val engine = factory.getScriptEngine
+ try {
+ Assert.assertEquals("should have exception",engine.eval(s))
+ } catch {
+ case e : ScriptException => Assert.assertEquals(2, e.getLineNumber)
+ }
+ }*/
}
object ScriptEngineFactoryTest {