From 9331fc8975ac8ce6db55e4eb9b3fe684d708b686 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Tue, 3 Aug 2010 14:42:42 +0200 Subject: [PATCH] Closing ticket 355 --- .../main/scala/component/ActorComponent.scala | 5 ++-- .../src/main/scala/actor/ActorRegistry.scala | 23 ++++++++++--------- .../akka/actor/SampleUntypedActor.java | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/akka-camel/src/main/scala/component/ActorComponent.scala b/akka-camel/src/main/scala/component/ActorComponent.scala index 1cd29ced00..7ef8e0750c 100644 --- a/akka-camel/src/main/scala/component/ActorComponent.scala +++ b/akka-camel/src/main/scala/component/ActorComponent.scala @@ -148,9 +148,8 @@ class ActorProducer(val ep: ActorEndpoint) extends DefaultProducer(ep) with Asyn else targetByUuid(ep.uuid.get) private def targetById(id: String) = ActorRegistry.actorsFor(id) match { - case Nil => None - case actor :: Nil => Some(actor) - case actors => Some(actors.head) + case actors if actors.length == 0 => None + case actors => Some(actors(0)) } private def targetByUuid(uuid: String) = ActorRegistry.actorFor(uuid) diff --git a/akka-core/src/main/scala/actor/ActorRegistry.scala b/akka-core/src/main/scala/actor/ActorRegistry.scala index 953540fc70..63ddb939c7 100644 --- a/akka-core/src/main/scala/actor/ActorRegistry.scala +++ b/akka-core/src/main/scala/actor/ActorRegistry.scala @@ -32,10 +32,12 @@ object ActorRegistry extends ListenerManagement { private val actorsByUUID = new ConcurrentHashMap[String, ActorRef] private val actorsById = new ConcurrentHashMap[String, JSet[ActorRef]] + private val Naught = Array[ActorRef]() //Nil for Arrays + /** * Returns all actors in the system. */ - def actors: List[ActorRef] = filter(_ => true) + def actors: Array[ActorRef] = filter(_ => true) /** * Invokes a function for all actors. @@ -63,13 +65,13 @@ object ActorRegistry extends ListenerManagement { /** * Finds all actors that are subtypes of the class passed in as the Manifest argument and supproting passed message. */ - def actorsFor[T <: Actor](message: Any)(implicit manifest: Manifest[T] ): List[ActorRef] = + def actorsFor[T <: Actor](message: Any)(implicit manifest: Manifest[T] ): Array[ActorRef] = filter(a => manifest.erasure.isAssignableFrom(a.actor.getClass) && a.isDefinedAt(message)) /** * Finds all actors that satisfy a predicate. */ - def filter(p: ActorRef => Boolean): List[ActorRef] = { + def filter(p: ActorRef => Boolean): Array[ActorRef] = { val all = new ListBuffer[ActorRef] val elements = actorsByUUID.elements while (elements.hasMoreElements) { @@ -78,35 +80,34 @@ object ActorRegistry extends ListenerManagement { all += actorId } } - all.toList + all.toArray } /** * Finds all actors that are subtypes of the class passed in as the Manifest argument. */ - def actorsFor[T <: Actor](implicit manifest: Manifest[T]): List[ActorRef] = + def actorsFor[T <: Actor](implicit manifest: Manifest[T]): Array[ActorRef] = actorsFor[T](manifest.erasure.asInstanceOf[Class[T]]) /** * Finds any actor that matches T. - * FIXME: Improve performance by breaking out after the first match */ def actorFor[T <: Actor](implicit manifest: Manifest[T]): Option[ActorRef] = - actorsFor[T](manifest).headOption + find(a => if(manifest.erasure.isAssignableFrom(a.actor.getClass)) Some(a) else None) /** * Finds all actors of type or sub-type specified by the class passed in as the Class argument. */ - def actorsFor[T <: Actor](clazz: Class[T]): List[ActorRef] = + def actorsFor[T <: Actor](clazz: Class[T]): Array[ActorRef] = filter(a => clazz.isAssignableFrom(a.actor.getClass)) /** * Finds all actors that has a specific id. */ - def actorsFor(id: String): List[ActorRef] = { + def actorsFor(id: String): Array[ActorRef] = { if (actorsById.containsKey(id)) { - actorsById.get(id).toArray.toList.asInstanceOf[List[ActorRef]] - } else Nil + actorsById.get(id).toArray(Naught) + } else Naught } /** diff --git a/akka-core/src/test/java/se/scalablesolutions/akka/actor/SampleUntypedActor.java b/akka-core/src/test/java/se/scalablesolutions/akka/actor/SampleUntypedActor.java index 8040e1394f..ed8a67ab13 100644 --- a/akka-core/src/test/java/se/scalablesolutions/akka/actor/SampleUntypedActor.java +++ b/akka-core/src/test/java/se/scalablesolutions/akka/actor/SampleUntypedActor.java @@ -36,7 +36,7 @@ public class SampleUntypedActor extends UntypedActor { } else if (msg.equals("ForwardMessage")) { // Retreive an actor from the ActorRegistry by ID and get an ActorRef back - ActorRef actorRef = ActorRegistry.actorsFor("some-actor-id").head(); + ActorRef actorRef = ActorRegistry.actorsFor("some-actor-id")[0]; // Wrap the ActorRef in an UntypedActorRef and forward the message to this actor UntypedActorRef.wrap(actorRef).forward(msg, self);