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 {