summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2008-02-13 14:58:07 +0000
committerPhilipp Haller <hallerp@gmail.com>2008-02-13 14:58:07 +0000
commit928dce3cfa08ce3a4d5c92e31840b0ccb0e3135f (patch)
treea986e77df916bb881b5a4a014b5e2576f5c7824a /src
parentbdf8585f76aa0fe7eab9b3121942e788894117c6 (diff)
downloadscala-928dce3cfa08ce3a4d5c92e31840b0ccb0e3135f.tar.gz
scala-928dce3cfa08ce3a4d5c92e31840b0ccb0e3135f.tar.bz2
scala-928dce3cfa08ce3a4d5c92e31840b0ccb0e3135f.zip
Integrated ClassLoader patch from Guy Oliver
Diffstat (limited to 'src')
-rw-r--r--src/actors/scala/actors/remote/JavaSerializer.scala21
-rw-r--r--src/actors/scala/actors/remote/RemoteActor.scala8
-rw-r--r--src/actors/scala/actors/remote/TcpService.scala10
3 files changed, 28 insertions, 11 deletions
diff --git a/src/actors/scala/actors/remote/JavaSerializer.scala b/src/actors/scala/actors/remote/JavaSerializer.scala
index 85d4952d90..ec1f0181ce 100644
--- a/src/actors/scala/actors/remote/JavaSerializer.scala
+++ b/src/actors/scala/actors/remote/JavaSerializer.scala
@@ -11,13 +11,26 @@
package scala.actors.remote
import java.io.{ByteArrayInputStream, ByteArrayOutputStream,
- ObjectInputStream, ObjectOutputStream}
+ ObjectInputStream, ObjectOutputStream, InputStream,
+ ObjectStreamClass}
/**
- * @author Philipp Haller
+ * @author Guy Oliver
*/
-class JavaSerializer(serv: Service) extends Serializer(serv) {
+class CustomObjectInputStream(os: InputStream, val cl: ClassLoader) extends ObjectInputStream(os) {
+ override def resolveClass(cd: ObjectStreamClass): Class[T] forSome { type T } =
+ try {
+ cl.loadClass(cd.getName())
+ } catch {
+ case cnf: ClassNotFoundException =>
+ super.resolveClass(cd)
+ }
+}
+/**
+ * @author Philipp Haller
+ */
+class JavaSerializer(serv: Service, val cl: ClassLoader) extends Serializer(serv) {
def serialize(o: AnyRef): Array[Byte] = {
val bos = new ByteArrayOutputStream()
val out = new ObjectOutputStream(bos)
@@ -28,7 +41,7 @@ class JavaSerializer(serv: Service) extends Serializer(serv) {
def deserialize(bytes: Array[Byte]): AnyRef = {
val bis = new ByteArrayInputStream(bytes)
- val in = new ObjectInputStream(bis)
+ val in = new CustomObjectInputStream(bis, cl)
in.readObject()
}
}
diff --git a/src/actors/scala/actors/remote/RemoteActor.scala b/src/actors/scala/actors/remote/RemoteActor.scala
index f69acaa4ea..c363079505 100644
--- a/src/actors/scala/actors/remote/RemoteActor.scala
+++ b/src/actors/scala/actors/remote/RemoteActor.scala
@@ -45,6 +45,10 @@ object RemoteActor {
private val kernels = new scala.collection.mutable.HashMap[Actor, NetKernel]
+ private var cl: ClassLoader = ClassLoader.getSystemClassLoader()
+ def classLoader: ClassLoader = cl
+ def classLoader_=(x: ClassLoader) { cl = x }
+
/**
* Makes <code>self</code> remotely accessible on TCP port
* <code>port</code>.
@@ -54,7 +58,7 @@ object RemoteActor {
}
def createKernelOnPort(port: Int): NetKernel = {
- val serv = TcpService(port)
+ val serv = TcpService(port, cl)
val kern = serv.kernel
val s = Actor.self
kernels += Pair(s, kern)
@@ -79,7 +83,7 @@ object RemoteActor {
def register(name: Symbol, a: Actor): Unit = synchronized {
val kernel = kernels.get(Actor.self) match {
case None =>
- val serv = new TcpService(TcpService.generatePort)
+ val serv = new TcpService(TcpService.generatePort, cl)
serv.start()
kernels += Pair(Actor.self, serv.kernel)
serv.kernel
diff --git a/src/actors/scala/actors/remote/TcpService.scala b/src/actors/scala/actors/remote/TcpService.scala
index 74f03c44d5..9377bf1f71 100644
--- a/src/actors/scala/actors/remote/TcpService.scala
+++ b/src/actors/scala/actors/remote/TcpService.scala
@@ -14,7 +14,7 @@ package scala.actors.remote
import java.io.{DataInputStream, DataOutputStream, IOException}
import java.lang.{Thread, SecurityException}
-import java.net.{InetAddress, ServerSocket, Socket, UnknownHostException}
+import java.net.{InetAddress, ServerSocket, Socket, UnknownHostException, URLClassLoader}
import scala.collection.mutable.HashMap
@@ -27,12 +27,12 @@ object TcpService {
private val random = new Random
private val ports = new HashMap[Int, TcpService]
- def apply(port: Int): TcpService =
+ def apply(port: Int, cl: ClassLoader): TcpService =
ports.get(port) match {
case Some(service) =>
service
case None =>
- val service = new TcpService(port)
+ val service = new TcpService(port, cl)
ports += Pair(port, service)
service.start()
service
@@ -65,8 +65,8 @@ object TcpService {
* @version 0.9.10
* @author Philipp Haller
*/
-class TcpService(port: Int) extends Thread with Service {
- val serializer: JavaSerializer = new JavaSerializer(this)
+class TcpService(port: Int, cl: ClassLoader) extends Thread with Service {
+ val serializer: JavaSerializer = new JavaSerializer(this, cl)
private val internalNode = new Node(InetAddress.getLocalHost().getHostAddress(), port)
def node: Node = internalNode