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) {