From 928dce3cfa08ce3a4d5c92e31840b0ccb0e3135f Mon Sep 17 00:00:00 2001 From: Philipp Haller Date: Wed, 13 Feb 2008 14:58:07 +0000 Subject: Integrated ClassLoader patch from Guy Oliver --- src/actors/scala/actors/remote/JavaSerializer.scala | 21 +++++++++++++++++---- src/actors/scala/actors/remote/RemoteActor.scala | 8 ++++++-- src/actors/scala/actors/remote/TcpService.scala | 10 +++++----- 3 files changed, 28 insertions(+), 11 deletions(-) (limited to 'src/actors') 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 self remotely accessible on TCP port * port. @@ -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 -- cgit v1.2.3