diff --git a/akka-actor-tests/src/test/java/akka/japi/JavaAPITestBase.java b/akka-actor-tests/src/test/java/akka/japi/JavaAPITestBase.java index b3a092b1f9..386b849b48 100644 --- a/akka-actor-tests/src/test/java/akka/japi/JavaAPITestBase.java +++ b/akka-actor-tests/src/test/java/akka/japi/JavaAPITestBase.java @@ -1,8 +1,11 @@ package akka.japi; +import akka.actor.ExtendedActorSystem; import akka.event.LoggingAdapter; import akka.event.NoLogging; +import akka.serialization.JavaSerializer; import org.junit.Test; +import java.util.concurrent.Callable; import static org.junit.Assert.*; @@ -54,4 +57,13 @@ public class JavaAPITestBase { LoggingAdapter a = NoLogging.getInstance(); assertNotNull(a); } + + @Test + public void mustBeAbleToUseCurrentSystem() { + assertNull(JavaSerializer.currentSystem().withValue(null, new Callable() { + public ExtendedActorSystem call() { + return JavaSerializer.currentSystem().value(); + } + })); + } } diff --git a/akka-actor/src/main/scala/akka/serialization/Serializer.scala b/akka-actor/src/main/scala/akka/serialization/Serializer.scala index 5670ba61ba..bdf8adbf85 100644 --- a/akka-actor/src/main/scala/akka/serialization/Serializer.scala +++ b/akka-actor/src/main/scala/akka/serialization/Serializer.scala @@ -5,9 +5,11 @@ package akka.serialization */ import java.io.{ ObjectOutputStream, ByteArrayOutputStream, ObjectInputStream, ByteArrayInputStream } +import java.util.concurrent.Callable import akka.util.ClassLoaderObjectInputStream import akka.actor.ExtendedActorSystem import scala.util.DynamicVariable +import akka.serialization.JavaSerializer.CurrentSystem /** * A Serializer represents a bimap between an object and an array of bytes representing that object. @@ -93,9 +95,22 @@ object JavaSerializer { * currentSystem.withValue(system) { * ...code... * } + * + * or + * + * currentSystem.withValue(system, callable) */ - val currentSystem = new DynamicVariable[ExtendedActorSystem](null) - + val currentSystem = new CurrentSystem + final class CurrentSystem extends DynamicVariable[ExtendedActorSystem](null) { + /** + * Java API + * @param value - the current value under the call to callable.call() + * @param callable - the operation to be performed + * @tparam S - the return type + * @return the result of callable.call() + */ + def withValue[S](value: ExtendedActorSystem, callable: Callable[S]): S = super.withValue[S](value)(callable.call) + } } /**