From 0c21bb9170807cfdbf53966512865da874affd77 Mon Sep 17 00:00:00 2001 From: Szabolcs Berecz Date: Tue, 12 Jun 2012 21:49:55 +0200 Subject: [PATCH 1/4] #2156 - sbt plugin: project dependencies should be included automatically --- akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala b/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala index 08826fa5dd..835a596a4a 100644 --- a/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala +++ b/akka-sbt-plugin/src/main/scala/AkkaKernelPlugin.scala @@ -75,7 +75,9 @@ object AkkaKernelPlugin extends Plugin { copyFiles(libFiles(cp, conf.libFilter), distLibPath) copyFiles(conf.additionalLibs, distLibPath) - for (subTarget ← subProjectDependencies.map(_.target)) { + for (subProjectDependency ← subProjectDependencies) { + val subTarget = subProjectDependency.target + EvaluateTask(buildStruct, packageBin in Compile, st, subProjectDependency.projectRef) copyJars(subTarget, distLibPath) } log.info("Distribution created.") @@ -220,10 +222,10 @@ object AkkaKernelPlugin extends Plugin { }.toList val target = setting(Keys.crossTarget, "Missing crossTarget directory") - SubProjectInfo(project.id, target, subProjects) + SubProjectInfo(projectRef, target, subProjects) } - private case class SubProjectInfo(id: String, target: File, subProjects: Seq[SubProjectInfo]) { + private case class SubProjectInfo(projectRef: ProjectRef, target: File, subProjects: Seq[SubProjectInfo]) { def recursiveSubProjects: Set[SubProjectInfo] = { val flatSubProjects = for { From 8ce6ac3e3e5e0c066e2db25d07a97bb21c26afd0 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 13 Jun 2012 12:23:02 +0200 Subject: [PATCH 2/4] #2217 - setting accessible = true before newInstance --- .../test/java/akka/actor/NonPublicClass.java | 22 +++++++++++++++++++ .../test/scala/akka/actor/ActorRefSpec.scala | 7 ++++++ .../src/main/scala/akka/actor/Props.scala | 6 ++++- 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java diff --git a/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java b/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java new file mode 100644 index 0000000000..55f3910db7 --- /dev/null +++ b/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java @@ -0,0 +1,22 @@ +package akka.actor; + +import com.sun.xml.internal.ws.api.PropertySet; + +/** + * Created by IntelliJ IDEA. + * User: viktorklang + * Date: 6/13/12 + * Time: 12:12 PM + * To change this template use File | Settings | File Templates. + */ +public class NonPublicClass { + public static Props createProps() { + return new Props(MyNonPublicActorClass.class); + } +} + +class MyNonPublicActorClass extends UntypedActor { + @Override public void onReceive(Object msg) { + getSender().tell(msg); + } +} \ No newline at end of file diff --git a/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala index bec066d97a..3056dc9e95 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/ActorRefSpec.scala @@ -358,6 +358,13 @@ class ActorRefSpec extends AkkaSpec with DefaultTimeout { system.stop(serverRef) } + "support actorOfs where the class of the actor isn't public" in { + val a = system.actorOf(NonPublicClass.createProps()) + a.tell("pigdog", testActor) + expectMsg("pigdog") + system stop a + } + "stop when sent a poison pill" in { val timeout = Timeout(20000) val ref = system.actorOf(Props(new Actor { diff --git a/akka-actor/src/main/scala/akka/actor/Props.scala b/akka-actor/src/main/scala/akka/actor/Props.scala index fc01a5ba36..91c4ced285 100644 --- a/akka-actor/src/main/scala/akka/actor/Props.scala +++ b/akka-actor/src/main/scala/akka/actor/Props.scala @@ -186,5 +186,9 @@ case class Props( * able to optimize serialization. */ private[akka] case class FromClassCreator(clazz: Class[_ <: Actor]) extends Function0[Actor] { - def apply(): Actor = clazz.newInstance + def apply(): Actor = { + val ctor = clazz.getDeclaredConstructor() + ctor.setAccessible(true) + ctor.newInstance() + } } From 1eb6681b3c9c23d60dce31c17acaf58cafd09643 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 13 Jun 2012 15:11:19 +0200 Subject: [PATCH 3/4] Removing horrid IDEA autogenerated section and adding Typesafe copyright to NonPublicClass.java --- .../src/test/java/akka/actor/NonPublicClass.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java b/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java index 55f3910db7..850d82cd62 100644 --- a/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java +++ b/akka-actor-tests/src/test/java/akka/actor/NonPublicClass.java @@ -1,14 +1,9 @@ +/** + * Copyright (C) 2009-2012 Typesafe Inc. + */ + package akka.actor; -import com.sun.xml.internal.ws.api.PropertySet; - -/** - * Created by IntelliJ IDEA. - * User: viktorklang - * Date: 6/13/12 - * Time: 12:12 PM - * To change this template use File | Settings | File Templates. - */ public class NonPublicClass { public static Props createProps() { return new Props(MyNonPublicActorClass.class); From 6bb1bf679562c60538c84fd14a828c4c2c5140e2 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Wed, 13 Jun 2012 15:19:58 +0200 Subject: [PATCH 4/4] Switching to getDeclaredConstructor.newInstance as a fallback --- akka-actor/src/main/scala/akka/actor/Props.scala | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/Props.scala b/akka-actor/src/main/scala/akka/actor/Props.scala index 91c4ced285..e1d8e3b04c 100644 --- a/akka-actor/src/main/scala/akka/actor/Props.scala +++ b/akka-actor/src/main/scala/akka/actor/Props.scala @@ -186,9 +186,10 @@ case class Props( * able to optimize serialization. */ private[akka] case class FromClassCreator(clazz: Class[_ <: Actor]) extends Function0[Actor] { - def apply(): Actor = { - val ctor = clazz.getDeclaredConstructor() - ctor.setAccessible(true) - ctor.newInstance() + def apply(): Actor = try clazz.newInstance catch { + case iae: IllegalAccessException ⇒ + val ctor = clazz.getDeclaredConstructor() + ctor.setAccessible(true) + ctor.newInstance() } }