16
16
17
17
package org .vertx .scala .platform .impl
18
18
19
+ import scala .collection .mutable
19
20
import scala .reflect .internal .util .BatchSourceFile
20
21
import scala .reflect .io .Path .string2path
21
22
import scala .reflect .io .PlainFile
@@ -26,7 +27,6 @@ import org.vertx.java.core.{Vertx => JVertx}
26
27
import org .vertx .java .platform .{Container => JContainer }
27
28
import org .vertx .java .platform .{Verticle => JVerticle }
28
29
import org .vertx .java .platform .VerticleFactory
29
- import org .vertx .scala .core .Vertx
30
30
import org .vertx .scala .platform .Verticle
31
31
32
32
/**
@@ -35,7 +35,7 @@ import org.vertx.scala.platform.Verticle
35
35
*/
36
36
class ScalaVerticleFactory extends VerticleFactory {
37
37
38
- protected val PREFIX : String = " scala: "
38
+ protected val SUFFIX : String = " . scala"
39
39
40
40
private val settings = new Settings ()
41
41
@@ -47,22 +47,23 @@ class ScalaVerticleFactory extends VerticleFactory {
47
47
48
48
private var interpreter : IMain = null
49
49
50
+ private val classLoader = classOf [ScalaVerticleFactory ].getClassLoader
51
+
52
+ private val classCache = mutable.Map [String , java.lang.Class [_]]()
53
+
50
54
override def init (jvertx : JVertx , jcontainer : JContainer , aloader : ClassLoader ): Unit = {
51
55
this .jvertx = jvertx
52
56
this .jcontainer = jcontainer
53
57
this .loader = aloader
54
- settings.embeddedDefaults(aloader)
55
- settings.usejavacp.value = true
56
- // settings.verbose.value = true
57
- interpreter = new IMain (settings)
58
- interpreter.setContextClassLoader()
58
+
59
+ println(" HELLO WORLD" )
60
+
61
+ initializeScalaInterpreter()
59
62
}
60
63
61
64
@ throws(classOf [Exception ])
62
65
override def createVerticle (main : String ): JVerticle = {
63
- // TODO: main without language Id is passed in.
64
- // val rawClass = if (main.startsWith(PREFIX)) loader.loadClass(main.replaceFirst(PREFIX, "")) else loadScript(main)
65
- val rawClass = loader.loadClass(main.replaceFirst(PREFIX , " " ))
66
+ val rawClass = if (! main.endsWith(SUFFIX )) loader.loadClass(main) else loadScript(main)
66
67
val delegate = rawClass.newInstance().asInstanceOf [Verticle ]
67
68
ScalaVerticle .newVerticle(delegate, jvertx, jcontainer)
68
69
}
@@ -77,10 +78,34 @@ class ScalaVerticleFactory extends VerticleFactory {
77
78
78
79
@ throws(classOf [Exception ])
79
80
private def loadScript (main : String ): Class [_] = {
80
- val resolved = loader.getResource(main).toExternalForm()
81
- interpreter.compileSources(new BatchSourceFile (PlainFile .fromPath(resolved.replaceFirst(" file:" , " " ))))
81
+ val resolved = loader.getResource(main).toExternalForm
82
82
val className = main.replaceFirst(" .scala$" , " " ).replaceAll(" /" , " ." )
83
- interpreter.classLoader.loadClass(className)
83
+ var cls = classCache.get(className).getOrElse(null )
84
+
85
+ if (cls == null ) {
86
+ interpreter.compileSources(new BatchSourceFile (PlainFile .fromPath(resolved.replaceFirst(" file:" , " " ))))
87
+ cls = interpreter.classLoader.loadClass(className)
88
+ }
89
+
90
+ classCache += className -> cls
91
+
92
+ cls
93
+ }
94
+
95
+ private def initializeScalaInterpreter (): Unit = {
96
+ val scalaLibrary = classLoader.getResource(" ./lib/scala-library-2.10.2.jar" ).toExternalForm
97
+ val scalaReflectLibrary = classLoader.getResource(" ./lib/scala-reflect-2.10.2.jar" ).toExternalForm
98
+ val modLangScala = classLoader.getResource(" ./" ).toExternalForm
99
+
100
+ settings.bootclasspath.append(scalaLibrary.replaceFirst(" file:" , " " ))
101
+ settings.bootclasspath.append(scalaReflectLibrary.replaceFirst(" file:" , " " ))
102
+ settings.bootclasspath.append(modLangScala.replaceFirst(" file:" , " " ))
103
+
104
+ settings.usejavacp.value = true
105
+ settings.verbose.value = true
106
+ interpreter = new IMain (settings)
107
+ interpreter.classLoader
108
+ interpreter.setContextClassLoader()
84
109
}
85
110
86
111
}
0 commit comments