From d5e45239ee70a947c903ecf934fa6effb94a174b Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 29 Apr 2010 10:38:07 +0200 Subject: [PATCH 1/7] Removed Shoal and moved jGroups to akka-cluster, packages remain intact --- .../src/main/scala/ShoalClusterActor.scala | 105 ------------------ .../src/main/scala/JGroupsClusterActor.scala | 0 project/build/AkkaProject.scala | 19 +--- 3 files changed, 3 insertions(+), 121 deletions(-) delete mode 100644 akka-cluster/akka-cluster-shoal/src/main/scala/ShoalClusterActor.scala rename akka-cluster/{akka-cluster-jgroups => }/src/main/scala/JGroupsClusterActor.scala (100%) diff --git a/akka-cluster/akka-cluster-shoal/src/main/scala/ShoalClusterActor.scala b/akka-cluster/akka-cluster-shoal/src/main/scala/ShoalClusterActor.scala deleted file mode 100644 index 455b57e3d2..0000000000 --- a/akka-cluster/akka-cluster-shoal/src/main/scala/ShoalClusterActor.scala +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (C) 2009-2010 Scalable Solutions AB - */ -package se.scalablesolutions.akka.cluster.shoal - -import java.util.Properties - -import se.scalablesolutions.akka.config.Config.config -import se.scalablesolutions.akka.remote.{ClusterActor, BasicClusterActor, RemoteServer} - -import com.sun.enterprise.ee.cms.core._ -import com.sun.enterprise.ee.cms.impl.client._ - -/** - * Clustering support via Shoal. - */ -class ShoalClusterActor extends BasicClusterActor { - - type ADDR_T = String - - @volatile protected var gms : Option[GroupManagementService] = None - protected lazy val serverName : String = RemoteServer.HOSTNAME + ":" + RemoteServer.PORT - @volatile private var isActive = false - - lazy val topic : String = config.getString("akka.remote.cluster.shoal.topic") getOrElse "akka-messages" - - override def init = { - super.init - gms = Some(createGMS) - isActive = true - } - - override def shutdown = { - super.shutdown - isActive = false - for(g <- gms) g.shutdown(GMSConstants.shutdownType.INSTANCE_SHUTDOWN) - gms = None - } - - /** - * Constructs a Properties instance with properties designated for the underlying - * Shoal cluster transport (JXTA,JGroups) - */ - protected def properties() : Properties = { - config.getConfigMap("akka.remote.cluster.shoal.properties").map( m => { - new Properties(){ - for(key <- m.keys) setProperty(key,m(key)) - } - }).getOrElse(null) - } - - /** - * Creates a GroupManagementService, provides it with the proper properties - * Adds callbacks and boots up the cluster - */ - protected def createGMS : GroupManagementService = { - val g = GMSFactory - .startGMSModule(serverName,name, GroupManagementService.MemberType.CORE, properties()) - .asInstanceOf[GroupManagementService] - val callback = createCallback - g.addActionFactory(new JoinNotificationActionFactoryImpl(callback)) - g.addActionFactory(new FailureSuspectedActionFactoryImpl(callback)) - g.addActionFactory(new FailureNotificationActionFactoryImpl(callback)) - g.addActionFactory(new PlannedShutdownActionFactoryImpl(callback)) - g.addActionFactory(new MessageActionFactoryImpl(callback), topic) - g.join - g - } - - /** - * Creates a CallBack instance that deals with the cluster signalling - */ - protected def createCallback : CallBack = { - import scala.collection.JavaConversions._ - import ClusterActor._ - - val me = this - new CallBack { - def processNotification(signal : Signal) { - try { - signal.acquire() - if(isActive) { - signal match { - case ms : MessageSignal => me ! Message[ADDR_T](ms.getMemberToken,ms.getMessage) - case jns : JoinNotificationSignal => me ! View[ADDR_T](Set[ADDR_T]() ++ jns.getCurrentCoreMembers - serverName) - case fss : FailureSuspectedSignal => me ! Zombie[ADDR_T](fss.getMemberToken) - case fns : FailureNotificationSignal => me ! Zombie[ADDR_T](fns.getMemberToken) - case _ => log.debug("Unhandled signal: [%s]",signal) - } - } - signal.release() - } catch { - case e : SignalAcquireException => log.warning(e,"SignalAcquireException") - case e : SignalReleaseException => log.warning(e,"SignalReleaseException") - } - } - } - } - - protected def toOneNode(dest : ADDR_T, msg : Array[Byte]) : Unit = - for(g <- gms) g.getGroupHandle.sendMessage(dest,topic, msg) - - protected def toAllNodes(msg : Array[Byte]) : Unit = - for(g <- gms) g.getGroupHandle.sendMessage(topic, msg) -} \ No newline at end of file diff --git a/akka-cluster/akka-cluster-jgroups/src/main/scala/JGroupsClusterActor.scala b/akka-cluster/src/main/scala/JGroupsClusterActor.scala similarity index 100% rename from akka-cluster/akka-cluster-jgroups/src/main/scala/JGroupsClusterActor.scala rename to akka-cluster/src/main/scala/JGroupsClusterActor.scala diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index cf1e9c3e68..6d317e5f08 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -59,7 +59,7 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { lazy val akka_patterns = project("akka-patterns", "akka-patterns", new AkkaPatternsProject(_), akka_core) lazy val akka_security = project("akka-security", "akka-security", new AkkaSecurityProject(_), akka_core) lazy val akka_persistence = project("akka-persistence", "akka-persistence", new AkkaPersistenceParentProject(_)) - lazy val akka_cluster = project("akka-cluster", "akka-cluster", new AkkaClusterParentProject(_)) + lazy val akka_cluster = project("akka-cluster", "akka-cluster", new AkkaClusterProject(_), akka_core) lazy val akka_spring = project("akka-spring", "akka-spring", new AkkaSpringProject(_), akka_core) lazy val akka_jta = project("akka-jta", "akka-jta", new AkkaJTAProject(_), akka_core) lazy val akka_servlet = project("akka-servlet", "akka-servlet", new AkkaServletProject(_), @@ -96,8 +96,7 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { " dist/akka-util_%s-%s.jar".format(buildScalaVersion, version) + " dist/akka-util-java_%s-%s.jar".format(buildScalaVersion, version) + " dist/akka-core_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-cluster-shoal_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-cluster-jgroups_%s-%s.jar".format(buildScalaVersion, version) + + " dist/akka-cluster%s-%s.jar".format(buildScalaVersion, version) + " dist/akka-rest_%s-%s.jar".format(buildScalaVersion, version) + " dist/akka-comet_%s-%s.jar".format(buildScalaVersion, version) + " dist/akka-camel_%s-%s.jar".format(buildScalaVersion, version) + @@ -262,22 +261,10 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { new AkkaCassandraProject(_), akka_persistence_common) } - class AkkaJgroupsProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { + class AkkaClusterProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val jgroups = "jgroups" % "jgroups" % "2.8.0.CR7" % "compile" } - class AkkaShoalProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val shoal = "shoal-jxta" % "shoal" % "1.1-20090818" % "compile" - val shoal_extra = "shoal-jxta" % "jxta" % "1.1-20090818" % "compile" - } - - class AkkaClusterParentProject(info: ProjectInfo) extends ParentProject(info) { - lazy val akka_cluster_jgroups = project("akka-cluster-jgroups", "akka-cluster-jgroups", - new AkkaJgroupsProject(_), akka_core) - lazy val akka_cluster_shoal = project("akka-cluster-shoal", "akka-cluster-shoal", - new AkkaShoalProject(_), akka_core) - } - class AkkaServletProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) class AkkaKernelProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) From 46c491a0a9c06c3ef10db78e20acb5fd144ec857 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 29 Apr 2010 11:03:25 +0200 Subject: [PATCH 2/7] Consolidated akka-security, akka-rest, akka-comet and akka-servlet into akka-http --- .../javax.ws.rs.ext.MessageBodyWriter_FIXME | 0 .../main/scala/ActorComponentProvider.scala | 0 .../scala/ActorComponentProviderFactory.scala | 0 .../src/main/scala/AkkaBroadcaster.scala | 0 .../scala/AkkaClusterBroadcastFilter.scala | 0 .../src/main/scala/AkkaCometServlet.scala | 0 .../src/main/scala/AkkaLoader.scala | 0 .../src/main/scala/AkkaServlet.scala | 0 .../scala/BootableCometActorService.scala | 0 .../src/main/scala/Initializer.scala | 0 .../src/main/scala/ListWriter.scala | 0 .../src/main/scala/Security.scala | 0 .../src/test/scala/AllTest.scala | 0 .../src/test/scala/SecuritySpec.scala | 0 project/build/AkkaProject.scala | 45 ++++++------------- 15 files changed, 14 insertions(+), 31 deletions(-) rename {akka-rest => akka-http}/src/main/resources/META-INF/services/javax.ws.rs.ext.MessageBodyWriter_FIXME (100%) rename {akka-rest => akka-http}/src/main/scala/ActorComponentProvider.scala (100%) rename {akka-rest => akka-http}/src/main/scala/ActorComponentProviderFactory.scala (100%) rename {akka-comet => akka-http}/src/main/scala/AkkaBroadcaster.scala (100%) rename {akka-comet => akka-http}/src/main/scala/AkkaClusterBroadcastFilter.scala (100%) rename akka-comet/src/main/scala/AkkaServlet.scala => akka-http/src/main/scala/AkkaCometServlet.scala (100%) rename {akka-servlet => akka-http}/src/main/scala/AkkaLoader.scala (100%) rename {akka-rest => akka-http}/src/main/scala/AkkaServlet.scala (100%) rename {akka-comet => akka-http}/src/main/scala/BootableCometActorService.scala (100%) rename {akka-servlet => akka-http}/src/main/scala/Initializer.scala (100%) rename {akka-rest => akka-http}/src/main/scala/ListWriter.scala (100%) rename {akka-security => akka-http}/src/main/scala/Security.scala (100%) rename {akka-security => akka-http}/src/test/scala/AllTest.scala (100%) rename {akka-security => akka-http}/src/test/scala/SecuritySpec.scala (100%) diff --git a/akka-rest/src/main/resources/META-INF/services/javax.ws.rs.ext.MessageBodyWriter_FIXME b/akka-http/src/main/resources/META-INF/services/javax.ws.rs.ext.MessageBodyWriter_FIXME similarity index 100% rename from akka-rest/src/main/resources/META-INF/services/javax.ws.rs.ext.MessageBodyWriter_FIXME rename to akka-http/src/main/resources/META-INF/services/javax.ws.rs.ext.MessageBodyWriter_FIXME diff --git a/akka-rest/src/main/scala/ActorComponentProvider.scala b/akka-http/src/main/scala/ActorComponentProvider.scala similarity index 100% rename from akka-rest/src/main/scala/ActorComponentProvider.scala rename to akka-http/src/main/scala/ActorComponentProvider.scala diff --git a/akka-rest/src/main/scala/ActorComponentProviderFactory.scala b/akka-http/src/main/scala/ActorComponentProviderFactory.scala similarity index 100% rename from akka-rest/src/main/scala/ActorComponentProviderFactory.scala rename to akka-http/src/main/scala/ActorComponentProviderFactory.scala diff --git a/akka-comet/src/main/scala/AkkaBroadcaster.scala b/akka-http/src/main/scala/AkkaBroadcaster.scala similarity index 100% rename from akka-comet/src/main/scala/AkkaBroadcaster.scala rename to akka-http/src/main/scala/AkkaBroadcaster.scala diff --git a/akka-comet/src/main/scala/AkkaClusterBroadcastFilter.scala b/akka-http/src/main/scala/AkkaClusterBroadcastFilter.scala similarity index 100% rename from akka-comet/src/main/scala/AkkaClusterBroadcastFilter.scala rename to akka-http/src/main/scala/AkkaClusterBroadcastFilter.scala diff --git a/akka-comet/src/main/scala/AkkaServlet.scala b/akka-http/src/main/scala/AkkaCometServlet.scala similarity index 100% rename from akka-comet/src/main/scala/AkkaServlet.scala rename to akka-http/src/main/scala/AkkaCometServlet.scala diff --git a/akka-servlet/src/main/scala/AkkaLoader.scala b/akka-http/src/main/scala/AkkaLoader.scala similarity index 100% rename from akka-servlet/src/main/scala/AkkaLoader.scala rename to akka-http/src/main/scala/AkkaLoader.scala diff --git a/akka-rest/src/main/scala/AkkaServlet.scala b/akka-http/src/main/scala/AkkaServlet.scala similarity index 100% rename from akka-rest/src/main/scala/AkkaServlet.scala rename to akka-http/src/main/scala/AkkaServlet.scala diff --git a/akka-comet/src/main/scala/BootableCometActorService.scala b/akka-http/src/main/scala/BootableCometActorService.scala similarity index 100% rename from akka-comet/src/main/scala/BootableCometActorService.scala rename to akka-http/src/main/scala/BootableCometActorService.scala diff --git a/akka-servlet/src/main/scala/Initializer.scala b/akka-http/src/main/scala/Initializer.scala similarity index 100% rename from akka-servlet/src/main/scala/Initializer.scala rename to akka-http/src/main/scala/Initializer.scala diff --git a/akka-rest/src/main/scala/ListWriter.scala b/akka-http/src/main/scala/ListWriter.scala similarity index 100% rename from akka-rest/src/main/scala/ListWriter.scala rename to akka-http/src/main/scala/ListWriter.scala diff --git a/akka-security/src/main/scala/Security.scala b/akka-http/src/main/scala/Security.scala similarity index 100% rename from akka-security/src/main/scala/Security.scala rename to akka-http/src/main/scala/Security.scala diff --git a/akka-security/src/test/scala/AllTest.scala b/akka-http/src/test/scala/AllTest.scala similarity index 100% rename from akka-security/src/test/scala/AllTest.scala rename to akka-http/src/test/scala/AllTest.scala diff --git a/akka-security/src/test/scala/SecuritySpec.scala b/akka-http/src/test/scala/SecuritySpec.scala similarity index 100% rename from akka-security/src/test/scala/SecuritySpec.scala rename to akka-http/src/test/scala/SecuritySpec.scala diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index 6d317e5f08..a2831b852b 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -53,20 +53,16 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { lazy val akka_util = project("akka-util", "akka-util", new AkkaUtilProject(_)) lazy val akka_core = project("akka-core", "akka-core", new AkkaCoreProject(_), akka_util, akka_java_util) lazy val akka_amqp = project("akka-amqp", "akka-amqp", new AkkaAMQPProject(_), akka_core) - lazy val akka_rest = project("akka-rest", "akka-rest", new AkkaRestProject(_), akka_core) - lazy val akka_comet = project("akka-comet", "akka-comet", new AkkaCometProject(_), akka_rest) + lazy val akka_http = project("akka-http", "akka-http", new AkkaHttpProject(_), akka_core, akka_camel) lazy val akka_camel = project("akka-camel", "akka-camel", new AkkaCamelProject(_), akka_core) lazy val akka_patterns = project("akka-patterns", "akka-patterns", new AkkaPatternsProject(_), akka_core) - lazy val akka_security = project("akka-security", "akka-security", new AkkaSecurityProject(_), akka_core) lazy val akka_persistence = project("akka-persistence", "akka-persistence", new AkkaPersistenceParentProject(_)) lazy val akka_cluster = project("akka-cluster", "akka-cluster", new AkkaClusterProject(_), akka_core) lazy val akka_spring = project("akka-spring", "akka-spring", new AkkaSpringProject(_), akka_core) lazy val akka_jta = project("akka-jta", "akka-jta", new AkkaJTAProject(_), akka_core) - lazy val akka_servlet = project("akka-servlet", "akka-servlet", new AkkaServletProject(_), - akka_core, akka_rest, akka_camel) lazy val akka_kernel = project("akka-kernel", "akka-kernel", new AkkaKernelProject(_), - akka_core, akka_rest, akka_spring, akka_camel, akka_persistence, - akka_cluster, akka_amqp, akka_security, akka_comet, akka_patterns, akka_servlet) + akka_core, akka_http, akka_spring, akka_camel, akka_persistence, + akka_cluster, akka_amqp, akka_patterns) // functional tests in java lazy val akka_fun_test = project("akka-fun-test-java", "akka-fun-test-java", new AkkaFunTestProject(_), akka_kernel) @@ -97,17 +93,14 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { " dist/akka-util-java_%s-%s.jar".format(buildScalaVersion, version) + " dist/akka-core_%s-%s.jar".format(buildScalaVersion, version) + " dist/akka-cluster%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-rest_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-comet_%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-security_%s-%s.jar".format(buildScalaVersion, version) + " dist/akka-amqp_%s-%s.jar".format(buildScalaVersion, version) + " dist/akka-patterns_%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-servlet_%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) @@ -180,7 +173,7 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { val rabbit = "com.rabbitmq" % "amqp-client" % "1.7.2" % "compile" } - class AkkaRestProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { + class AkkaHttpProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val jackson_core_asl = "org.codehaus.jackson" % "jackson-core-asl" % "1.2.1" % "compile" val stax_api = "javax.xml.stream" % "stax-api" % "1.0-2" % "compile" val servlet = "javax.servlet" % "servlet-api" % "2.5" % "compile" @@ -189,14 +182,19 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { val jersey_json = "com.sun.jersey" % "jersey-json" % JERSEY_VERSION % "compile" val jersey_contrib = "com.sun.jersey.contribs" % "jersey-scala" % JERSEY_VERSION % "compile" val jsr311 = "javax.ws.rs" % "jsr311-api" % "1.1" % "compile" - } - - class AkkaCometProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val grizzly = "com.sun.grizzly" % "grizzly-comet-webserver" % "1.9.18-i" % "compile" - val servlet = "javax.servlet" % "servlet-api" % "2.5" % "compile" val atmo = "org.atmosphere" % "atmosphere-annotations" % ATMO_VERSION % "compile" val atmo_jersey = "org.atmosphere" % "atmosphere-jersey" % ATMO_VERSION % "compile" val atmo_runtime = "org.atmosphere" % "atmosphere-runtime" % ATMO_VERSION % "compile" + val commons_logging = "commons-logging" % "commons-logging" % "1.1.1" % "compile" + val annotation = "javax.annotation" % "jsr250-api" % "1.0" % "compile" + val lift_common = "net.liftweb" % "lift-common" % LIFT_VERSION % "compile" + val lift_util = "net.liftweb" % "lift-util" % LIFT_VERSION % "compile" + + // testing + val scalatest = "org.scalatest" % "scalatest" % SCALATEST_VERSION % "test" + val junit = "junit" % "junit" % "4.5" % "test" + val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" } class AkkaCamelProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { @@ -209,19 +207,6 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { val junit = "junit" % "junit" % "4.5" % "test" } - class AkkaSecurityProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val commons_logging = "commons-logging" % "commons-logging" % "1.1.1" % "compile" - val annotation = "javax.annotation" % "jsr250-api" % "1.0" % "compile" - val jersey_server = "com.sun.jersey" % "jersey-server" % JERSEY_VERSION % "compile" - val jsr311 = "javax.ws.rs" % "jsr311-api" % "1.1" % "compile" - val lift_common = "net.liftweb" % "lift-common" % LIFT_VERSION % "compile" - val lift_util = "net.liftweb" % "lift-util" % LIFT_VERSION % "compile" - // testing - val scalatest = "org.scalatest" % "scalatest" % SCALATEST_VERSION % "test" - val junit = "junit" % "junit" % "4.5" % "test" - val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" - } - class AkkaPersistenceCommonProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val thrift = "com.facebook" % "thrift" % "1.0" % "compile" val commons_pool = "commons-pool" % "commons-pool" % "1.5.4" % "compile" @@ -265,8 +250,6 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { val jgroups = "jgroups" % "jgroups" % "2.8.0.CR7" % "compile" } - class AkkaServletProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) - class AkkaKernelProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) class AkkaSpringProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { From 834f866903c2262ff2596d4bba3244a78d9e4ba5 Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 29 Apr 2010 17:24:02 +0200 Subject: [PATCH 3/7] Moving akka-patterns into akka-core --- .../src/main/scala/routing}/Patterns.scala | 0 .../src/test/scala/ActorPatternsTest.scala | 0 project/build/AkkaProject.scala | 10 +--------- 3 files changed, 1 insertion(+), 9 deletions(-) rename {akka-patterns/src/main/scala => akka-core/src/main/scala/routing}/Patterns.scala (100%) rename {akka-patterns => akka-core}/src/test/scala/ActorPatternsTest.scala (100%) diff --git a/akka-patterns/src/main/scala/Patterns.scala b/akka-core/src/main/scala/routing/Patterns.scala similarity index 100% rename from akka-patterns/src/main/scala/Patterns.scala rename to akka-core/src/main/scala/routing/Patterns.scala diff --git a/akka-patterns/src/test/scala/ActorPatternsTest.scala b/akka-core/src/test/scala/ActorPatternsTest.scala similarity index 100% rename from akka-patterns/src/test/scala/ActorPatternsTest.scala rename to akka-core/src/test/scala/ActorPatternsTest.scala diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index a2831b852b..b78926e482 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -55,14 +55,13 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { lazy val akka_amqp = project("akka-amqp", "akka-amqp", new AkkaAMQPProject(_), akka_core) lazy val akka_http = project("akka-http", "akka-http", new AkkaHttpProject(_), akka_core, akka_camel) lazy val akka_camel = project("akka-camel", "akka-camel", new AkkaCamelProject(_), akka_core) - lazy val akka_patterns = project("akka-patterns", "akka-patterns", new AkkaPatternsProject(_), akka_core) lazy val akka_persistence = project("akka-persistence", "akka-persistence", new AkkaPersistenceParentProject(_)) lazy val akka_cluster = project("akka-cluster", "akka-cluster", new AkkaClusterProject(_), akka_core) lazy val akka_spring = project("akka-spring", "akka-spring", new AkkaSpringProject(_), akka_core) lazy val akka_jta = project("akka-jta", "akka-jta", new AkkaJTAProject(_), akka_core) lazy val akka_kernel = project("akka-kernel", "akka-kernel", new AkkaKernelProject(_), akka_core, akka_http, akka_spring, akka_camel, akka_persistence, - akka_cluster, akka_amqp, akka_patterns) + akka_cluster, akka_amqp) // functional tests in java lazy val akka_fun_test = project("akka-fun-test-java", "akka-fun-test-java", new AkkaFunTestProject(_), akka_kernel) @@ -96,7 +95,6 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { " 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-patterns_%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) + @@ -201,12 +199,6 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { val camel_core = "org.apache.camel" % "camel-core" % "2.2.0" % "compile" } - class AkkaPatternsProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - // testing - val scalatest = "org.scalatest" % "scalatest" % SCALATEST_VERSION % "test" - val junit = "junit" % "junit" % "4.5" % "test" - } - class AkkaPersistenceCommonProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val thrift = "com.facebook" % "thrift" % "1.0" % "compile" val commons_pool = "commons-pool" % "commons-pool" % "1.5.4" % "compile" From 17241e1d70eab86c210752f7e8b00bab502877dc Mon Sep 17 00:00:00 2001 From: Viktor Klang Date: Thu, 29 Apr 2010 17:42:06 +0200 Subject: [PATCH 4/7] Moved Grizzly logic to Kernel and renamed it to EmbeddedAppServer --- .../src/main/scala/EmbeddedAppServer.scala | 5 +++-- akka-kernel/src/main/scala/Kernel.scala | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) rename akka-http/src/main/scala/BootableCometActorService.scala => akka-kernel/src/main/scala/EmbeddedAppServer.scala (94%) diff --git a/akka-http/src/main/scala/BootableCometActorService.scala b/akka-kernel/src/main/scala/EmbeddedAppServer.scala similarity index 94% rename from akka-http/src/main/scala/BootableCometActorService.scala rename to akka-kernel/src/main/scala/EmbeddedAppServer.scala index 6d9444d5f7..dc52076a81 100644 --- a/akka-http/src/main/scala/BootableCometActorService.scala +++ b/akka-kernel/src/main/scala/EmbeddedAppServer.scala @@ -2,7 +2,7 @@ * Copyright (C) 2009-2010 Scalable Solutions AB */ -package se.scalablesolutions.akka.comet +package se.scalablesolutions.akka.kernel import com.sun.grizzly.http.SelectorThread import com.sun.grizzly.http.servlet.ServletAdapter @@ -12,11 +12,12 @@ import javax.ws.rs.core.UriBuilder import se.scalablesolutions.akka.actor.BootableActorLoaderService import se.scalablesolutions.akka.util.{Bootable, Logging} +import se.scalablesolutions.akka.comet.AkkaServlet /** * Handles the Akka Comet Support (load/unload) */ -trait BootableCometActorService extends Bootable with Logging { +trait EmbeddedAppServer extends Bootable with Logging { self : BootableActorLoaderService => import se.scalablesolutions.akka.config.Config._ diff --git a/akka-kernel/src/main/scala/Kernel.scala b/akka-kernel/src/main/scala/Kernel.scala index 9243c8486f..0a10681960 100644 --- a/akka-kernel/src/main/scala/Kernel.scala +++ b/akka-kernel/src/main/scala/Kernel.scala @@ -6,7 +6,6 @@ package se.scalablesolutions.akka.kernel import se.scalablesolutions.akka.servlet.AkkaLoader import se.scalablesolutions.akka.remote.BootableRemoteActorService -import se.scalablesolutions.akka.comet.BootableCometActorService import se.scalablesolutions.akka.actor.BootableActorLoaderService import se.scalablesolutions.akka.camel.service.CamelService import se.scalablesolutions.akka.config.Config @@ -25,9 +24,8 @@ object Kernel extends AkkaLoader { * Boots up the Kernel with default bootables */ def boot: Unit = boot(true, - new BootableActorLoaderService + new EmbeddedAppServer with BootableActorLoaderService with BootableRemoteActorService - with BootableCometActorService with CamelService) //For testing purposes only From 8816c7feaae4293d88c0b8cb207578eda5d4d319 Mon Sep 17 00:00:00 2001 From: Debasish Ghosh Date: Sat, 1 May 2010 11:40:57 +0530 Subject: [PATCH 5/7] Fixed problem with PersistentVector.slice : Issue #161 --- .../src/main/scala/Storage.scala | 4 ++-- .../src/main/scala/MongoStorageBackend.scala | 10 ++++++++- .../test/scala/MongoPersistentActorSpec.scala | 22 ++++++++++++++----- .../src/test/scala/MongoStorageSpec.scala | 7 +++--- .../src/main/scala/RedisStorageBackend.scala | 12 ++++++---- .../test/scala/RedisPersistentActorSpec.scala | 15 ++++++++++--- .../src/test/scala/RedisPersistentQSpec.scala | 5 ++--- 7 files changed, 52 insertions(+), 23 deletions(-) diff --git a/akka-persistence/akka-persistence-common/src/main/scala/Storage.scala b/akka-persistence/akka-persistence-common/src/main/scala/Storage.scala index 379dd0b5f4..c11541accc 100644 --- a/akka-persistence/akka-persistence-common/src/main/scala/Storage.scala +++ b/akka-persistence/akka-persistence-common/src/main/scala/Storage.scala @@ -218,9 +218,9 @@ trait PersistentVector[T] extends IndexedSeq[T] with Transactional with Committa else storage.getVectorStorageEntryFor(uuid, index) } - override def slice(start: Int, count: Int): IndexedSeq[T] = slice(Some(start), None, count) + override def slice(start: Int, finish: Int): IndexedSeq[T] = slice(Some(start), Some(finish)) - def slice(start: Option[Int], finish: Option[Int], count: Int): IndexedSeq[T] = { + def slice(start: Option[Int], finish: Option[Int], count: Int = 0): IndexedSeq[T] = { val buffer = new scala.collection.mutable.ArrayBuffer[T] storage.getVectorStorageRangeFor(uuid, start, finish, count).foreach(buffer.append(_)) buffer diff --git a/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala b/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala index cfe996be06..97245cff02 100644 --- a/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala +++ b/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala @@ -248,9 +248,17 @@ private[akka] object MongoStorageBackend extends dbo.get(VALUE).asInstanceOf[JList[AnyRef]] } + val s = if (start.isDefined) start.get else 0 + val cnt = + if (finish.isDefined) { + val f = finish.get + if (f >= s) (f - s) else count + } + else count + // pick the subrange and make a Scala list val l = - List(o.subList(start.get, start.get + count).toArray: _*) + List(o.subList(s, s + cnt).toArray: _*) for(e <- l) yield serializer.in[AnyRef](e.asInstanceOf[Array[Byte]]) diff --git a/akka-persistence/akka-persistence-mongo/src/test/scala/MongoPersistentActorSpec.scala b/akka-persistence/akka-persistence-mongo/src/test/scala/MongoPersistentActorSpec.scala index 93aa1862d1..eb231ad473 100644 --- a/akka-persistence/akka-persistence-mongo/src/test/scala/MongoPersistentActorSpec.scala +++ b/akka-persistence/akka-persistence-mongo/src/test/scala/MongoPersistentActorSpec.scala @@ -1,9 +1,8 @@ package se.scalablesolutions.akka.persistence.mongo -import junit.framework.TestCase - import org.junit.{Test, Before} import org.junit.Assert._ +import org.scalatest.junit.JUnitSuite import _root_.dispatch.json.{JsNumber, JsValue} import _root_.dispatch.json.Js._ @@ -27,6 +26,7 @@ case class Balance(accountNo: String) case class Debit(accountNo: String, amount: BigInt, failer: Actor) case class MultiDebit(accountNo: String, amounts: List[BigInt], failer: Actor) case class Credit(accountNo: String, amount: BigInt) +case class Log(start: Int, finish: Int) case object LogSize class BankAccountActor extends Transactor { @@ -88,6 +88,9 @@ class BankAccountActor extends Transactor { case LogSize => reply(txnLog.length.asInstanceOf[AnyRef]) + + case Log(start, finish) => + reply(txnLog.slice(start, finish)) } } @@ -98,7 +101,7 @@ class BankAccountActor extends Transactor { } } -class MongoPersistentActorSpec extends TestCase { +class MongoPersistentActorSpec extends JUnitSuite { @Test def testSuccessfulDebit = { val bactor = new BankAccountActor @@ -121,7 +124,14 @@ class MongoPersistentActorSpec extends TestCase { val JsNumber(b2) = (bactor !! Balance("a-123")).get.asInstanceOf[JsValue] assertEquals(BigInt(1000), BigInt(b2.intValue)) - assertEquals(7, (bactor !! LogSize).get) + assert(7 == (bactor !! LogSize).get.asInstanceOf[Int]) + + import scala.collection.mutable.ArrayBuffer + assert((bactor !! Log(0, 7)).get.asInstanceOf[ArrayBuffer[String]].size == 7) + assert((bactor !! Log(0, 0)).get.asInstanceOf[ArrayBuffer[String]].size == 0) + assert((bactor !! Log(1, 2)).get.asInstanceOf[ArrayBuffer[String]].size == 1) + assert((bactor !! Log(6, 7)).get.asInstanceOf[ArrayBuffer[String]].size == 1) + assert((bactor !! Log(0, 1)).get.asInstanceOf[ArrayBuffer[String]].size == 1) } @Test @@ -144,7 +154,7 @@ class MongoPersistentActorSpec extends TestCase { assertEquals(BigInt(5000), BigInt(b1.intValue)) // should not count the failed one - assertEquals(3, (bactor !! LogSize).get) + assert(3 == (bactor !! LogSize).get.asInstanceOf[Int]) } @Test @@ -167,6 +177,6 @@ class MongoPersistentActorSpec extends TestCase { assertEquals(BigInt(5000), BigInt(b1.intValue)) // should not count the failed one - assertEquals(3, (bactor !! LogSize).get) + assert(3 == (bactor !! LogSize).get.asInstanceOf[Int]) } } diff --git a/akka-persistence/akka-persistence-mongo/src/test/scala/MongoStorageSpec.scala b/akka-persistence/akka-persistence-mongo/src/test/scala/MongoStorageSpec.scala index 97307dde17..ae2a1e4dd4 100644 --- a/akka-persistence/akka-persistence-mongo/src/test/scala/MongoStorageSpec.scala +++ b/akka-persistence/akka-persistence-mongo/src/test/scala/MongoStorageSpec.scala @@ -1,20 +1,19 @@ package se.scalablesolutions.akka.persistence.mongo -import junit.framework.TestCase - import org.junit.{Test, Before} import org.junit.Assert._ +import org.scalatest.junit.JUnitSuite import _root_.dispatch.json._ import _root_.dispatch.json.Js._ import java.util.NoSuchElementException @scala.reflect.BeanInfo case class Foo(no: Int, name: String) -class MongoStorageSpec extends TestCase { +class MongoStorageSpec extends JUnitSuite { val changeSetV = new scala.collection.mutable.ArrayBuffer[AnyRef] val changeSetM = new scala.collection.mutable.HashMap[AnyRef, AnyRef] - override def setUp = { + @Before def initialize() = { MongoStorageBackend.coll.drop } diff --git a/akka-persistence/akka-persistence-redis/src/main/scala/RedisStorageBackend.scala b/akka-persistence/akka-persistence-redis/src/main/scala/RedisStorageBackend.scala index 79aae70fd1..8e2adaa5c3 100644 --- a/akka-persistence/akka-persistence-redis/src/main/scala/RedisStorageBackend.scala +++ b/akka-persistence/akka-persistence-redis/src/main/scala/RedisStorageBackend.scala @@ -228,17 +228,21 @@ private [akka] object RedisStorageBackend extends def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[Array[Byte]] = withErrorHandling { /** - * count is the max number of results to return. Start with - * start or 0 (if start is not defined) and go until - * you hit finish or count. + * if start and finish both are defined, ignore count and + * report the range [start, finish) + * if start is not defined, assume start = 0 + * if start == 0 and finish == 0, return an empty collection */ val s = if (start.isDefined) start.get else 0 val cnt = if (finish.isDefined) { val f = finish.get - if (f >= s) Math.min(count, (f - s)) else count + // if (f >= s) Math.min(count, (f - s)) else count + if (f >= s) (f - s) else count } else count + if (s == 0 && cnt == 0) List() + else db.lrange(new String(encode(name.getBytes)), s, s + cnt - 1) match { case None => throw new NoSuchElementException(name + " does not have elements in the range specified") diff --git a/akka-persistence/akka-persistence-redis/src/test/scala/RedisPersistentActorSpec.scala b/akka-persistence/akka-persistence-redis/src/test/scala/RedisPersistentActorSpec.scala index f21b1b72a0..d27ec1bd31 100644 --- a/akka-persistence/akka-persistence-redis/src/test/scala/RedisPersistentActorSpec.scala +++ b/akka-persistence/akka-persistence-redis/src/test/scala/RedisPersistentActorSpec.scala @@ -1,7 +1,5 @@ package se.scalablesolutions.akka.persistence.redis -import junit.framework.TestCase - import org.junit.{Test, Before} import org.junit.Assert._ @@ -24,6 +22,7 @@ case class Balance(accountNo: String) case class Debit(accountNo: String, amount: BigInt, failer: Actor) case class MultiDebit(accountNo: String, amounts: List[BigInt], failer: Actor) case class Credit(accountNo: String, amount: BigInt) +case class Log(start: Int, finish: Int) case object LogSize class AccountActor extends Transactor { @@ -83,6 +82,9 @@ class AccountActor extends Transactor { case LogSize => reply(txnLog.length.asInstanceOf[AnyRef]) + + case Log(start, finish) => + reply(txnLog.slice(start, finish)) } } @@ -94,7 +96,8 @@ class AccountActor extends Transactor { } } -class RedisPersistentActorSpec extends TestCase { +import org.scalatest.junit.JUnitSuite +class RedisPersistentActorSpec extends JUnitSuite { @Test def testSuccessfulDebit = { val bactor = new AccountActor @@ -113,6 +116,12 @@ class RedisPersistentActorSpec extends TestCase { val c: Int = (bactor !! LogSize).get assertTrue(7 == c) + import scala.collection.mutable.ArrayBuffer + assert((bactor !! Log(0, 7)).get.asInstanceOf[ArrayBuffer[String]].size == 7) + assert((bactor !! Log(0, 0)).get.asInstanceOf[ArrayBuffer[String]].size == 0) + assert((bactor !! Log(1, 2)).get.asInstanceOf[ArrayBuffer[String]].size == 1) + assert((bactor !! Log(6, 7)).get.asInstanceOf[ArrayBuffer[String]].size == 1) + assert((bactor !! Log(0, 1)).get.asInstanceOf[ArrayBuffer[String]].size == 1) } @Test diff --git a/akka-persistence/akka-persistence-redis/src/test/scala/RedisPersistentQSpec.scala b/akka-persistence/akka-persistence-redis/src/test/scala/RedisPersistentQSpec.scala index 2e5b5a507e..e53c958f9b 100644 --- a/akka-persistence/akka-persistence-redis/src/test/scala/RedisPersistentQSpec.scala +++ b/akka-persistence/akka-persistence-redis/src/test/scala/RedisPersistentQSpec.scala @@ -1,7 +1,5 @@ package se.scalablesolutions.akka.persistence.redis -import junit.framework.TestCase - import org.junit.{Test, Before} import org.junit.Assert._ @@ -50,7 +48,8 @@ class QueueActor extends Transactor { } } -class RedisPersistentQSpec extends TestCase { +import org.scalatest.junit.JUnitSuite +class RedisPersistentQSpec extends JUnitSuite { @Test def testSuccessfulNQ = { val qa = new QueueActor From 0fd629e405f9a74eaaf4800eb52af380d2ab8785 Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Sun, 2 May 2010 12:27:49 +1200 Subject: [PATCH 6/7] Added test for Ref initial value bug --- .../src/test/scala/TransactionalRefSpec.scala | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/akka-core/src/test/scala/TransactionalRefSpec.scala b/akka-core/src/test/scala/TransactionalRefSpec.scala index 07c36ebdcf..6cc2e883a6 100644 --- a/akka-core/src/test/scala/TransactionalRefSpec.scala +++ b/akka-core/src/test/scala/TransactionalRefSpec.scala @@ -23,6 +23,23 @@ class TransactionalRefSpec extends Spec with ShouldMatchers { value should be(3) } + it("should keep the initial value, even if the first transaction is rolled back") { + val ref = Ref(3) + + try { + atomic { + ref.swap(5) + throw new Exception + } + } catch { + case e => {} + } + + val value = atomic { ref.get.get } + + value should be(3) + } + it("should be settable using swap") { val ref = Ref[Int] From ec2a0bd99d8daa24c2f845a26d0e0b462a8bc731 Mon Sep 17 00:00:00 2001 From: Peter Vlugter Date: Sun, 2 May 2010 12:28:37 +1200 Subject: [PATCH 7/7] Fixed Ref initial value bug by removing laziness --- akka-core/src/main/scala/stm/TransactionalState.scala | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/akka-core/src/main/scala/stm/TransactionalState.scala b/akka-core/src/main/scala/stm/TransactionalState.scala index 9bf4859ee5..f870af75e6 100644 --- a/akka-core/src/main/scala/stm/TransactionalState.scala +++ b/akka-core/src/main/scala/stm/TransactionalState.scala @@ -100,10 +100,9 @@ class TransactionalRef[T](initialOpt: Option[T] = None) extends Transactional { implicit val txInitName = "TransactionalRef:Init" val uuid = UUID.newUuid.toString - private[this] lazy val ref = { - val r = new AlphaRef[T] - initialOpt.foreach(r.set(_)) - r + private[this] val ref = { + if (initialOpt.isDefined) new AlphaRef(initialOpt.get) + else new AlphaRef[T] } def swap(elem: T) = { @@ -220,7 +219,7 @@ object TransactionalMap { class TransactionalMap[K, V](initialOpt: Option[HashTrie[K, V]] = None) extends Transactional with scala.collection.mutable.Map[K, V] { val uuid = UUID.newUuid.toString - protected[this] lazy val ref = new TransactionalRef(initialOpt.orElse(Some(new HashTrie[K, V]))) + protected[this] val ref = new TransactionalRef(initialOpt.orElse(Some(new HashTrie[K, V]))) def -=(key: K) = { remove(key) @@ -294,7 +293,7 @@ object TransactionalVector { class TransactionalVector[T](initialOpt: Option[Vector[T]] = None) extends Transactional with IndexedSeq[T] { val uuid = UUID.newUuid.toString - private[this] lazy val ref = new TransactionalRef(initialOpt.orElse(Some(EmptyVector))) + private[this] val ref = new TransactionalRef(initialOpt.orElse(Some(EmptyVector))) def clear = ref.swap(EmptyVector)