From 9d71142748f9b5a5d0415020996adcd81ca7e9c9 Mon Sep 17 00:00:00 2001 From: Balazs Kossovics Date: Tue, 15 Dec 2015 22:31:50 +0100 Subject: [PATCH] #19192 Cluster extension helper to get full path of an actor ref --- .../src/main/scala/akka/cluster/Cluster.scala | 14 ++++++++++++++ .../src/test/scala/akka/cluster/ClusterSpec.scala | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala index 745bdb0066..eb7ba075c8 100644 --- a/akka-cluster/src/main/scala/akka/cluster/Cluster.scala +++ b/akka-cluster/src/main/scala/akka/cluster/Cluster.scala @@ -356,6 +356,20 @@ class Cluster(val system: ExtendedActorSystem) extends Extension { else clusterDaemons ! InternalClusterAction.AddOnMemberRemovedListener(callback) } + + /** + * Generate the remote actor path by replacing the Address in the RootActor Path for the given + * ActorRef with the cluster's `selfAddress`, unless address' host is already defined + */ + def remotePathOf(actorRef: ActorRef): ActorPath = { + val path = actorRef.path + if (path.address.host.isDefined) { + path + } else { + path.root.copy(selfAddress) / path.elements withUid path.uid + } + } + // ======================================================== // ===================== INTERNAL API ===================== // ======================================================== diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterSpec.scala index b68258585a..e363611422 100644 --- a/akka-cluster/src/test/scala/akka/cluster/ClusterSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterSpec.scala @@ -135,5 +135,12 @@ class ClusterSpec extends AkkaSpec(ClusterSpec.config) with ImplicitSender { } } + "allow to resolve remotePathOf any actor" in { + val remotePath = cluster.remotePathOf(testActor) + + testActor.path.address.host should ===(None) + cluster.remotePathOf(testActor).uid should ===(testActor.path.uid) + cluster.remotePathOf(testActor).address should ===(selfAddress) + } } }