diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/configuration.java b/akka-core/src/main/java/se/scalablesolutions/akka/annotation/configuration.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/configuration.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/annotation/configuration.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/consume.java b/akka-core/src/main/java/se/scalablesolutions/akka/annotation/consume.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/consume.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/annotation/consume.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/immutable.java b/akka-core/src/main/java/se/scalablesolutions/akka/annotation/immutable.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/immutable.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/annotation/immutable.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/inittransactionalstate.java b/akka-core/src/main/java/se/scalablesolutions/akka/annotation/inittransactionalstate.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/inittransactionalstate.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/annotation/inittransactionalstate.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/oneway.java b/akka-core/src/main/java/se/scalablesolutions/akka/annotation/oneway.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/oneway.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/annotation/oneway.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/postrestart.java b/akka-core/src/main/java/se/scalablesolutions/akka/annotation/postrestart.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/postrestart.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/annotation/postrestart.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/prerestart.java b/akka-core/src/main/java/se/scalablesolutions/akka/annotation/prerestart.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/prerestart.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/annotation/prerestart.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/state.java b/akka-core/src/main/java/se/scalablesolutions/akka/annotation/state.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/state.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/annotation/state.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/transactionrequired.java b/akka-core/src/main/java/se/scalablesolutions/akka/annotation/transactionrequired.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/annotation/transactionrequired.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/annotation/transactionrequired.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/config/ActiveObjectGuiceModule.java b/akka-core/src/main/java/se/scalablesolutions/akka/config/ActiveObjectGuiceModule.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/config/ActiveObjectGuiceModule.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/config/ActiveObjectGuiceModule.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/config/DependencyBinding.java b/akka-core/src/main/java/se/scalablesolutions/akka/config/DependencyBinding.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/config/DependencyBinding.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/config/DependencyBinding.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/remote/protobuf/RemoteProtocol.java b/akka-core/src/main/java/se/scalablesolutions/akka/remote/protobuf/RemoteProtocol.java
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/remote/protobuf/RemoteProtocol.java
rename to akka-core/src/main/java/se/scalablesolutions/akka/remote/protobuf/RemoteProtocol.java
diff --git a/akka-util-java/src/main/java/se/scalablesolutions/akka/remote/protobuf/RemoteProtocol.proto b/akka-core/src/main/java/se/scalablesolutions/akka/remote/protobuf/RemoteProtocol.proto
similarity index 100%
rename from akka-util-java/src/main/java/se/scalablesolutions/akka/remote/protobuf/RemoteProtocol.proto
rename to akka-core/src/main/java/se/scalablesolutions/akka/remote/protobuf/RemoteProtocol.proto
diff --git a/akka-core/src/main/scala/routing/Iterators.scala b/akka-core/src/main/scala/routing/Iterators.scala
index 96140010c8..cb2945865f 100644
--- a/akka-core/src/main/scala/routing/Iterators.scala
+++ b/akka-core/src/main/scala/routing/Iterators.scala
@@ -6,8 +6,12 @@ package se.scalablesolutions.akka.patterns
import se.scalablesolutions.akka.actor.ActorRef
+/** An Iterator that is either always empty or yields an infinite number of Ts
+ */
trait InfiniteIterator[T] extends Iterator[T]
+/** CyclicIterator is a round-robin style InfiniteIterator that cycles the supplied List
+ */
class CyclicIterator[T](items: List[T]) extends InfiniteIterator[T] {
@volatile private[this] var current: List[T] = items
@@ -20,6 +24,10 @@ class CyclicIterator[T](items: List[T]) extends InfiniteIterator[T] {
}
}
+/**
+ * This InfiniteIterator always returns the Actor that has the currently smallest mailbox
+ * useful for work-stealing.
+ */
class SmallestMailboxFirstIterator(items : List[ActorRef]) extends InfiniteIterator[ActorRef] {
def hasNext = items != Nil
diff --git a/akka-core/src/main/scala/routing/Listeners.scala b/akka-core/src/main/scala/routing/Listeners.scala
index 0d4b96cecf..db544f58f8 100644
--- a/akka-core/src/main/scala/routing/Listeners.scala
+++ b/akka-core/src/main/scala/routing/Listeners.scala
@@ -11,6 +11,12 @@ case class Listen(listener: ActorRef) extends ListenerMessage
case class Deafen(listener: ActorRef) extends ListenerMessage
case class WithListeners(f: Set[ActorRef] => Unit) extends ListenerMessage
+/** Listeners is a generic trait to implement listening capability on an Actor
+ * Use the gossip(msg) method to have it sent to the listenees
+ * Send Listen(self) to start listening
+ * Send Deafen(self) to stop listening
+ * Send WithListeners(fun) to traverse the current listeners
+ */
trait Listeners { self : Actor =>
import se.scalablesolutions.akka.actor.Agent
private lazy val listeners = Agent(Set[ActorRef]())
diff --git a/akka-core/src/main/scala/routing/Patterns.scala b/akka-core/src/main/scala/routing/Patterns.scala
index 5ad78261f8..258847b3fc 100644
--- a/akka-core/src/main/scala/routing/Patterns.scala
+++ b/akka-core/src/main/scala/routing/Patterns.scala
@@ -10,8 +10,7 @@ import se.scalablesolutions.akka.actor.Actor._
object Patterns {
type PF[A, B] = PartialFunction[A, B]
- /**
- * Creates a new PartialFunction whose isDefinedAt is a combination
+ /** Creates a new PartialFunction whose isDefinedAt is a combination
* of the two parameters, and whose apply is first to call filter.apply and then filtered.apply
*/
def filter[A, B](filter: PF[A, Unit], filtered: PF[A, B]): PF[A, B] = {
@@ -20,31 +19,38 @@ object Patterns {
filtered(a)
}
- /**
- * Interceptor is a filter(x,y) where x.isDefinedAt is considered to be always true
+ /** Interceptor is a filter(x,y) where x.isDefinedAt is considered to be always true
*/
def intercept[A, B](interceptor: (A) => Unit, interceptee: PF[A, B]): PF[A, B] =
filter({case a if a.isInstanceOf[A] => interceptor(a)}, interceptee)
- //FIXME 2.8, use default params with CyclicIterator
- def loadBalancerActor(actors: => InfiniteIterator[ActorRef]): ActorRef =
+ /** Creates a LoadBalancer from the thunk-supplied InfiniteIterator
+ */
+ def loadBalancerActor(actors: => InfiniteIterator[ActorRef]): ActorRef =
newActor(() => new Actor with LoadBalancer {
start
val seq = actors
})
- def dispatcherActor(routing: PF[Any, ActorRef], msgTransformer: (Any) => Any): ActorRef =
+ /** Creates a Dispatcher given a routing and a message-transforming function
+ */
+ def dispatcherActor(routing: PF[Any, ActorRef], msgTransformer: (Any) => Any): ActorRef =
newActor(() => new Actor with Dispatcher {
start
override def transform(msg: Any) = msgTransformer(msg)
def routes = routing
})
- def dispatcherActor(routing: PF[Any, ActorRef]): ActorRef = newActor(() => new Actor with Dispatcher {
+ /** Creates a Dispatcher given a routing
+ */
+ def dispatcherActor(routing: PF[Any, ActorRef]): ActorRef = newActor(() => new Actor with Dispatcher {
start
def routes = routing
})
+ /** Creates an actor that pipes all incoming messages to
+ * both another actor and through the supplied function
+ */
def loggerActor(actorToLog: ActorRef, logger: (Any) => Unit): ActorRef =
dispatcherActor({case _ => actorToLog}, logger)
}
\ No newline at end of file
diff --git a/akka-core/src/main/scala/routing/Routers.scala b/akka-core/src/main/scala/routing/Routers.scala
index 7515197f74..dcfa3add15 100644
--- a/akka-core/src/main/scala/routing/Routers.scala
+++ b/akka-core/src/main/scala/routing/Routers.scala
@@ -6,6 +6,8 @@ package se.scalablesolutions.akka.patterns
import se.scalablesolutions.akka.actor.{Actor, ActorRef}
+/** A Dispatcher is a trait whose purpose is to route incoming messages to actors
+ */
trait Dispatcher { self: Actor =>
protected def transform(msg: Any): Any = msg
@@ -15,12 +17,16 @@ trait Dispatcher { self: Actor =>
protected def dispatch: PartialFunction[Any, Unit] = {
case a if routes.isDefinedAt(a) =>
if (self.replyTo.isDefined) routes(a) forward transform(a)
- else routes(a) ! transform(a)
+ else routes(a).!(transform(a))(None)
}
def receive = dispatch
}
+/** A LoadBalancer is a specialized kind of Dispatcher,
+ * that is supplied an InfiniteIterator of targets
+ * to dispatch incoming messages to
+ */
trait LoadBalancer extends Dispatcher { self: Actor =>
protected def seq: InfiniteIterator[ActorRef]
diff --git a/akka-core/src/main/scala/stm/Transaction.scala b/akka-core/src/main/scala/stm/Transaction.scala
index fb9f14b62e..d7874ffc15 100644
--- a/akka-core/src/main/scala/stm/Transaction.scala
+++ b/akka-core/src/main/scala/stm/Transaction.scala
@@ -15,11 +15,12 @@ import scala.collection.mutable.HashMap
import se.scalablesolutions.akka.util.Logging
import se.scalablesolutions.akka.config.Config._
-import org.multiverse.api.{Transaction => MultiverseTransaction, TransactionLifecycleListener, TransactionLifecycleEvent}
+import org.multiverse.api.{Transaction => MultiverseTransaction}
+import org.multiverse.api.lifecycle.{TransactionLifecycleListener, TransactionLifecycleEvent}
import org.multiverse.api.GlobalStmInstance.getGlobalStmInstance
import org.multiverse.api.ThreadLocalTransaction._
import org.multiverse.templates.{TransactionTemplate, OrElseTemplate}
-import org.multiverse.utils.backoff.ExponentialBackoffPolicy
+import org.multiverse.api.backoff.ExponentialBackoffPolicy
import org.multiverse.stms.alpha.AlphaStm
class NoTransactionInScopeException extends RuntimeException
diff --git a/akka-core/src/main/scala/stm/TransactionalState.scala b/akka-core/src/main/scala/stm/TransactionalState.scala
index f870af75e6..450c179163 100644
--- a/akka-core/src/main/scala/stm/TransactionalState.scala
+++ b/akka-core/src/main/scala/stm/TransactionalState.scala
@@ -6,7 +6,7 @@ package se.scalablesolutions.akka.stm
import se.scalablesolutions.akka.util.UUID
-import org.multiverse.stms.alpha.AlphaRef
+import org.multiverse.api.GlobalStmInstance.getGlobalStmInstance
/**
* Example Scala usage:
@@ -56,6 +56,14 @@ trait Committable {
def commit: Unit
}
+object RefFactory {
+ private val factory = getGlobalStmInstance.getProgrammaticReferenceFactoryBuilder.build
+
+ def createRef[T] = factory.atomicCreateReference[T]()
+
+ def createRef[T](value: T) = factory.atomicCreateReference(value)
+}
+
/**
* Alias to TransactionalRef.
*
@@ -101,8 +109,8 @@ class TransactionalRef[T](initialOpt: Option[T] = None) extends Transactional {
val uuid = UUID.newUuid.toString
private[this] val ref = {
- if (initialOpt.isDefined) new AlphaRef(initialOpt.get)
- else new AlphaRef[T]
+ if (initialOpt.isDefined) RefFactory.createRef(initialOpt.get)
+ else RefFactory.createRef[T]
}
def swap(elem: T) = {
diff --git a/akka-util/src/main/scala/Bootable.scala b/akka-core/src/main/scala/util/Bootable.scala
similarity index 100%
rename from akka-util/src/main/scala/Bootable.scala
rename to akka-core/src/main/scala/util/Bootable.scala
diff --git a/akka-util/src/main/scala/HashCode.scala b/akka-core/src/main/scala/util/HashCode.scala
similarity index 100%
rename from akka-util/src/main/scala/HashCode.scala
rename to akka-core/src/main/scala/util/HashCode.scala
diff --git a/akka-util/src/main/scala/Helpers.scala b/akka-core/src/main/scala/util/Helpers.scala
similarity index 100%
rename from akka-util/src/main/scala/Helpers.scala
rename to akka-core/src/main/scala/util/Helpers.scala
diff --git a/akka-util/src/main/scala/Logging.scala b/akka-core/src/main/scala/util/Logging.scala
similarity index 100%
rename from akka-util/src/main/scala/Logging.scala
rename to akka-core/src/main/scala/util/Logging.scala
diff --git a/akka-util/src/main/scala/Uuid.scala b/akka-core/src/main/scala/util/Uuid.scala
similarity index 100%
rename from akka-util/src/main/scala/Uuid.scala
rename to akka-core/src/main/scala/util/Uuid.scala
diff --git a/config/akka-reference.conf b/config/akka-reference.conf
index ab365ea6eb..f5ac4d724e 100644
--- a/config/akka-reference.conf
+++ b/config/akka-reference.conf
@@ -51,6 +51,14 @@
port = 9998
filters = ["se.scalablesolutions.akka.security.AkkaSecurityFilterFactory"] # List with all jersey filters to use
authenticator = "sample.security.BasicAuthenticationService" # The authentication service to use. Need to be overridden (uses sample now)
+
+ #IF you are using a KerberosAuthenticationActor
+ #
+ # servicePrincipal = "HTTP/localhost@EXAMPLE.COM"
+ # keyTabLocation = "URL to keytab"
+ # kerberosDebug = "true"
+ # realm = "EXAMPLE.COM"
+ #
diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala
index 388af31334..f96ff598e8 100644
--- a/project/build/AkkaProject.scala
+++ b/project/build/AkkaProject.scala
@@ -51,9 +51,7 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) {
// ------------------------------------------------------------
// project defintions
- lazy val akka_java_util = project("akka-util-java", "akka-util-java", new AkkaJavaUtilProject(_))
- 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_core = project("akka-core", "akka-core", new AkkaCoreProject(_))
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)
@@ -90,8 +88,6 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) {
.map("lib_managed/scala_%s/compile/".format(buildScalaVersion) + _.getName)
.mkString(" ") +
" scala-library.jar" +
- " 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%s-%s.jar".format(buildScalaVersion, version) +
" dist/akka-http_%s-%s.jar".format(buildScalaVersion, version) +
@@ -151,21 +147,16 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) {
val h2_lzf = "voldemort.store.compress" % "h2-lzf" % "1.0" % "compile"
val jsr166x = "jsr166x" % "jsr166x" % "1.0" % "compile"
val jta_1_1 = "org.apache.geronimo.specs" % "geronimo-jta_1.1_spec" % "1.1.1" % "compile"
- // testing
- val scalatest = "org.scalatest" % "scalatest" % SCALATEST_VERSION % "test"
- val junit = "junit" % "junit" % "4.5" % "test"
- }
-
- class AkkaUtilProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) {
val werkz = "org.codehaus.aspectwerkz" % "aspectwerkz-nodeps-jdk5" % "2.1" % "compile"
val werkz_core = "org.codehaus.aspectwerkz" % "aspectwerkz-jdk5" % "2.1" % "compile"
val configgy = "net.lag" % "configgy" % "2.8.0.Beta1-1.5-SNAPSHOT" % "compile"
- }
-
- class AkkaJavaUtilProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) {
val guicey = "org.guiceyfruit" % "guice-core" % "2.0-beta-4" % "compile"
val protobuf = "com.google.protobuf" % "protobuf-java" % "2.2.0" % "compile"
- val multiverse = "org.multiverse" % "multiverse-alpha" % "0.4" % "compile"
+ val multiverse = "org.multiverse" % "multiverse-alpha" % "0.5" % "compile"
+
+ // testing
+ val scalatest = "org.scalatest" % "scalatest" % SCALATEST_VERSION % "test"
+ val junit = "junit" % "junit" % "4.5" % "test"
}
class AkkaAMQPProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) {