From 8268ca71e75ed7f96d4adbb8de5601fd575c27df Mon Sep 17 00:00:00 2001 From: Paul Pacheco Date: Sun, 14 Nov 2010 13:10:13 -0600 Subject: [PATCH 01/23] Added interface for registering session actors, and adding unit test (which is failing now) --- .../src/main/scala/actor/ActorRegistry.scala | 2 + .../src/main/scala/remote/RemoteServer.scala | 33 +++++++++++++ .../ServerInitiatedRemoteActorSpec.scala | 47 +++++++++++++++++++ 3 files changed, 82 insertions(+) diff --git a/akka-actor/src/main/scala/actor/ActorRegistry.scala b/akka-actor/src/main/scala/actor/ActorRegistry.scala index 6751ee9350..0b946df99f 100644 --- a/akka-actor/src/main/scala/actor/ActorRegistry.scala +++ b/akka-actor/src/main/scala/actor/ActorRegistry.scala @@ -301,12 +301,14 @@ object ActorRegistry extends ListenerManagement { private[akka] def actors(address: Address) = actorsFor(address).actors private[akka] def actorsByUuid(address: Address) = actorsFor(address).actorsByUuid + private[akka] def actorsFactories(address: Address) = actorsFor(address).actorsFactories private[akka] def typedActors(address: Address) = actorsFor(address).typedActors private[akka] def typedActorsByUuid(address: Address) = actorsFor(address).typedActorsByUuid private[akka] class RemoteActorSet { private[ActorRegistry] val actors = new ConcurrentHashMap[String, ActorRef] private[ActorRegistry] val actorsByUuid = new ConcurrentHashMap[String, ActorRef] + private[ActorRegistry] val actorsFactories = new ConcurrentHashMap[String, () => ActorRef] private[ActorRegistry] val typedActors = new ConcurrentHashMap[String, AnyRef] private[ActorRegistry] val typedActorsByUuid = new ConcurrentHashMap[String, AnyRef] } diff --git a/akka-remote/src/main/scala/remote/RemoteServer.scala b/akka-remote/src/main/scala/remote/RemoteServer.scala index c85f2913e0..cead8bf9f8 100644 --- a/akka-remote/src/main/scala/remote/RemoteServer.scala +++ b/akka-remote/src/main/scala/remote/RemoteServer.scala @@ -302,6 +302,17 @@ class RemoteServer extends Logging with ListenerManagement { else register(id, actorRef, actors) } + /** + * Register Remote Session Actor by a specific 'id' passed as argument. + *

+ * NOTE: If you use this method to register your remote actor then you must unregister the actor by this ID yourself. + */ + def registerPerSession(id: String, factory: => ActorRef): Unit = synchronized { + log.debug("Registering server side remote session actor with id [%s]", id) + if (id.startsWith(UUID_PREFIX)) register(id.substring(UUID_PREFIX.length), factory, actorsByUuid) + else registerPerSession(id, () => factory, actorsFactories) + } + private def register[Key](id: Key, actorRef: ActorRef, registry: ConcurrentHashMap[Key, ActorRef]) { if (_isRunning && !registry.contains(id)) { if (!actorRef.isRunning) actorRef.start @@ -309,6 +320,12 @@ class RemoteServer extends Logging with ListenerManagement { } } + private def registerPerSession[Key](id: Key, factory: () => ActorRef, registry: ConcurrentHashMap[Key,() => ActorRef]) { + if (_isRunning && !registry.contains(id)) { + registry.put(id, factory) + } + } + private def registerTypedActor[Key](id: Key, typedActor: AnyRef, registry: ConcurrentHashMap[Key, AnyRef]) { if (_isRunning && !registry.contains(id)) registry.put(id, typedActor) } @@ -341,6 +358,18 @@ class RemoteServer extends Logging with ListenerManagement { } } + /** + * Unregister Remote Actor by specific 'id'. + *

+ * NOTE: You need to call this method if you have registered an actor by a custom ID. + */ + def unregisterPerSession(id: String):Unit = synchronized { + if (_isRunning) { + log.info("Unregistering server side remote session actor with id [%s]", id) + actorsFactories.remove(id) + } + } + /** * Unregister Remote Typed Actor by specific 'id'. *

@@ -358,8 +387,10 @@ class RemoteServer extends Logging with ListenerManagement { protected[akka] override def notifyListeners(message: => Any): Unit = super.notifyListeners(message) + private[akka] def actors = ActorRegistry.actors(address) private[akka] def actorsByUuid = ActorRegistry.actorsByUuid(address) + private[akka] def actorsFactories = ActorRegistry.actorsFactories(address) private[akka] def typedActors = ActorRegistry.typedActors(address) private[akka] def typedActorsByUuid = ActorRegistry.typedActorsByUuid(address) } @@ -429,6 +460,8 @@ class RemoteServerHandler( val AW_PROXY_PREFIX = "$$ProxiedByAW".intern val CHANNEL_INIT = "channel-init".intern + val sessionActors = new ChannelLocal(); + applicationLoader.foreach(MessageSerializer.setClassLoader(_)) /** diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala index ef60732852..ff8793218e 100644 --- a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala @@ -36,6 +36,22 @@ object ServerInitiatedRemoteActorSpec { } } + case class Login(user:String); + case class GetUser(); + + class RemoteStatefullSessionActorSpec extends Actor { + + var user : String= _; + + def receive = { + case Login(user) => + this.user = user; + case GetUser() => + self.reply(this.user) + } + } + + object RemoteActorSpecActorAsyncSender { val latch = new CountDownLatch(1) } @@ -63,6 +79,7 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { server.register(actorOf[RemoteActorSpecActorUnidirectional]) server.register(actorOf[RemoteActorSpecActorBidirectional]) server.register(actorOf[RemoteActorSpecActorAsyncSender]) + server.registerPerSession("statefull-session-actor", actorOf[RemoteStatefullSessionActorSpec]) Thread.sleep(1000) } @@ -103,6 +120,29 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { actor.stop } + @Test + def shouldKeepSessionInformation { + val session1 = RemoteClient.actorFor( + "statefull-session-actor", + 5000L, + HOSTNAME, PORT) + val session2 = RemoteClient.actorFor( + "statefull-session-actor", + 5000L, + HOSTNAME, PORT) + + session1 ! Login("session1"); + session2 ! Login("session2"); + + val result1 = session1 !! GetUser(); + assert("session1" === result1.get.asInstanceOf[String]) + val result2 = session2 !! GetUser(); + assert("session2" === result2.get.asInstanceOf[String]) + + session1.stop() + session2.stop() + } + @Test def shouldSendWithBangAndGetReplyThroughSenderRef { implicit val timeout = 500000000L @@ -205,6 +245,13 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { server.unregister("my-service-1") assert(server.actors.get("my-service-1") eq null, "actor unregistered") } + @Test + def shouldRegisterAndUnregisterSession { + server.registerPerSession("my-service-1", actorOf[RemoteActorSpecActorUnidirectional]) + assert(server.actorsFactories.get("my-service-1") ne null, "actor registered") + server.unregisterPerSession("my-service-1") + assert(server.actorsFactories.get("my-service-1") eq null, "actor unregistered") + } @Test def shouldRegisterAndUnregisterByUuid { From 6d62831f70b270b1f8341f413ac73f692dc5e220 Mon Sep 17 00:00:00 2001 From: Paul Pacheco Date: Sun, 14 Nov 2010 16:26:33 -0600 Subject: [PATCH 02/23] Added server initiated remote untyped session actors now you can register a factory function and whenever a new session starts, the actor will be created and started. When the client disconnects, the actor will be stopped. The client works the same as any other untyped remote server managed actor. use like this: RemoteServer.registerPerSession("actor-name", actorOf[MyActor]) Unregister like this: RemoteServer.unregisterPerSession("actor-name") --- .../src/main/scala/remote/RemoteServer.scala | 80 +++++++++++----- .../ServerInitiatedRemoteActorSpec.scala | 92 +++++++++++++++++-- 2 files changed, 138 insertions(+), 34 deletions(-) diff --git a/akka-remote/src/main/scala/remote/RemoteServer.scala b/akka-remote/src/main/scala/remote/RemoteServer.scala index 2a92fff853..5ba58567ef 100644 --- a/akka-remote/src/main/scala/remote/RemoteServer.scala +++ b/akka-remote/src/main/scala/remote/RemoteServer.scala @@ -458,7 +458,7 @@ class RemoteServerHandler( val AW_PROXY_PREFIX = "$$ProxiedByAW".intern val CHANNEL_INIT = "channel-init".intern - val sessionActors = new ChannelLocal(); + val sessionActors = new ChannelLocal[Map[String, ActorRef]](); applicationLoader.foreach(MessageSerializer.setClassLoader(_)) @@ -470,6 +470,7 @@ class RemoteServerHandler( override def channelConnected(ctx: ChannelHandlerContext, event: ChannelStateEvent) = { val clientAddress = getClientAddress(ctx) + sessionActors.set(event.getChannel(), Map[String, ActorRef]()); log.debug("Remote client [%s] connected to [%s]", clientAddress, server.name) if (RemoteServer.SECURE) { val sslHandler: SslHandler = ctx.getPipeline.get(classOf[SslHandler]) @@ -489,6 +490,11 @@ class RemoteServerHandler( override def channelDisconnected(ctx: ChannelHandlerContext, event: ChannelStateEvent) = { val clientAddress = getClientAddress(ctx) log.debug("Remote client [%s] disconnected from [%s]", clientAddress, server.name) + // stop all session actors + for ((id, actorRef) <- sessionActors.get(event.getChannel())) { + actorRef.stop() + } + sessionActors.remove(event.getChannel()); server.notifyListeners(RemoteServerClientDisconnected(server, clientAddress)) } @@ -543,7 +549,7 @@ class RemoteServerHandler( val actorRef = try { - createActor(actorInfo).start + createActor(actorInfo, channel).start } catch { case e: SecurityException => channel.write(createErrorReplyMessage(e, request, AkkaActorType.ScalaActor)) @@ -664,6 +670,13 @@ class RemoteServerHandler( server.actorsByUuid.get(uuid) } + private def findActorFactory(id: String) : () => ActorRef = { + server.actorsFactories.get(id) + } + private def findSessionActor(id: String, channel: Channel) : ActorRef = { + sessionActors.get(channel).getOrElse(id, null) + } + private def findTypedActorById(id: String) : AnyRef = { server.typedActors.get(id) } @@ -693,7 +706,7 @@ class RemoteServerHandler( * * Does not start the actor. */ - private def createActor(actorInfo: ActorInfoProtocol): ActorRef = { + private def createActor(actorInfo: ActorInfoProtocol, channel: Channel): ActorRef = { val uuid = actorInfo.getUuid val id = actorInfo.getId @@ -702,28 +715,47 @@ class RemoteServerHandler( val actorRefOrNull = findActorByIdOrUuid(id, uuidFrom(uuid.getHigh,uuid.getLow).toString) - if (actorRefOrNull eq null) { - try { - if (RemoteServer.UNTRUSTED_MODE) throw new SecurityException( - "Remote server is operating is untrusted mode, can not create remote actors on behalf of the remote client") + if (actorRefOrNull ne null) + return actorRefOrNull - log.info("Creating a new remote actor [%s:%s]", name, uuid) - val clazz = if (applicationLoader.isDefined) applicationLoader.get.loadClass(name) - else Class.forName(name) - val actorRef = Actor.actorOf(clazz.asInstanceOf[Class[_ <: Actor]]) - actorRef.uuid = uuidFrom(uuid.getHigh,uuid.getLow) - actorRef.id = id - actorRef.timeout = timeout - actorRef.remoteAddress = None - server.actorsByUuid.put(actorRef.uuid.toString, actorRef) // register by uuid - actorRef - } catch { - case e => - log.error(e, "Could not create remote actor instance") - server.notifyListeners(RemoteServerError(e, server)) - throw e - } - } else actorRefOrNull + + // the actor has not been registered globally. See if we have it in the session + + val sessionActorRefOrNull = findSessionActor(id, channel); + if (sessionActorRefOrNull ne null) + return sessionActorRefOrNull + + // we dont have it in the session either, see if we have a factory for it + val actorFactoryOrNull = findActorFactory(id) + if (actorFactoryOrNull ne null) { + val actorRef = actorFactoryOrNull(); + actorRef.uuid = uuidFrom(uuid.getHigh,uuid.getLow) + sessionActors.get(channel).put(id, actorRef); + server.actorsByUuid.put(actorRef.uuid.toString, actorRef) // register by uuid + return actorRef + } + + // None of the above, so treat it as a client managed remote actor + try { + if (RemoteServer.UNTRUSTED_MODE) throw new SecurityException( + "Remote server is operating is untrusted mode, can not create remote actors on behalf of the remote client") + + log.info("Creating a new remote actor [%s:%s]", name, uuid) + val clazz = if (applicationLoader.isDefined) applicationLoader.get.loadClass(name) + else Class.forName(name) + val actorRef = Actor.actorOf(clazz.asInstanceOf[Class[_ <: Actor]]) + actorRef.uuid = uuidFrom(uuid.getHigh,uuid.getLow) + actorRef.id = id + actorRef.timeout = timeout + actorRef.remoteAddress = None + server.actorsByUuid.put(actorRef.uuid.toString, actorRef) // register by uuid + actorRef + } catch { + case e => + log.error(e, "Could not create remote actor instance") + server.notifyListeners(RemoteServerError(e, server)) + throw e + } } private def createTypedActor(actorInfo: ActorInfoProtocol): AnyRef = { diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala index ff8793218e..f0e2123310 100644 --- a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala @@ -7,12 +7,14 @@ import org.junit.{Test, Before, After} import akka.remote.{RemoteServer, RemoteClient} import akka.actor.Actor._ import akka.actor.{ActorRegistry, ActorRef, Actor} +import scala.collection.mutable.Set object ServerInitiatedRemoteActorSpec { val HOSTNAME = "localhost" val PORT = 9990 var server: RemoteServer = null + case class Send(actor: ActorRef) object RemoteActorSpecActorUnidirectional { @@ -38,16 +40,29 @@ object ServerInitiatedRemoteActorSpec { case class Login(user:String); case class GetUser(); - + case class DoSomethingWeird(); + + val instantiatedSessionActors= Set[ActorRef](); + class RemoteStatefullSessionActorSpec extends Actor { - var user : String= _; + var user : String= "anonymous"; + override def preStart = { + instantiatedSessionActors += self; + } + + override def postStop = { + instantiatedSessionActors -= self; + } + def receive = { case Login(user) => this.user = user; case GetUser() => self.reply(this.user) + case DoSomethingWeird() => + throw new Exception("Bad boy") } } @@ -122,25 +137,82 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { @Test def shouldKeepSessionInformation { + + //RemoteClient.clientFor(HOSTNAME, PORT).connect + val session1 = RemoteClient.actorFor( "statefull-session-actor", 5000L, HOSTNAME, PORT) + + + val default1 = session1 !! GetUser(); + assert("anonymous" === default1.get.asInstanceOf[String]) + + session1 ! Login("session[1]"); + + val result1 = session1 !! GetUser(); + assert("session[1]" === result1.get.asInstanceOf[String]) + + session1.stop() + + RemoteClient.shutdownAll + + //RemoteClient.clientFor(HOSTNAME, PORT).connect + val session2 = RemoteClient.actorFor( "statefull-session-actor", 5000L, HOSTNAME, PORT) - session1 ! Login("session1"); - session2 ! Login("session2"); + // since this is a new session, the server should reset the state + val default2 = session2 !! GetUser(); + assert("anonymous" === default2.get.asInstanceOf[String]) - val result1 = session1 !! GetUser(); - assert("session1" === result1.get.asInstanceOf[String]) - val result2 = session2 !! GetUser(); - assert("session2" === result2.get.asInstanceOf[String]) - - session1.stop() session2.stop() + + RemoteClient.shutdownAll + } + + @Test + def shouldStopActorOnDisconnect{ + + + val session1 = RemoteClient.actorFor( + "statefull-session-actor", + 5000L, + HOSTNAME, PORT) + + + val default1 = session1 !! GetUser(); + assert("anonymous" === default1.get.asInstanceOf[String]) + + assert(instantiatedSessionActors.size == 1); + + RemoteClient.shutdownAll + Thread.sleep(1000) + assert(instantiatedSessionActors.size == 0); + + } + + @Test + def shouldStopActorOnError{ + + + val session1 = RemoteClient.actorFor( + "statefull-session-actor", + 5000L, + HOSTNAME, PORT) + + + session1 ! DoSomethingWeird(); + session1.stop() + + RemoteClient.shutdownAll + Thread.sleep(1000) + + assert(instantiatedSessionActors.size == 0); + } @Test From 4ee49e3add39b770accd4231e9a360f385d88e72 Mon Sep 17 00:00:00 2001 From: Paul Pacheco Date: Sun, 14 Nov 2010 18:03:34 -0600 Subject: [PATCH 03/23] Added remote typed session actors, along with unit tests --- .../src/main/scala/actor/ActorRegistry.scala | 2 + .../src/main/scala/remote/RemoteServer.scala | 119 +++++++++++++----- .../akka/actor/RemoteTypedSessionActor.java | 8 ++ .../actor/RemoteTypedSessionActorImpl.java | 49 ++++++++ .../ServerInitiatedRemoteActorSpec.scala | 16 +-- ...InitiatedRemoteTypedSessionActorSpec.scala | 110 ++++++++++++++++ 6 files changed, 268 insertions(+), 36 deletions(-) create mode 100644 akka-remote/src/test/java/akka/actor/RemoteTypedSessionActor.java create mode 100644 akka-remote/src/test/java/akka/actor/RemoteTypedSessionActorImpl.java create mode 100644 akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala diff --git a/akka-actor/src/main/scala/actor/ActorRegistry.scala b/akka-actor/src/main/scala/actor/ActorRegistry.scala index 0b946df99f..f8b46fd3c4 100644 --- a/akka-actor/src/main/scala/actor/ActorRegistry.scala +++ b/akka-actor/src/main/scala/actor/ActorRegistry.scala @@ -304,6 +304,7 @@ object ActorRegistry extends ListenerManagement { private[akka] def actorsFactories(address: Address) = actorsFor(address).actorsFactories private[akka] def typedActors(address: Address) = actorsFor(address).typedActors private[akka] def typedActorsByUuid(address: Address) = actorsFor(address).typedActorsByUuid + private[akka] def typedActorsFactories(address: Address) = actorsFor(address).typedActorsFactories private[akka] class RemoteActorSet { private[ActorRegistry] val actors = new ConcurrentHashMap[String, ActorRef] @@ -311,6 +312,7 @@ object ActorRegistry extends ListenerManagement { private[ActorRegistry] val actorsFactories = new ConcurrentHashMap[String, () => ActorRef] private[ActorRegistry] val typedActors = new ConcurrentHashMap[String, AnyRef] private[ActorRegistry] val typedActorsByUuid = new ConcurrentHashMap[String, AnyRef] + private[ActorRegistry] val typedActorsFactories = new ConcurrentHashMap[String, () => AnyRef] } } diff --git a/akka-remote/src/main/scala/remote/RemoteServer.scala b/akka-remote/src/main/scala/remote/RemoteServer.scala index 5ba58567ef..9afef140b1 100644 --- a/akka-remote/src/main/scala/remote/RemoteServer.scala +++ b/akka-remote/src/main/scala/remote/RemoteServer.scala @@ -284,6 +284,21 @@ class RemoteServer extends Logging with ListenerManagement { else registerTypedActor(id, typedActor, typedActors) } + /** + * Register typed actor by interface name. + */ + def registerTypedPerSessionActor(intfClass: Class[_], factory: => AnyRef) : Unit = registerTypedActor(intfClass.getName, factory) + + /** + * Register remote typed actor by a specific id. + * @param id custom actor id + * @param typedActor typed actor to register + */ + def registerTypedPerSessionActor(id: String, factory: => AnyRef): Unit = synchronized { + log.debug("Registering server side typed remote session actor with id [%s]", id) + registerTypedPerSessionActor(id, () => factory, typedActorsFactories) + } + /** * Register Remote Actor by the Actor's 'id' field. It starts the Actor if it is not started already. */ @@ -307,8 +322,7 @@ class RemoteServer extends Logging with ListenerManagement { */ def registerPerSession(id: String, factory: => ActorRef): Unit = synchronized { log.debug("Registering server side remote session actor with id [%s]", id) - if (id.startsWith(UUID_PREFIX)) register(id.substring(UUID_PREFIX.length), factory, actorsByUuid) - else registerPerSession(id, () => factory, actorsFactories) + registerPerSession(id, () => factory, actorsFactories) } private def register[Key](id: Key, actorRef: ActorRef, registry: ConcurrentHashMap[Key, ActorRef]) { @@ -328,6 +342,12 @@ class RemoteServer extends Logging with ListenerManagement { if (_isRunning && !registry.contains(id)) registry.put(id, typedActor) } + private def registerTypedPerSessionActor[Key](id: Key, factory: () => AnyRef, registry: ConcurrentHashMap[Key,() => AnyRef]) { + if (_isRunning && !registry.contains(id)) { + registry.put(id, factory) + } + } + /** * Unregister Remote Actor that is registered using its 'id' field (not custom ID). */ @@ -381,6 +401,17 @@ class RemoteServer extends Logging with ListenerManagement { } } + /** + * Unregister Remote Typed Actor by specific 'id'. + *

+ * NOTE: You need to call this method if you have registered an actor by a custom ID. + */ + def unregisterTypedPerSessionActor(id: String):Unit = synchronized { + if (_isRunning) { + typedActorsFactories.remove(id) + } + } + protected override def manageLifeCycleOfListeners = false protected[akka] override def notifyListeners(message: => Any): Unit = super.notifyListeners(message) @@ -391,6 +422,7 @@ class RemoteServer extends Logging with ListenerManagement { private[akka] def actorsFactories = ActorRegistry.actorsFactories(address) private[akka] def typedActors = ActorRegistry.typedActors(address) private[akka] def typedActorsByUuid = ActorRegistry.typedActorsByUuid(address) + private[akka] def typedActorsFactories = ActorRegistry.typedActorsFactories(address) } object RemoteServerSslContext { @@ -459,6 +491,7 @@ class RemoteServerHandler( val CHANNEL_INIT = "channel-init".intern val sessionActors = new ChannelLocal[Map[String, ActorRef]](); + val typedSessionActors = new ChannelLocal[Map[String, AnyRef]](); applicationLoader.foreach(MessageSerializer.setClassLoader(_)) @@ -471,6 +504,7 @@ class RemoteServerHandler( override def channelConnected(ctx: ChannelHandlerContext, event: ChannelStateEvent) = { val clientAddress = getClientAddress(ctx) sessionActors.set(event.getChannel(), Map[String, ActorRef]()); + typedSessionActors.set(event.getChannel(), Map[String, AnyRef]()); log.debug("Remote client [%s] connected to [%s]", clientAddress, server.name) if (RemoteServer.SECURE) { val sslHandler: SslHandler = ctx.getPipeline.get(classOf[SslHandler]) @@ -495,6 +529,11 @@ class RemoteServerHandler( actorRef.stop() } sessionActors.remove(event.getChannel()); + for ((id, actorRef) <- typedSessionActors.get(event.getChannel())) { + TypedActor.stop(actorRef) + } + typedSessionActors.remove(event.getChannel()); + server.notifyListeners(RemoteServerClientDisconnected(server, clientAddress)) } @@ -623,7 +662,7 @@ class RemoteServerHandler( val typedActorInfo = actorInfo.getTypedActorInfo log.debug("Dispatching to remote typed actor [%s :: %s]", typedActorInfo.getMethod, typedActorInfo.getInterface) - val typedActor = createTypedActor(actorInfo) + val typedActor = createTypedActor(actorInfo, channel) val args = MessageSerializer.deserialize(request.getMessage).asInstanceOf[Array[AnyRef]].toList val argClasses = args.map(_.getClass) @@ -673,6 +712,7 @@ class RemoteServerHandler( private def findActorFactory(id: String) : () => ActorRef = { server.actorsFactories.get(id) } + private def findSessionActor(id: String, channel: Channel) : ActorRef = { sessionActors.get(channel).getOrElse(id, null) } @@ -681,6 +721,14 @@ class RemoteServerHandler( server.typedActors.get(id) } + private def findTypedActorFactory(id: String) : () => AnyRef = { + server.typedActorsFactories.get(id) + } + + private def findTypedSessionActor(id: String, channel: Channel) : AnyRef = { + typedSessionActors.get(channel).getOrElse(id, null) + } + private def findTypedActorByUuid(uuid: String) : AnyRef = { server.typedActorsByUuid.get(uuid) } @@ -731,7 +779,6 @@ class RemoteServerHandler( val actorRef = actorFactoryOrNull(); actorRef.uuid = uuidFrom(uuid.getHigh,uuid.getLow) sessionActors.get(channel).put(id, actorRef); - server.actorsByUuid.put(actorRef.uuid.toString, actorRef) // register by uuid return actorRef } @@ -758,39 +805,55 @@ class RemoteServerHandler( } } - private def createTypedActor(actorInfo: ActorInfoProtocol): AnyRef = { + private def createTypedActor(actorInfo: ActorInfoProtocol, channel: Channel): AnyRef = { val uuid = actorInfo.getUuid val id = actorInfo.getId val typedActorOrNull = findTypedActorByIdOrUuid(id, uuidFrom(uuid.getHigh,uuid.getLow).toString) + if (typedActorOrNull ne null) + return typedActorOrNull; - if (typedActorOrNull eq null) { - val typedActorInfo = actorInfo.getTypedActorInfo - val interfaceClassname = typedActorInfo.getInterface - val targetClassname = actorInfo.getTarget + // the actor has not been registered globally. See if we have it in the session - try { - if (RemoteServer.UNTRUSTED_MODE) throw new SecurityException( - "Remote server is operating is untrusted mode, can not create remote actors on behalf of the remote client") + val sessionActorRefOrNull = findTypedSessionActor(id, channel); + if (sessionActorRefOrNull ne null) + return sessionActorRefOrNull - log.info("Creating a new remote typed actor:\n\t[%s :: %s]", interfaceClassname, targetClassname) + // we dont have it in the session either, see if we have a factory for it + val actorFactoryOrNull = findTypedActorFactory(id) + if (actorFactoryOrNull ne null) { + val newInstance = actorFactoryOrNull(); + typedSessionActors.get(channel).put(id, newInstance); + return newInstance + } - val (interfaceClass, targetClass) = - if (applicationLoader.isDefined) (applicationLoader.get.loadClass(interfaceClassname), - applicationLoader.get.loadClass(targetClassname)) - else (Class.forName(interfaceClassname), Class.forName(targetClassname)) + // None of the above, so treat it as a client managed remote actor - val newInstance = TypedActor.newInstance( - interfaceClass, targetClass.asInstanceOf[Class[_ <: TypedActor]], actorInfo.getTimeout).asInstanceOf[AnyRef] - server.typedActors.put(uuidFrom(uuid.getHigh,uuid.getLow).toString, newInstance) // register by uuid - newInstance - } catch { - case e => - log.error(e, "Could not create remote typed actor instance") - server.notifyListeners(RemoteServerError(e, server)) - throw e - } - } else typedActorOrNull + val typedActorInfo = actorInfo.getTypedActorInfo + val interfaceClassname = typedActorInfo.getInterface + val targetClassname = actorInfo.getTarget + + try { + if (RemoteServer.UNTRUSTED_MODE) throw new SecurityException( + "Remote server is operating is untrusted mode, can not create remote actors on behalf of the remote client") + + log.info("Creating a new remote typed actor:\n\t[%s :: %s]", interfaceClassname, targetClassname) + + val (interfaceClass, targetClass) = + if (applicationLoader.isDefined) (applicationLoader.get.loadClass(interfaceClassname), + applicationLoader.get.loadClass(targetClassname)) + else (Class.forName(interfaceClassname), Class.forName(targetClassname)) + + val newInstance = TypedActor.newInstance( + interfaceClass, targetClass.asInstanceOf[Class[_ <: TypedActor]], actorInfo.getTimeout).asInstanceOf[AnyRef] + server.typedActors.put(uuidFrom(uuid.getHigh,uuid.getLow).toString, newInstance) // register by uuid + newInstance + } catch { + case e => + log.error(e, "Could not create remote typed actor instance") + server.notifyListeners(RemoteServerError(e, server)) + throw e + } } private def createErrorReplyMessage(exception: Throwable, request: RemoteMessageProtocol, actorType: AkkaActorType): RemoteMessageProtocol = { diff --git a/akka-remote/src/test/java/akka/actor/RemoteTypedSessionActor.java b/akka-remote/src/test/java/akka/actor/RemoteTypedSessionActor.java new file mode 100644 index 0000000000..8a6c2e6373 --- /dev/null +++ b/akka-remote/src/test/java/akka/actor/RemoteTypedSessionActor.java @@ -0,0 +1,8 @@ +package akka.actor; + +public interface RemoteTypedSessionActor { + + public void login(String user); + public String getUser(); + public void doSomethingFunny() throws Exception; +} diff --git a/akka-remote/src/test/java/akka/actor/RemoteTypedSessionActorImpl.java b/akka-remote/src/test/java/akka/actor/RemoteTypedSessionActorImpl.java new file mode 100644 index 0000000000..b4140f74ed --- /dev/null +++ b/akka-remote/src/test/java/akka/actor/RemoteTypedSessionActorImpl.java @@ -0,0 +1,49 @@ +package akka.actor.remote; + +import akka.actor.*; + +import java.util.Set; +import java.util.HashSet; + +import java.util.concurrent.CountDownLatch; + +public class RemoteTypedSessionActorImpl extends TypedActor implements RemoteTypedSessionActor { + + + private static Set instantiatedSessionActors = new HashSet(); + + public static Set getInstances() { + return instantiatedSessionActors; + } + + @Override + public void preStart() { + instantiatedSessionActors.add(this); + } + + @Override + public void postStop() { + instantiatedSessionActors.remove(this); + } + + + private String user="anonymous"; + + @Override + public void login(String user) { + this.user = user; + } + + @Override + public String getUser() + { + return this.user; + } + + @Override + public void doSomethingFunny() throws Exception + { + throw new Exception("Bad boy"); + } + +} diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala index f0e2123310..5ffbecb612 100644 --- a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala @@ -40,7 +40,7 @@ object ServerInitiatedRemoteActorSpec { case class Login(user:String); case class GetUser(); - case class DoSomethingWeird(); + case class DoSomethingFunny(); val instantiatedSessionActors= Set[ActorRef](); @@ -61,7 +61,7 @@ object ServerInitiatedRemoteActorSpec { this.user = user; case GetUser() => self.reply(this.user) - case DoSomethingWeird() => + case DoSomethingFunny() => throw new Exception("Bad boy") } } @@ -94,7 +94,7 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { server.register(actorOf[RemoteActorSpecActorUnidirectional]) server.register(actorOf[RemoteActorSpecActorBidirectional]) server.register(actorOf[RemoteActorSpecActorAsyncSender]) - server.registerPerSession("statefull-session-actor", actorOf[RemoteStatefullSessionActorSpec]) + server.registerPerSession("untyped-session-actor-service", actorOf[RemoteStatefullSessionActorSpec]) Thread.sleep(1000) } @@ -141,7 +141,7 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { //RemoteClient.clientFor(HOSTNAME, PORT).connect val session1 = RemoteClient.actorFor( - "statefull-session-actor", + "untyped-session-actor-service", 5000L, HOSTNAME, PORT) @@ -161,7 +161,7 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { //RemoteClient.clientFor(HOSTNAME, PORT).connect val session2 = RemoteClient.actorFor( - "statefull-session-actor", + "untyped-session-actor-service", 5000L, HOSTNAME, PORT) @@ -179,7 +179,7 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { val session1 = RemoteClient.actorFor( - "statefull-session-actor", + "untyped-session-actor-service", 5000L, HOSTNAME, PORT) @@ -200,12 +200,12 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { val session1 = RemoteClient.actorFor( - "statefull-session-actor", + "untyped-session-actor-service", 5000L, HOSTNAME, PORT) - session1 ! DoSomethingWeird(); + session1 ! DoSomethingFunny(); session1.stop() RemoteClient.shutdownAll diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala new file mode 100644 index 0000000000..e766c24d67 --- /dev/null +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala @@ -0,0 +1,110 @@ +/** + * Copyright (C) 2009-2010 Scalable Solutions AB + */ + +package akka.actor.remote + +import org.scalatest._ +import org.scalatest.matchers.ShouldMatchers +import org.scalatest.BeforeAndAfterAll +import org.scalatest.junit.JUnitRunner +import org.junit.runner.RunWith + +import java.util.concurrent.TimeUnit + +import akka.remote.{RemoteServer, RemoteClient} +import akka.actor._ +import RemoteTypedActorLog._ + +object ServerInitiatedRemoteTypedSessionActorSpec { + val HOSTNAME = "localhost" + val PORT = 9990 + var server: RemoteServer = null +} + +@RunWith(classOf[JUnitRunner]) +class ServerInitiatedRemoteTypedSessionActorSpec extends + FlatSpec with + ShouldMatchers with + BeforeAndAfterAll { + import ServerInitiatedRemoteTypedActorSpec._ + + private val unit = TimeUnit.MILLISECONDS + + + override def beforeAll = { + server = new RemoteServer() + server.start(HOSTNAME, PORT) + + server.registerTypedPerSessionActor("typed-session-actor-service", + TypedActor.newInstance(classOf[RemoteTypedSessionActor], classOf[RemoteTypedSessionActorImpl], 1000)) + + Thread.sleep(1000) + } + + // make sure the servers shutdown cleanly after the test has finished + override def afterAll = { + try { + server.shutdown + RemoteClient.shutdownAll + Thread.sleep(1000) + } catch { + case e => () + } + } + + "A remote session Actor" should "create a new session actor per connection" in { + clearMessageLogs + + val session1 = RemoteClient.typedActorFor(classOf[RemoteTypedSessionActor], "typed-session-actor-service", 5000L, HOSTNAME, PORT) + + session1.getUser() should equal ("anonymous"); + session1.login("session[1]"); + session1.getUser() should equal ("session[1]"); + + RemoteClient.shutdownAll + + val session2 = RemoteClient.typedActorFor(classOf[RemoteTypedSessionActor], "typed-session-actor-service", 5000L, HOSTNAME, PORT) + + session2.getUser() should equal ("anonymous"); + + RemoteClient.shutdownAll + + } + + it should "stop the actor when the client disconnects" in { + + val session1 = RemoteClient.typedActorFor(classOf[RemoteTypedSessionActor], "typed-session-actor-service", 5000L, HOSTNAME, PORT) + + session1.getUser() should equal ("anonymous"); + + RemoteTypedSessionActorImpl.getInstances() should have size (1); + RemoteClient.shutdownAll + Thread.sleep(1000) + RemoteTypedSessionActorImpl.getInstances() should have size (0); + + } + + it should "stop the actor when there is an error" in { + + val session1 = RemoteClient.typedActorFor(classOf[RemoteTypedSessionActor], "typed-session-actor-service", 5000L, HOSTNAME, PORT) + + session1.doSomethingFunny(); + + RemoteClient.shutdownAll + Thread.sleep(1000) + RemoteTypedSessionActorImpl.getInstances() should have size (0); + + } + + + it should "be able to unregister" in { + server.registerTypedPerSessionActor("my-service-1",TypedActor.newInstance(classOf[RemoteTypedSessionActor], classOf[RemoteTypedSessionActorImpl], 1000)) + + server.typedActorsFactories.get("my-service-1") should not be (null) + server.unregisterTypedPerSessionActor("my-service-1") + server.typedActorsFactories.get("my-service-1") should be (null) + } + +} + From dcf78ad5cd2b58590483a4c973e36664eca4e81e Mon Sep 17 00:00:00 2001 From: Paul Pacheco Date: Thu, 18 Nov 2010 11:09:55 -0600 Subject: [PATCH 04/23] Cleaned up patch as suggested by Vicktor --- .../src/main/scala/remote/RemoteServer.scala | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/akka-remote/src/main/scala/remote/RemoteServer.scala b/akka-remote/src/main/scala/remote/RemoteServer.scala index 9afef140b1..4c5442de65 100644 --- a/akka-remote/src/main/scala/remote/RemoteServer.scala +++ b/akka-remote/src/main/scala/remote/RemoteServer.scala @@ -326,25 +326,28 @@ class RemoteServer extends Logging with ListenerManagement { } private def register[Key](id: Key, actorRef: ActorRef, registry: ConcurrentHashMap[Key, ActorRef]) { - if (_isRunning && !registry.contains(id)) { - if (!actorRef.isRunning) actorRef.start - registry.put(id, actorRef) + if (_isRunning) { + if (registry.putIfAbsent(id, actorRef) eq null) { + if (!actorRef.isRunning) actorRef.start + } } } private def registerPerSession[Key](id: Key, factory: () => ActorRef, registry: ConcurrentHashMap[Key,() => ActorRef]) { - if (_isRunning && !registry.contains(id)) { - registry.put(id, factory) + if (_isRunning) { + registry.putIfAbsent(id, factory); } } private def registerTypedActor[Key](id: Key, typedActor: AnyRef, registry: ConcurrentHashMap[Key, AnyRef]) { - if (_isRunning && !registry.contains(id)) registry.put(id, typedActor) + if (_isRunning) { + registry.putIfAbsent(id, typedActor); + } } private def registerTypedPerSessionActor[Key](id: Key, factory: () => AnyRef, registry: ConcurrentHashMap[Key,() => AnyRef]) { - if (_isRunning && !registry.contains(id)) { - registry.put(id, factory) + if (_isRunning) { + registry.putIfAbsent(id, factory); } } @@ -381,7 +384,7 @@ class RemoteServer extends Logging with ListenerManagement { *

* NOTE: You need to call this method if you have registered an actor by a custom ID. */ - def unregisterPerSession(id: String):Unit = synchronized { + def unregisterPerSession(id: String):Unit = { if (_isRunning) { log.info("Unregistering server side remote session actor with id [%s]", id) actorsFactories.remove(id) @@ -406,7 +409,7 @@ class RemoteServer extends Logging with ListenerManagement { *

* NOTE: You need to call this method if you have registered an actor by a custom ID. */ - def unregisterTypedPerSessionActor(id: String):Unit = synchronized { + def unregisterTypedPerSessionActor(id: String):Unit = { if (_isRunning) { typedActorsFactories.remove(id) } @@ -490,8 +493,8 @@ class RemoteServerHandler( val AW_PROXY_PREFIX = "$$ProxiedByAW".intern val CHANNEL_INIT = "channel-init".intern - val sessionActors = new ChannelLocal[Map[String, ActorRef]](); - val typedSessionActors = new ChannelLocal[Map[String, AnyRef]](); + val sessionActors = new ChannelLocal[ConcurrentHashMap[String, ActorRef]](); + val typedSessionActors = new ChannelLocal[ConcurrentHashMap[String, AnyRef]](); applicationLoader.foreach(MessageSerializer.setClassLoader(_)) @@ -503,8 +506,8 @@ class RemoteServerHandler( override def channelConnected(ctx: ChannelHandlerContext, event: ChannelStateEvent) = { val clientAddress = getClientAddress(ctx) - sessionActors.set(event.getChannel(), Map[String, ActorRef]()); - typedSessionActors.set(event.getChannel(), Map[String, AnyRef]()); + sessionActors.set(event.getChannel(), new ConcurrentHashMap[String, ActorRef]()); + typedSessionActors.set(event.getChannel(), new ConcurrentHashMap[String, AnyRef]()); log.debug("Remote client [%s] connected to [%s]", clientAddress, server.name) if (RemoteServer.SECURE) { val sslHandler: SslHandler = ctx.getPipeline.get(classOf[SslHandler]) @@ -525,15 +528,13 @@ class RemoteServerHandler( val clientAddress = getClientAddress(ctx) log.debug("Remote client [%s] disconnected from [%s]", clientAddress, server.name) // stop all session actors - for ((id, actorRef) <- sessionActors.get(event.getChannel())) { + for ((id, actorRef) <- sessionActors.remove(event.getChannel())) { actorRef.stop() } - sessionActors.remove(event.getChannel()); - for ((id, actorRef) <- typedSessionActors.get(event.getChannel())) { + for ((id, actorRef) <- typedSessionActors.remove(event.getChannel())) { TypedActor.stop(actorRef) } - typedSessionActors.remove(event.getChannel()); - + server.notifyListeners(RemoteServerClientDisconnected(server, clientAddress)) } @@ -714,7 +715,7 @@ class RemoteServerHandler( } private def findSessionActor(id: String, channel: Channel) : ActorRef = { - sessionActors.get(channel).getOrElse(id, null) + sessionActors.get(channel).get(id) } private def findTypedActorById(id: String) : AnyRef = { @@ -726,7 +727,7 @@ class RemoteServerHandler( } private def findTypedSessionActor(id: String, channel: Channel) : AnyRef = { - typedSessionActors.get(channel).getOrElse(id, null) + typedSessionActors.get(channel).get(id) } private def findTypedActorByUuid(uuid: String) : AnyRef = { @@ -767,12 +768,11 @@ class RemoteServerHandler( return actorRefOrNull - // the actor has not been registered globally. See if we have it in the session - val sessionActorRefOrNull = findSessionActor(id, channel); if (sessionActorRefOrNull ne null) return sessionActorRefOrNull + // we dont have it in the session either, see if we have a factory for it val actorFactoryOrNull = findActorFactory(id) if (actorFactoryOrNull ne null) { From 4c001fea15dd3cda7dfb74a6954f9a610a471db7 Mon Sep 17 00:00:00 2001 From: Paul Pacheco Date: Thu, 18 Nov 2010 12:48:31 -0600 Subject: [PATCH 05/23] refactored the createActor function to make it easier to understand and remove the return statements; --- .../src/main/scala/remote/RemoteServer.scala | 135 ++++++++++++------ 1 file changed, 90 insertions(+), 45 deletions(-) diff --git a/akka-remote/src/main/scala/remote/RemoteServer.scala b/akka-remote/src/main/scala/remote/RemoteServer.scala index 4c5442de65..57fb3d4078 100644 --- a/akka-remote/src/main/scala/remote/RemoteServer.scala +++ b/akka-remote/src/main/scala/remote/RemoteServer.scala @@ -528,11 +528,16 @@ class RemoteServerHandler( val clientAddress = getClientAddress(ctx) log.debug("Remote client [%s] disconnected from [%s]", clientAddress, server.name) // stop all session actors - for ((id, actorRef) <- sessionActors.remove(event.getChannel())) { - actorRef.stop() + val channelActors = sessionActors.remove(event.getChannel()) + val channelActorsIterator = channelActors.elements() + while (channelActorsIterator.hasMoreElements()) { + channelActorsIterator.nextElement().stop() } - for ((id, actorRef) <- typedSessionActors.remove(event.getChannel())) { - TypedActor.stop(actorRef) + + val channelTypedActors = typedSessionActors.remove(event.getChannel()) + val channelTypedActorsIterator = channelTypedActors.elements() + while (channelTypedActorsIterator.hasMoreElements()) { + TypedActor.stop(channelTypedActorsIterator.nextElement()) } server.notifyListeners(RemoteServerClientDisconnected(server, clientAddress)) @@ -749,40 +754,36 @@ class RemoteServerHandler( } /** - * Creates a new instance of the actor with name, uuid and timeout specified as arguments. - * - * If actor already created then just return it from the registry. - * - * Does not start the actor. + * gets the actor from the session, or creates one if there is a factory for it */ - private def createActor(actorInfo: ActorInfoProtocol, channel: Channel): ActorRef = { + private def createSessionActor(actorInfo: ActorInfoProtocol, channel: Channel): ActorRef = { val uuid = actorInfo.getUuid val id = actorInfo.getId - - val name = actorInfo.getTarget - val timeout = actorInfo.getTimeout - - val actorRefOrNull = findActorByIdOrUuid(id, uuidFrom(uuid.getHigh,uuid.getLow).toString) - - if (actorRefOrNull ne null) - return actorRefOrNull - - val sessionActorRefOrNull = findSessionActor(id, channel); if (sessionActorRefOrNull ne null) - return sessionActorRefOrNull - - - // we dont have it in the session either, see if we have a factory for it - val actorFactoryOrNull = findActorFactory(id) - if (actorFactoryOrNull ne null) { - val actorRef = actorFactoryOrNull(); - actorRef.uuid = uuidFrom(uuid.getHigh,uuid.getLow) - sessionActors.get(channel).put(id, actorRef); - return actorRef + sessionActorRefOrNull + else + { + // we dont have it in the session either, see if we have a factory for it + val actorFactoryOrNull = findActorFactory(id) + if (actorFactoryOrNull ne null) { + val actorRef = actorFactoryOrNull(); + actorRef.uuid = uuidFrom(uuid.getHigh,uuid.getLow) + sessionActors.get(channel).put(id, actorRef); + actorRef + } + else + null } + } + + + private def createClientManagedActor(actorInfo: ActorInfoProtocol): ActorRef = { + val uuid = actorInfo.getUuid + val id = actorInfo.getId + val timeout = actorInfo.getTimeout + val name = actorInfo.getTarget - // None of the above, so treat it as a client managed remote actor try { if (RemoteServer.UNTRUSTED_MODE) throw new SecurityException( "Remote server is operating is untrusted mode, can not create remote actors on behalf of the remote client") @@ -803,35 +804,61 @@ class RemoteServerHandler( server.notifyListeners(RemoteServerError(e, server)) throw e } + } - private def createTypedActor(actorInfo: ActorInfoProtocol, channel: Channel): AnyRef = { + /** + * Creates a new instance of the actor with name, uuid and timeout specified as arguments. + * + * If actor already created then just return it from the registry. + * + * Does not start the actor. + */ + private def createActor(actorInfo: ActorInfoProtocol, channel: Channel): ActorRef = { val uuid = actorInfo.getUuid val id = actorInfo.getId - val typedActorOrNull = findTypedActorByIdOrUuid(id, uuidFrom(uuid.getHigh,uuid.getLow).toString) - if (typedActorOrNull ne null) - return typedActorOrNull; + val actorRefOrNull = findActorByIdOrUuid(id, uuidFrom(uuid.getHigh,uuid.getLow).toString) - // the actor has not been registered globally. See if we have it in the session + if (actorRefOrNull ne null) + actorRefOrNull + else + { + // the actor has not been registered globally. See if we have it in the session + val sessionActorRefOrNull = createSessionActor(actorInfo, channel); + if (sessionActorRefOrNull ne null) + sessionActorRefOrNull + else // maybe it is a client managed actor + createClientManagedActor(actorInfo) + } + } + /** + * gets the actor from the session, or creates one if there is a factory for it + */ + private def createTypedSessionActor(actorInfo: ActorInfoProtocol, channel: Channel):AnyRef ={ + val id = actorInfo.getId val sessionActorRefOrNull = findTypedSessionActor(id, channel); if (sessionActorRefOrNull ne null) - return sessionActorRefOrNull - - // we dont have it in the session either, see if we have a factory for it - val actorFactoryOrNull = findTypedActorFactory(id) - if (actorFactoryOrNull ne null) { - val newInstance = actorFactoryOrNull(); - typedSessionActors.get(channel).put(id, newInstance); - return newInstance + sessionActorRefOrNull + else { + val actorFactoryOrNull = findTypedActorFactory(id) + if (actorFactoryOrNull ne null) { + val newInstance = actorFactoryOrNull(); + typedSessionActors.get(channel).put(id, newInstance); + newInstance + } + else + null } - // None of the above, so treat it as a client managed remote actor + } + private def createClientManagedTypedActor(actorInfo: ActorInfoProtocol) = { val typedActorInfo = actorInfo.getTypedActorInfo val interfaceClassname = typedActorInfo.getInterface val targetClassname = actorInfo.getTarget + val uuid = actorInfo.getUuid try { if (RemoteServer.UNTRUSTED_MODE) throw new SecurityException( @@ -856,6 +883,24 @@ class RemoteServerHandler( } } + private def createTypedActor(actorInfo: ActorInfoProtocol, channel: Channel): AnyRef = { + val uuid = actorInfo.getUuid + val id = actorInfo.getId + + val typedActorOrNull = findTypedActorByIdOrUuid(id, uuidFrom(uuid.getHigh,uuid.getLow).toString) + if (typedActorOrNull ne null) + typedActorOrNull + else + { + // the actor has not been registered globally. See if we have it in the session + val sessionActorRefOrNull = createTypedSessionActor(actorInfo, channel) + if (sessionActorRefOrNull ne null) + sessionActorRefOrNull + else // maybe it is a client managed actor + createClientManagedTypedActor(actorInfo) + } + } + private def createErrorReplyMessage(exception: Throwable, request: RemoteMessageProtocol, actorType: AkkaActorType): RemoteMessageProtocol = { val actorInfo = request.getActorInfo log.error(exception, "Could not invoke remote actor [%s]", actorInfo.getTarget) From 9f53ad3f66593b9ea9e1d02e512cbff966bf30d2 Mon Sep 17 00:00:00 2001 From: Paul Pacheco Date: Thu, 18 Nov 2010 22:38:45 -0600 Subject: [PATCH 06/23] Refatored createActor, separate unit tests cleanup according to viktor's suggestions --- .../src/main/scala/remote/RemoteServer.scala | 13 +- .../ServerInitiatedRemoteActorSpec.scala | 116 ------------- ...erverInitiatedRemoteSessionActorSpec.scala | 162 ++++++++++++++++++ ...InitiatedRemoteTypedSessionActorSpec.scala | 6 +- 4 files changed, 175 insertions(+), 122 deletions(-) create mode 100644 akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala diff --git a/akka-remote/src/main/scala/remote/RemoteServer.scala b/akka-remote/src/main/scala/remote/RemoteServer.scala index 57fb3d4078..7ec32c7c80 100644 --- a/akka-remote/src/main/scala/remote/RemoteServer.scala +++ b/akka-remote/src/main/scala/remote/RemoteServer.scala @@ -820,16 +820,23 @@ class RemoteServerHandler( val actorRefOrNull = findActorByIdOrUuid(id, uuidFrom(uuid.getHigh,uuid.getLow).toString) - if (actorRefOrNull ne null) + if (actorRefOrNull ne null) { + println("Giving actor by id or uuid ") actorRefOrNull + } else { // the actor has not been registered globally. See if we have it in the session val sessionActorRefOrNull = createSessionActor(actorInfo, channel); - if (sessionActorRefOrNull ne null) + if (sessionActorRefOrNull ne null) { + println("giving session actor") sessionActorRefOrNull + } else // maybe it is a client managed actor - createClientManagedActor(actorInfo) + { + println("Client managed actor") + createClientManagedActor(actorInfo) + } } } diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala index 5ffbecb612..b0dee8563e 100644 --- a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala @@ -38,35 +38,6 @@ object ServerInitiatedRemoteActorSpec { } } - case class Login(user:String); - case class GetUser(); - case class DoSomethingFunny(); - - val instantiatedSessionActors= Set[ActorRef](); - - class RemoteStatefullSessionActorSpec extends Actor { - - var user : String= "anonymous"; - - override def preStart = { - instantiatedSessionActors += self; - } - - override def postStop = { - instantiatedSessionActors -= self; - } - - def receive = { - case Login(user) => - this.user = user; - case GetUser() => - self.reply(this.user) - case DoSomethingFunny() => - throw new Exception("Bad boy") - } - } - - object RemoteActorSpecActorAsyncSender { val latch = new CountDownLatch(1) } @@ -94,7 +65,6 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { server.register(actorOf[RemoteActorSpecActorUnidirectional]) server.register(actorOf[RemoteActorSpecActorBidirectional]) server.register(actorOf[RemoteActorSpecActorAsyncSender]) - server.registerPerSession("untyped-session-actor-service", actorOf[RemoteStatefullSessionActorSpec]) Thread.sleep(1000) } @@ -135,85 +105,6 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { actor.stop } - @Test - def shouldKeepSessionInformation { - - //RemoteClient.clientFor(HOSTNAME, PORT).connect - - val session1 = RemoteClient.actorFor( - "untyped-session-actor-service", - 5000L, - HOSTNAME, PORT) - - - val default1 = session1 !! GetUser(); - assert("anonymous" === default1.get.asInstanceOf[String]) - - session1 ! Login("session[1]"); - - val result1 = session1 !! GetUser(); - assert("session[1]" === result1.get.asInstanceOf[String]) - - session1.stop() - - RemoteClient.shutdownAll - - //RemoteClient.clientFor(HOSTNAME, PORT).connect - - val session2 = RemoteClient.actorFor( - "untyped-session-actor-service", - 5000L, - HOSTNAME, PORT) - - // since this is a new session, the server should reset the state - val default2 = session2 !! GetUser(); - assert("anonymous" === default2.get.asInstanceOf[String]) - - session2.stop() - - RemoteClient.shutdownAll - } - - @Test - def shouldStopActorOnDisconnect{ - - - val session1 = RemoteClient.actorFor( - "untyped-session-actor-service", - 5000L, - HOSTNAME, PORT) - - - val default1 = session1 !! GetUser(); - assert("anonymous" === default1.get.asInstanceOf[String]) - - assert(instantiatedSessionActors.size == 1); - - RemoteClient.shutdownAll - Thread.sleep(1000) - assert(instantiatedSessionActors.size == 0); - - } - - @Test - def shouldStopActorOnError{ - - - val session1 = RemoteClient.actorFor( - "untyped-session-actor-service", - 5000L, - HOSTNAME, PORT) - - - session1 ! DoSomethingFunny(); - session1.stop() - - RemoteClient.shutdownAll - Thread.sleep(1000) - - assert(instantiatedSessionActors.size == 0); - - } @Test def shouldSendWithBangAndGetReplyThroughSenderRef { @@ -317,13 +208,6 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { server.unregister("my-service-1") assert(server.actors.get("my-service-1") eq null, "actor unregistered") } - @Test - def shouldRegisterAndUnregisterSession { - server.registerPerSession("my-service-1", actorOf[RemoteActorSpecActorUnidirectional]) - assert(server.actorsFactories.get("my-service-1") ne null, "actor registered") - server.unregisterPerSession("my-service-1") - assert(server.actorsFactories.get("my-service-1") eq null, "actor unregistered") - } @Test def shouldRegisterAndUnregisterByUuid { diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala new file mode 100644 index 0000000000..e1f1db4c9e --- /dev/null +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala @@ -0,0 +1,162 @@ +/** + * Copyright (C) 2009-2010 Scalable Solutions AB + */ + +package akka.actor.remote + +import org.scalatest._ +import org.scalatest.matchers.ShouldMatchers +import org.scalatest.BeforeAndAfterAll +import org.scalatest.junit.JUnitRunner +import org.junit.runner.RunWith + +import java.util.concurrent.TimeUnit + +import akka.remote.{RemoteServer, RemoteClient} +import akka.actor._ +import RemoteTypedActorLog._ + +object ServerInitiatedRemoteSessionActorSpec { + val HOSTNAME = "localhost" + val PORT = 9990 + var server: RemoteServer = null + + case class Login(user:String); + case class GetUser(); + case class DoSomethingFunny(); + + val instantiatedSessionActors= Set[ActorRef](); + + class RemoteStatefullSessionActorSpec extends Actor { + + var user : String= "anonymous"; + + override def preStart = { + instantiatedSessionActors += self; + } + + override def postStop = { + instantiatedSessionActors -= self; + } + + def receive = { + case Login(user) => + this.user = user; + case GetUser() => + self.reply(this.user) + case DoSomethingFunny() => + throw new Exception("Bad boy") + } + } + +} + +@RunWith(classOf[JUnitRunner]) +class ServerInitiatedRemoteSessionActorSpec extends + FlatSpec with + ShouldMatchers with + BeforeAndAfterEach { + import ServerInitiatedRemoteTypedActorSpec._ + + private val unit = TimeUnit.MILLISECONDS + + + override def beforeEach = { + server = new RemoteServer() + server.start(HOSTNAME, PORT) + + server.registerTypedPerSessionActor("untyped-session-actor-service", actorOf[RemoteStatefullSessionActorSpec]) + + Thread.sleep(1000) + } + + // make sure the servers shutdown cleanly after the test has finished + override def afterEach = { + try { + server.shutdown + RemoteClient.shutdownAll + Thread.sleep(1000) + } catch { + case e => () + } + } + + "A remote session Actor" should "create a new session actor per connection" in { + clearMessageLogs + + val session1 = RemoteClient.actorFor( + "untyped-session-actor-service", + 5000L, + HOSTNAME, PORT) + + val default1 = session1 !! GetUser() + default1.get.asInstanceOf[String] should equal ("anonymous") + session1 ! Login("session[1]") + val result1 = session1 !! GetUser() + result1.get.asInstanceOf[String] should equal ("session[1]") + + session1.stop() + + RemoteClient.shutdownAll + + //RemoteClient.clientFor(HOSTNAME, PORT).connect + + val session2 = RemoteClient.actorFor( + "untyped-session-actor-service", + 5000L, + HOSTNAME, PORT) + + // since this is a new session, the server should reset the state + val default2 = session2 !! GetUser(); + default2.get.asInstanceOf[String] should equal ("anonymous") + + session2.stop() + + } + + it should "stop the actor when the client disconnects" in { + + val session1 = RemoteClient.actorFor( + "untyped-session-actor-service", + 5000L, + HOSTNAME, PORT) + + + val default1 = session1 !! GetUser() + default1.get.asInstanceOf[String] should equal ("anonymous") + + instantiatedSessionActors.size should have size (1) + + RemoteClient.shutdownAll + Thread.sleep(1000) + instantiatedSessionActors.size should have size (0); + + } + + it should "stop the actor when there is an error" in { + + val session1 = RemoteClient.actorFor( + "untyped-session-actor-service", + 5000L, + HOSTNAME, PORT) + + + session1 ! DoSomethingFunny(); + session1.stop() + + RemoteClient.shutdownAll + Thread.sleep(1000) + + instantiatedSessionActors.size should have size (0); + } + + + it should "be able to unregister" in { + server.registerPerSession("my-service-1", actorOf[RemoteActorSpecActorUnidirectional]) + server.actorsFactories.get("my-service-1") should not be (null) + server.unregisterPerSession("my-service-1") + server.actorsFactories.get("my-service-1") should be (null) + } + +} + diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala index e766c24d67..575d82ca96 100644 --- a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala @@ -26,13 +26,13 @@ object ServerInitiatedRemoteTypedSessionActorSpec { class ServerInitiatedRemoteTypedSessionActorSpec extends FlatSpec with ShouldMatchers with - BeforeAndAfterAll { + BeforeAndAfterEach { import ServerInitiatedRemoteTypedActorSpec._ private val unit = TimeUnit.MILLISECONDS - override def beforeAll = { + override def beforeEach = { server = new RemoteServer() server.start(HOSTNAME, PORT) @@ -43,7 +43,7 @@ class ServerInitiatedRemoteTypedSessionActorSpec extends } // make sure the servers shutdown cleanly after the test has finished - override def afterAll = { + override def afterEach = { try { server.shutdown RemoteClient.shutdownAll From a4b122ef921b1ba40255f5a57f2fc1263cba1f94 Mon Sep 17 00:00:00 2001 From: Paul Pacheco Date: Fri, 19 Nov 2010 11:53:51 -0600 Subject: [PATCH 07/23] Cleaned up some semicolons Test now compiles (but does not pass) --- .../src/main/scala/remote/RemoteServer.scala | 28 ++++++++-------- ...erverInitiatedRemoteSessionActorSpec.scala | 33 ++++++++++--------- ...InitiatedRemoteTypedSessionActorSpec.scala | 18 +++++----- 3 files changed, 40 insertions(+), 39 deletions(-) diff --git a/akka-remote/src/main/scala/remote/RemoteServer.scala b/akka-remote/src/main/scala/remote/RemoteServer.scala index 7ec32c7c80..c129506ad3 100644 --- a/akka-remote/src/main/scala/remote/RemoteServer.scala +++ b/akka-remote/src/main/scala/remote/RemoteServer.scala @@ -335,19 +335,19 @@ class RemoteServer extends Logging with ListenerManagement { private def registerPerSession[Key](id: Key, factory: () => ActorRef, registry: ConcurrentHashMap[Key,() => ActorRef]) { if (_isRunning) { - registry.putIfAbsent(id, factory); + registry.putIfAbsent(id, factory) } } private def registerTypedActor[Key](id: Key, typedActor: AnyRef, registry: ConcurrentHashMap[Key, AnyRef]) { if (_isRunning) { - registry.putIfAbsent(id, typedActor); + registry.putIfAbsent(id, typedActor) } } private def registerTypedPerSessionActor[Key](id: Key, factory: () => AnyRef, registry: ConcurrentHashMap[Key,() => AnyRef]) { if (_isRunning) { - registry.putIfAbsent(id, factory); + registry.putIfAbsent(id, factory) } } @@ -493,8 +493,8 @@ class RemoteServerHandler( val AW_PROXY_PREFIX = "$$ProxiedByAW".intern val CHANNEL_INIT = "channel-init".intern - val sessionActors = new ChannelLocal[ConcurrentHashMap[String, ActorRef]](); - val typedSessionActors = new ChannelLocal[ConcurrentHashMap[String, AnyRef]](); + val sessionActors = new ChannelLocal[ConcurrentHashMap[String, ActorRef]]() + val typedSessionActors = new ChannelLocal[ConcurrentHashMap[String, AnyRef]]() applicationLoader.foreach(MessageSerializer.setClassLoader(_)) @@ -506,8 +506,8 @@ class RemoteServerHandler( override def channelConnected(ctx: ChannelHandlerContext, event: ChannelStateEvent) = { val clientAddress = getClientAddress(ctx) - sessionActors.set(event.getChannel(), new ConcurrentHashMap[String, ActorRef]()); - typedSessionActors.set(event.getChannel(), new ConcurrentHashMap[String, AnyRef]()); + sessionActors.set(event.getChannel(), new ConcurrentHashMap[String, ActorRef]()) + typedSessionActors.set(event.getChannel(), new ConcurrentHashMap[String, AnyRef]()) log.debug("Remote client [%s] connected to [%s]", clientAddress, server.name) if (RemoteServer.SECURE) { val sslHandler: SslHandler = ctx.getPipeline.get(classOf[SslHandler]) @@ -759,7 +759,7 @@ class RemoteServerHandler( private def createSessionActor(actorInfo: ActorInfoProtocol, channel: Channel): ActorRef = { val uuid = actorInfo.getUuid val id = actorInfo.getId - val sessionActorRefOrNull = findSessionActor(id, channel); + val sessionActorRefOrNull = findSessionActor(id, channel) if (sessionActorRefOrNull ne null) sessionActorRefOrNull else @@ -767,9 +767,9 @@ class RemoteServerHandler( // we dont have it in the session either, see if we have a factory for it val actorFactoryOrNull = findActorFactory(id) if (actorFactoryOrNull ne null) { - val actorRef = actorFactoryOrNull(); + val actorRef = actorFactoryOrNull() actorRef.uuid = uuidFrom(uuid.getHigh,uuid.getLow) - sessionActors.get(channel).put(id, actorRef); + sessionActors.get(channel).put(id, actorRef) actorRef } else @@ -827,7 +827,7 @@ class RemoteServerHandler( else { // the actor has not been registered globally. See if we have it in the session - val sessionActorRefOrNull = createSessionActor(actorInfo, channel); + val sessionActorRefOrNull = createSessionActor(actorInfo, channel) if (sessionActorRefOrNull ne null) { println("giving session actor") sessionActorRefOrNull @@ -845,14 +845,14 @@ class RemoteServerHandler( */ private def createTypedSessionActor(actorInfo: ActorInfoProtocol, channel: Channel):AnyRef ={ val id = actorInfo.getId - val sessionActorRefOrNull = findTypedSessionActor(id, channel); + val sessionActorRefOrNull = findTypedSessionActor(id, channel) if (sessionActorRefOrNull ne null) sessionActorRefOrNull else { val actorFactoryOrNull = findTypedActorFactory(id) if (actorFactoryOrNull ne null) { - val newInstance = actorFactoryOrNull(); - typedSessionActors.get(channel).put(id, newInstance); + val newInstance = actorFactoryOrNull() + typedSessionActors.get(channel).put(id, newInstance) newInstance } else diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala index e1f1db4c9e..dab1f83437 100644 --- a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala @@ -14,6 +14,7 @@ import java.util.concurrent.TimeUnit import akka.remote.{RemoteServer, RemoteClient} import akka.actor._ +import akka.actor.Actor._ import RemoteTypedActorLog._ object ServerInitiatedRemoteSessionActorSpec { @@ -21,27 +22,27 @@ object ServerInitiatedRemoteSessionActorSpec { val PORT = 9990 var server: RemoteServer = null - case class Login(user:String); - case class GetUser(); - case class DoSomethingFunny(); + case class Login(user:String) + case class GetUser() + case class DoSomethingFunny() - val instantiatedSessionActors= Set[ActorRef](); + var instantiatedSessionActors= Set[ActorRef]() class RemoteStatefullSessionActorSpec extends Actor { - var user : String= "anonymous"; + var user : String= "anonymous" override def preStart = { - instantiatedSessionActors += self; + instantiatedSessionActors += self } override def postStop = { - instantiatedSessionActors -= self; + instantiatedSessionActors -= self } def receive = { case Login(user) => - this.user = user; + this.user = user case GetUser() => self.reply(this.user) case DoSomethingFunny() => @@ -56,7 +57,7 @@ class ServerInitiatedRemoteSessionActorSpec extends FlatSpec with ShouldMatchers with BeforeAndAfterEach { - import ServerInitiatedRemoteTypedActorSpec._ + import ServerInitiatedRemoteSessionActorSpec._ private val unit = TimeUnit.MILLISECONDS @@ -65,7 +66,7 @@ class ServerInitiatedRemoteSessionActorSpec extends server = new RemoteServer() server.start(HOSTNAME, PORT) - server.registerTypedPerSessionActor("untyped-session-actor-service", actorOf[RemoteStatefullSessionActorSpec]) + server.registerPerSession("untyped-session-actor-service", actorOf[RemoteStatefullSessionActorSpec]) Thread.sleep(1000) } @@ -107,7 +108,7 @@ class ServerInitiatedRemoteSessionActorSpec extends HOSTNAME, PORT) // since this is a new session, the server should reset the state - val default2 = session2 !! GetUser(); + val default2 = session2 !! GetUser() default2.get.asInstanceOf[String] should equal ("anonymous") session2.stop() @@ -125,11 +126,11 @@ class ServerInitiatedRemoteSessionActorSpec extends val default1 = session1 !! GetUser() default1.get.asInstanceOf[String] should equal ("anonymous") - instantiatedSessionActors.size should have size (1) + instantiatedSessionActors should have size (1) RemoteClient.shutdownAll Thread.sleep(1000) - instantiatedSessionActors.size should have size (0); + instantiatedSessionActors should have size (0) } @@ -141,18 +142,18 @@ class ServerInitiatedRemoteSessionActorSpec extends HOSTNAME, PORT) - session1 ! DoSomethingFunny(); + session1 ! DoSomethingFunny() session1.stop() RemoteClient.shutdownAll Thread.sleep(1000) - instantiatedSessionActors.size should have size (0); + instantiatedSessionActors should have size (0) } it should "be able to unregister" in { - server.registerPerSession("my-service-1", actorOf[RemoteActorSpecActorUnidirectional]) + server.registerPerSession("my-service-1", actorOf[RemoteStatefullSessionActorSpec]) server.actorsFactories.get("my-service-1") should not be (null) server.unregisterPerSession("my-service-1") server.actorsFactories.get("my-service-1") should be (null) diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala index 575d82ca96..2e82afc6ba 100644 --- a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala @@ -58,15 +58,15 @@ class ServerInitiatedRemoteTypedSessionActorSpec extends val session1 = RemoteClient.typedActorFor(classOf[RemoteTypedSessionActor], "typed-session-actor-service", 5000L, HOSTNAME, PORT) - session1.getUser() should equal ("anonymous"); - session1.login("session[1]"); - session1.getUser() should equal ("session[1]"); + session1.getUser() should equal ("anonymous") + session1.login("session[1]") + session1.getUser() should equal ("session[1]") RemoteClient.shutdownAll val session2 = RemoteClient.typedActorFor(classOf[RemoteTypedSessionActor], "typed-session-actor-service", 5000L, HOSTNAME, PORT) - session2.getUser() should equal ("anonymous"); + session2.getUser() should equal ("anonymous") RemoteClient.shutdownAll @@ -76,12 +76,12 @@ class ServerInitiatedRemoteTypedSessionActorSpec extends val session1 = RemoteClient.typedActorFor(classOf[RemoteTypedSessionActor], "typed-session-actor-service", 5000L, HOSTNAME, PORT) - session1.getUser() should equal ("anonymous"); + session1.getUser() should equal ("anonymous") - RemoteTypedSessionActorImpl.getInstances() should have size (1); + RemoteTypedSessionActorImpl.getInstances() should have size (1) RemoteClient.shutdownAll Thread.sleep(1000) - RemoteTypedSessionActorImpl.getInstances() should have size (0); + RemoteTypedSessionActorImpl.getInstances() should have size (0) } @@ -89,11 +89,11 @@ class ServerInitiatedRemoteTypedSessionActorSpec extends val session1 = RemoteClient.typedActorFor(classOf[RemoteTypedSessionActor], "typed-session-actor-service", 5000L, HOSTNAME, PORT) - session1.doSomethingFunny(); + session1.doSomethingFunny() RemoteClient.shutdownAll Thread.sleep(1000) - RemoteTypedSessionActorImpl.getInstances() should have size (0); + RemoteTypedSessionActorImpl.getInstances() should have size (0) } From d80883c063366abcd3e1fbe512ba83cc70a38c6c Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sat, 20 Nov 2010 21:08:57 +0100 Subject: [PATCH 08/23] Changing artifact IDs so they dont include scala version no, closing ticket #529 --- project/build/AkkaProject.scala | 40 +++++++++++++++++---------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index 79f42869fe..f8a91ad62f 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -30,7 +30,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // Deploy/dist settings // ------------------------------------------------------------------------------------------------------------------- - def distName = "%s_%s-%s".format(name, buildScalaVersion, version) + def distName = "%s-%s".format(name, version) lazy val deployPath = info.projectPath / "deploy" lazy val distPath = info.projectPath / "dist" @@ -307,6 +307,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // Miscellaneous // ------------------------------------------------------------------------------------------------------------------- + override def artifactID: String = this.name override def mainClass = Some("akka.kernel.Main") @@ -328,23 +329,23 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { .mkString(" ") + " config/" + " scala-library.jar" + - " dist/akka-actor_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-stm_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-typed-actor_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-remote_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-http_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-camel_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-amqp_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-persistence-common_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-persistence-redis_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-persistence-mongo_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-persistence-cassandra_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-persistence-voldemort_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-persistence-riak_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-persistence-hbase_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-kernel_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-spring_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-jta_%s-%s.jar".format(buildScalaVersion, version) + " dist/akka-actor-%s.jar".format(version) + + " dist/akka-stm-%s.jar".format(version) + + " dist/akka-typed-actor-%s.jar".format(version) + + " dist/akka-remote-%s.jar".format(version) + + " dist/akka-http-%s.jar".format(version) + + " dist/akka-camel-%s.jar".format(version) + + " dist/akka-amqp-%s.jar".format(version) + + " dist/akka-persistence-common-%s.jar".format(version) + + " dist/akka-persistence-redis-%s.jar".format(version) + + " dist/akka-persistence-mongo-%s.jar".format(version) + + " dist/akka-persistence-cassandra-%s.jar".format(version) + + " dist/akka-persistence-voldemort-%s.jar".format(version) + + " dist/akka-persistence-riak-%s.jar".format(version) + + " dist/akka-persistence-hbase-%s.jar".format(version) + + " dist/akka-kernel-%s.jar".format(version) + + " dist/akka-spring-%s.jar".format(version) + + " dist/akka-jta-%s.jar".format(version) ) //Exclude slf4j1.5.11 from the classpath, it's conflicting... @@ -942,12 +943,13 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { ) } - def akkaArtifacts = descendents(info.projectPath / "dist", "*" + buildScalaVersion + "-" + version + ".jar") + def akkaArtifacts = descendents(info.projectPath / "dist", "*-" + version + ".jar") lazy val integrationTestsEnabled = systemOptional[Boolean]("integration.tests",false) lazy val stressTestsEnabled = systemOptional[Boolean]("stress.tests",false) // ------------------------------------------------------------ class AkkaDefaultProject(info: ProjectInfo, val deployPath: Path) extends DefaultProject(info) with DeployProject with OSGiProject { + override def artifactID: String = this.name lazy val sourceArtifact = Artifact(this.artifactID, "source", "jar", Some("sources"), Nil, None) lazy val docsArtifact = Artifact(this.artifactID, "doc", "jar", Some("docs"), Nil, None) override def runClasspath = super.runClasspath +++ (AkkaParentProject.this.info.projectPath / "config") From 2e12337d7894c8df41ec32cfb587eee27fdb25c3 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sat, 20 Nov 2010 22:03:57 +0100 Subject: [PATCH 09/23] Changing signature for HotSwap to include self-reference, closing ticket #540 --- akka-actor/src/main/scala/actor/Actor.scala | 18 +++++++++++++----- .../test/scala/actor/actor/HotSwapSpec.scala | 8 ++++---- .../scala/actor/actor/ReceiveTimeoutSpec.scala | 2 +- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/akka-actor/src/main/scala/actor/Actor.scala b/akka-actor/src/main/scala/actor/Actor.scala index 6667f7fbc4..8a7b045475 100644 --- a/akka-actor/src/main/scala/actor/Actor.scala +++ b/akka-actor/src/main/scala/actor/Actor.scala @@ -34,8 +34,16 @@ abstract class RemoteActor(address: InetSocketAddress) extends Actor { */ @serializable sealed trait LifeCycleMessage -case class HotSwap(code: Actor.Receive) extends LifeCycleMessage { - def this(behavior: Procedure[Any]) = this({ case msg => behavior.apply(msg) }: Actor.Receive) +case class HotSwap(code: ActorRef => Actor.Receive) extends LifeCycleMessage { + /** + * Java API + */ + def this(code: akka.japi.Function[ActorRef,Procedure[Any]]) = + this( (self: ActorRef) => { + val behavior = code(self) + val result: Actor.Receive = { case msg => behavior(msg) } + result + }) } case object RevertHotSwap extends LifeCycleMessage @@ -66,7 +74,7 @@ class ActorInitializationException private[akka](message: String) extends AkkaEx class ActorTimeoutException private[akka](message: String) extends AkkaException(message) /** - * This message is thrown by default when an Actors behavior doesn't match a message + * This message is thrown by default when an Actors behavior doesn't match a message */ case class UnhandledMessageException(msg: Any, ref: ActorRef) extends Exception { override def getMessage() = "Actor %s does not handle [%s]".format(ref,msg) @@ -426,7 +434,7 @@ trait Actor extends Logging { private lazy val processingBehavior: Receive = { lazy val defaultBehavior = receive val actorBehavior: Receive = { - case HotSwap(code) => become(code) + case HotSwap(code) => become(code(self)) case RevertHotSwap => unbecome case Exit(dead, reason) => self.handleTrapExit(dead, reason) case Link(child) => self.link(child) @@ -444,7 +452,7 @@ trait Actor extends Logging { private lazy val fullBehavior: Receive = { lazy val defaultBehavior = receive val actorBehavior: Receive = { - case HotSwap(code) => become(code) + case HotSwap(code) => become(code(self)) case RevertHotSwap => unbecome case Exit(dead, reason) => self.handleTrapExit(dead, reason) case Link(child) => self.link(child) diff --git a/akka-actor/src/test/scala/actor/actor/HotSwapSpec.scala b/akka-actor/src/test/scala/actor/actor/HotSwapSpec.scala index 5fc9e119a0..011141c746 100644 --- a/akka-actor/src/test/scala/actor/actor/HotSwapSpec.scala +++ b/akka-actor/src/test/scala/actor/actor/HotSwapSpec.scala @@ -16,11 +16,11 @@ class HotSwapSpec extends WordSpec with MustMatchers { val a = actorOf( new Actor { def receive = { case _ => _log += "default" } }).start - a ! HotSwap { + a ! HotSwap( self => { case _ => _log += "swapped" barrier.await - } + }) a ! "swapped" barrier.await _log must be ("swapped") @@ -71,11 +71,11 @@ class HotSwapSpec extends WordSpec with MustMatchers { barrier.reset _log = "" - a ! HotSwap { + a ! HotSwap(self => { case "swapped" => _log += "swapped" barrier.await - } + }) a ! "swapped" barrier.await diff --git a/akka-actor/src/test/scala/actor/actor/ReceiveTimeoutSpec.scala b/akka-actor/src/test/scala/actor/actor/ReceiveTimeoutSpec.scala index b47b6830b4..e469ab43d1 100644 --- a/akka-actor/src/test/scala/actor/actor/ReceiveTimeoutSpec.scala +++ b/akka-actor/src/test/scala/actor/actor/ReceiveTimeoutSpec.scala @@ -41,7 +41,7 @@ class ReceiveTimeoutSpec extends JUnitSuite { assert(timeoutLatch.tryAwait(3, TimeUnit.SECONDS)) val swappedLatch = new StandardLatch - timeoutActor ! HotSwap({ + timeoutActor ! HotSwap(self => { case ReceiveTimeout => swappedLatch.open }) From 2f62241519d5c4d41a169bf8cc66bddf17a579cd Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sat, 20 Nov 2010 22:26:26 +0100 Subject: [PATCH 10/23] Added a root akka folder for source files for the docs to work properly, closing ticket #541 --- akka-actor/src/main/scala/{ => akka}/actor/Actor.scala | 0 akka-actor/src/main/scala/{ => akka}/actor/ActorRef.scala | 0 .../src/main/scala/{ => akka}/actor/ActorRegistry.scala | 0 .../{ => akka}/actor/BootableActorLoaderService.scala | 0 akka-actor/src/main/scala/{ => akka}/actor/FSM.scala | 0 .../src/main/scala/{ => akka}/actor/Implicits.scala | 0 .../src/main/scala/{ => akka}/actor/Scheduler.scala | 0 .../src/main/scala/{ => akka}/actor/Supervisor.scala | 0 .../src/main/scala/{ => akka}/actor/UntypedActor.scala | 6 ++---- akka-actor/src/main/scala/{ => akka}/config/Config.scala | 0 .../src/main/scala/{ => akka}/config/Configuration.scala | 0 .../src/main/scala/{ => akka}/config/Configurator.scala | 0 .../main/scala/{ => akka}/config/SupervisionConfig.scala | 0 .../main/scala/{ => akka}/dataflow/DataFlowVariable.scala | 0 .../src/main/scala/{ => akka}/dispatch/Dispatchers.scala | 0 .../dispatch/ExecutorBasedEventDrivenDispatcher.scala | 0 .../ExecutorBasedEventDrivenWorkStealingDispatcher.scala | 0 .../src/main/scala/{ => akka}/dispatch/Future.scala | 0 .../main/scala/{ => akka}/dispatch/HawtDispatcher.scala | 0 .../main/scala/{ => akka}/dispatch/MailboxHandling.scala | 0 .../main/scala/{ => akka}/dispatch/MessageHandling.scala | 0 .../scala/{ => akka}/dispatch/ThreadBasedDispatcher.scala | 0 .../scala/{ => akka}/dispatch/ThreadPoolBuilder.scala | 0 akka-actor/src/main/scala/{ => akka}/japi/JavaAPI.scala | 8 ++++++++ .../src/main/scala/{ => akka}/routing/Iterators.scala | 0 .../src/main/scala/{ => akka}/routing/Listeners.scala | 0 .../src/main/scala/{ => akka}/routing/Routers.scala | 0 .../src/main/scala/{ => akka}/routing/Routing.scala | 0 akka-actor/src/main/scala/{ => akka}/util/Address.scala | 0 .../src/main/scala/{ => akka}/util/AkkaException.scala | 0 akka-actor/src/main/scala/{ => akka}/util/Bootable.scala | 0 akka-actor/src/main/scala/{ => akka}/util/Crypt.scala | 0 akka-actor/src/main/scala/{ => akka}/util/Duration.scala | 0 akka-actor/src/main/scala/{ => akka}/util/HashCode.scala | 0 akka-actor/src/main/scala/{ => akka}/util/Helpers.scala | 0 .../main/scala/{ => akka}/util/ListenerManagement.scala | 0 akka-actor/src/main/scala/{ => akka}/util/LockUtil.scala | 0 akka-actor/src/main/scala/{ => akka}/util/Logging.scala | 0 .../src/main/scala/{ => akka}/util/ReflectiveAccess.scala | 0 akka-actor/src/test/scala/{ => akka}/Messages.scala | 0 .../actor/actor/ActorFireForgetRequestReplySpec.scala | 0 .../test/scala/{ => akka}/actor/actor/ActorRefSpec.scala | 0 .../src/test/scala/{ => akka}/actor/actor/Bench.scala | 0 .../test/scala/{ => akka}/actor/actor/FSMActorSpec.scala | 0 .../scala/{ => akka}/actor/actor/ForwardActorSpec.scala | 0 .../test/scala/{ => akka}/actor/actor/HotSwapSpec.scala | 0 .../scala/{ => akka}/actor/actor/ReceiveTimeoutSpec.scala | 0 .../{ => akka}/actor/supervisor/RestartStrategySpec.scala | 0 .../actor/supervisor/SupervisorHierarchySpec.scala | 0 .../{ => akka}/actor/supervisor/SupervisorMiscSpec.scala | 0 .../{ => akka}/actor/supervisor/SupervisorSpec.scala | 0 .../src/test/scala/{ => akka}/dataflow/DataFlowSpec.scala | 0 .../test/scala/{ => akka}/dispatch/ActorModelSpec.scala | 0 .../test/scala/{ => akka}/dispatch/DispatchersSpec.scala | 0 .../ExecutorBasedEventDrivenDispatcherActorSpec.scala | 0 .../ExecutorBasedEventDrivenDispatcherActorsSpec.scala | 0 ...ecutorBasedEventDrivenWorkStealingDispatcherSpec.scala | 0 .../src/test/scala/{ => akka}/dispatch/FutureSpec.scala | 0 .../{ => akka}/dispatch/HawtDispatcherActorSpec.scala | 0 .../{ => akka}/dispatch/HawtDispatcherEchoServer.scala | 0 .../scala/{ => akka}/dispatch/MailboxConfigSpec.scala | 0 .../scala/{ => akka}/dispatch/ThreadBasedActorSpec.scala | 0 .../{ => akka}/dispatch/ThreadBasedDispatcherSpec.scala | 0 .../src/test/scala/{ => akka}/japi/JavaAPITest.scala | 0 .../test/scala/{ => akka}/misc/ActorRegistrySpec.scala | 0 .../src/test/scala/{ => akka}/misc/SchedulerSpec.scala | 0 .../src/test/scala/{ => akka}/routing/RoutingSpec.scala | 0 .../src/test/scala/{ => akka}/ticket/Ticket001Spec.scala | 0 .../src/main/scala/{ => akka}/CamelContextLifecycle.scala | 0 akka-camel/src/main/scala/{ => akka}/CamelService.scala | 0 akka-camel/src/main/scala/{ => akka}/Consumer.scala | 0 .../src/main/scala/{ => akka}/ConsumerPublisher.scala | 0 akka-camel/src/main/scala/{ => akka}/Message.scala | 0 akka-camel/src/main/scala/{ => akka}/Producer.scala | 0 .../main/scala/{ => akka}/component/ActorComponent.scala | 0 .../scala/{ => akka}/component/TypedActorComponent.scala | 0 .../test/scala/{ => akka}/CamelContextLifecycleTest.scala | 0 .../test/scala/{ => akka}/CamelExchangeAdapterTest.scala | 0 .../test/scala/{ => akka}/CamelMessageAdapterTest.scala | 0 .../test/scala/{ => akka}/CamelServiceManagerTest.scala | 0 .../src/test/scala/{ => akka}/ConsumerJavaTest.scala | 0 .../test/scala/{ => akka}/ConsumerRegisteredTest.scala | 0 .../src/test/scala/{ => akka}/ConsumerScalaTest.scala | 0 .../src/test/scala/{ => akka}/MessageJavaTest.scala | 0 .../src/test/scala/{ => akka}/MessageScalaTest.scala | 0 .../src/test/scala/{ => akka}/ProducerFeatureTest.scala | 0 .../src/test/scala/{ => akka}/PublishRequestorTest.scala | 0 .../src/test/scala/{ => akka}/RemoteConsumerTest.scala | 0 .../scala/{ => akka}/UntypedProducerFeatureTest.scala | 0 .../{ => akka}/component/ActorComponentFeatureTest.scala | 0 .../scala/{ => akka}/component/ActorComponentTest.scala | 0 .../scala/{ => akka}/component/ActorProducerTest.scala | 0 .../component/TypedActorComponentFeatureTest.scala | 0 .../src/test/scala/{ => akka}/support/TestSupport.scala | 0 akka-http/src/main/scala/{ => akka}/AkkaBroadcaster.scala | 0 .../src/main/scala/{ => akka}/AkkaCometServlet.scala | 0 akka-http/src/main/scala/{ => akka}/AkkaLoader.scala | 0 .../src/main/scala/{ => akka}/DefaultAkkaLoader.scala | 0 .../src/main/scala/{ => akka}/EmbeddedAppServer.scala | 0 akka-http/src/main/scala/{ => akka}/Initializer.scala | 0 akka-http/src/main/scala/{ => akka}/ListWriter.scala | 0 akka-http/src/main/scala/{ => akka}/Security.scala | 0 .../scala/{ => akka}/AtomikosTransactionService.scala | 0 akka-jta/src/main/scala/{ => akka}/JTA.scala | 0 .../src/main/scala/{ => akka}/TransactionContext.scala | 0 .../src/main/scala/{ => akka}/TransactionProtocol.scala | 0 akka-kernel/src/main/scala/{ => akka}/Kernel.scala | 0 .../src/main/scala/{ => akka}/CassandraSession.scala | 0 .../src/main/scala/{ => akka}/CassandraStorage.scala | 0 .../main/scala/{ => akka}/CassandraStorageBackend.scala | 0 .../src/main/scala/{ => akka}/CommonStorageBackend.scala | 0 .../src/main/scala/{ => akka}/Pool.scala | 0 .../src/main/scala/{ => akka}/Storage.scala | 0 .../src/main/scala/{ => akka}/StorageBackend.scala | 0 .../src/main/scala/{ => akka}/CouchDBStorage.scala | 0 .../src/main/scala/{ => akka}/CouchDBStorageBackend.scala | 0 .../src/main/scala/{ => akka}/HbaseStorage.scala | 0 .../src/main/scala/{ => akka}/HbaseStorageBackend.scala | 0 .../src/main/scala/{ => akka}/MemcachedStorage.scala | 0 .../main/scala/{ => akka}/MemcachedStorageBackend.scala | 0 .../src/main/scala/{ => akka}/MongoStorage.scala | 0 .../src/main/scala/{ => akka}/MongoStorageBackend.scala | 0 .../src/main/scala/{ => akka}/RedisPubSubServer.scala | 0 .../src/main/scala/{ => akka}/RedisStorage.scala | 0 .../src/main/scala/{ => akka}/RedisStorageBackend.scala | 0 .../src/main/scala/{ => akka}/RiakStorage.scala | 0 .../src/main/scala/{ => akka}/RiakStorageBackend.scala | 0 .../src/main/scala/{ => akka}/SimpledbStorage.scala | 0 .../main/scala/{ => akka}/SimpledbStorageBackend.scala | 0 .../src/main/scala/{ => akka}/VoldemortStorage.scala | 0 .../main/scala/{ => akka}/VoldemortStorageBackend.scala | 0 .../{ => akka}/remote/BootableRemoteActorService.scala | 0 .../main/scala/{ => akka}/remote/MessageSerializer.scala | 0 .../src/main/scala/{ => akka}/remote/RemoteClient.scala | 0 .../src/main/scala/{ => akka}/remote/RemoteServer.scala | 0 .../src/main/scala/{ => akka}/serialization/Binary.scala | 0 .../main/scala/{ => akka}/serialization/Compression.scala | 0 .../scala/{ => akka}/serialization/Serializable.scala | 0 .../{ => akka}/serialization/SerializationProtocol.scala | 0 .../main/scala/{ => akka}/serialization/Serializer.scala | 0 .../src/main/scala/{ => akka}/serialization/package.scala | 0 .../main/scala/{ => akka}/ActorBeanDefinitionParser.scala | 0 .../src/main/scala/{ => akka}/ActorFactoryBean.scala | 0 akka-spring/src/main/scala/{ => akka}/ActorParser.scala | 0 .../src/main/scala/{ => akka}/ActorProperties.scala | 0 .../src/main/scala/{ => akka}/AkkaNamespaceHandler.scala | 0 .../scala/{ => akka}/AkkaSpringConfigurationTags.scala | 0 .../{ => akka}/CamelServiceBeanDefinitionParser.scala | 0 .../main/scala/{ => akka}/CamelServiceFactoryBean.scala | 0 .../ConfiggyPropertyPlaceholderConfigurer.scala | 0 .../scala/{ => akka}/DispatcherBeanDefinitionParser.scala | 0 .../src/main/scala/{ => akka}/DispatcherFactoryBean.scala | 0 .../src/main/scala/{ => akka}/DispatcherProperties.scala | 0 .../src/main/scala/{ => akka}/PropertyEntries.scala | 0 akka-spring/src/main/scala/{ => akka}/StringReflect.scala | 0 .../{ => akka}/SupervisionBeanDefinitionParser.scala | 0 .../main/scala/{ => akka}/SupervisionFactoryBean.scala | 0 akka-stm/src/main/scala/{ => akka}/agent/Agent.scala | 0 akka-stm/src/main/scala/{ => akka}/stm/Atomic.scala | 0 akka-stm/src/main/scala/{ => akka}/stm/Ref.scala | 0 akka-stm/src/main/scala/{ => akka}/stm/Stm.scala | 0 akka-stm/src/main/scala/{ => akka}/stm/Transaction.scala | 0 .../main/scala/{ => akka}/stm/TransactionFactory.scala | 0 .../scala/{ => akka}/stm/TransactionFactoryBuilder.scala | 0 .../src/main/scala/{ => akka}/stm/TransactionalMap.scala | 0 .../main/scala/{ => akka}/stm/TransactionalVector.scala | 0 akka-stm/src/main/scala/{ => akka}/stm/package.scala | 0 .../src/main/scala/{ => akka}/transactor/Atomically.scala | 0 .../main/scala/{ => akka}/transactor/Coordinated.scala | 0 .../src/main/scala/{ => akka}/transactor/Transactor.scala | 0 .../scala/{ => akka}/transactor/UntypedTransactor.scala | 0 .../src/main/scala/{ => akka}/actor/TypedActor.scala | 0 .../scala/{ => akka}/config/TypedActorConfigurator.scala | 0 .../{ => akka}/config/TypedActorGuiceConfigurator.scala | 0 .../main/scala/{ => akka}/transactor/Coordination.scala | 0 175 files changed, 10 insertions(+), 4 deletions(-) rename akka-actor/src/main/scala/{ => akka}/actor/Actor.scala (100%) rename akka-actor/src/main/scala/{ => akka}/actor/ActorRef.scala (100%) rename akka-actor/src/main/scala/{ => akka}/actor/ActorRegistry.scala (100%) rename akka-actor/src/main/scala/{ => akka}/actor/BootableActorLoaderService.scala (100%) rename akka-actor/src/main/scala/{ => akka}/actor/FSM.scala (100%) rename akka-actor/src/main/scala/{ => akka}/actor/Implicits.scala (100%) rename akka-actor/src/main/scala/{ => akka}/actor/Scheduler.scala (100%) rename akka-actor/src/main/scala/{ => akka}/actor/Supervisor.scala (100%) rename akka-actor/src/main/scala/{ => akka}/actor/UntypedActor.scala (98%) rename akka-actor/src/main/scala/{ => akka}/config/Config.scala (100%) rename akka-actor/src/main/scala/{ => akka}/config/Configuration.scala (100%) rename akka-actor/src/main/scala/{ => akka}/config/Configurator.scala (100%) rename akka-actor/src/main/scala/{ => akka}/config/SupervisionConfig.scala (100%) rename akka-actor/src/main/scala/{ => akka}/dataflow/DataFlowVariable.scala (100%) rename akka-actor/src/main/scala/{ => akka}/dispatch/Dispatchers.scala (100%) rename akka-actor/src/main/scala/{ => akka}/dispatch/ExecutorBasedEventDrivenDispatcher.scala (100%) rename akka-actor/src/main/scala/{ => akka}/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcher.scala (100%) rename akka-actor/src/main/scala/{ => akka}/dispatch/Future.scala (100%) rename akka-actor/src/main/scala/{ => akka}/dispatch/HawtDispatcher.scala (100%) rename akka-actor/src/main/scala/{ => akka}/dispatch/MailboxHandling.scala (100%) rename akka-actor/src/main/scala/{ => akka}/dispatch/MessageHandling.scala (100%) rename akka-actor/src/main/scala/{ => akka}/dispatch/ThreadBasedDispatcher.scala (100%) rename akka-actor/src/main/scala/{ => akka}/dispatch/ThreadPoolBuilder.scala (100%) rename akka-actor/src/main/scala/{ => akka}/japi/JavaAPI.scala (93%) rename akka-actor/src/main/scala/{ => akka}/routing/Iterators.scala (100%) rename akka-actor/src/main/scala/{ => akka}/routing/Listeners.scala (100%) rename akka-actor/src/main/scala/{ => akka}/routing/Routers.scala (100%) rename akka-actor/src/main/scala/{ => akka}/routing/Routing.scala (100%) rename akka-actor/src/main/scala/{ => akka}/util/Address.scala (100%) rename akka-actor/src/main/scala/{ => akka}/util/AkkaException.scala (100%) rename akka-actor/src/main/scala/{ => akka}/util/Bootable.scala (100%) rename akka-actor/src/main/scala/{ => akka}/util/Crypt.scala (100%) rename akka-actor/src/main/scala/{ => akka}/util/Duration.scala (100%) rename akka-actor/src/main/scala/{ => akka}/util/HashCode.scala (100%) rename akka-actor/src/main/scala/{ => akka}/util/Helpers.scala (100%) rename akka-actor/src/main/scala/{ => akka}/util/ListenerManagement.scala (100%) rename akka-actor/src/main/scala/{ => akka}/util/LockUtil.scala (100%) rename akka-actor/src/main/scala/{ => akka}/util/Logging.scala (100%) rename akka-actor/src/main/scala/{ => akka}/util/ReflectiveAccess.scala (100%) rename akka-actor/src/test/scala/{ => akka}/Messages.scala (100%) rename akka-actor/src/test/scala/{ => akka}/actor/actor/ActorFireForgetRequestReplySpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/actor/actor/ActorRefSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/actor/actor/Bench.scala (100%) rename akka-actor/src/test/scala/{ => akka}/actor/actor/FSMActorSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/actor/actor/ForwardActorSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/actor/actor/HotSwapSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/actor/actor/ReceiveTimeoutSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/actor/supervisor/RestartStrategySpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/actor/supervisor/SupervisorHierarchySpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/actor/supervisor/SupervisorMiscSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/actor/supervisor/SupervisorSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dataflow/DataFlowSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dispatch/ActorModelSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dispatch/DispatchersSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dispatch/ExecutorBasedEventDrivenDispatcherActorSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dispatch/ExecutorBasedEventDrivenDispatcherActorsSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcherSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dispatch/FutureSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dispatch/HawtDispatcherActorSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dispatch/HawtDispatcherEchoServer.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dispatch/MailboxConfigSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dispatch/ThreadBasedActorSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/dispatch/ThreadBasedDispatcherSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/japi/JavaAPITest.scala (100%) rename akka-actor/src/test/scala/{ => akka}/misc/ActorRegistrySpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/misc/SchedulerSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/routing/RoutingSpec.scala (100%) rename akka-actor/src/test/scala/{ => akka}/ticket/Ticket001Spec.scala (100%) rename akka-camel/src/main/scala/{ => akka}/CamelContextLifecycle.scala (100%) rename akka-camel/src/main/scala/{ => akka}/CamelService.scala (100%) rename akka-camel/src/main/scala/{ => akka}/Consumer.scala (100%) rename akka-camel/src/main/scala/{ => akka}/ConsumerPublisher.scala (100%) rename akka-camel/src/main/scala/{ => akka}/Message.scala (100%) rename akka-camel/src/main/scala/{ => akka}/Producer.scala (100%) rename akka-camel/src/main/scala/{ => akka}/component/ActorComponent.scala (100%) rename akka-camel/src/main/scala/{ => akka}/component/TypedActorComponent.scala (100%) rename akka-camel/src/test/scala/{ => akka}/CamelContextLifecycleTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/CamelExchangeAdapterTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/CamelMessageAdapterTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/CamelServiceManagerTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/ConsumerJavaTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/ConsumerRegisteredTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/ConsumerScalaTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/MessageJavaTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/MessageScalaTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/ProducerFeatureTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/PublishRequestorTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/RemoteConsumerTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/UntypedProducerFeatureTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/component/ActorComponentFeatureTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/component/ActorComponentTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/component/ActorProducerTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/component/TypedActorComponentFeatureTest.scala (100%) rename akka-camel/src/test/scala/{ => akka}/support/TestSupport.scala (100%) rename akka-http/src/main/scala/{ => akka}/AkkaBroadcaster.scala (100%) rename akka-http/src/main/scala/{ => akka}/AkkaCometServlet.scala (100%) rename akka-http/src/main/scala/{ => akka}/AkkaLoader.scala (100%) rename akka-http/src/main/scala/{ => akka}/DefaultAkkaLoader.scala (100%) rename akka-http/src/main/scala/{ => akka}/EmbeddedAppServer.scala (100%) rename akka-http/src/main/scala/{ => akka}/Initializer.scala (100%) rename akka-http/src/main/scala/{ => akka}/ListWriter.scala (100%) rename akka-http/src/main/scala/{ => akka}/Security.scala (100%) rename akka-jta/src/main/scala/{ => akka}/AtomikosTransactionService.scala (100%) rename akka-jta/src/main/scala/{ => akka}/JTA.scala (100%) rename akka-jta/src/main/scala/{ => akka}/TransactionContext.scala (100%) rename akka-jta/src/main/scala/{ => akka}/TransactionProtocol.scala (100%) rename akka-kernel/src/main/scala/{ => akka}/Kernel.scala (100%) rename akka-persistence/akka-persistence-cassandra/src/main/scala/{ => akka}/CassandraSession.scala (100%) rename akka-persistence/akka-persistence-cassandra/src/main/scala/{ => akka}/CassandraStorage.scala (100%) rename akka-persistence/akka-persistence-cassandra/src/main/scala/{ => akka}/CassandraStorageBackend.scala (100%) rename akka-persistence/akka-persistence-common/src/main/scala/{ => akka}/CommonStorageBackend.scala (100%) rename akka-persistence/akka-persistence-common/src/main/scala/{ => akka}/Pool.scala (100%) rename akka-persistence/akka-persistence-common/src/main/scala/{ => akka}/Storage.scala (100%) rename akka-persistence/akka-persistence-common/src/main/scala/{ => akka}/StorageBackend.scala (100%) rename akka-persistence/akka-persistence-couchdb/src/main/scala/{ => akka}/CouchDBStorage.scala (100%) rename akka-persistence/akka-persistence-couchdb/src/main/scala/{ => akka}/CouchDBStorageBackend.scala (100%) rename akka-persistence/akka-persistence-hbase/src/main/scala/{ => akka}/HbaseStorage.scala (100%) rename akka-persistence/akka-persistence-hbase/src/main/scala/{ => akka}/HbaseStorageBackend.scala (100%) rename akka-persistence/akka-persistence-memcached/src/main/scala/{ => akka}/MemcachedStorage.scala (100%) rename akka-persistence/akka-persistence-memcached/src/main/scala/{ => akka}/MemcachedStorageBackend.scala (100%) rename akka-persistence/akka-persistence-mongo/src/main/scala/{ => akka}/MongoStorage.scala (100%) rename akka-persistence/akka-persistence-mongo/src/main/scala/{ => akka}/MongoStorageBackend.scala (100%) rename akka-persistence/akka-persistence-redis/src/main/scala/{ => akka}/RedisPubSubServer.scala (100%) rename akka-persistence/akka-persistence-redis/src/main/scala/{ => akka}/RedisStorage.scala (100%) rename akka-persistence/akka-persistence-redis/src/main/scala/{ => akka}/RedisStorageBackend.scala (100%) rename akka-persistence/akka-persistence-riak/src/main/scala/{ => akka}/RiakStorage.scala (100%) rename akka-persistence/akka-persistence-riak/src/main/scala/{ => akka}/RiakStorageBackend.scala (100%) rename akka-persistence/akka-persistence-simpledb/src/main/scala/{ => akka}/SimpledbStorage.scala (100%) rename akka-persistence/akka-persistence-simpledb/src/main/scala/{ => akka}/SimpledbStorageBackend.scala (100%) rename akka-persistence/akka-persistence-voldemort/src/main/scala/{ => akka}/VoldemortStorage.scala (100%) rename akka-persistence/akka-persistence-voldemort/src/main/scala/{ => akka}/VoldemortStorageBackend.scala (100%) rename akka-remote/src/main/scala/{ => akka}/remote/BootableRemoteActorService.scala (100%) rename akka-remote/src/main/scala/{ => akka}/remote/MessageSerializer.scala (100%) rename akka-remote/src/main/scala/{ => akka}/remote/RemoteClient.scala (100%) rename akka-remote/src/main/scala/{ => akka}/remote/RemoteServer.scala (100%) rename akka-remote/src/main/scala/{ => akka}/serialization/Binary.scala (100%) rename akka-remote/src/main/scala/{ => akka}/serialization/Compression.scala (100%) rename akka-remote/src/main/scala/{ => akka}/serialization/Serializable.scala (100%) rename akka-remote/src/main/scala/{ => akka}/serialization/SerializationProtocol.scala (100%) rename akka-remote/src/main/scala/{ => akka}/serialization/Serializer.scala (100%) rename akka-remote/src/main/scala/{ => akka}/serialization/package.scala (100%) rename akka-spring/src/main/scala/{ => akka}/ActorBeanDefinitionParser.scala (100%) rename akka-spring/src/main/scala/{ => akka}/ActorFactoryBean.scala (100%) rename akka-spring/src/main/scala/{ => akka}/ActorParser.scala (100%) rename akka-spring/src/main/scala/{ => akka}/ActorProperties.scala (100%) rename akka-spring/src/main/scala/{ => akka}/AkkaNamespaceHandler.scala (100%) rename akka-spring/src/main/scala/{ => akka}/AkkaSpringConfigurationTags.scala (100%) rename akka-spring/src/main/scala/{ => akka}/CamelServiceBeanDefinitionParser.scala (100%) rename akka-spring/src/main/scala/{ => akka}/CamelServiceFactoryBean.scala (100%) rename akka-spring/src/main/scala/{ => akka}/ConfiggyPropertyPlaceholderConfigurer.scala (100%) rename akka-spring/src/main/scala/{ => akka}/DispatcherBeanDefinitionParser.scala (100%) rename akka-spring/src/main/scala/{ => akka}/DispatcherFactoryBean.scala (100%) rename akka-spring/src/main/scala/{ => akka}/DispatcherProperties.scala (100%) rename akka-spring/src/main/scala/{ => akka}/PropertyEntries.scala (100%) rename akka-spring/src/main/scala/{ => akka}/StringReflect.scala (100%) rename akka-spring/src/main/scala/{ => akka}/SupervisionBeanDefinitionParser.scala (100%) rename akka-spring/src/main/scala/{ => akka}/SupervisionFactoryBean.scala (100%) rename akka-stm/src/main/scala/{ => akka}/agent/Agent.scala (100%) rename akka-stm/src/main/scala/{ => akka}/stm/Atomic.scala (100%) rename akka-stm/src/main/scala/{ => akka}/stm/Ref.scala (100%) rename akka-stm/src/main/scala/{ => akka}/stm/Stm.scala (100%) rename akka-stm/src/main/scala/{ => akka}/stm/Transaction.scala (100%) rename akka-stm/src/main/scala/{ => akka}/stm/TransactionFactory.scala (100%) rename akka-stm/src/main/scala/{ => akka}/stm/TransactionFactoryBuilder.scala (100%) rename akka-stm/src/main/scala/{ => akka}/stm/TransactionalMap.scala (100%) rename akka-stm/src/main/scala/{ => akka}/stm/TransactionalVector.scala (100%) rename akka-stm/src/main/scala/{ => akka}/stm/package.scala (100%) rename akka-stm/src/main/scala/{ => akka}/transactor/Atomically.scala (100%) rename akka-stm/src/main/scala/{ => akka}/transactor/Coordinated.scala (100%) rename akka-stm/src/main/scala/{ => akka}/transactor/Transactor.scala (100%) rename akka-stm/src/main/scala/{ => akka}/transactor/UntypedTransactor.scala (100%) rename akka-typed-actor/src/main/scala/{ => akka}/actor/TypedActor.scala (100%) rename akka-typed-actor/src/main/scala/{ => akka}/config/TypedActorConfigurator.scala (100%) rename akka-typed-actor/src/main/scala/{ => akka}/config/TypedActorGuiceConfigurator.scala (100%) rename akka-typed-actor/src/main/scala/{ => akka}/transactor/Coordination.scala (100%) diff --git a/akka-actor/src/main/scala/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala similarity index 100% rename from akka-actor/src/main/scala/actor/Actor.scala rename to akka-actor/src/main/scala/akka/actor/Actor.scala diff --git a/akka-actor/src/main/scala/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala similarity index 100% rename from akka-actor/src/main/scala/actor/ActorRef.scala rename to akka-actor/src/main/scala/akka/actor/ActorRef.scala diff --git a/akka-actor/src/main/scala/actor/ActorRegistry.scala b/akka-actor/src/main/scala/akka/actor/ActorRegistry.scala similarity index 100% rename from akka-actor/src/main/scala/actor/ActorRegistry.scala rename to akka-actor/src/main/scala/akka/actor/ActorRegistry.scala diff --git a/akka-actor/src/main/scala/actor/BootableActorLoaderService.scala b/akka-actor/src/main/scala/akka/actor/BootableActorLoaderService.scala similarity index 100% rename from akka-actor/src/main/scala/actor/BootableActorLoaderService.scala rename to akka-actor/src/main/scala/akka/actor/BootableActorLoaderService.scala diff --git a/akka-actor/src/main/scala/actor/FSM.scala b/akka-actor/src/main/scala/akka/actor/FSM.scala similarity index 100% rename from akka-actor/src/main/scala/actor/FSM.scala rename to akka-actor/src/main/scala/akka/actor/FSM.scala diff --git a/akka-actor/src/main/scala/actor/Implicits.scala b/akka-actor/src/main/scala/akka/actor/Implicits.scala similarity index 100% rename from akka-actor/src/main/scala/actor/Implicits.scala rename to akka-actor/src/main/scala/akka/actor/Implicits.scala diff --git a/akka-actor/src/main/scala/actor/Scheduler.scala b/akka-actor/src/main/scala/akka/actor/Scheduler.scala similarity index 100% rename from akka-actor/src/main/scala/actor/Scheduler.scala rename to akka-actor/src/main/scala/akka/actor/Scheduler.scala diff --git a/akka-actor/src/main/scala/actor/Supervisor.scala b/akka-actor/src/main/scala/akka/actor/Supervisor.scala similarity index 100% rename from akka-actor/src/main/scala/actor/Supervisor.scala rename to akka-actor/src/main/scala/akka/actor/Supervisor.scala diff --git a/akka-actor/src/main/scala/actor/UntypedActor.scala b/akka-actor/src/main/scala/akka/actor/UntypedActor.scala similarity index 98% rename from akka-actor/src/main/scala/actor/UntypedActor.scala rename to akka-actor/src/main/scala/akka/actor/UntypedActor.scala index cce41a92a7..9eec8cbb5d 100644 --- a/akka-actor/src/main/scala/actor/UntypedActor.scala +++ b/akka-actor/src/main/scala/akka/actor/UntypedActor.scala @@ -6,7 +6,7 @@ package akka.actor import akka.dispatch._ import akka.config.Supervision._ -import akka.japi.Procedure +import akka.japi.{Creator, Procedure} import java.net.InetSocketAddress @@ -90,9 +90,7 @@ abstract class UntypedActor extends Actor { * * @author Jonas Bonér */ -trait UntypedActorFactory { - def create: UntypedActor -} +trait UntypedActorFactory extends Creator[Actor] /** * Extend this abstract class to create a remote UntypedActor. diff --git a/akka-actor/src/main/scala/config/Config.scala b/akka-actor/src/main/scala/akka/config/Config.scala similarity index 100% rename from akka-actor/src/main/scala/config/Config.scala rename to akka-actor/src/main/scala/akka/config/Config.scala diff --git a/akka-actor/src/main/scala/config/Configuration.scala b/akka-actor/src/main/scala/akka/config/Configuration.scala similarity index 100% rename from akka-actor/src/main/scala/config/Configuration.scala rename to akka-actor/src/main/scala/akka/config/Configuration.scala diff --git a/akka-actor/src/main/scala/config/Configurator.scala b/akka-actor/src/main/scala/akka/config/Configurator.scala similarity index 100% rename from akka-actor/src/main/scala/config/Configurator.scala rename to akka-actor/src/main/scala/akka/config/Configurator.scala diff --git a/akka-actor/src/main/scala/config/SupervisionConfig.scala b/akka-actor/src/main/scala/akka/config/SupervisionConfig.scala similarity index 100% rename from akka-actor/src/main/scala/config/SupervisionConfig.scala rename to akka-actor/src/main/scala/akka/config/SupervisionConfig.scala diff --git a/akka-actor/src/main/scala/dataflow/DataFlowVariable.scala b/akka-actor/src/main/scala/akka/dataflow/DataFlowVariable.scala similarity index 100% rename from akka-actor/src/main/scala/dataflow/DataFlowVariable.scala rename to akka-actor/src/main/scala/akka/dataflow/DataFlowVariable.scala diff --git a/akka-actor/src/main/scala/dispatch/Dispatchers.scala b/akka-actor/src/main/scala/akka/dispatch/Dispatchers.scala similarity index 100% rename from akka-actor/src/main/scala/dispatch/Dispatchers.scala rename to akka-actor/src/main/scala/akka/dispatch/Dispatchers.scala diff --git a/akka-actor/src/main/scala/dispatch/ExecutorBasedEventDrivenDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala similarity index 100% rename from akka-actor/src/main/scala/dispatch/ExecutorBasedEventDrivenDispatcher.scala rename to akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala diff --git a/akka-actor/src/main/scala/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcher.scala similarity index 100% rename from akka-actor/src/main/scala/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcher.scala rename to akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcher.scala diff --git a/akka-actor/src/main/scala/dispatch/Future.scala b/akka-actor/src/main/scala/akka/dispatch/Future.scala similarity index 100% rename from akka-actor/src/main/scala/dispatch/Future.scala rename to akka-actor/src/main/scala/akka/dispatch/Future.scala diff --git a/akka-actor/src/main/scala/dispatch/HawtDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/HawtDispatcher.scala similarity index 100% rename from akka-actor/src/main/scala/dispatch/HawtDispatcher.scala rename to akka-actor/src/main/scala/akka/dispatch/HawtDispatcher.scala diff --git a/akka-actor/src/main/scala/dispatch/MailboxHandling.scala b/akka-actor/src/main/scala/akka/dispatch/MailboxHandling.scala similarity index 100% rename from akka-actor/src/main/scala/dispatch/MailboxHandling.scala rename to akka-actor/src/main/scala/akka/dispatch/MailboxHandling.scala diff --git a/akka-actor/src/main/scala/dispatch/MessageHandling.scala b/akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala similarity index 100% rename from akka-actor/src/main/scala/dispatch/MessageHandling.scala rename to akka-actor/src/main/scala/akka/dispatch/MessageHandling.scala diff --git a/akka-actor/src/main/scala/dispatch/ThreadBasedDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/ThreadBasedDispatcher.scala similarity index 100% rename from akka-actor/src/main/scala/dispatch/ThreadBasedDispatcher.scala rename to akka-actor/src/main/scala/akka/dispatch/ThreadBasedDispatcher.scala diff --git a/akka-actor/src/main/scala/dispatch/ThreadPoolBuilder.scala b/akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala similarity index 100% rename from akka-actor/src/main/scala/dispatch/ThreadPoolBuilder.scala rename to akka-actor/src/main/scala/akka/dispatch/ThreadPoolBuilder.scala diff --git a/akka-actor/src/main/scala/japi/JavaAPI.scala b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala similarity index 93% rename from akka-actor/src/main/scala/japi/JavaAPI.scala rename to akka-actor/src/main/scala/akka/japi/JavaAPI.scala index f3dd89d91b..88732a4efc 100644 --- a/akka-actor/src/main/scala/japi/JavaAPI.scala +++ b/akka-actor/src/main/scala/akka/japi/JavaAPI.scala @@ -20,6 +20,14 @@ trait SideEffect { def apply: Unit } +/** + + * A constructor/factory, takes no parameters but creates a new value of type T every call + + */ +trait Creator[T] { + def create: T +} + + /** * This class represents optional values. Instances of Option * are either instances of case class Some or it is case diff --git a/akka-actor/src/main/scala/routing/Iterators.scala b/akka-actor/src/main/scala/akka/routing/Iterators.scala similarity index 100% rename from akka-actor/src/main/scala/routing/Iterators.scala rename to akka-actor/src/main/scala/akka/routing/Iterators.scala diff --git a/akka-actor/src/main/scala/routing/Listeners.scala b/akka-actor/src/main/scala/akka/routing/Listeners.scala similarity index 100% rename from akka-actor/src/main/scala/routing/Listeners.scala rename to akka-actor/src/main/scala/akka/routing/Listeners.scala diff --git a/akka-actor/src/main/scala/routing/Routers.scala b/akka-actor/src/main/scala/akka/routing/Routers.scala similarity index 100% rename from akka-actor/src/main/scala/routing/Routers.scala rename to akka-actor/src/main/scala/akka/routing/Routers.scala diff --git a/akka-actor/src/main/scala/routing/Routing.scala b/akka-actor/src/main/scala/akka/routing/Routing.scala similarity index 100% rename from akka-actor/src/main/scala/routing/Routing.scala rename to akka-actor/src/main/scala/akka/routing/Routing.scala diff --git a/akka-actor/src/main/scala/util/Address.scala b/akka-actor/src/main/scala/akka/util/Address.scala similarity index 100% rename from akka-actor/src/main/scala/util/Address.scala rename to akka-actor/src/main/scala/akka/util/Address.scala diff --git a/akka-actor/src/main/scala/util/AkkaException.scala b/akka-actor/src/main/scala/akka/util/AkkaException.scala similarity index 100% rename from akka-actor/src/main/scala/util/AkkaException.scala rename to akka-actor/src/main/scala/akka/util/AkkaException.scala diff --git a/akka-actor/src/main/scala/util/Bootable.scala b/akka-actor/src/main/scala/akka/util/Bootable.scala similarity index 100% rename from akka-actor/src/main/scala/util/Bootable.scala rename to akka-actor/src/main/scala/akka/util/Bootable.scala diff --git a/akka-actor/src/main/scala/util/Crypt.scala b/akka-actor/src/main/scala/akka/util/Crypt.scala similarity index 100% rename from akka-actor/src/main/scala/util/Crypt.scala rename to akka-actor/src/main/scala/akka/util/Crypt.scala diff --git a/akka-actor/src/main/scala/util/Duration.scala b/akka-actor/src/main/scala/akka/util/Duration.scala similarity index 100% rename from akka-actor/src/main/scala/util/Duration.scala rename to akka-actor/src/main/scala/akka/util/Duration.scala diff --git a/akka-actor/src/main/scala/util/HashCode.scala b/akka-actor/src/main/scala/akka/util/HashCode.scala similarity index 100% rename from akka-actor/src/main/scala/util/HashCode.scala rename to akka-actor/src/main/scala/akka/util/HashCode.scala diff --git a/akka-actor/src/main/scala/util/Helpers.scala b/akka-actor/src/main/scala/akka/util/Helpers.scala similarity index 100% rename from akka-actor/src/main/scala/util/Helpers.scala rename to akka-actor/src/main/scala/akka/util/Helpers.scala diff --git a/akka-actor/src/main/scala/util/ListenerManagement.scala b/akka-actor/src/main/scala/akka/util/ListenerManagement.scala similarity index 100% rename from akka-actor/src/main/scala/util/ListenerManagement.scala rename to akka-actor/src/main/scala/akka/util/ListenerManagement.scala diff --git a/akka-actor/src/main/scala/util/LockUtil.scala b/akka-actor/src/main/scala/akka/util/LockUtil.scala similarity index 100% rename from akka-actor/src/main/scala/util/LockUtil.scala rename to akka-actor/src/main/scala/akka/util/LockUtil.scala diff --git a/akka-actor/src/main/scala/util/Logging.scala b/akka-actor/src/main/scala/akka/util/Logging.scala similarity index 100% rename from akka-actor/src/main/scala/util/Logging.scala rename to akka-actor/src/main/scala/akka/util/Logging.scala diff --git a/akka-actor/src/main/scala/util/ReflectiveAccess.scala b/akka-actor/src/main/scala/akka/util/ReflectiveAccess.scala similarity index 100% rename from akka-actor/src/main/scala/util/ReflectiveAccess.scala rename to akka-actor/src/main/scala/akka/util/ReflectiveAccess.scala diff --git a/akka-actor/src/test/scala/Messages.scala b/akka-actor/src/test/scala/akka/Messages.scala similarity index 100% rename from akka-actor/src/test/scala/Messages.scala rename to akka-actor/src/test/scala/akka/Messages.scala diff --git a/akka-actor/src/test/scala/actor/actor/ActorFireForgetRequestReplySpec.scala b/akka-actor/src/test/scala/akka/actor/actor/ActorFireForgetRequestReplySpec.scala similarity index 100% rename from akka-actor/src/test/scala/actor/actor/ActorFireForgetRequestReplySpec.scala rename to akka-actor/src/test/scala/akka/actor/actor/ActorFireForgetRequestReplySpec.scala diff --git a/akka-actor/src/test/scala/actor/actor/ActorRefSpec.scala b/akka-actor/src/test/scala/akka/actor/actor/ActorRefSpec.scala similarity index 100% rename from akka-actor/src/test/scala/actor/actor/ActorRefSpec.scala rename to akka-actor/src/test/scala/akka/actor/actor/ActorRefSpec.scala diff --git a/akka-actor/src/test/scala/actor/actor/Bench.scala b/akka-actor/src/test/scala/akka/actor/actor/Bench.scala similarity index 100% rename from akka-actor/src/test/scala/actor/actor/Bench.scala rename to akka-actor/src/test/scala/akka/actor/actor/Bench.scala diff --git a/akka-actor/src/test/scala/actor/actor/FSMActorSpec.scala b/akka-actor/src/test/scala/akka/actor/actor/FSMActorSpec.scala similarity index 100% rename from akka-actor/src/test/scala/actor/actor/FSMActorSpec.scala rename to akka-actor/src/test/scala/akka/actor/actor/FSMActorSpec.scala diff --git a/akka-actor/src/test/scala/actor/actor/ForwardActorSpec.scala b/akka-actor/src/test/scala/akka/actor/actor/ForwardActorSpec.scala similarity index 100% rename from akka-actor/src/test/scala/actor/actor/ForwardActorSpec.scala rename to akka-actor/src/test/scala/akka/actor/actor/ForwardActorSpec.scala diff --git a/akka-actor/src/test/scala/actor/actor/HotSwapSpec.scala b/akka-actor/src/test/scala/akka/actor/actor/HotSwapSpec.scala similarity index 100% rename from akka-actor/src/test/scala/actor/actor/HotSwapSpec.scala rename to akka-actor/src/test/scala/akka/actor/actor/HotSwapSpec.scala diff --git a/akka-actor/src/test/scala/actor/actor/ReceiveTimeoutSpec.scala b/akka-actor/src/test/scala/akka/actor/actor/ReceiveTimeoutSpec.scala similarity index 100% rename from akka-actor/src/test/scala/actor/actor/ReceiveTimeoutSpec.scala rename to akka-actor/src/test/scala/akka/actor/actor/ReceiveTimeoutSpec.scala diff --git a/akka-actor/src/test/scala/actor/supervisor/RestartStrategySpec.scala b/akka-actor/src/test/scala/akka/actor/supervisor/RestartStrategySpec.scala similarity index 100% rename from akka-actor/src/test/scala/actor/supervisor/RestartStrategySpec.scala rename to akka-actor/src/test/scala/akka/actor/supervisor/RestartStrategySpec.scala diff --git a/akka-actor/src/test/scala/actor/supervisor/SupervisorHierarchySpec.scala b/akka-actor/src/test/scala/akka/actor/supervisor/SupervisorHierarchySpec.scala similarity index 100% rename from akka-actor/src/test/scala/actor/supervisor/SupervisorHierarchySpec.scala rename to akka-actor/src/test/scala/akka/actor/supervisor/SupervisorHierarchySpec.scala diff --git a/akka-actor/src/test/scala/actor/supervisor/SupervisorMiscSpec.scala b/akka-actor/src/test/scala/akka/actor/supervisor/SupervisorMiscSpec.scala similarity index 100% rename from akka-actor/src/test/scala/actor/supervisor/SupervisorMiscSpec.scala rename to akka-actor/src/test/scala/akka/actor/supervisor/SupervisorMiscSpec.scala diff --git a/akka-actor/src/test/scala/actor/supervisor/SupervisorSpec.scala b/akka-actor/src/test/scala/akka/actor/supervisor/SupervisorSpec.scala similarity index 100% rename from akka-actor/src/test/scala/actor/supervisor/SupervisorSpec.scala rename to akka-actor/src/test/scala/akka/actor/supervisor/SupervisorSpec.scala diff --git a/akka-actor/src/test/scala/dataflow/DataFlowSpec.scala b/akka-actor/src/test/scala/akka/dataflow/DataFlowSpec.scala similarity index 100% rename from akka-actor/src/test/scala/dataflow/DataFlowSpec.scala rename to akka-actor/src/test/scala/akka/dataflow/DataFlowSpec.scala diff --git a/akka-actor/src/test/scala/dispatch/ActorModelSpec.scala b/akka-actor/src/test/scala/akka/dispatch/ActorModelSpec.scala similarity index 100% rename from akka-actor/src/test/scala/dispatch/ActorModelSpec.scala rename to akka-actor/src/test/scala/akka/dispatch/ActorModelSpec.scala diff --git a/akka-actor/src/test/scala/dispatch/DispatchersSpec.scala b/akka-actor/src/test/scala/akka/dispatch/DispatchersSpec.scala similarity index 100% rename from akka-actor/src/test/scala/dispatch/DispatchersSpec.scala rename to akka-actor/src/test/scala/akka/dispatch/DispatchersSpec.scala diff --git a/akka-actor/src/test/scala/dispatch/ExecutorBasedEventDrivenDispatcherActorSpec.scala b/akka-actor/src/test/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcherActorSpec.scala similarity index 100% rename from akka-actor/src/test/scala/dispatch/ExecutorBasedEventDrivenDispatcherActorSpec.scala rename to akka-actor/src/test/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcherActorSpec.scala diff --git a/akka-actor/src/test/scala/dispatch/ExecutorBasedEventDrivenDispatcherActorsSpec.scala b/akka-actor/src/test/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcherActorsSpec.scala similarity index 100% rename from akka-actor/src/test/scala/dispatch/ExecutorBasedEventDrivenDispatcherActorsSpec.scala rename to akka-actor/src/test/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcherActorsSpec.scala diff --git a/akka-actor/src/test/scala/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcherSpec.scala b/akka-actor/src/test/scala/akka/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcherSpec.scala similarity index 100% rename from akka-actor/src/test/scala/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcherSpec.scala rename to akka-actor/src/test/scala/akka/dispatch/ExecutorBasedEventDrivenWorkStealingDispatcherSpec.scala diff --git a/akka-actor/src/test/scala/dispatch/FutureSpec.scala b/akka-actor/src/test/scala/akka/dispatch/FutureSpec.scala similarity index 100% rename from akka-actor/src/test/scala/dispatch/FutureSpec.scala rename to akka-actor/src/test/scala/akka/dispatch/FutureSpec.scala diff --git a/akka-actor/src/test/scala/dispatch/HawtDispatcherActorSpec.scala b/akka-actor/src/test/scala/akka/dispatch/HawtDispatcherActorSpec.scala similarity index 100% rename from akka-actor/src/test/scala/dispatch/HawtDispatcherActorSpec.scala rename to akka-actor/src/test/scala/akka/dispatch/HawtDispatcherActorSpec.scala diff --git a/akka-actor/src/test/scala/dispatch/HawtDispatcherEchoServer.scala b/akka-actor/src/test/scala/akka/dispatch/HawtDispatcherEchoServer.scala similarity index 100% rename from akka-actor/src/test/scala/dispatch/HawtDispatcherEchoServer.scala rename to akka-actor/src/test/scala/akka/dispatch/HawtDispatcherEchoServer.scala diff --git a/akka-actor/src/test/scala/dispatch/MailboxConfigSpec.scala b/akka-actor/src/test/scala/akka/dispatch/MailboxConfigSpec.scala similarity index 100% rename from akka-actor/src/test/scala/dispatch/MailboxConfigSpec.scala rename to akka-actor/src/test/scala/akka/dispatch/MailboxConfigSpec.scala diff --git a/akka-actor/src/test/scala/dispatch/ThreadBasedActorSpec.scala b/akka-actor/src/test/scala/akka/dispatch/ThreadBasedActorSpec.scala similarity index 100% rename from akka-actor/src/test/scala/dispatch/ThreadBasedActorSpec.scala rename to akka-actor/src/test/scala/akka/dispatch/ThreadBasedActorSpec.scala diff --git a/akka-actor/src/test/scala/dispatch/ThreadBasedDispatcherSpec.scala b/akka-actor/src/test/scala/akka/dispatch/ThreadBasedDispatcherSpec.scala similarity index 100% rename from akka-actor/src/test/scala/dispatch/ThreadBasedDispatcherSpec.scala rename to akka-actor/src/test/scala/akka/dispatch/ThreadBasedDispatcherSpec.scala diff --git a/akka-actor/src/test/scala/japi/JavaAPITest.scala b/akka-actor/src/test/scala/akka/japi/JavaAPITest.scala similarity index 100% rename from akka-actor/src/test/scala/japi/JavaAPITest.scala rename to akka-actor/src/test/scala/akka/japi/JavaAPITest.scala diff --git a/akka-actor/src/test/scala/misc/ActorRegistrySpec.scala b/akka-actor/src/test/scala/akka/misc/ActorRegistrySpec.scala similarity index 100% rename from akka-actor/src/test/scala/misc/ActorRegistrySpec.scala rename to akka-actor/src/test/scala/akka/misc/ActorRegistrySpec.scala diff --git a/akka-actor/src/test/scala/misc/SchedulerSpec.scala b/akka-actor/src/test/scala/akka/misc/SchedulerSpec.scala similarity index 100% rename from akka-actor/src/test/scala/misc/SchedulerSpec.scala rename to akka-actor/src/test/scala/akka/misc/SchedulerSpec.scala diff --git a/akka-actor/src/test/scala/routing/RoutingSpec.scala b/akka-actor/src/test/scala/akka/routing/RoutingSpec.scala similarity index 100% rename from akka-actor/src/test/scala/routing/RoutingSpec.scala rename to akka-actor/src/test/scala/akka/routing/RoutingSpec.scala diff --git a/akka-actor/src/test/scala/ticket/Ticket001Spec.scala b/akka-actor/src/test/scala/akka/ticket/Ticket001Spec.scala similarity index 100% rename from akka-actor/src/test/scala/ticket/Ticket001Spec.scala rename to akka-actor/src/test/scala/akka/ticket/Ticket001Spec.scala diff --git a/akka-camel/src/main/scala/CamelContextLifecycle.scala b/akka-camel/src/main/scala/akka/CamelContextLifecycle.scala similarity index 100% rename from akka-camel/src/main/scala/CamelContextLifecycle.scala rename to akka-camel/src/main/scala/akka/CamelContextLifecycle.scala diff --git a/akka-camel/src/main/scala/CamelService.scala b/akka-camel/src/main/scala/akka/CamelService.scala similarity index 100% rename from akka-camel/src/main/scala/CamelService.scala rename to akka-camel/src/main/scala/akka/CamelService.scala diff --git a/akka-camel/src/main/scala/Consumer.scala b/akka-camel/src/main/scala/akka/Consumer.scala similarity index 100% rename from akka-camel/src/main/scala/Consumer.scala rename to akka-camel/src/main/scala/akka/Consumer.scala diff --git a/akka-camel/src/main/scala/ConsumerPublisher.scala b/akka-camel/src/main/scala/akka/ConsumerPublisher.scala similarity index 100% rename from akka-camel/src/main/scala/ConsumerPublisher.scala rename to akka-camel/src/main/scala/akka/ConsumerPublisher.scala diff --git a/akka-camel/src/main/scala/Message.scala b/akka-camel/src/main/scala/akka/Message.scala similarity index 100% rename from akka-camel/src/main/scala/Message.scala rename to akka-camel/src/main/scala/akka/Message.scala diff --git a/akka-camel/src/main/scala/Producer.scala b/akka-camel/src/main/scala/akka/Producer.scala similarity index 100% rename from akka-camel/src/main/scala/Producer.scala rename to akka-camel/src/main/scala/akka/Producer.scala diff --git a/akka-camel/src/main/scala/component/ActorComponent.scala b/akka-camel/src/main/scala/akka/component/ActorComponent.scala similarity index 100% rename from akka-camel/src/main/scala/component/ActorComponent.scala rename to akka-camel/src/main/scala/akka/component/ActorComponent.scala diff --git a/akka-camel/src/main/scala/component/TypedActorComponent.scala b/akka-camel/src/main/scala/akka/component/TypedActorComponent.scala similarity index 100% rename from akka-camel/src/main/scala/component/TypedActorComponent.scala rename to akka-camel/src/main/scala/akka/component/TypedActorComponent.scala diff --git a/akka-camel/src/test/scala/CamelContextLifecycleTest.scala b/akka-camel/src/test/scala/akka/CamelContextLifecycleTest.scala similarity index 100% rename from akka-camel/src/test/scala/CamelContextLifecycleTest.scala rename to akka-camel/src/test/scala/akka/CamelContextLifecycleTest.scala diff --git a/akka-camel/src/test/scala/CamelExchangeAdapterTest.scala b/akka-camel/src/test/scala/akka/CamelExchangeAdapterTest.scala similarity index 100% rename from akka-camel/src/test/scala/CamelExchangeAdapterTest.scala rename to akka-camel/src/test/scala/akka/CamelExchangeAdapterTest.scala diff --git a/akka-camel/src/test/scala/CamelMessageAdapterTest.scala b/akka-camel/src/test/scala/akka/CamelMessageAdapterTest.scala similarity index 100% rename from akka-camel/src/test/scala/CamelMessageAdapterTest.scala rename to akka-camel/src/test/scala/akka/CamelMessageAdapterTest.scala diff --git a/akka-camel/src/test/scala/CamelServiceManagerTest.scala b/akka-camel/src/test/scala/akka/CamelServiceManagerTest.scala similarity index 100% rename from akka-camel/src/test/scala/CamelServiceManagerTest.scala rename to akka-camel/src/test/scala/akka/CamelServiceManagerTest.scala diff --git a/akka-camel/src/test/scala/ConsumerJavaTest.scala b/akka-camel/src/test/scala/akka/ConsumerJavaTest.scala similarity index 100% rename from akka-camel/src/test/scala/ConsumerJavaTest.scala rename to akka-camel/src/test/scala/akka/ConsumerJavaTest.scala diff --git a/akka-camel/src/test/scala/ConsumerRegisteredTest.scala b/akka-camel/src/test/scala/akka/ConsumerRegisteredTest.scala similarity index 100% rename from akka-camel/src/test/scala/ConsumerRegisteredTest.scala rename to akka-camel/src/test/scala/akka/ConsumerRegisteredTest.scala diff --git a/akka-camel/src/test/scala/ConsumerScalaTest.scala b/akka-camel/src/test/scala/akka/ConsumerScalaTest.scala similarity index 100% rename from akka-camel/src/test/scala/ConsumerScalaTest.scala rename to akka-camel/src/test/scala/akka/ConsumerScalaTest.scala diff --git a/akka-camel/src/test/scala/MessageJavaTest.scala b/akka-camel/src/test/scala/akka/MessageJavaTest.scala similarity index 100% rename from akka-camel/src/test/scala/MessageJavaTest.scala rename to akka-camel/src/test/scala/akka/MessageJavaTest.scala diff --git a/akka-camel/src/test/scala/MessageScalaTest.scala b/akka-camel/src/test/scala/akka/MessageScalaTest.scala similarity index 100% rename from akka-camel/src/test/scala/MessageScalaTest.scala rename to akka-camel/src/test/scala/akka/MessageScalaTest.scala diff --git a/akka-camel/src/test/scala/ProducerFeatureTest.scala b/akka-camel/src/test/scala/akka/ProducerFeatureTest.scala similarity index 100% rename from akka-camel/src/test/scala/ProducerFeatureTest.scala rename to akka-camel/src/test/scala/akka/ProducerFeatureTest.scala diff --git a/akka-camel/src/test/scala/PublishRequestorTest.scala b/akka-camel/src/test/scala/akka/PublishRequestorTest.scala similarity index 100% rename from akka-camel/src/test/scala/PublishRequestorTest.scala rename to akka-camel/src/test/scala/akka/PublishRequestorTest.scala diff --git a/akka-camel/src/test/scala/RemoteConsumerTest.scala b/akka-camel/src/test/scala/akka/RemoteConsumerTest.scala similarity index 100% rename from akka-camel/src/test/scala/RemoteConsumerTest.scala rename to akka-camel/src/test/scala/akka/RemoteConsumerTest.scala diff --git a/akka-camel/src/test/scala/UntypedProducerFeatureTest.scala b/akka-camel/src/test/scala/akka/UntypedProducerFeatureTest.scala similarity index 100% rename from akka-camel/src/test/scala/UntypedProducerFeatureTest.scala rename to akka-camel/src/test/scala/akka/UntypedProducerFeatureTest.scala diff --git a/akka-camel/src/test/scala/component/ActorComponentFeatureTest.scala b/akka-camel/src/test/scala/akka/component/ActorComponentFeatureTest.scala similarity index 100% rename from akka-camel/src/test/scala/component/ActorComponentFeatureTest.scala rename to akka-camel/src/test/scala/akka/component/ActorComponentFeatureTest.scala diff --git a/akka-camel/src/test/scala/component/ActorComponentTest.scala b/akka-camel/src/test/scala/akka/component/ActorComponentTest.scala similarity index 100% rename from akka-camel/src/test/scala/component/ActorComponentTest.scala rename to akka-camel/src/test/scala/akka/component/ActorComponentTest.scala diff --git a/akka-camel/src/test/scala/component/ActorProducerTest.scala b/akka-camel/src/test/scala/akka/component/ActorProducerTest.scala similarity index 100% rename from akka-camel/src/test/scala/component/ActorProducerTest.scala rename to akka-camel/src/test/scala/akka/component/ActorProducerTest.scala diff --git a/akka-camel/src/test/scala/component/TypedActorComponentFeatureTest.scala b/akka-camel/src/test/scala/akka/component/TypedActorComponentFeatureTest.scala similarity index 100% rename from akka-camel/src/test/scala/component/TypedActorComponentFeatureTest.scala rename to akka-camel/src/test/scala/akka/component/TypedActorComponentFeatureTest.scala diff --git a/akka-camel/src/test/scala/support/TestSupport.scala b/akka-camel/src/test/scala/akka/support/TestSupport.scala similarity index 100% rename from akka-camel/src/test/scala/support/TestSupport.scala rename to akka-camel/src/test/scala/akka/support/TestSupport.scala diff --git a/akka-http/src/main/scala/AkkaBroadcaster.scala b/akka-http/src/main/scala/akka/AkkaBroadcaster.scala similarity index 100% rename from akka-http/src/main/scala/AkkaBroadcaster.scala rename to akka-http/src/main/scala/akka/AkkaBroadcaster.scala diff --git a/akka-http/src/main/scala/AkkaCometServlet.scala b/akka-http/src/main/scala/akka/AkkaCometServlet.scala similarity index 100% rename from akka-http/src/main/scala/AkkaCometServlet.scala rename to akka-http/src/main/scala/akka/AkkaCometServlet.scala diff --git a/akka-http/src/main/scala/AkkaLoader.scala b/akka-http/src/main/scala/akka/AkkaLoader.scala similarity index 100% rename from akka-http/src/main/scala/AkkaLoader.scala rename to akka-http/src/main/scala/akka/AkkaLoader.scala diff --git a/akka-http/src/main/scala/DefaultAkkaLoader.scala b/akka-http/src/main/scala/akka/DefaultAkkaLoader.scala similarity index 100% rename from akka-http/src/main/scala/DefaultAkkaLoader.scala rename to akka-http/src/main/scala/akka/DefaultAkkaLoader.scala diff --git a/akka-http/src/main/scala/EmbeddedAppServer.scala b/akka-http/src/main/scala/akka/EmbeddedAppServer.scala similarity index 100% rename from akka-http/src/main/scala/EmbeddedAppServer.scala rename to akka-http/src/main/scala/akka/EmbeddedAppServer.scala diff --git a/akka-http/src/main/scala/Initializer.scala b/akka-http/src/main/scala/akka/Initializer.scala similarity index 100% rename from akka-http/src/main/scala/Initializer.scala rename to akka-http/src/main/scala/akka/Initializer.scala diff --git a/akka-http/src/main/scala/ListWriter.scala b/akka-http/src/main/scala/akka/ListWriter.scala similarity index 100% rename from akka-http/src/main/scala/ListWriter.scala rename to akka-http/src/main/scala/akka/ListWriter.scala diff --git a/akka-http/src/main/scala/Security.scala b/akka-http/src/main/scala/akka/Security.scala similarity index 100% rename from akka-http/src/main/scala/Security.scala rename to akka-http/src/main/scala/akka/Security.scala diff --git a/akka-jta/src/main/scala/AtomikosTransactionService.scala b/akka-jta/src/main/scala/akka/AtomikosTransactionService.scala similarity index 100% rename from akka-jta/src/main/scala/AtomikosTransactionService.scala rename to akka-jta/src/main/scala/akka/AtomikosTransactionService.scala diff --git a/akka-jta/src/main/scala/JTA.scala b/akka-jta/src/main/scala/akka/JTA.scala similarity index 100% rename from akka-jta/src/main/scala/JTA.scala rename to akka-jta/src/main/scala/akka/JTA.scala diff --git a/akka-jta/src/main/scala/TransactionContext.scala b/akka-jta/src/main/scala/akka/TransactionContext.scala similarity index 100% rename from akka-jta/src/main/scala/TransactionContext.scala rename to akka-jta/src/main/scala/akka/TransactionContext.scala diff --git a/akka-jta/src/main/scala/TransactionProtocol.scala b/akka-jta/src/main/scala/akka/TransactionProtocol.scala similarity index 100% rename from akka-jta/src/main/scala/TransactionProtocol.scala rename to akka-jta/src/main/scala/akka/TransactionProtocol.scala diff --git a/akka-kernel/src/main/scala/Kernel.scala b/akka-kernel/src/main/scala/akka/Kernel.scala similarity index 100% rename from akka-kernel/src/main/scala/Kernel.scala rename to akka-kernel/src/main/scala/akka/Kernel.scala diff --git a/akka-persistence/akka-persistence-cassandra/src/main/scala/CassandraSession.scala b/akka-persistence/akka-persistence-cassandra/src/main/scala/akka/CassandraSession.scala similarity index 100% rename from akka-persistence/akka-persistence-cassandra/src/main/scala/CassandraSession.scala rename to akka-persistence/akka-persistence-cassandra/src/main/scala/akka/CassandraSession.scala diff --git a/akka-persistence/akka-persistence-cassandra/src/main/scala/CassandraStorage.scala b/akka-persistence/akka-persistence-cassandra/src/main/scala/akka/CassandraStorage.scala similarity index 100% rename from akka-persistence/akka-persistence-cassandra/src/main/scala/CassandraStorage.scala rename to akka-persistence/akka-persistence-cassandra/src/main/scala/akka/CassandraStorage.scala diff --git a/akka-persistence/akka-persistence-cassandra/src/main/scala/CassandraStorageBackend.scala b/akka-persistence/akka-persistence-cassandra/src/main/scala/akka/CassandraStorageBackend.scala similarity index 100% rename from akka-persistence/akka-persistence-cassandra/src/main/scala/CassandraStorageBackend.scala rename to akka-persistence/akka-persistence-cassandra/src/main/scala/akka/CassandraStorageBackend.scala diff --git a/akka-persistence/akka-persistence-common/src/main/scala/CommonStorageBackend.scala b/akka-persistence/akka-persistence-common/src/main/scala/akka/CommonStorageBackend.scala similarity index 100% rename from akka-persistence/akka-persistence-common/src/main/scala/CommonStorageBackend.scala rename to akka-persistence/akka-persistence-common/src/main/scala/akka/CommonStorageBackend.scala diff --git a/akka-persistence/akka-persistence-common/src/main/scala/Pool.scala b/akka-persistence/akka-persistence-common/src/main/scala/akka/Pool.scala similarity index 100% rename from akka-persistence/akka-persistence-common/src/main/scala/Pool.scala rename to akka-persistence/akka-persistence-common/src/main/scala/akka/Pool.scala diff --git a/akka-persistence/akka-persistence-common/src/main/scala/Storage.scala b/akka-persistence/akka-persistence-common/src/main/scala/akka/Storage.scala similarity index 100% rename from akka-persistence/akka-persistence-common/src/main/scala/Storage.scala rename to akka-persistence/akka-persistence-common/src/main/scala/akka/Storage.scala diff --git a/akka-persistence/akka-persistence-common/src/main/scala/StorageBackend.scala b/akka-persistence/akka-persistence-common/src/main/scala/akka/StorageBackend.scala similarity index 100% rename from akka-persistence/akka-persistence-common/src/main/scala/StorageBackend.scala rename to akka-persistence/akka-persistence-common/src/main/scala/akka/StorageBackend.scala diff --git a/akka-persistence/akka-persistence-couchdb/src/main/scala/CouchDBStorage.scala b/akka-persistence/akka-persistence-couchdb/src/main/scala/akka/CouchDBStorage.scala similarity index 100% rename from akka-persistence/akka-persistence-couchdb/src/main/scala/CouchDBStorage.scala rename to akka-persistence/akka-persistence-couchdb/src/main/scala/akka/CouchDBStorage.scala diff --git a/akka-persistence/akka-persistence-couchdb/src/main/scala/CouchDBStorageBackend.scala b/akka-persistence/akka-persistence-couchdb/src/main/scala/akka/CouchDBStorageBackend.scala similarity index 100% rename from akka-persistence/akka-persistence-couchdb/src/main/scala/CouchDBStorageBackend.scala rename to akka-persistence/akka-persistence-couchdb/src/main/scala/akka/CouchDBStorageBackend.scala diff --git a/akka-persistence/akka-persistence-hbase/src/main/scala/HbaseStorage.scala b/akka-persistence/akka-persistence-hbase/src/main/scala/akka/HbaseStorage.scala similarity index 100% rename from akka-persistence/akka-persistence-hbase/src/main/scala/HbaseStorage.scala rename to akka-persistence/akka-persistence-hbase/src/main/scala/akka/HbaseStorage.scala diff --git a/akka-persistence/akka-persistence-hbase/src/main/scala/HbaseStorageBackend.scala b/akka-persistence/akka-persistence-hbase/src/main/scala/akka/HbaseStorageBackend.scala similarity index 100% rename from akka-persistence/akka-persistence-hbase/src/main/scala/HbaseStorageBackend.scala rename to akka-persistence/akka-persistence-hbase/src/main/scala/akka/HbaseStorageBackend.scala diff --git a/akka-persistence/akka-persistence-memcached/src/main/scala/MemcachedStorage.scala b/akka-persistence/akka-persistence-memcached/src/main/scala/akka/MemcachedStorage.scala similarity index 100% rename from akka-persistence/akka-persistence-memcached/src/main/scala/MemcachedStorage.scala rename to akka-persistence/akka-persistence-memcached/src/main/scala/akka/MemcachedStorage.scala diff --git a/akka-persistence/akka-persistence-memcached/src/main/scala/MemcachedStorageBackend.scala b/akka-persistence/akka-persistence-memcached/src/main/scala/akka/MemcachedStorageBackend.scala similarity index 100% rename from akka-persistence/akka-persistence-memcached/src/main/scala/MemcachedStorageBackend.scala rename to akka-persistence/akka-persistence-memcached/src/main/scala/akka/MemcachedStorageBackend.scala diff --git a/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorage.scala b/akka-persistence/akka-persistence-mongo/src/main/scala/akka/MongoStorage.scala similarity index 100% rename from akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorage.scala rename to akka-persistence/akka-persistence-mongo/src/main/scala/akka/MongoStorage.scala diff --git a/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala b/akka-persistence/akka-persistence-mongo/src/main/scala/akka/MongoStorageBackend.scala similarity index 100% rename from akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala rename to akka-persistence/akka-persistence-mongo/src/main/scala/akka/MongoStorageBackend.scala diff --git a/akka-persistence/akka-persistence-redis/src/main/scala/RedisPubSubServer.scala b/akka-persistence/akka-persistence-redis/src/main/scala/akka/RedisPubSubServer.scala similarity index 100% rename from akka-persistence/akka-persistence-redis/src/main/scala/RedisPubSubServer.scala rename to akka-persistence/akka-persistence-redis/src/main/scala/akka/RedisPubSubServer.scala diff --git a/akka-persistence/akka-persistence-redis/src/main/scala/RedisStorage.scala b/akka-persistence/akka-persistence-redis/src/main/scala/akka/RedisStorage.scala similarity index 100% rename from akka-persistence/akka-persistence-redis/src/main/scala/RedisStorage.scala rename to akka-persistence/akka-persistence-redis/src/main/scala/akka/RedisStorage.scala diff --git a/akka-persistence/akka-persistence-redis/src/main/scala/RedisStorageBackend.scala b/akka-persistence/akka-persistence-redis/src/main/scala/akka/RedisStorageBackend.scala similarity index 100% rename from akka-persistence/akka-persistence-redis/src/main/scala/RedisStorageBackend.scala rename to akka-persistence/akka-persistence-redis/src/main/scala/akka/RedisStorageBackend.scala diff --git a/akka-persistence/akka-persistence-riak/src/main/scala/RiakStorage.scala b/akka-persistence/akka-persistence-riak/src/main/scala/akka/RiakStorage.scala similarity index 100% rename from akka-persistence/akka-persistence-riak/src/main/scala/RiakStorage.scala rename to akka-persistence/akka-persistence-riak/src/main/scala/akka/RiakStorage.scala diff --git a/akka-persistence/akka-persistence-riak/src/main/scala/RiakStorageBackend.scala b/akka-persistence/akka-persistence-riak/src/main/scala/akka/RiakStorageBackend.scala similarity index 100% rename from akka-persistence/akka-persistence-riak/src/main/scala/RiakStorageBackend.scala rename to akka-persistence/akka-persistence-riak/src/main/scala/akka/RiakStorageBackend.scala diff --git a/akka-persistence/akka-persistence-simpledb/src/main/scala/SimpledbStorage.scala b/akka-persistence/akka-persistence-simpledb/src/main/scala/akka/SimpledbStorage.scala similarity index 100% rename from akka-persistence/akka-persistence-simpledb/src/main/scala/SimpledbStorage.scala rename to akka-persistence/akka-persistence-simpledb/src/main/scala/akka/SimpledbStorage.scala diff --git a/akka-persistence/akka-persistence-simpledb/src/main/scala/SimpledbStorageBackend.scala b/akka-persistence/akka-persistence-simpledb/src/main/scala/akka/SimpledbStorageBackend.scala similarity index 100% rename from akka-persistence/akka-persistence-simpledb/src/main/scala/SimpledbStorageBackend.scala rename to akka-persistence/akka-persistence-simpledb/src/main/scala/akka/SimpledbStorageBackend.scala diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorage.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/akka/VoldemortStorage.scala similarity index 100% rename from akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorage.scala rename to akka-persistence/akka-persistence-voldemort/src/main/scala/akka/VoldemortStorage.scala diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/akka/VoldemortStorageBackend.scala similarity index 100% rename from akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala rename to akka-persistence/akka-persistence-voldemort/src/main/scala/akka/VoldemortStorageBackend.scala diff --git a/akka-remote/src/main/scala/remote/BootableRemoteActorService.scala b/akka-remote/src/main/scala/akka/remote/BootableRemoteActorService.scala similarity index 100% rename from akka-remote/src/main/scala/remote/BootableRemoteActorService.scala rename to akka-remote/src/main/scala/akka/remote/BootableRemoteActorService.scala diff --git a/akka-remote/src/main/scala/remote/MessageSerializer.scala b/akka-remote/src/main/scala/akka/remote/MessageSerializer.scala similarity index 100% rename from akka-remote/src/main/scala/remote/MessageSerializer.scala rename to akka-remote/src/main/scala/akka/remote/MessageSerializer.scala diff --git a/akka-remote/src/main/scala/remote/RemoteClient.scala b/akka-remote/src/main/scala/akka/remote/RemoteClient.scala similarity index 100% rename from akka-remote/src/main/scala/remote/RemoteClient.scala rename to akka-remote/src/main/scala/akka/remote/RemoteClient.scala diff --git a/akka-remote/src/main/scala/remote/RemoteServer.scala b/akka-remote/src/main/scala/akka/remote/RemoteServer.scala similarity index 100% rename from akka-remote/src/main/scala/remote/RemoteServer.scala rename to akka-remote/src/main/scala/akka/remote/RemoteServer.scala diff --git a/akka-remote/src/main/scala/serialization/Binary.scala b/akka-remote/src/main/scala/akka/serialization/Binary.scala similarity index 100% rename from akka-remote/src/main/scala/serialization/Binary.scala rename to akka-remote/src/main/scala/akka/serialization/Binary.scala diff --git a/akka-remote/src/main/scala/serialization/Compression.scala b/akka-remote/src/main/scala/akka/serialization/Compression.scala similarity index 100% rename from akka-remote/src/main/scala/serialization/Compression.scala rename to akka-remote/src/main/scala/akka/serialization/Compression.scala diff --git a/akka-remote/src/main/scala/serialization/Serializable.scala b/akka-remote/src/main/scala/akka/serialization/Serializable.scala similarity index 100% rename from akka-remote/src/main/scala/serialization/Serializable.scala rename to akka-remote/src/main/scala/akka/serialization/Serializable.scala diff --git a/akka-remote/src/main/scala/serialization/SerializationProtocol.scala b/akka-remote/src/main/scala/akka/serialization/SerializationProtocol.scala similarity index 100% rename from akka-remote/src/main/scala/serialization/SerializationProtocol.scala rename to akka-remote/src/main/scala/akka/serialization/SerializationProtocol.scala diff --git a/akka-remote/src/main/scala/serialization/Serializer.scala b/akka-remote/src/main/scala/akka/serialization/Serializer.scala similarity index 100% rename from akka-remote/src/main/scala/serialization/Serializer.scala rename to akka-remote/src/main/scala/akka/serialization/Serializer.scala diff --git a/akka-remote/src/main/scala/serialization/package.scala b/akka-remote/src/main/scala/akka/serialization/package.scala similarity index 100% rename from akka-remote/src/main/scala/serialization/package.scala rename to akka-remote/src/main/scala/akka/serialization/package.scala diff --git a/akka-spring/src/main/scala/ActorBeanDefinitionParser.scala b/akka-spring/src/main/scala/akka/ActorBeanDefinitionParser.scala similarity index 100% rename from akka-spring/src/main/scala/ActorBeanDefinitionParser.scala rename to akka-spring/src/main/scala/akka/ActorBeanDefinitionParser.scala diff --git a/akka-spring/src/main/scala/ActorFactoryBean.scala b/akka-spring/src/main/scala/akka/ActorFactoryBean.scala similarity index 100% rename from akka-spring/src/main/scala/ActorFactoryBean.scala rename to akka-spring/src/main/scala/akka/ActorFactoryBean.scala diff --git a/akka-spring/src/main/scala/ActorParser.scala b/akka-spring/src/main/scala/akka/ActorParser.scala similarity index 100% rename from akka-spring/src/main/scala/ActorParser.scala rename to akka-spring/src/main/scala/akka/ActorParser.scala diff --git a/akka-spring/src/main/scala/ActorProperties.scala b/akka-spring/src/main/scala/akka/ActorProperties.scala similarity index 100% rename from akka-spring/src/main/scala/ActorProperties.scala rename to akka-spring/src/main/scala/akka/ActorProperties.scala diff --git a/akka-spring/src/main/scala/AkkaNamespaceHandler.scala b/akka-spring/src/main/scala/akka/AkkaNamespaceHandler.scala similarity index 100% rename from akka-spring/src/main/scala/AkkaNamespaceHandler.scala rename to akka-spring/src/main/scala/akka/AkkaNamespaceHandler.scala diff --git a/akka-spring/src/main/scala/AkkaSpringConfigurationTags.scala b/akka-spring/src/main/scala/akka/AkkaSpringConfigurationTags.scala similarity index 100% rename from akka-spring/src/main/scala/AkkaSpringConfigurationTags.scala rename to akka-spring/src/main/scala/akka/AkkaSpringConfigurationTags.scala diff --git a/akka-spring/src/main/scala/CamelServiceBeanDefinitionParser.scala b/akka-spring/src/main/scala/akka/CamelServiceBeanDefinitionParser.scala similarity index 100% rename from akka-spring/src/main/scala/CamelServiceBeanDefinitionParser.scala rename to akka-spring/src/main/scala/akka/CamelServiceBeanDefinitionParser.scala diff --git a/akka-spring/src/main/scala/CamelServiceFactoryBean.scala b/akka-spring/src/main/scala/akka/CamelServiceFactoryBean.scala similarity index 100% rename from akka-spring/src/main/scala/CamelServiceFactoryBean.scala rename to akka-spring/src/main/scala/akka/CamelServiceFactoryBean.scala diff --git a/akka-spring/src/main/scala/ConfiggyPropertyPlaceholderConfigurer.scala b/akka-spring/src/main/scala/akka/ConfiggyPropertyPlaceholderConfigurer.scala similarity index 100% rename from akka-spring/src/main/scala/ConfiggyPropertyPlaceholderConfigurer.scala rename to akka-spring/src/main/scala/akka/ConfiggyPropertyPlaceholderConfigurer.scala diff --git a/akka-spring/src/main/scala/DispatcherBeanDefinitionParser.scala b/akka-spring/src/main/scala/akka/DispatcherBeanDefinitionParser.scala similarity index 100% rename from akka-spring/src/main/scala/DispatcherBeanDefinitionParser.scala rename to akka-spring/src/main/scala/akka/DispatcherBeanDefinitionParser.scala diff --git a/akka-spring/src/main/scala/DispatcherFactoryBean.scala b/akka-spring/src/main/scala/akka/DispatcherFactoryBean.scala similarity index 100% rename from akka-spring/src/main/scala/DispatcherFactoryBean.scala rename to akka-spring/src/main/scala/akka/DispatcherFactoryBean.scala diff --git a/akka-spring/src/main/scala/DispatcherProperties.scala b/akka-spring/src/main/scala/akka/DispatcherProperties.scala similarity index 100% rename from akka-spring/src/main/scala/DispatcherProperties.scala rename to akka-spring/src/main/scala/akka/DispatcherProperties.scala diff --git a/akka-spring/src/main/scala/PropertyEntries.scala b/akka-spring/src/main/scala/akka/PropertyEntries.scala similarity index 100% rename from akka-spring/src/main/scala/PropertyEntries.scala rename to akka-spring/src/main/scala/akka/PropertyEntries.scala diff --git a/akka-spring/src/main/scala/StringReflect.scala b/akka-spring/src/main/scala/akka/StringReflect.scala similarity index 100% rename from akka-spring/src/main/scala/StringReflect.scala rename to akka-spring/src/main/scala/akka/StringReflect.scala diff --git a/akka-spring/src/main/scala/SupervisionBeanDefinitionParser.scala b/akka-spring/src/main/scala/akka/SupervisionBeanDefinitionParser.scala similarity index 100% rename from akka-spring/src/main/scala/SupervisionBeanDefinitionParser.scala rename to akka-spring/src/main/scala/akka/SupervisionBeanDefinitionParser.scala diff --git a/akka-spring/src/main/scala/SupervisionFactoryBean.scala b/akka-spring/src/main/scala/akka/SupervisionFactoryBean.scala similarity index 100% rename from akka-spring/src/main/scala/SupervisionFactoryBean.scala rename to akka-spring/src/main/scala/akka/SupervisionFactoryBean.scala diff --git a/akka-stm/src/main/scala/agent/Agent.scala b/akka-stm/src/main/scala/akka/agent/Agent.scala similarity index 100% rename from akka-stm/src/main/scala/agent/Agent.scala rename to akka-stm/src/main/scala/akka/agent/Agent.scala diff --git a/akka-stm/src/main/scala/stm/Atomic.scala b/akka-stm/src/main/scala/akka/stm/Atomic.scala similarity index 100% rename from akka-stm/src/main/scala/stm/Atomic.scala rename to akka-stm/src/main/scala/akka/stm/Atomic.scala diff --git a/akka-stm/src/main/scala/stm/Ref.scala b/akka-stm/src/main/scala/akka/stm/Ref.scala similarity index 100% rename from akka-stm/src/main/scala/stm/Ref.scala rename to akka-stm/src/main/scala/akka/stm/Ref.scala diff --git a/akka-stm/src/main/scala/stm/Stm.scala b/akka-stm/src/main/scala/akka/stm/Stm.scala similarity index 100% rename from akka-stm/src/main/scala/stm/Stm.scala rename to akka-stm/src/main/scala/akka/stm/Stm.scala diff --git a/akka-stm/src/main/scala/stm/Transaction.scala b/akka-stm/src/main/scala/akka/stm/Transaction.scala similarity index 100% rename from akka-stm/src/main/scala/stm/Transaction.scala rename to akka-stm/src/main/scala/akka/stm/Transaction.scala diff --git a/akka-stm/src/main/scala/stm/TransactionFactory.scala b/akka-stm/src/main/scala/akka/stm/TransactionFactory.scala similarity index 100% rename from akka-stm/src/main/scala/stm/TransactionFactory.scala rename to akka-stm/src/main/scala/akka/stm/TransactionFactory.scala diff --git a/akka-stm/src/main/scala/stm/TransactionFactoryBuilder.scala b/akka-stm/src/main/scala/akka/stm/TransactionFactoryBuilder.scala similarity index 100% rename from akka-stm/src/main/scala/stm/TransactionFactoryBuilder.scala rename to akka-stm/src/main/scala/akka/stm/TransactionFactoryBuilder.scala diff --git a/akka-stm/src/main/scala/stm/TransactionalMap.scala b/akka-stm/src/main/scala/akka/stm/TransactionalMap.scala similarity index 100% rename from akka-stm/src/main/scala/stm/TransactionalMap.scala rename to akka-stm/src/main/scala/akka/stm/TransactionalMap.scala diff --git a/akka-stm/src/main/scala/stm/TransactionalVector.scala b/akka-stm/src/main/scala/akka/stm/TransactionalVector.scala similarity index 100% rename from akka-stm/src/main/scala/stm/TransactionalVector.scala rename to akka-stm/src/main/scala/akka/stm/TransactionalVector.scala diff --git a/akka-stm/src/main/scala/stm/package.scala b/akka-stm/src/main/scala/akka/stm/package.scala similarity index 100% rename from akka-stm/src/main/scala/stm/package.scala rename to akka-stm/src/main/scala/akka/stm/package.scala diff --git a/akka-stm/src/main/scala/transactor/Atomically.scala b/akka-stm/src/main/scala/akka/transactor/Atomically.scala similarity index 100% rename from akka-stm/src/main/scala/transactor/Atomically.scala rename to akka-stm/src/main/scala/akka/transactor/Atomically.scala diff --git a/akka-stm/src/main/scala/transactor/Coordinated.scala b/akka-stm/src/main/scala/akka/transactor/Coordinated.scala similarity index 100% rename from akka-stm/src/main/scala/transactor/Coordinated.scala rename to akka-stm/src/main/scala/akka/transactor/Coordinated.scala diff --git a/akka-stm/src/main/scala/transactor/Transactor.scala b/akka-stm/src/main/scala/akka/transactor/Transactor.scala similarity index 100% rename from akka-stm/src/main/scala/transactor/Transactor.scala rename to akka-stm/src/main/scala/akka/transactor/Transactor.scala diff --git a/akka-stm/src/main/scala/transactor/UntypedTransactor.scala b/akka-stm/src/main/scala/akka/transactor/UntypedTransactor.scala similarity index 100% rename from akka-stm/src/main/scala/transactor/UntypedTransactor.scala rename to akka-stm/src/main/scala/akka/transactor/UntypedTransactor.scala diff --git a/akka-typed-actor/src/main/scala/actor/TypedActor.scala b/akka-typed-actor/src/main/scala/akka/actor/TypedActor.scala similarity index 100% rename from akka-typed-actor/src/main/scala/actor/TypedActor.scala rename to akka-typed-actor/src/main/scala/akka/actor/TypedActor.scala diff --git a/akka-typed-actor/src/main/scala/config/TypedActorConfigurator.scala b/akka-typed-actor/src/main/scala/akka/config/TypedActorConfigurator.scala similarity index 100% rename from akka-typed-actor/src/main/scala/config/TypedActorConfigurator.scala rename to akka-typed-actor/src/main/scala/akka/config/TypedActorConfigurator.scala diff --git a/akka-typed-actor/src/main/scala/config/TypedActorGuiceConfigurator.scala b/akka-typed-actor/src/main/scala/akka/config/TypedActorGuiceConfigurator.scala similarity index 100% rename from akka-typed-actor/src/main/scala/config/TypedActorGuiceConfigurator.scala rename to akka-typed-actor/src/main/scala/akka/config/TypedActorGuiceConfigurator.scala diff --git a/akka-typed-actor/src/main/scala/transactor/Coordination.scala b/akka-typed-actor/src/main/scala/akka/transactor/Coordination.scala similarity index 100% rename from akka-typed-actor/src/main/scala/transactor/Coordination.scala rename to akka-typed-actor/src/main/scala/akka/transactor/Coordination.scala From d08f428da2b0338c3b4aab711d946690e89fd7a9 Mon Sep 17 00:00:00 2001 From: Paul Pacheco Date: Sat, 20 Nov 2010 15:48:37 -0600 Subject: [PATCH 11/23] tests pass --- .../src/main/scala/remote/RemoteServer.scala | 36 +++++++++---------- .../ServerInitiatedRemoteActorSpec.scala | 6 ++-- ...erverInitiatedRemoteSessionActorSpec.scala | 1 - ...InitiatedRemoteTypedSessionActorSpec.scala | 2 -- 4 files changed, 18 insertions(+), 27 deletions(-) diff --git a/akka-remote/src/main/scala/remote/RemoteServer.scala b/akka-remote/src/main/scala/remote/RemoteServer.scala index c129506ad3..6dd418b046 100644 --- a/akka-remote/src/main/scala/remote/RemoteServer.scala +++ b/akka-remote/src/main/scala/remote/RemoteServer.scala @@ -326,28 +326,31 @@ class RemoteServer extends Logging with ListenerManagement { } private def register[Key](id: Key, actorRef: ActorRef, registry: ConcurrentHashMap[Key, ActorRef]) { - if (_isRunning) { - if (registry.putIfAbsent(id, actorRef) eq null) { - if (!actorRef.isRunning) actorRef.start - } + // TODO: contains is an alias for containsValue, not containsKey, so the contains is useless here + if (_isRunning && !registry.contains(id)) { + registry.put(id, actorRef); + if (!actorRef.isRunning) actorRef.start } } private def registerPerSession[Key](id: Key, factory: () => ActorRef, registry: ConcurrentHashMap[Key,() => ActorRef]) { - if (_isRunning) { - registry.putIfAbsent(id, factory) + // TODO: contains is an alias for containsValue, not containsKey, so the contains is useless here + if (_isRunning && !registry.contains(id)) { + registry.put(id, factory) } } private def registerTypedActor[Key](id: Key, typedActor: AnyRef, registry: ConcurrentHashMap[Key, AnyRef]) { - if (_isRunning) { - registry.putIfAbsent(id, typedActor) + // TODO: contains is an alias for containsValue, not containsKey, so the contains is useless here + if (_isRunning && !registry.contains(id)) { + registry.put(id, typedActor) } } private def registerTypedPerSessionActor[Key](id: Key, factory: () => AnyRef, registry: ConcurrentHashMap[Key,() => AnyRef]) { - if (_isRunning) { - registry.putIfAbsent(id, factory) + // TODO: contains is an alias for containsValue, not containsKey, so the contains is useless here + if (_isRunning && !registry.contains(id)) { + registry.put(id, factory) } } @@ -820,23 +823,16 @@ class RemoteServerHandler( val actorRefOrNull = findActorByIdOrUuid(id, uuidFrom(uuid.getHigh,uuid.getLow).toString) - if (actorRefOrNull ne null) { - println("Giving actor by id or uuid ") + if (actorRefOrNull ne null) actorRefOrNull - } else { // the actor has not been registered globally. See if we have it in the session val sessionActorRefOrNull = createSessionActor(actorInfo, channel) - if (sessionActorRefOrNull ne null) { - println("giving session actor") + if (sessionActorRefOrNull ne null) sessionActorRefOrNull - } else // maybe it is a client managed actor - { - println("Client managed actor") - createClientManagedActor(actorInfo) - } + createClientManagedActor(actorInfo) } } diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala index b0dee8563e..5881687c01 100644 --- a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteActorSpec.scala @@ -3,18 +3,17 @@ package akka.actor.remote import java.util.concurrent.{CountDownLatch, TimeUnit} import org.scalatest.junit.JUnitSuite import org.junit.{Test, Before, After} - +import akka.util._ + import akka.remote.{RemoteServer, RemoteClient} import akka.actor.Actor._ import akka.actor.{ActorRegistry, ActorRef, Actor} -import scala.collection.mutable.Set object ServerInitiatedRemoteActorSpec { val HOSTNAME = "localhost" val PORT = 9990 var server: RemoteServer = null - case class Send(actor: ActorRef) object RemoteActorSpecActorUnidirectional { @@ -105,7 +104,6 @@ class ServerInitiatedRemoteActorSpec extends JUnitSuite { actor.stop } - @Test def shouldSendWithBangAndGetReplyThroughSenderRef { implicit val timeout = 500000000L diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala index dab1f83437..173898c1fe 100644 --- a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteSessionActorSpec.scala @@ -145,7 +145,6 @@ class ServerInitiatedRemoteSessionActorSpec extends session1 ! DoSomethingFunny() session1.stop() - RemoteClient.shutdownAll Thread.sleep(1000) instantiatedSessionActors should have size (0) diff --git a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala index 2e82afc6ba..0ae4ca2dee 100644 --- a/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala +++ b/akka-remote/src/test/scala/remote/ServerInitiatedRemoteTypedSessionActorSpec.scala @@ -68,8 +68,6 @@ class ServerInitiatedRemoteTypedSessionActorSpec extends session2.getUser() should equal ("anonymous") - RemoteClient.shutdownAll - } it should "stop the actor when the client disconnects" in { From 7e40ee46d13b6eb77c879a51e45976ed5374641d Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sat, 20 Nov 2010 22:47:13 +0100 Subject: [PATCH 12/23] Adding a Java API for Channel, and adding some docs, have updated wiki, closing #536 --- akka-actor/src/main/scala/akka/actor/ActorRef.scala | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index adf7a1cde7..79cf2cc920 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -1,5 +1,5 @@ /** - * Copyright (C) 2009-2010 Scalable Solutions AB + * Copyright (C) 2009-2010 Scalable Solutions AB */ package akka.actor @@ -1522,5 +1522,15 @@ trait ScalaActorRef extends ActorRefShared { ref: ActorRef => * Abstraction for unification of sender and senderFuture for later reply */ abstract class Channel[T] { + /** + * Sends the specified message to the channel + * Scala API + */ def !(msg: T): Unit + + /** + * Sends the specified message to the channel + * Java API + */ + def sendOneWay(msg: T): Unit = this.!(msg) } From a3548df5fac31a6db9de374cf22841c1b7ff1315 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 21 Nov 2010 13:31:07 +0100 Subject: [PATCH 13/23] Fixing groupID for SBT plugin and change url to akka homepage --- akka-sbt-plugin/src/main/scala/AkkaProject.scala | 2 +- project/build/AkkaProject.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/akka-sbt-plugin/src/main/scala/AkkaProject.scala b/akka-sbt-plugin/src/main/scala/AkkaProject.scala index e4d1308d7a..8644311030 100644 --- a/akka-sbt-plugin/src/main/scala/AkkaProject.scala +++ b/akka-sbt-plugin/src/main/scala/AkkaProject.scala @@ -59,7 +59,7 @@ trait AkkaProject extends AkkaBaseProject { val akkaVersion = "1.0-SNAPSHOT" // convenience method - def akkaModule(module: String) = "akka" %% ("akka-" + module) % akkaVersion + def akkaModule(module: String) = "se.scalablesolutions.akka" % ("akka-" + module) % akkaVersion // akka actor dependency by default val akkaActor = akkaModule("actor") diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index f8a91ad62f..0946f87f1f 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -377,7 +377,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { override def pomExtra = 2009 - http://akkasource.org + http://akka.io Scalable Solutions AB http://scalablesolutions.se From d73d2778234cd2a0a7978bdb583c4e44c0318963 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 21 Nov 2010 15:11:14 +0100 Subject: [PATCH 14/23] Fixing ticket #533 by adding get/set LifeCycle in ActorRef --- .../src/main/scala/akka/actor/ActorRef.scala | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 79cf2cc920..2a3c57caaf 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -139,6 +139,25 @@ trait ActorRef extends ActorRefShared with java.lang.Comparable[ActorRef] { scal def setFaultHandler(handler: FaultHandlingStrategy) def getFaultHandler(): FaultHandlingStrategy + + /** + * Akka Java API + * A lifeCycle defines whether the actor will be stopped on error (Temporary) or if it can be restarted (Permanent) + *

+ * Can be one of: + * + * import static akka.config.Supervision.*; + *

+   * getContext().setLifeCycle(permanent());
+   * 
+ * Or: + *
+   * getContext().setLifeCycle(temporary());
+   * 
+ */ + def setLifeCycle(lifeCycle: LifeCycle): Unit + def getLifeCycle(): LifeCycle + @volatile private[akka] var _dispatcher: MessageDispatcher = Dispatchers.defaultGlobalDispatcher @@ -1313,9 +1332,7 @@ trait ScalaActorRef extends ActorRefShared { ref: ActorRef => */ def id: String - def id_=(id: String): Unit - - /** + def id_=(id: String): Unit /** * User overridable callback/setting. *

* Defines the life-cycle for a supervised actor. From e119bd4c78e853463a1a60deaecd95a39a45bf89 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 21 Nov 2010 15:24:33 +0100 Subject: [PATCH 15/23] Moving dispatcher volatile field from ActorRef to LocalActorRef --- akka-actor/src/main/scala/akka/actor/ActorRef.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 2a3c57caaf..8fe21da757 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -158,9 +158,6 @@ trait ActorRef extends ActorRefShared with java.lang.Comparable[ActorRef] { scal def setLifeCycle(lifeCycle: LifeCycle): Unit def getLifeCycle(): LifeCycle - @volatile - private[akka] var _dispatcher: MessageDispatcher = Dispatchers.defaultGlobalDispatcher - /** * Akka Java API * The default dispatcher is the Dispatchers.globalExecutorBasedEventDrivenDispatcher. @@ -616,6 +613,8 @@ class LocalActorRef private[akka] ( private var restartsWithinTimeRangeTimestamp: Long = 0L @volatile private var _mailbox: AnyRef = _ + @volatile + private[akka] var _dispatcher: MessageDispatcher = Dispatchers.defaultGlobalDispatcher protected[akka] val actorInstance = guard.withGuard { new AtomicReference[Actor](newActor) } From c387d00e18040c8e9aa45acd4af1d4631addf7c2 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 21 Nov 2010 16:15:22 +0100 Subject: [PATCH 16/23] Ticket #506 closed, caused by REPL --- .../src/main/scala/akka/actor/ActorRef.scala | 4 +- .../src/test/scala/ticket/Ticket506Spec.scala | 62 +++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 akka-remote/src/test/scala/ticket/Ticket506Spec.scala diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 8fe21da757..ddc26313d5 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -1226,6 +1226,8 @@ private[akka] case class RemoteActorRef private[akka] ( ensureRemotingEnabled + val remoteAddress: Option[InetSocketAddress] = Some(new InetSocketAddress(hostname, port)) + id = classOrServiceName timeout = _timeout @@ -1260,8 +1262,6 @@ private[akka] case class RemoteActorRef private[akka] ( protected[akka] def registerSupervisorAsRemoteActor: Option[Uuid] = None - val remoteAddress: Option[InetSocketAddress] = Some(new InetSocketAddress(hostname, port)) - // ==== NOT SUPPORTED ==== def actorClass: Class[_ <: Actor] = unsupported def dispatcher_=(md: MessageDispatcher): Unit = unsupported diff --git a/akka-remote/src/test/scala/ticket/Ticket506Spec.scala b/akka-remote/src/test/scala/ticket/Ticket506Spec.scala new file mode 100644 index 0000000000..a391188ade --- /dev/null +++ b/akka-remote/src/test/scala/ticket/Ticket506Spec.scala @@ -0,0 +1,62 @@ +package ticket + +import org.scalatest.Spec +import org.scalatest.matchers.ShouldMatchers + +import akka.remote.{RemoteClient, RemoteNode, RemoteServer} +import akka.actor.{Actor, ActorRef} +import akka.serialization.RemoteActorSerialization +import akka.actor.Actor.actorOf + +import java.util.concurrent.{CountDownLatch, TimeUnit} + +object State { + val latch = new CountDownLatch(1) +} + +case class RecvActorRef(bytes:Array[Byte]) + +class ActorRefService extends Actor { + import self._ + + def receive:Receive = { + case RecvActorRef(bytes) => + val ref = RemoteActorSerialization.fromBinaryToRemoteActorRef(bytes) + ref ! "hello" + case "hello" => + State.latch.countDown + } +} + +class Ticket506Spec extends Spec with ShouldMatchers { + val hostname:String = "localhost" + val port:Int = 9440 + + describe("a RemoteActorRef serialized") { + it("should be remotely usable") { + val s1,s2 = new RemoteServer + s1.start(hostname, port) + s2.start(hostname, port + 1) + + val a1,a2 = actorOf[ActorRefService] + a1.homeAddress = (hostname, port) + a2.homeAddress = (hostname, port+1) + + s1.register("service", a1) + s2.register("service", a2) + + // connect to the first server/service + val c1 = RemoteClient.actorFor("service", hostname, port) + + val bytes = RemoteActorSerialization.toRemoteActorRefProtocol(a2).toByteArray + c1 ! RecvActorRef(bytes) + + State.latch.await(1000, TimeUnit.MILLISECONDS) should be(true) + + RemoteClient.shutdownAll + s1.shutdown + s2.shutdown + Thread.sleep(1000) + } + } +} \ No newline at end of file From 02b134847211a88f800ef0c37553899c69a365b0 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Sun, 21 Nov 2010 16:15:22 +0100 Subject: [PATCH 17/23] Ticket #506 closed, caused by REPL --- .../src/main/scala/akka/actor/ActorRef.scala | 4 +- .../src/test/scala/ticket/Ticket506Spec.scala | 61 +++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 akka-remote/src/test/scala/ticket/Ticket506Spec.scala diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 8fe21da757..ddc26313d5 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -1226,6 +1226,8 @@ private[akka] case class RemoteActorRef private[akka] ( ensureRemotingEnabled + val remoteAddress: Option[InetSocketAddress] = Some(new InetSocketAddress(hostname, port)) + id = classOrServiceName timeout = _timeout @@ -1260,8 +1262,6 @@ private[akka] case class RemoteActorRef private[akka] ( protected[akka] def registerSupervisorAsRemoteActor: Option[Uuid] = None - val remoteAddress: Option[InetSocketAddress] = Some(new InetSocketAddress(hostname, port)) - // ==== NOT SUPPORTED ==== def actorClass: Class[_ <: Actor] = unsupported def dispatcher_=(md: MessageDispatcher): Unit = unsupported diff --git a/akka-remote/src/test/scala/ticket/Ticket506Spec.scala b/akka-remote/src/test/scala/ticket/Ticket506Spec.scala new file mode 100644 index 0000000000..7a15c00a2e --- /dev/null +++ b/akka-remote/src/test/scala/ticket/Ticket506Spec.scala @@ -0,0 +1,61 @@ +package ticket + +import org.scalatest.Spec +import org.scalatest.matchers.ShouldMatchers + +import akka.remote.{RemoteClient, RemoteNode, RemoteServer} +import akka.actor.{Actor, ActorRef} +import akka.serialization.RemoteActorSerialization +import akka.actor.Actor.actorOf + +import java.util.concurrent.{CountDownLatch, TimeUnit} + +object State { + val latch = new CountDownLatch(1) +} + +case class RecvActorRef(bytes:Array[Byte]) + +class ActorRefService extends Actor { + import self._ + + def receive:Receive = { + case RecvActorRef(bytes) => + val ref = RemoteActorSerialization.fromBinaryToRemoteActorRef(bytes) + ref ! "hello" + case "hello" => + State.latch.countDown + } +} + +class Ticket506Spec extends Spec with ShouldMatchers { + val hostname:String = "localhost" + val port:Int = 9440 + + describe("a RemoteActorRef serialized") { + it("should be remotely usable") { + val s1,s2 = new RemoteServer + s1.start(hostname, port) + s2.start(hostname, port + 1) + + val a1,a2 = actorOf[ActorRefService] + a1.homeAddress = (hostname, port) + a2.homeAddress = (hostname, port+1) + + s1.register("service", a1) + s2.register("service", a2) + + // connect to the first server/service + val c1 = RemoteClient.actorFor("service", hostname, port) + + val bytes = RemoteActorSerialization.toRemoteActorRefProtocol(a2).toByteArray + c1 ! RecvActorRef(bytes) + + State.latch.await(1000, TimeUnit.MILLISECONDS) should be(true) + + RemoteClient.shutdownAll + s1.shutdown + s2.shutdown + } + } +} \ No newline at end of file From 44d0f2dadbea4492ac9a36ffc5478fd95cf461a5 Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Mon, 22 Nov 2010 13:14:10 +1300 Subject: [PATCH 18/23] Disable cross paths for publishing without Scala version --- project/build/AkkaProject.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index 0946f87f1f..eace80ba22 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -307,7 +307,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- // Miscellaneous // ------------------------------------------------------------------------------------------------------------------- - override def artifactID: String = this.name + override def disableCrossPaths = true override def mainClass = Some("akka.kernel.Main") @@ -949,7 +949,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------ class AkkaDefaultProject(info: ProjectInfo, val deployPath: Path) extends DefaultProject(info) with DeployProject with OSGiProject { - override def artifactID: String = this.name + override def disableCrossPaths = true lazy val sourceArtifact = Artifact(this.artifactID, "source", "jar", Some("sources"), Nil, None) lazy val docsArtifact = Artifact(this.artifactID, "doc", "jar", Some("docs"), Nil, None) override def runClasspath = super.runClasspath +++ (AkkaParentProject.this.info.projectPath / "config") From 9c072327d94261a0945213851f5aaddaa8ddc9b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bon=C3=A9r?= Date: Mon, 22 Nov 2010 08:09:12 +0100 Subject: [PATCH 19/23] fixed wrong path in voldermort tests - now test are passing again --- .../src/test/scala/EmbeddedVoldemort.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala index bd10420a5b..23940fbadf 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala @@ -18,7 +18,7 @@ trait EmbeddedVoldemort extends BeforeAndAfterAll with Logging { override protected def beforeAll(): Unit = { try { - val dir = "./akka-persistence/akka-persistence-voldemort/target/scala_2.8.0/test-resources" + val dir = "./akka-persistence/akka-persistence-voldemort/target/test-resources" val home = new File(dir) log.info("Creating Voldemort Config") val config = VoldemortConfig.loadFromVoldemortHome(home.getCanonicalPath) From e83b7d407f01ae902d766b1045eef1a5481e3330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bon=C3=A9r?= Date: Mon, 22 Nov 2010 08:59:45 +0100 Subject: [PATCH 20/23] Fixed bug in ActorRegistry getting typed actor by manifest --- .../main/scala/akka/actor/ActorRegistry.scala | 101 +++++++----------- .../ExecutorBasedEventDrivenDispatcher.scala | 10 +- .../scala/akka/dispatch/MailboxHandling.scala | 16 +-- .../scala/akka/util/ReflectiveAccess.scala | 58 +++++----- .../scala/akka/misc/ActorRegistrySpec.scala | 1 - 5 files changed, 80 insertions(+), 106 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorRegistry.scala b/akka-actor/src/main/scala/akka/actor/ActorRegistry.scala index bf0a479f7f..aebfe70d85 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRegistry.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRegistry.scala @@ -37,10 +37,10 @@ case class ActorUnregistered(actor: ActorRef) extends ActorRegistryEvent * @author Jonas Bonér */ object ActorRegistry extends ListenerManagement { - private val actorsByUUID = new ConcurrentHashMap[Uuid, ActorRef] - private val actorsById = new Index[String,ActorRef] - private val remoteActorSets = Map[Address, RemoteActorSet]() - private val guard = new ReadWriteGuard + private val actorsByUUID = new ConcurrentHashMap[Uuid, ActorRef] + private val actorsById = new Index[String,ActorRef] + private val remoteActorSets = Map[Address, RemoteActorSet]() + private val guard = new ReadWriteGuard /** * Returns all actors in the system. @@ -50,7 +50,7 @@ object ActorRegistry extends ListenerManagement { /** * Returns the number of actors in the system. */ - def size : Int = actorsByUUID.size + def size: Int = actorsByUUID.size /** * Invokes a function for all actors. @@ -68,8 +68,7 @@ object ActorRegistry extends ListenerManagement { val elements = actorsByUUID.elements while (elements.hasMoreElements) { val element = elements.nextElement - if(f isDefinedAt element) - return Some(f(element)) + if (f isDefinedAt element) return Some(f(element)) } None } @@ -88,9 +87,7 @@ object ActorRegistry extends ListenerManagement { val elements = actorsByUUID.elements while (elements.hasMoreElements) { val actorId = elements.nextElement - if (p(actorId)) { - all += actorId - } + if (p(actorId)) all += actorId } all.toArray } @@ -105,7 +102,7 @@ object ActorRegistry extends ListenerManagement { * Finds any actor that matches T. */ def actorFor[T <: Actor](implicit manifest: Manifest[T]): Option[ActorRef] = - find({ case a:ActorRef if manifest.erasure.isAssignableFrom(a.actor.getClass) => a }) + find({ case a: ActorRef if manifest.erasure.isAssignableFrom(a.actor.getClass) => a }) /** * Finds all actors of type or sub-type specified by the class passed in as the Class argument. @@ -132,13 +129,11 @@ object ActorRegistry extends ListenerManagement { * Invokes a function for all typed actors. */ def foreachTypedActor(f: (AnyRef) => Unit) = { - TypedActorModule.ensureTypedActorEnabled + TypedActorModule.ensureEnabled val elements = actorsByUUID.elements while (elements.hasMoreElements) { val proxy = typedActorFor(elements.nextElement) - if (proxy.isDefined) { - f(proxy.get) - } + if (proxy.isDefined) f(proxy.get) } } @@ -147,12 +142,11 @@ object ActorRegistry extends ListenerManagement { * Returns None if the function never returns Some */ def findTypedActor[T](f: PartialFunction[AnyRef,T]) : Option[T] = { - TypedActorModule.ensureTypedActorEnabled + TypedActorModule.ensureEnabled val elements = actorsByUUID.elements while (elements.hasMoreElements) { val proxy = typedActorFor(elements.nextElement) - if(proxy.isDefined && (f isDefinedAt proxy)) - return Some(f(proxy)) + if (proxy.isDefined && (f isDefinedAt proxy)) return Some(f(proxy)) } None } @@ -161,14 +155,12 @@ object ActorRegistry extends ListenerManagement { * Finds all typed actors that satisfy a predicate. */ def filterTypedActors(p: AnyRef => Boolean): Array[AnyRef] = { - TypedActorModule.ensureTypedActorEnabled + TypedActorModule.ensureEnabled val all = new ListBuffer[AnyRef] val elements = actorsByUUID.elements while (elements.hasMoreElements) { val proxy = typedActorFor(elements.nextElement) - if (proxy.isDefined && p(proxy.get)) { - all += proxy.get - } + if (proxy.isDefined && p(proxy.get)) all += proxy.get } all.toArray } @@ -177,7 +169,7 @@ object ActorRegistry extends ListenerManagement { * Finds all typed actors that are subtypes of the class passed in as the Manifest argument. */ def typedActorsFor[T <: AnyRef](implicit manifest: Manifest[T]): Array[AnyRef] = { - TypedActorModule.ensureTypedActorEnabled + TypedActorModule.ensureEnabled typedActorsFor[T](manifest.erasure.asInstanceOf[Class[T]]) } @@ -185,20 +177,20 @@ object ActorRegistry extends ListenerManagement { * Finds any typed actor that matches T. */ def typedActorFor[T <: AnyRef](implicit manifest: Manifest[T]): Option[AnyRef] = { - TypedActorModule.ensureTypedActorEnabled - def predicate(proxy: AnyRef) : Boolean = { + TypedActorModule.ensureEnabled + def predicate(proxy: AnyRef): Boolean = { val actorRef = TypedActorModule.typedActorObjectInstance.get.actorFor(proxy) actorRef.isDefined && manifest.erasure.isAssignableFrom(actorRef.get.actor.getClass) } - findTypedActor({ case a:AnyRef if predicate(a) => a }) + findTypedActor({ case a: Some[AnyRef] if predicate(a.get) => a }) } /** * Finds all typed actors of type or sub-type specified by the class passed in as the Class argument. */ def typedActorsFor[T <: AnyRef](clazz: Class[T]): Array[AnyRef] = { - TypedActorModule.ensureTypedActorEnabled - def predicate(proxy: AnyRef) : Boolean = { + TypedActorModule.ensureEnabled + def predicate(proxy: AnyRef): Boolean = { val actorRef = TypedActorModule.typedActorObjectInstance.get.actorFor(proxy) actorRef.isDefined && clazz.isAssignableFrom(actorRef.get.actor.getClass) } @@ -209,7 +201,7 @@ object ActorRegistry extends ListenerManagement { * Finds all typed actors that have a specific id. */ def typedActorsFor(id: String): Array[AnyRef] = { - TypedActorModule.ensureTypedActorEnabled + TypedActorModule.ensureEnabled val actorRefs = actorsById values id actorRefs.flatMap(typedActorFor(_)) } @@ -218,12 +210,10 @@ object ActorRegistry extends ListenerManagement { * Finds the typed actor that has a specific UUID. */ def typedActorFor(uuid: Uuid): Option[AnyRef] = { - TypedActorModule.ensureTypedActorEnabled + TypedActorModule.ensureEnabled val actorRef = actorsByUUID get uuid - if (actorRef eq null) - None - else - typedActorFor(actorRef) + if (actorRef eq null) None + else typedActorFor(actorRef) } /** @@ -265,20 +255,15 @@ object ActorRegistry extends ListenerManagement { */ def shutdownAll() { log.info("Shutting down all actors in the system...") - if (TypedActorModule.isTypedActorEnabled) { + if (TypedActorModule.isEnabled) { val elements = actorsByUUID.elements while (elements.hasMoreElements) { val actorRef = elements.nextElement val proxy = typedActorFor(actorRef) - if (proxy.isDefined) { - TypedActorModule.typedActorObjectInstance.get.stop(proxy.get) - } else { - actorRef.stop - } + if (proxy.isDefined) TypedActorModule.typedActorObjectInstance.get.stop(proxy.get) + else actorRef.stop } - } else { - foreach(_.stop) - } + } else foreach(_.stop) actorsByUUID.clear actorsById.clear log.info("All actors have been shut down and unregistered from ActorRegistry") @@ -337,16 +322,13 @@ class Index[K <: AnyRef,V <: AnyRef : Manifest] { if (set ne null) { set.synchronized { - if (set.isEmpty) { - retry = true //IF the set is empty then it has been removed, so signal retry - } + if (set.isEmpty) retry = true //IF the set is empty then it has been removed, so signal retry else { //Else add the value to the set and signal that retry is not needed added = set add v retry = false } } - } - else { + } else { val newSet = new ConcurrentSkipListSet[V] newSet add v @@ -354,24 +336,20 @@ class Index[K <: AnyRef,V <: AnyRef : Manifest] { val oldSet = container.putIfAbsent(k,newSet) if (oldSet ne null) { oldSet.synchronized { - if (oldSet.isEmpty) { - retry = true //IF the set is empty then it has been removed, so signal retry - } + if (oldSet.isEmpty) retry = true //IF the set is empty then it has been removed, so signal retry else { //Else try to add the value to the set and signal that retry is not needed added = oldSet add v retry = false } } - } else { - added = true - } + } else added = true } - if (retry) spinPut(k,v) + if (retry) spinPut(k, v) else added } - spinPut(key,value) + spinPut(key, value) } /** @@ -390,10 +368,8 @@ class Index[K <: AnyRef,V <: AnyRef : Manifest] { def findValue(key: K)(f: (V) => Boolean): Option[V] = { import scala.collection.JavaConversions._ val set = container get key - if (set ne null) - set.iterator.find(f) - else - None + if (set ne null) set.iterator.find(f) + else None } /** @@ -420,8 +396,7 @@ class Index[K <: AnyRef,V <: AnyRef : Manifest] { container.remove(key,emptySet) //We try to remove the key if it's mapped to an empty set true //Remove succeeded - } - else false //Remove failed + } else false //Remove failed } } else false //Remove failed } @@ -434,5 +409,5 @@ class Index[K <: AnyRef,V <: AnyRef : Manifest] { /** * Removes all keys and all values */ - def clear = foreach { case (k,v) => remove(k,v) } + def clear = foreach { case (k, v) => remove(k, v) } } diff --git a/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala b/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala index 83ff50427a..ee5dd890b8 100644 --- a/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala +++ b/akka-actor/src/main/scala/akka/dispatch/ExecutorBasedEventDrivenDispatcher.scala @@ -5,7 +5,7 @@ package akka.dispatch import akka.actor.{ActorRef, IllegalActorStateException} -import akka.util.ReflectiveAccess.EnterpriseModule +import akka.util.ReflectiveAccess.AkkaCloudModule import java.util.Queue import akka.util.Switch @@ -123,10 +123,10 @@ class ExecutorBasedEventDrivenDispatcher( */ def createDurableMailbox(actorRef: ActorRef, mailboxType: DurableMailboxType): AnyRef = mailboxType match { // FIXME make generic (work for TypedActor as well) - case FileBasedDurableMailbox(serializer) => EnterpriseModule.createFileBasedMailbox(actorRef).asInstanceOf[MessageQueue] - case ZooKeeperBasedDurableMailbox(serializer) => EnterpriseModule.createZooKeeperBasedMailbox(actorRef).asInstanceOf[MessageQueue] - case BeanstalkBasedDurableMailbox(serializer) => EnterpriseModule.createBeanstalkBasedMailbox(actorRef).asInstanceOf[MessageQueue] - case RedisBasedDurableMailbox(serializer) => EnterpriseModule.createRedisBasedMailbox(actorRef).asInstanceOf[MessageQueue] + case FileBasedDurableMailbox(serializer) => AkkaCloudModule.createFileBasedMailbox(actorRef).asInstanceOf[MessageQueue] + case ZooKeeperBasedDurableMailbox(serializer) => AkkaCloudModule.createZooKeeperBasedMailbox(actorRef).asInstanceOf[MessageQueue] + case BeanstalkBasedDurableMailbox(serializer) => AkkaCloudModule.createBeanstalkBasedMailbox(actorRef).asInstanceOf[MessageQueue] + case RedisBasedDurableMailbox(serializer) => AkkaCloudModule.createRedisBasedMailbox(actorRef).asInstanceOf[MessageQueue] case AMQPBasedDurableMailbox(serializer) => throw new UnsupportedOperationException("AMQPBasedDurableMailbox is not yet supported") case JMSBasedDurableMailbox(serializer) => throw new UnsupportedOperationException("JMSBasedDurableMailbox is not yet supported") } diff --git a/akka-actor/src/main/scala/akka/dispatch/MailboxHandling.scala b/akka-actor/src/main/scala/akka/dispatch/MailboxHandling.scala index ff71b607ce..7e81d4a598 100644 --- a/akka-actor/src/main/scala/akka/dispatch/MailboxHandling.scala +++ b/akka-actor/src/main/scala/akka/dispatch/MailboxHandling.scala @@ -5,7 +5,7 @@ package akka.dispatch import akka.actor.{Actor, ActorType, ActorRef, ActorInitializationException} -import akka.util.ReflectiveAccess.EnterpriseModule +import akka.util.ReflectiveAccess.AkkaCloudModule import akka.AkkaException import java.util.{Queue, List} @@ -42,15 +42,15 @@ case class BoundedMailbox( if (pushTimeOut eq null) throw new IllegalArgumentException("The push time-out for BoundedMailbox can not be null") } -abstract class DurableMailboxType(val serializer: EnterpriseModule.Serializer) extends MailboxType { +abstract class DurableMailboxType(val serializer: AkkaCloudModule.Serializer) extends MailboxType { if (serializer eq null) throw new IllegalArgumentException("The serializer for DurableMailboxType can not be null") } -case class FileBasedDurableMailbox(ser: EnterpriseModule.Serializer) extends DurableMailboxType(ser) -case class RedisBasedDurableMailbox(ser: EnterpriseModule.Serializer) extends DurableMailboxType(ser) -case class BeanstalkBasedDurableMailbox(ser: EnterpriseModule.Serializer) extends DurableMailboxType(ser) -case class ZooKeeperBasedDurableMailbox(ser: EnterpriseModule.Serializer) extends DurableMailboxType(ser) -case class AMQPBasedDurableMailbox(ser: EnterpriseModule.Serializer) extends DurableMailboxType(ser) -case class JMSBasedDurableMailbox(ser: EnterpriseModule.Serializer) extends DurableMailboxType(ser) +case class FileBasedDurableMailbox(ser: AkkaCloudModule.Serializer) extends DurableMailboxType(ser) +case class RedisBasedDurableMailbox(ser: AkkaCloudModule.Serializer) extends DurableMailboxType(ser) +case class BeanstalkBasedDurableMailbox(ser: AkkaCloudModule.Serializer) extends DurableMailboxType(ser) +case class ZooKeeperBasedDurableMailbox(ser: AkkaCloudModule.Serializer) extends DurableMailboxType(ser) +case class AMQPBasedDurableMailbox(ser: AkkaCloudModule.Serializer) extends DurableMailboxType(ser) +case class JMSBasedDurableMailbox(ser: AkkaCloudModule.Serializer) extends DurableMailboxType(ser) class DefaultUnboundedMessageQueue(blockDequeue: Boolean) extends LinkedBlockingQueue[MessageInvocation] with MessageQueue { diff --git a/akka-actor/src/main/scala/akka/util/ReflectiveAccess.scala b/akka-actor/src/main/scala/akka/util/ReflectiveAccess.scala index 5257d596f0..b5a4c7edb7 100644 --- a/akka-actor/src/main/scala/akka/util/ReflectiveAccess.scala +++ b/akka-actor/src/main/scala/akka/util/ReflectiveAccess.scala @@ -20,13 +20,13 @@ object ReflectiveAccess extends Logging { val loader = getClass.getClassLoader - lazy val isRemotingEnabled = RemoteClientModule.isRemotingEnabled - lazy val isTypedActorEnabled = TypedActorModule.isTypedActorEnabled - lazy val isEnterpriseEnabled = EnterpriseModule.isEnterpriseEnabled + lazy val isRemotingEnabled = RemoteClientModule.isEnabled + lazy val isTypedActorEnabled = TypedActorModule.isEnabled + lazy val isAkkaCloudEnabled = AkkaCloudModule.isEnabled - def ensureRemotingEnabled = RemoteClientModule.ensureRemotingEnabled - def ensureTypedActorEnabled = TypedActorModule.ensureTypedActorEnabled - def ensureEnterpriseEnabled = EnterpriseModule.ensureEnterpriseEnabled + def ensureRemotingEnabled = RemoteClientModule.ensureEnabled + def ensureTypedActorEnabled = TypedActorModule.ensureEnabled + def ensureAkkaCloudEnabled = AkkaCloudModule.ensureEnabled /** * Reflective access to the RemoteClient module. @@ -56,32 +56,32 @@ object ReflectiveAccess extends Logging { def clientFor(hostname: String, port: Int, loader: Option[ClassLoader]): RemoteClient } - lazy val isRemotingEnabled = remoteClientObjectInstance.isDefined + lazy val isEnabled = remoteClientObjectInstance.isDefined - def ensureRemotingEnabled = if (!isRemotingEnabled) throw new ModuleNotAvailableException( + def ensureEnabled = if (!isEnabled) throw new ModuleNotAvailableException( "Can't load the remoting module, make sure that akka-remote.jar is on the classpath") val remoteClientObjectInstance: Option[RemoteClientObject] = getObjectFor("akka.remote.RemoteClient$") def register(address: InetSocketAddress, uuid: Uuid) = { - ensureRemotingEnabled + ensureEnabled remoteClientObjectInstance.get.register(address.getHostName, address.getPort, uuid) } def unregister(address: InetSocketAddress, uuid: Uuid) = { - ensureRemotingEnabled + ensureEnabled remoteClientObjectInstance.get.unregister(address.getHostName, address.getPort, uuid) } def registerSupervisorForActor(remoteAddress: InetSocketAddress, actorRef: ActorRef) = { - ensureRemotingEnabled + ensureEnabled val remoteClient = remoteClientObjectInstance.get.clientFor(remoteAddress) remoteClient.registerSupervisorForActor(actorRef) } def clientFor(hostname: String, port: Int, loader: Option[ClassLoader]): RemoteClient = { - ensureRemotingEnabled + ensureEnabled remoteClientObjectInstance.get.clientFor(hostname, port, loader) } @@ -95,7 +95,7 @@ object ReflectiveAccess extends Logging { actorRef: ActorRef, typedActorInfo: Option[Tuple2[String, String]], actorType: ActorType): Option[CompletableFuture[T]] = { - ensureRemotingEnabled + ensureEnabled clientFor(remoteAddress.getHostName, remoteAddress.getPort, None).send[T]( message, senderOption, senderFuture, remoteAddress, timeout, isOneWay, actorRef, typedActorInfo, actorType) } @@ -126,17 +126,17 @@ object ReflectiveAccess extends Logging { getObjectFor("akka.remote.RemoteNode$") def registerActor(address: InetSocketAddress, actorRef: ActorRef) = { - ensureRemotingEnabled + RemoteClientModule.ensureEnabled remoteServerObjectInstance.get.registerActor(address, actorRef) } def registerTypedActor(address: InetSocketAddress, implementationClassName: String, proxy: AnyRef) = { - ensureRemotingEnabled + RemoteClientModule.ensureEnabled remoteServerObjectInstance.get.registerTypedActor(address, implementationClassName, proxy) } def unregister(actorRef: ActorRef) = { - ensureRemotingEnabled + RemoteClientModule.ensureEnabled remoteNodeObjectInstance.get.unregister(actorRef) } } @@ -156,16 +156,16 @@ object ReflectiveAccess extends Logging { def stop(anyRef: AnyRef) : Unit } - lazy val isTypedActorEnabled = typedActorObjectInstance.isDefined + lazy val isEnabled = typedActorObjectInstance.isDefined - def ensureTypedActorEnabled = if (!isTypedActorEnabled) throw new ModuleNotAvailableException( + def ensureEnabled = if (!isTypedActorEnabled) throw new ModuleNotAvailableException( "Can't load the typed actor module, make sure that akka-typed-actor.jar is on the classpath") val typedActorObjectInstance: Option[TypedActorObject] = getObjectFor("akka.actor.TypedActor$") def resolveFutureIfMessageIsJoinPoint(message: Any, future: Future[_]): Boolean = { - ensureTypedActorEnabled + ensureEnabled if (typedActorObjectInstance.get.isJoinPointAndOneWay(message)) { future.asInstanceOf[CompletableFuture[Option[_]]].completeWithResult(None) } @@ -173,7 +173,7 @@ object ReflectiveAccess extends Logging { } } - object EnterpriseModule { + object AkkaCloudModule { type Mailbox = { def enqueue(message: MessageInvocation) @@ -185,27 +185,27 @@ object ReflectiveAccess extends Logging { def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef } - lazy val isEnterpriseEnabled = clusterObjectInstance.isDefined + lazy val isEnabled = clusterObjectInstance.isDefined val clusterObjectInstance: Option[AnyRef] = - getObjectFor("akka.cluster.Cluster$") + getObjectFor("akka.cloud.cluster.Cluster$") val serializerClass: Option[Class[_]] = getClassFor("akka.serialization.Serializer") - def ensureEnterpriseEnabled = if (!isEnterpriseEnabled) throw new ModuleNotAvailableException( - "Feature is only available in Akka Enterprise edition") + def ensureEnabled = if (!isEnabled) throw new ModuleNotAvailableException( + "Feature is only available in Akka Cloud") - def createFileBasedMailbox(actorRef: ActorRef): Mailbox = createMailbox("akka.actor.mailbox.FileBasedMailbox", actorRef) + def createFileBasedMailbox(actorRef: ActorRef): Mailbox = createMailbox("akka.cloud.cluster.FileBasedMailbox", actorRef) - def createZooKeeperBasedMailbox(actorRef: ActorRef): Mailbox = createMailbox("akka.actor.mailbox.ZooKeeperBasedMailbox", actorRef) + def createZooKeeperBasedMailbox(actorRef: ActorRef): Mailbox = createMailbox("akka.cloud.cluster.ZooKeeperBasedMailbox", actorRef) - def createBeanstalkBasedMailbox(actorRef: ActorRef): Mailbox = createMailbox("akka.actor.mailbox.BeanstalkBasedMailbox", actorRef) + def createBeanstalkBasedMailbox(actorRef: ActorRef): Mailbox = createMailbox("akka.cloud.cluster.BeanstalkBasedMailbox", actorRef) - def createRedisBasedMailbox(actorRef: ActorRef): Mailbox = createMailbox("akka.actor.mailbox.RedisBasedMailbox", actorRef) + def createRedisBasedMailbox(actorRef: ActorRef): Mailbox = createMailbox("akka.cloud.cluster.RedisBasedMailbox", actorRef) private def createMailbox(mailboxClassname: String, actorRef: ActorRef): Mailbox = { - ensureEnterpriseEnabled + ensureEnabled createInstance( mailboxClassname, Array(classOf[ActorRef]), diff --git a/akka-actor/src/test/scala/akka/misc/ActorRegistrySpec.scala b/akka-actor/src/test/scala/akka/misc/ActorRegistrySpec.scala index 6148b04f53..f951281f2e 100644 --- a/akka-actor/src/test/scala/akka/misc/ActorRegistrySpec.scala +++ b/akka-actor/src/test/scala/akka/misc/ActorRegistrySpec.scala @@ -27,7 +27,6 @@ object ActorRegistrySpec { self.reply("got ping") } } - } class ActorRegistrySpec extends JUnitSuite { From 6c4e819c445269d0698e6ee8a5e31ace2b916ba0 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Mon, 22 Nov 2010 11:57:17 +0100 Subject: [PATCH 21/23] Merging in Actor per Session + fixing blocking problem with remote typed actors with Future response types --- .../main/scala/akka/remote/RemoteServer.scala | 91 ++++++++++--------- 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/akka-remote/src/main/scala/akka/remote/RemoteServer.scala b/akka-remote/src/main/scala/akka/remote/RemoteServer.scala index 6dd418b046..1d79978559 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteServer.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteServer.scala @@ -326,32 +326,25 @@ class RemoteServer extends Logging with ListenerManagement { } private def register[Key](id: Key, actorRef: ActorRef, registry: ConcurrentHashMap[Key, ActorRef]) { - // TODO: contains is an alias for containsValue, not containsKey, so the contains is useless here - if (_isRunning && !registry.contains(id)) { - registry.put(id, actorRef); + if (_isRunning) { + registry.put(id, actorRef) //TODO change to putIfAbsent if (!actorRef.isRunning) actorRef.start } } private def registerPerSession[Key](id: Key, factory: () => ActorRef, registry: ConcurrentHashMap[Key,() => ActorRef]) { - // TODO: contains is an alias for containsValue, not containsKey, so the contains is useless here - if (_isRunning && !registry.contains(id)) { - registry.put(id, factory) - } + if (_isRunning) + registry.put(id, factory) //TODO change to putIfAbsent } private def registerTypedActor[Key](id: Key, typedActor: AnyRef, registry: ConcurrentHashMap[Key, AnyRef]) { - // TODO: contains is an alias for containsValue, not containsKey, so the contains is useless here - if (_isRunning && !registry.contains(id)) { - registry.put(id, typedActor) - } + if (_isRunning) + registry.put(id, typedActor) //TODO change to putIfAbsent } private def registerTypedPerSessionActor[Key](id: Key, factory: () => AnyRef, registry: ConcurrentHashMap[Key,() => AnyRef]) { - // TODO: contains is an alias for containsValue, not containsKey, so the contains is useless here - if (_isRunning && !registry.contains(id)) { - registry.put(id, factory) - } + if (_isRunning) + registry.put(id, factory) //TODO change to putIfAbsent } /** @@ -531,18 +524,21 @@ class RemoteServerHandler( val clientAddress = getClientAddress(ctx) log.debug("Remote client [%s] disconnected from [%s]", clientAddress, server.name) // stop all session actors - val channelActors = sessionActors.remove(event.getChannel()) - val channelActorsIterator = channelActors.elements() - while (channelActorsIterator.hasMoreElements()) { - channelActorsIterator.nextElement().stop() + val channelActors = sessionActors.remove(event.getChannel) + if (channelActors ne null) { + val channelActorsIterator = channelActors.elements + while (channelActorsIterator.hasMoreElements) { + channelActorsIterator.nextElement.stop + } } - val channelTypedActors = typedSessionActors.remove(event.getChannel()) - val channelTypedActorsIterator = channelTypedActors.elements() - while (channelTypedActorsIterator.hasMoreElements()) { - TypedActor.stop(channelTypedActorsIterator.nextElement()) + val channelTypedActors = typedSessionActors.remove(event.getChannel) + if (channelTypedActors ne null) { + val channelTypedActorsIterator = channelTypedActors.elements + while (channelTypedActorsIterator.hasMoreElements) { + TypedActor.stop(channelTypedActorsIterator.nextElement) + } } - server.notifyListeners(RemoteServerClientDisconnected(server, clientAddress)) } @@ -629,7 +625,7 @@ class RemoteServerHandler( val exception = f.exception if (exception.isDefined) { - log.debug("Returning exception from actor invocation [%s]".format(exception.get)) + log.debug("Returning exception from actor invocation [%s]",exception.get) try { channel.write(createErrorReplyMessage(exception.get, request, AkkaActorType.ScalaActor)) } catch { @@ -679,26 +675,35 @@ class RemoteServerHandler( val messageReceiver = typedActor.getClass.getDeclaredMethod(typedActorInfo.getMethod, argClasses: _*) if (request.getOneWay) messageReceiver.invoke(typedActor, args: _*) else { - val result = messageReceiver.invoke(typedActor, args: _*) match { - case f: Future[_] => f.await.result.get //TODO replace this with a Listener on the Future to avoid blocking - case other => other + //Sends the response + def sendResponse(result: Either[Any,Throwable]): Unit = try { + val messageBuilder = RemoteActorSerialization.createRemoteMessageProtocolBuilder( + None, + Right(request.getUuid), + actorInfo.getId, + actorInfo.getTarget, + actorInfo.getTimeout, + result, + true, + None, + None, + AkkaActorType.TypedActor, + None) + if (request.hasSupervisorUuid) messageBuilder.setSupervisorUuid(request.getSupervisorUuid) + channel.write(messageBuilder.build) + log.debug("Returning result from remote typed actor invocation [%s]", result) + } catch { + case e: Throwable => server.notifyListeners(RemoteServerError(e, server)) } - log.debug("Returning result from remote typed actor invocation [%s]", result) - val messageBuilder = RemoteActorSerialization.createRemoteMessageProtocolBuilder( - None, - Right(request.getUuid), - actorInfo.getId, - actorInfo.getTarget, - actorInfo.getTimeout, - Left(result), - true, - None, - None, - AkkaActorType.TypedActor, - None) - if (request.hasSupervisorUuid) messageBuilder.setSupervisorUuid(request.getSupervisorUuid) - channel.write(messageBuilder.build) + messageReceiver.invoke(typedActor, args: _*) match { + case f: Future[_] => //If it's a future, we can lift on that to defer the send to when the future is completed + f.onComplete( future => { + val result: Either[Any,Throwable] = if (future.exception.isDefined) Right(future.exception.get) else Left(future.result.get) + sendResponse(result) + }) + case other => sendResponse(Left(other)) + } } } catch { case e: InvocationTargetException => From 4ffedf99cd6ad3c97e4320e583ae6b7266604e7e Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Tue, 23 Nov 2010 11:50:06 +1300 Subject: [PATCH 22/23] Remove scala version from dist paths - fixes #549 --- project/build/AkkaProject.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index eace80ba22..3d80b2d8d8 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -325,7 +325,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { .filter(_.getName.endsWith(".jar")) .filter(!_.getName.contains("servlet_2.4")) .filter(!_.getName.contains("scala-library")) - .map("lib_managed/scala_%s/compile/".format(buildScalaVersion) + _.getName) + .map("lib_managed/compile/" + _.getName) .mkString(" ") + " config/" + " scala-library.jar" + @@ -785,6 +785,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { } class AkkaOSGiAssemblyProject(info: ProjectInfo) extends DefaultProject(info) { + override def disableCrossPaths = true // Scala bundle val scala_bundle = "com.weiglewilczek.scala-lang-osgi" % "scala-library" % buildScalaVersion % "compile" intransitive @@ -845,6 +846,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaSampleAntsProject(info: ProjectInfo) extends DefaultSpdeProject(info) { + override def disableCrossPaths = true override def spdeSourcePath = mainSourcePath / "spde" } From a9e7451ac12b4ddb77ef072d99370cebdea7e174 Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Tue, 23 Nov 2010 12:28:21 +1300 Subject: [PATCH 23/23] Disable cross paths on parent projects as well --- project/build/AkkaProject.scala | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index 3d80b2d8d8..298983e9f1 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -542,6 +542,8 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaPersistenceParentProject(info: ProjectInfo) extends ParentProject(info) { + override def disableCrossPaths = true + lazy val akka_persistence_common = project("akka-persistence-common", "akka-persistence-common", new AkkaPersistenceCommonProject(_), akka_remote, akka_stm) lazy val akka_persistence_redis = project("akka-persistence-redis", "akka-persistence-redis", @@ -749,6 +751,8 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaOSGiParentProject(info: ProjectInfo) extends ParentProject(info) { + override def disableCrossPaths = true + lazy val akka_osgi_dependencies_bundle = project("akka-osgi-dependencies-bundle", "akka-osgi-dependencies-bundle", new AkkaOSGiDependenciesBundleProject(_), akka_kernel, akka_jta) // akka_kernel does not depend on akka_jta (why?) therefore we list akka_jta here lazy val akka_osgi_assembly = project("akka-osgi-assembly", "akka-osgi-assembly", @@ -895,6 +899,8 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { } class AkkaSamplesParentProject(info: ProjectInfo) extends ParentProject(info) { + override def disableCrossPaths = true + lazy val akka_sample_ants = project("akka-sample-ants", "akka-sample-ants", new AkkaSampleAntsProject(_), akka_stm) lazy val akka_sample_chat = project("akka-sample-chat", "akka-sample-chat",