Author: reto
Date: Mon Nov 15 00:18:54 2010
New Revision: 1035107
URL: http://svn.apache.org/viewvc?rev=1035107&view=rev
Log:
Added CompilerService
Added:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/CompilerService.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/FileWrapper.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/GenericFileWrapperTrait.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/VirtualDirectoryWrapper.scala
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/Wrapper.scala
incubator/clerezza/trunk/scala-scripting/tests/src/test/scala/org/apache/clerezza/scala/tests/CompilerServiceTest.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/ (props changed)
incubator/clerezza/trunk/scala-scripting/tests/pom.xml
Modified: incubator/clerezza/trunk/scala-scripting/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/pom.xml?rev=1035107&r1=1035106&r2=1035107&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/pom.xml (original)
+++ incubator/clerezza/trunk/scala-scripting/pom.xml Mon Nov 15 00:18:54 2010
@@ -81,6 +81,37 @@
</args>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>add-source</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>add-source</goal>
+ </goals>
+ <configuration>
+ <sources>
+
<source>src/main/scala</source>
+ </sources>
+ </configuration>
+ </execution>
+ <execution>
+ <id>add-test-source</id>
+ <phase>generate-sources</phase>
+ <goals>
+ <goal>add-test-source</goal>
+ </goals>
+ <configuration>
+ <sources>
+
<source>src/test/scala</source>
+ </sources>
+ </configuration>
+ </execution>
+
+ </executions>
+ </plugin>
</plugins>
</build>
</project>
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=1035107&r1=1035106&r2=1035107&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/script-engine/pom.xml (original)
+++ incubator/clerezza/trunk/scala-scripting/script-engine/pom.xml Mon Nov 15
00:18:54 2010
@@ -44,6 +44,7 @@
<instructions>
<Service-Component>OSGI-INF/serviceComponents.xml</Service-Component>
<Export-Package>org.apache.clerezza.scala.scripting</Export-Package>
+
<Private-Package>org.apache.clerezza.scala.scripting.util</Private-Package>
<DynamicImport-Package>*</DynamicImport-Package>
<Bundle-SymbolicName>org.apache.clerezza.scala.scripting</Bundle-SymbolicName>
</instructions>
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=1035107&r1=1035106&r2=1035107&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 Nov 15 00:18:54 2010
@@ -11,6 +11,13 @@
</service>
<property name="service.pid"
value="org.apache.clerezza.scala.scripting.InterpreterFactory"/>
</scr:component>
+ <scr:component enabled="true" immediate="true"
name="org.apache.clerezza.scala.scripting.CompilerService">
+ <implementation
class="org.apache.clerezza.scala.scripting.CompilerService"/>
+ <service servicefactory="false">
+ <provide
interface="org.apache.clerezza.scala.scripting.CompilerService"/>
+ </service>
+ <property name="service.pid"
value="org.apache.clerezza.scala.scripting.CompilerService"/>
+ </scr:component>
<scr:component enabled="true" immediate="true"
name="org.apache.clerezza.scala.scripting.ScriptEngineFactory">
<implementation
class="org.apache.clerezza.scala.scripting.ScriptEngineFactory"/>
<service servicefactory="false">
Added:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/CompilerService.scala
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/CompilerService.scala?rev=1035107&view=auto
==============================================================================
---
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/CompilerService.scala
(added)
+++
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/CompilerService.scala
Mon Nov 15 00:18:54 2010
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.scala.scripting;
+
+
+import java.security.AccessController
+import java.security.PrivilegedAction
+import org.apache.clerezza.scala.scripting.util.FileWrapper
+import org.apache.clerezza.scala.scripting.util.GenericFileWrapperTrait
+import org.apache.clerezza.scala.scripting.util.VirtualDirectoryWrapper
+import org.osgi.framework.BundleContext
+import org.osgi.service.component.ComponentContext;
+import scala.tools.nsc._;
+import scala.tools.nsc.interpreter._;
+import scala.tools.nsc.io.AbstractFile
+import scala.tools.nsc.io.VirtualDirectory
+import scala.tools.nsc.reporters.ConsoleReporter
+import scala.tools.nsc.util._
+import java.io.ByteArrayOutputStream
+import java.io.File
+import java.io.PrintWriter
+import java.io.Reader
+import java.net._
+
+
+class CompilerService() {
+
+ protected var bundleContext : BundleContext = null;
+
+ def activate(componentContext: ComponentContext)= {
+ bundleContext = componentContext.getBundleContext
+ }
+
+ def deactivate(componentContext: ComponentContext) = {
+ bundleContext = null
+ }
+
+ def createCompiler(out: PrintWriter, outputSirectory: AbstractFile) :
Global = {
+ val settings = new Settings
+ settings.outputDirs setSingleOutput outputSirectory
+ AccessController.doPrivileged(new
PrivilegedAction[BundleContextScalaCompiler]() {
+ override def run() = {
+ new BundleContextScalaCompiler(bundleContext,
settings,
+ new ConsoleReporter(settings, null,
out) {
+
+ override def printMessage(msg:
String) {
+ out write msg
+ out.flush()
+ }
+ })
+ }
+ })
+ }
+
+ def compile(sources: List[Array[Char]]): List[Class[_]] = {
+ val virtualDirectory = new VirtualDirectory("(memory)", None)
+ compile(sources, virtualDirectory)
+ }
+
+ def compile(sources: List[Array[Char]], rawOutputDirectory:
AbstractFile): List[Class[_]] = {
+
+ var writtenClasses: List[AbstractFile] = List[AbstractFile]()
+
+ trait VirtualDirectoryFlavour extends VirtualDirectoryWrapper {
+ abstract override def output = {
+ println("unexpected call to output "+name)
+ super.output
+ }
+ }
+
+ def wrap(f: AbstractFile): AbstractFile = {
+ f match {
+ case d: VirtualDirectory => new
VirtualDirectoryWrapper(d, wrap) with LoggingFileWrapper with
VirtualDirectoryFlavour {
+ override def output = d.output
+ }
+ case o => new FileWrapper(o, wrap) with
LoggingFileWrapper
+ }
+ }
+
+ trait LoggingFileWrapper extends GenericFileWrapperTrait {
+
+ abstract override def output = {
+ writtenClasses ::= this
+ super.output
+ }
+ }
+ val outputDirectory = wrap(rawOutputDirectory)
+ val out = new ByteArrayOutputStream
+ val printWriter = new PrintWriter(out)
+ val compiler = createCompiler(printWriter, outputDirectory)
+ val sourceFiles: List[SourceFile] = for(chars <- sources) yield
new BatchSourceFile("<script>", chars)
+ (new compiler.Run).compileSources(sourceFiles)
+ printWriter.flush
+ if (compiler.reporter.hasErrors) {
+ compiler.reporter.reset
+ throw new RuntimeException("compile errors: "+new
String(out.toByteArray));
+ }
+ val classLoader = new
AbstractFileClassLoader(rawOutputDirectory, this.getClass.getClassLoader())
+ val result: List[Class[_]] = for (classFile <- writtenClasses;
+
if (!classFile.name.contains('$'))) yield {
+
val path = classFile.path
+
val relevantPath =
path.substring(path.indexOf('/')+1,path.lastIndexOf('.'))
+
val fqn = relevantPath.replace("/",".")
+
classLoader.loadClass(fqn)
+
}
+ return result
+ }
+
+
+}
Added:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/FileWrapper.scala
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/FileWrapper.scala?rev=1035107&view=auto
==============================================================================
---
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/FileWrapper.scala
(added)
+++
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/FileWrapper.scala
Mon Nov 15 00:18:54 2010
@@ -0,0 +1,27 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.apache.clerezza.scala.scripting.util
+
+import scala.tools.nsc.io.AbstractFile
+
+class FileWrapper(val wrapped: AbstractFile, val childWrapper: (AbstractFile)
=> AbstractFile) extends AbstractFile with GenericFileWrapperTrait {
+ println("wrapping!!!")
+
+ /** overriding this hgere rather than in the trait as this is a var in
VirtualDirectory
+ */
+ def lastModified = {
+ wrapped.lastModified
+ }
+
+ override protected def unsupported(msg: String) = {
+ println("unsupported!")
+ try {
+ super.unsupported(msg)
+ } catch {
+ case e => e.printStackTrace(); throw e
+ }
+ }
+}
Added:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/GenericFileWrapperTrait.scala
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/GenericFileWrapperTrait.scala?rev=1035107&view=auto
==============================================================================
---
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/GenericFileWrapperTrait.scala
(added)
+++
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/GenericFileWrapperTrait.scala
Mon Nov 15 00:18:54 2010
@@ -0,0 +1,70 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.apache.clerezza.scala.scripting.util
+
+import scala.tools.nsc.io.AbstractFile
+
+trait GenericFileWrapperTrait extends AbstractFile with Wrapper[AbstractFile] {
+ override def lookupNameUnchecked(name: String,directory: Boolean) = {
+ childWrapper(wrapped.lookupNameUnchecked(name, directory))
+ }
+ override def lookupName(name: String,directory: Boolean) = {
+ wrapped.lookupName(name, directory)
+ }
+ override def iterator = {
+ //TODO wrap
+ wrapped.iterator
+ }
+ override def output = {
+ wrapped.output
+ }
+ override def input = {
+ wrapped.input
+ }
+
+ override def isDirectory = {
+ wrapped.isDirectory
+ }
+ override def delete = {
+ wrapped.delete
+ }
+ override def create = {
+ wrapped.create
+ }
+ override def file = {
+ wrapped.file
+ }
+ override def container = {
+ childWrapper(wrapped.container)
+ }
+ override def absolute = {
+ childWrapper(wrapped.absolute)
+ }
+ override def path = {
+ wrapped.path
+ }
+ override def name = {
+ wrapped.name
+ }
+
+ override def sizeOption = {
+ wrapped.sizeOption
+ }
+
+ override def lookupPath(path: String, directory: Boolean): AbstractFile
= {
+ childWrapper(wrapped.lookupPath(path, directory))
+ }
+ override def lookupPathUnchecked(path: String, directory: Boolean):
AbstractFile = {
+ childWrapper(wrapped.lookupPathUnchecked(path, directory))
+ }
+ override def fileNamed(name: String): AbstractFile = {
+ childWrapper(wrapped.fileNamed(name))
+ }
+
+ override def subdirectoryNamed(name: String): AbstractFile = {
+ childWrapper(wrapped.subdirectoryNamed(name))
+ }
+}
Added:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/VirtualDirectoryWrapper.scala
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/VirtualDirectoryWrapper.scala?rev=1035107&view=auto
==============================================================================
---
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/VirtualDirectoryWrapper.scala
(added)
+++
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/VirtualDirectoryWrapper.scala
Mon Nov 15 00:18:54 2010
@@ -0,0 +1,41 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.apache.clerezza.scala.scripting.util
+
+import scala.tools.nsc.io.AbstractFile
+import scala.tools.nsc.io.VirtualDirectory
+
+class VirtualDirectoryWrapper(val wrapped: AbstractFile,
+ val childWrapper:
(AbstractFile) => AbstractFile) extends VirtualDirectory(null, None)
+ with
GenericFileWrapperTrait {
+ lastModified =wrapped.lastModified
+
+ override def output = {
+ wrapped.asInstanceOf[VirtualDirectory].output
+ }
+ override def input = {
+ wrapped.asInstanceOf[VirtualDirectory].input
+ }
+ override def file = {
+ wrapped.asInstanceOf[VirtualDirectory].file
+ }
+ override def container = {
+ wrapped.asInstanceOf[VirtualDirectory].container
+ }
+ override def absolute = {
+ wrapped.asInstanceOf[VirtualDirectory].absolute
+ }
+ override val name = {
+ wrapped.name
+ }
+ override def lookupPath(path: String, directory: Boolean): AbstractFile
= {
+ childWrapper(wrapped.lookupPath(path, directory))
+ }
+ override def lookupPathUnchecked(path: String, directory: Boolean):
AbstractFile = {
+ childWrapper(wrapped.lookupPathUnchecked(path, directory))
+ }
+
+}
Added:
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/Wrapper.scala
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/Wrapper.scala?rev=1035107&view=auto
==============================================================================
---
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/Wrapper.scala
(added)
+++
incubator/clerezza/trunk/scala-scripting/script-engine/src/main/scala/org/apache/clerezza/scala/scripting/util/Wrapper.scala
Mon Nov 15 00:18:54 2010
@@ -0,0 +1,11 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.apache.clerezza.scala.scripting.util
+
+trait Wrapper[T] {
+ protected def wrapped: T
+ protected val childWrapper: (T) => T
+}
Propchange: incubator/clerezza/trunk/scala-scripting/tests/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Mon Nov 15 00:18:54 2010
@@ -1,2 +1,3 @@
target
.project
+.classpath
Modified: incubator/clerezza/trunk/scala-scripting/tests/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/tests/pom.xml?rev=1035107&r1=1035106&r2=1035107&view=diff
==============================================================================
--- incubator/clerezza/trunk/scala-scripting/tests/pom.xml (original)
+++ incubator/clerezza/trunk/scala-scripting/tests/pom.xml Mon Nov 15 00:18:54
2010
@@ -47,12 +47,6 @@
</dependency>
<dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient-osgi</artifactId>
- <version>4.0.1</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
<groupId>org.apache.clerezza.scala</groupId>
<artifactId>scala-library-osgi</artifactId>
<scope>provided</scope>
Added:
incubator/clerezza/trunk/scala-scripting/tests/src/test/scala/org/apache/clerezza/scala/tests/CompilerServiceTest.scala
URL:
http://svn.apache.org/viewvc/incubator/clerezza/trunk/scala-scripting/tests/src/test/scala/org/apache/clerezza/scala/tests/CompilerServiceTest.scala?rev=1035107&view=auto
==============================================================================
---
incubator/clerezza/trunk/scala-scripting/tests/src/test/scala/org/apache/clerezza/scala/tests/CompilerServiceTest.scala
(added)
+++
incubator/clerezza/trunk/scala-scripting/tests/src/test/scala/org/apache/clerezza/scala/tests/CompilerServiceTest.scala
Mon Nov 15 00:18:54 2010
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.scala.tests;
+
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+
+import org.ops4j.pax.exam.CoreOptions._;
+import org.ops4j.pax.exam.container.`def`.PaxRunnerOptions._;
+import org.ops4j.pax.exam.junit.JUnitOptions._;
+
+import org.apache.clerezza.scala.scripting.CompilerService
+import org.junit.Assert
+import org.junit.Before;
+import org.junit.Test;
+import org.ops4j.pax.exam.Inject;
+import org.osgi.framework.BundleContext;
+import java.io.Reader
+import java.io.StringReader
+import org.osgi.util.tracker.ServiceTracker
+import scala.actors.Actor
+import scala.math.random
+
+
+/**
+ *
+ * @author reto
+ */
+...@runwith(classOf[JUnit4TestRunner])
+class CompilerServiceTest {
+
+
+
+ @Inject
+ private var bundleContext: BundleContext = null;
+
+ private var webServerExist = false;
+
+ private var service: CompilerService = null;
+
+ @Before
+ def getService() : Unit = {
+ /*webServerExist = waitForWebserver();*/
+ service = waitFor(classOf[CompilerService], 300000);
+ }
+
+ private def waitFor[T](aClass: Class[T], timeout: Long): T = {
+ System.out.println("waiting for a " + aClass);
+ val tracker = new ServiceTracker(bundleContext,
+ aClass.getName(), null);
+ tracker.open();
+ val service = tracker.waitForService(timeout);
+ return service.asInstanceOf[T];
+ }
+
+ @Test
+ def checkEngine(): Unit = {
+
+ Assert.assertNotNull(service)
+ val s = """
+ package foo {
+ class TestClass() {
+ println("constructing TestClass");
+ }
+ object TestClass {
+ println("constructing TestClass Object");
+ val msg = "Hello"
+ }
+ }
+ """
+ println("now compiling")
+ val compileResult = service.compile(List(s.toCharArray))
+ println("finished compiling")
+ Assert.assertEquals(1, compileResult.size)
+ val testClassClass: Class[_] = compileResult(0)
+ Assert.assertEquals("foo.TestClass", testClassClass.getName)
+ val method = testClassClass.getMethod("msg")
+ Assert.assertEquals("Hello", method.invoke(null))
+ }
+
+}
+
+object CompilerServiceTest {
+
+ protected val testHttpPort = 8976;
+
+ @Configuration
+ def configuration() : Array[Option] = {
+ return options(
+ mavenConfiguration(),
+ dsProfile(),
+ configProfile(),
+ //webProfile(),
+ junitBundles(),
+ frameworks(
+ felix()),
+
systemProperty("org.osgi.service.http.port").value(
+ Integer.toString(testHttpPort)));
+ }
+}
\ No newline at end of file