Author: reto
Date: Mon May 31 22:13:39 2010
New Revision: 949876
URL: http://svn.apache.org/viewvc?rev=949876&view=rev
Log:
CLEREZZA-221: updating interpreter on bunlde-events
Modified:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleContextScalaInterpreter.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/InterpreterFactory.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/ScriptEngineFactory.scala
incubator/clerezza/trunk/scala-scripting/tests/src/test/scala/org/apache/clerezza/scala/tests/ScriptEngineFactoryTest.scala
Modified:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/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?rev=949876&r1=949875&r2=949876&view=diff
==============================================================================
---
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleContextScalaInterpreter.scala
(original)
+++
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/BundleContextScalaInterpreter.scala
Mon May 31 22:13:39 2010
@@ -18,71 +18,72 @@
*/
package org.apache.clerezza.scala.scripting;
-
-
-import org.apache.felix.scr.annotations.Component;
-import org.osgi.service.component.ComponentContext;
+import org.osgi.framework.BundleContext
import org.osgi.framework.Bundle
import java.io.{File, PrintWriter}
-import java.util.{ArrayList, Arrays};
import scala.tools.nsc._;
import scala.tools.nsc.interpreter._;
import scala.tools.nsc.io.{AbstractFile, PlainFile}
import scala.tools.nsc.util._
-import scala.tools.nsc.symtab.SymbolLoaders
+import java.io.PrintWriter
import java.net._
-import scala.tools.nsc.reporters.ConsoleReporter
+import scala.tools.nsc.io.AbstractFile
import scala.tools.nsc.reporters.Reporter
import scala.tools.util.PathResolver
-import scala.tools.nsc.util.{ClassPath, JavaClassPath}
-class BundleContextScalaInterpreter(bundles: Array[Bundle], out: PrintWriter)
+
+class BundleContextScalaInterpreter(bundleContext : BundleContext, out:
PrintWriter)
extends Interpreter(new Settings, out) {
- def this(bundles: Array[Bundle]) = {
- this(bundles, new PrintWriter(System.out))
+ def this(bundleContext : BundleContext) = {
+ this(bundleContext, new PrintWriter(System.out))
}
- protected val PATH_SEPARATOR = System.getProperty("path.separator")
override lazy val classLoader: AbstractFileClassLoader = {
new AbstractFileClassLoader(virtualDirectory,
this.getClass.getClassLoader())
}
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
+ new BundleContextScalaCompiler(bundleContext, settings,
reporter)
+ }
+}
- 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
+/*
+ * unfortunately there seems to be no way to change the classpath, so this
doesn't
+ * listen to BunldeEvents
+ */
+class BundleContextScalaCompiler(bundleContext : BundleContext,
+ settings: Settings, reporter: Reporter)
+ extends Global(settings, reporter) {
+
+
+ override lazy val classPath: ClassPath[AbstractFile] = {
+
+ val classPathOrig: ClassPath[AbstractFile] = new
PathResolver(settings).result
+ var bundles: Array[Bundle] = bundleContext.getBundles
+ val classPathAbstractFiles = for (bundle <- bundles;
+
val url = bundle.getResource("/");
+
if url != null) yield {
+ if ("file".equals(url.getProtocol())) {
+ new PlainFile(new File(url.toURI()))
}
- override lazy val classPath: ClassPath[_] = {
- _classPath
+ else {
+ BundleFS.create(bundle);
}
+ }
+ val classPaths: List[ClassPath[AbstractFile]] = (for
(abstractFile <- classPathAbstractFiles)
+ yield {
+ new DirectoryClassPath(abstractFile,
classPathOrig.context)
+ }) toList
- override def rootLoader: LazyType = {
+ new MergedClassPath[AbstractFile](classPathOrig :: classPaths,
+ classPathOrig.context)
- new loaders.JavaPackageLoader(_classPath)
- }
- }
+ }
+
+ override def rootLoader: LazyType = {
+ new loaders.JavaPackageLoader(classPath)
}
}
Modified:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/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?rev=949876&r1=949875&r2=949876&view=diff
==============================================================================
---
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/InterpreterFactory.scala
(original)
+++
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/InterpreterFactory.scala
Mon May 31 22:13:39 2010
@@ -21,6 +21,7 @@ package org.apache.clerezza.scala.script
import org.apache.felix.scr.annotations.Component;
+import org.osgi.framework.BundleContext
import org.osgi.service.component.ComponentContext;
import org.osgi.framework.Bundle
import java.io.{File, PrintWriter}
@@ -40,18 +41,20 @@ import scala.tools.nsc.util.{ClassPath,
class InterpreterFactory() {
protected var bundles: Array[Bundle] = null
+ protected var bundleContext : BundleContext = null;
def activate(componentContext: ComponentContext)= {
- bundles = componentContext.getBundleContext.getBundles
- //TODO register listener for bunle-changed events
+ bundleContext = componentContext.getBundleContext
}
def deactivate(componentContext: ComponentContext) = {
- bundles = null
+ bundleContext = null
}
- def createInterpreter(out: PrintWriter) : Interpreter =
- new BundleContextScalaInterpreter(bundles, out)
+ def createInterpreter(out: PrintWriter) : Interpreter = {
+ val i = new BundleContextScalaInterpreter(bundleContext, out)
+ i
+ }
}
Modified:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/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?rev=949876&r1=949875&r2=949876&view=diff
==============================================================================
---
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/ScriptEngineFactory.scala
(original)
+++
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/ScriptEngineFactory.scala
Mon May 31 22:13:39 2010
@@ -21,6 +21,8 @@ package org.apache.clerezza.scala.script
import org.apache.felix.scr.annotations.Component;
+import org.osgi.framework.BundleEvent
+import org.osgi.framework.BundleListener
import org.osgi.service.component.ComponentContext;
import org.osgi.framework.Bundle
import java.io.{File, PrintWriter, Reader, StringWriter}
@@ -40,9 +42,25 @@ import javax.script.{ScriptEngineFactory
import scala.actors.Actor
import scala.actors.Actor._
-class ScriptEngineFactory() extends JavaxEngineFactory {
+class ScriptEngineFactory() extends JavaxEngineFactory with BundleListener {
- var interpreter : Interpreter = null;
+
+ def bundleChanged(event: BundleEvent) = {
+ MyScriptEngine.interpreterAction !
ScriptEngineFactory.RefreshInterpreter
+ }
+
+ var factory: InterpreterFactory = null
+ var _interpreter : Interpreter = null;
+ def interpreter = {
+ if (_interpreter == null) {
+ this.synchronized {
+ if (_interpreter == null) {
+ _interpreter =
factory.createInterpreter(new PrintWriter(System.out))
+ }
+ }
+ }
+ _interpreter
+ }
//methods from ScriptEngineFactory
@@ -73,19 +91,22 @@ class ScriptEngineFactory() extends Jav
override def getScriptEngine : ScriptEngine = MyScriptEngine
def activate(componentContext: ComponentContext)= {
-
+ val bundleContext = componentContext.getBundleContext
+ bundleContext.addBundleListener(this)
}
def deactivate(componentContext: ComponentContext) = {
-
+ val bundleContext = componentContext.getBundleContext
+ bundleContext.removeBundleListener(this)
}
def bindInterpreterFactory(f: InterpreterFactory) = {
- interpreter = f.createInterpreter(new PrintWriter(System.out))
+ factory = f
}
def unbindInterpreterFactory(f: InterpreterFactory) = {
- interpreter = null
+ factory = null
+ _interpreter = null
}
/** Inner object as it accesse interpreter
*/
@@ -110,24 +131,31 @@ class ScriptEngineFactory() extends Jav
//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] =
+ try {
+ 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
+ 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
+ } catch {
+ case e =>
sender ! ScriptEngineFactory.ActorException(e)
}
- if
(interpreter.reporter.hasErrors) {
- throw new
ScriptException("some error","script-file",1)
- }
- sender ! result
+ }
+ case
ScriptEngineFactory.RefreshInterpreter => {
+ _interpreter =
null;
}
}
}
@@ -141,6 +169,7 @@ class ScriptEngineFactory() extends Jav
case x => throw new RuntimeException("Timeout
executing script")
}*/
interpreterAction !? ((script, context)) match {
+ case ScriptEngineFactory.ActorException(e) =>
throw e
case x : Object => x
}
}
@@ -186,4 +215,7 @@ class ScriptEngineFactory() extends Jav
}
}
-
+object ScriptEngineFactory {
+ case class ActorException(e: Throwable);
+ case object RefreshInterpreter;
+}
\ No newline at end of file
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=949876&r1=949875&r2=949876&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 22:13:39 2010
@@ -120,6 +120,23 @@ s"""
}
+ @Test
+ def classFromNewlyAddedBundle(): Unit = {
+ val s = "hello"
+ val engine = factory.getScriptEngine
+ val bindings = engine.createBindings
+ bindings.put("s",s)
+ Assert.assertEquals(s, engine.eval("s", bindings))
+
bundleContext.installBundle("http://repo2.maven.org/maven2/org/wymiwyg/wrhapi/0.8.2/wrhapi-0.8.2.jar");
+ println("sleeping")
+ Thread.sleep(1000)
+ val script = """
+import org.wymiwyg.wrhapi._
+val h : Handler = null
+s"""
+ Assert.assertEquals(s, engine.eval(script, bindings))
+ }
+
//This seems hard to realize before
https://lampsvn.epfl.ch/trac/scala/ticket/3513 is fixed
/*...@test
def checkException(): Unit = {