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 =  {


Reply via email to