From 16f21b9356e4e99064de2b7a4122d39822698d1c Mon Sep 17 00:00:00 2001 From: ticktock Date: Tue, 14 Sep 2010 16:43:15 -0400 Subject: [PATCH 01/14] initial structures --- .../src/main/scala/VoldemortSession.scala | 24 ++++ .../src/main/scala/VoldemortStorage.scala | 43 ++++++ .../main/scala/VoldemortStorageBackend.scala | 129 ++++++++++++++++++ .../src/test/resources/cluster.xml | 0 .../src/test/resources/server.properties | 0 .../src/test/resources/stores.xml | 52 +++++++ .../scala/VoldemortStorageBackendSuite.scala | 17 +++ project/build/AkkaProject.scala | 24 ++++ 8 files changed, 289 insertions(+) create mode 100644 akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortSession.scala create mode 100644 akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorage.scala create mode 100644 akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala create mode 100644 akka-persistence/akka-persistence-voldemort/src/test/resources/cluster.xml create mode 100644 akka-persistence/akka-persistence-voldemort/src/test/resources/server.properties create mode 100644 akka-persistence/akka-persistence-voldemort/src/test/resources/stores.xml create mode 100644 akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortSession.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortSession.scala new file mode 100644 index 0000000000..c0eca74832 --- /dev/null +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortSession.scala @@ -0,0 +1,24 @@ +/** + * Copyright (C) 2009-2010 Scalable Solutions AB + */ + +package se.scalablesolutions.akka.persistence.voldemort + +import se.scalablesolutions.akka.util.UUID +import se.scalablesolutions.akka.stm._ +import se.scalablesolutions.akka.persistence.common._ +import voldemort.client.StoreClient + + +class VoldemortSession { + + val voldemort: StoreClient + + def getOptionalBytes(name: String): Option[Array[Byte]] = { + + } + + def put(name:) + + +} \ No newline at end of file diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorage.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorage.scala new file mode 100644 index 0000000000..a590de349b --- /dev/null +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorage.scala @@ -0,0 +1,43 @@ +/** + * Copyright (C) 2009-2010 Scalable Solutions AB + */ + +package se.scalablesolutions.akka.persistence.voldemort + +import se.scalablesolutions.akka.util.UUID +import se.scalablesolutions.akka.stm._ +import se.scalablesolutions.akka.persistence.common._ + + +object VoldemortStorage extends Storage { + + type ElementType = Array[Byte] + def newMap: PersistentMap[ElementType, ElementType] = newMap(UUID.newUuid.toString) + def newVector: PersistentVector[ElementType] = newVector(UUID.newUuid.toString) + def newRef: PersistentRef[ElementType] = newRef(UUID.newUuid.toString) + + def getMap(id: String): PersistentMap[ElementType, ElementType] = newMap(id) + def getVector(id: String): PersistentVector[ElementType] = newVector(id) + def getRef(id: String): PersistentRef[ElementType] = newRef(id) + + def newMap(id: String): PersistentMap[ElementType, ElementType] = new VoldemortPersistentMap(id) + def newVector(id: String): PersistentVector[ElementType] = new VoldemortPersistentVector(id) + def newRef(id: String): PersistentRef[ElementType] = new VoldemortPersistentRef(id) +} + + +class VoldemortPersistentMap(id: String) extends PersistentMapBinary { + val uuid = id + val storage = VoldemortStorageBackend +} + + +class VoldemortPersistentVector(id: String) extends PersistentVector[Array[Byte]] { + val uuid = id + val storage = VoldemortStoragebackend +} + +class VoldemortPersistentRef(id: String) extends PersistentRef[Array[Byte]] { + val uuid = id + val storage = VoldemortStoragebackend +} diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala new file mode 100644 index 0000000000..5732fbac8d --- /dev/null +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala @@ -0,0 +1,129 @@ +/** + * Copyright (C) 2009-2010 Scalable Solutions AB + */ + +package se.scalablesolutions.akka.persistence.voldemort + +import se.scalablesolutions.akka.stm._ +import se.scalablesolutions.akka.persistence.common._ +import se.scalablesolutions.akka.util.Logging +import se.scalablesolutions.akka.util.Helpers._ +import se.scalablesolutions.akka.config.Config.config + +import voldemort.client._ +import collection.mutable.{Set, HashSet, ArrayBuffer} +import java.lang.String + + +private[akka] object VoldemortStorageBackend extends +MapStorageBackend[Array[Byte], Array[Byte]] with + VectorStorageBackend[Array[Byte]] with + RefStorageBackend[Array[Byte]] with + Logging { + + /** + * Concat the owner+key+lenght of owner so owned data will be colocated + * Store the length of owner as last byte to work aroune the rarest case + * where ownerbytes1 + keybytes1 == ownerbytes2 + keybytes2 but ownerbytes1 != ownerbytes2 + */ + private def mapKey(owner: String, key: Array[Byte]): Array[Byte] = { + val ownerBytes: Array[Byte] = owner.getBytes("UTF-8") + val ownerLenghtByte = ownerBytes.length.byteValue + val mapKey = new Array[Byte](ownerBytes.length + key.length + 1) + System.arraycopy(ownerBytes, 0, mapKey, 0, ownerBytes.length) + System.arraycopy(key, 0, mapKey, ownerBytes.length, key.length) + mapKey.update(mapKey.length - 1) = ownerLenghtByte + } + + var refClient: StoreClient + var mapKeyClient: StoreClient + var mapValueClient: StoreClient + + + def getRefStorageFor(name: String): Option[Array[Byte]] = { + val result: Array[Byte] = refClient.get(RefKey(name).key) + result match { + case null => None + case _ => Some(result) + } + } + + def insertRefStorageFor(name: String, element: Array[Byte]) = { + refClient.put(RefKey(name).key, element) + } + + def getMapStorageRangeFor(name: String, start: Option[Array[Byte]], finish: Option[Array[Byte]], count: Int): List[(Array[Byte], Array[Byte])] = { + + } + + def getMapStorageFor(name: String): List[(Array[Byte], Array[Byte])] = { + val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) + val entries: ArrayBuffer[(Array[Byte], Array[Byte])] = new ArrayBuffer + keys.foreach { + entries += (_, mapValueClient.getValue(mapKey(name, _))) + } + entries.toList + } + + def getMapStorageSizeFor(name: String): Int = { + val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) + keys.size + } + + def getMapStorageEntryFor(name: String, key: Array[Byte]): Option[Array[Byte]] = { + val result: Array[Byte] = mapValueClient.get(mapKey(name, key)) + result match { + case null => None + case _ => Some(result) + } + } + + def removeMapStorageFor(name: String, key: Array[Byte]) = { + val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) + keys -= key + mapKeyClient.put(name, keys) + mapValueClient.delete(mapKey(name, key)) + } + + + def removeMapStorageFor(name: String) = { + val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) + keys.foreach { + mapValueClient.delete(mapKey(name, _)) + } + mapKeyClient.delete(name) + } + + def insertMapStorageEntryFor(name: String, key: Array[Byte], value: Array[Byte]) = { + mapValueClient.put(mapKey(name, key)) + val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) + keys += key + mapKeyClient.put(name, keys) + } + + def insertMapStorageEntriesFor(name: String, entries: List[(Array[Byte], Array[Byte])]) = { + val newKeys = new HashSet[Array[Byte]] + entries.foreach { + (key, value) => mapValueClient.put(mapKey(name, key), value) + newKeys += key + } + val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) + keys += key + mapKeyClient.put(name, keys) + } + + + def getVectorStorageSizeFor(name: String): Int = null + + def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[Array[Byte]] = null + + def getVectorStorageEntryFor(name: String, index: Int): Array[Byte] = null + + def updateVectorStorageEntryFor(name: String, index: Int, elem: Array[Byte]) = null + + def insertVectorStorageEntriesFor(name: String, elements: List[Array[Byte]]) = null + + def insertVectorStorageEntryFor(name: String, element: Array[Byte]) = null + + +} \ No newline at end of file diff --git a/akka-persistence/akka-persistence-voldemort/src/test/resources/cluster.xml b/akka-persistence/akka-persistence-voldemort/src/test/resources/cluster.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/akka-persistence/akka-persistence-voldemort/src/test/resources/server.properties b/akka-persistence/akka-persistence-voldemort/src/test/resources/server.properties new file mode 100644 index 0000000000..e69de29bb2 diff --git a/akka-persistence/akka-persistence-voldemort/src/test/resources/stores.xml b/akka-persistence/akka-persistence-voldemort/src/test/resources/stores.xml new file mode 100644 index 0000000000..f031238e59 --- /dev/null +++ b/akka-persistence/akka-persistence-voldemort/src/test/resources/stores.xml @@ -0,0 +1,52 @@ + + + Refs + 1 + 1 + 1 + 1 + 1 + bdb + client + + string + utf8 + + + identity + + + + MapValues + 1 + 1 + 1 + 1 + 1 + bdb + client + + + + + identity + + + + MapKeys + 1 + 1 + 1 + 1 + 1 + bdb + client + + string + utf8 + + + identity + + + \ No newline at end of file diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala new file mode 100644 index 0000000000..b11a4bba35 --- /dev/null +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala @@ -0,0 +1,17 @@ +package se.scalablesolutions.akka.persistence.voldemort + +import org.scalatest.FunSuite +import org.scalatest.matchers.ShouldMatchers +import se.scalablesolutions.akka.util.UUID + + +/** + * + */ + +class VoldemortStorageBackendSuite extends FunSuite with ShouldMatchers { + + test("UUID generation looks like"){ + System.out.println(UUID.newUuid.toString) + } +} \ No newline at end of file diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index 6a97dbccfd..fe4fb19584 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -50,6 +50,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val SonatypeSnapshotRepo = MavenRepository("Sonatype OSS Repo", "http://oss.sonatype.org/content/repositories/releases") lazy val SunJDMKRepo = MavenRepository("Sun JDMK Repo", "http://wp5.e-taxonomy.eu/cdmlib/mavenrepo") lazy val CasbahRepoReleases = MavenRepository("Casbah Release Repo", "http://repo.bumnetworks.com/releases") + lazy val ClojarsRepo = MavenRepository("Clojars Repo", "http://clojars.org/repo") } // ------------------------------------------------------------------------------------------------------------------- @@ -77,6 +78,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val logbackModuleConfig = ModuleConfiguration("ch.qos.logback",sbt.DefaultMavenRepository) lazy val atomikosModuleConfig = ModuleConfiguration("com.atomikos",sbt.DefaultMavenRepository) lazy val casbahRelease = ModuleConfiguration("com.novus",CasbahRepoReleases) + lazy val voldemortModuleConfig = ModuleConfiguration("voldemort", ClojarsRepo) lazy val embeddedRepo = EmbeddedRepo // This is the only exception, because the embedded repo is fast! // ------------------------------------------------------------------------------------------------------------------- @@ -200,6 +202,9 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val thrift = "com.facebook" % "thrift" % "r917130" % "compile" + lazy val voldemort = "voldemort" % "voldemort" % "0.81" % "compile" + lazy val voldemort_contrib = "voldemort" % "voldemort-contrib" % "0.81" % "compile" + lazy val werkz = "org.codehaus.aspectwerkz" % "aspectwerkz-nodeps-jdk5" % ASPECTWERKZ_VERSION % "compile" lazy val werkz_core = "org.codehaus.aspectwerkz" % "aspectwerkz-jdk5" % ASPECTWERKZ_VERSION % "compile" @@ -461,6 +466,8 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { new AkkaMongoProject(_), akka_persistence_common) lazy val akka_persistence_cassandra = project("akka-persistence-cassandra", "akka-persistence-cassandra", new AkkaCassandraProject(_), akka_persistence_common) + lazy val akka_persistence_voldemort = project("akka-persistence-voldemort", "akka-persistence-voldemort", + new AkkaVoldemortProject(_), akka_persistence_common) } // ------------------------------------------------------------------------------------------------------------------- @@ -510,6 +517,23 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { override def testOptions = TestFilter((name: String) => name.endsWith("Test")) :: Nil } + + // ------------------------------------------------------------------------------------------------------------------- + // akka-persistence-voldemort subproject + // ------------------------------------------------------------------------------------------------------------------- + + class AkkaVoldemortProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { + val voldemort = Dependencies.voldemort + val voldemort_contrib = Dependencies.voldemort_contrib + + //testing + val scalatest = Dependencies.scalatest + override def testOptions = TestFilter((name: String) => name.endsWith("Test")) :: Nil + } + + + + // ------------------------------------------------------------------------------------------------------------------- // akka-kernel subproject // ------------------------------------------------------------------------------------------------------------------- From 1de3c3dd30582e3c07da4e9d3725fab03f4fe1a5 Mon Sep 17 00:00:00 2001 From: ticktock Date: Tue, 14 Sep 2010 21:02:22 -0400 Subject: [PATCH 02/14] Initial PersistentMap backend --- .../src/main/scala/VoldemortSession.scala | 24 ------ .../src/main/scala/VoldemortStorage.scala | 4 +- .../main/scala/VoldemortStorageBackend.scala | 86 ++++++++++++------- 3 files changed, 57 insertions(+), 57 deletions(-) delete mode 100644 akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortSession.scala diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortSession.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortSession.scala deleted file mode 100644 index c0eca74832..0000000000 --- a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortSession.scala +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2009-2010 Scalable Solutions AB - */ - -package se.scalablesolutions.akka.persistence.voldemort - -import se.scalablesolutions.akka.util.UUID -import se.scalablesolutions.akka.stm._ -import se.scalablesolutions.akka.persistence.common._ -import voldemort.client.StoreClient - - -class VoldemortSession { - - val voldemort: StoreClient - - def getOptionalBytes(name: String): Option[Array[Byte]] = { - - } - - def put(name:) - - -} \ No newline at end of file diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorage.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorage.scala index a590de349b..b906460ca6 100644 --- a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorage.scala +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorage.scala @@ -34,10 +34,10 @@ class VoldemortPersistentMap(id: String) extends PersistentMapBinary { class VoldemortPersistentVector(id: String) extends PersistentVector[Array[Byte]] { val uuid = id - val storage = VoldemortStoragebackend + val storage = VoldemortStorageBackend } class VoldemortPersistentRef(id: String) extends PersistentRef[Array[Byte]] { val uuid = id - val storage = VoldemortStoragebackend + val storage = VoldemortStorageBackend } diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala index 5732fbac8d..6849aa09b2 100644 --- a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala @@ -13,6 +13,11 @@ import se.scalablesolutions.akka.config.Config.config import voldemort.client._ import collection.mutable.{Set, HashSet, ArrayBuffer} import java.lang.String +import voldemort.utils.ByteUtils +import collection.immutable.{SortedSet, TreeSet} +import voldemort.versioning.Versioned +import java.util.Map +import collection.JavaConversions private[akka] object VoldemortStorageBackend extends @@ -23,25 +28,30 @@ MapStorageBackend[Array[Byte], Array[Byte]] with /** * Concat the owner+key+lenght of owner so owned data will be colocated - * Store the length of owner as last byte to work aroune the rarest case + * Store the length of owner as last byte to work around the rare case * where ownerbytes1 + keybytes1 == ownerbytes2 + keybytes2 but ownerbytes1 != ownerbytes2 */ private def mapKey(owner: String, key: Array[Byte]): Array[Byte] = { val ownerBytes: Array[Byte] = owner.getBytes("UTF-8") val ownerLenghtByte = ownerBytes.length.byteValue - val mapKey = new Array[Byte](ownerBytes.length + key.length + 1) - System.arraycopy(ownerBytes, 0, mapKey, 0, ownerBytes.length) - System.arraycopy(key, 0, mapKey, ownerBytes.length, key.length) - mapKey.update(mapKey.length - 1) = ownerLenghtByte + val theMapKey = new Array[Byte](ownerBytes.length + key.length + 1) + System.arraycopy(ownerBytes, 0, theMapKey, 0, ownerBytes.length) + System.arraycopy(key, 0, theMapKey, ownerBytes.length, key.length) + theMapKey.update(theMapKey.length - 1, ownerLenghtByte) + theMapKey } - var refClient: StoreClient - var mapKeyClient: StoreClient - var mapValueClient: StoreClient + var refClient: StoreClient[String, Array[Byte]] = null + var mapKeyClient: StoreClient[String, SortedSet[Array[Byte]]] = null + var mapValueClient: StoreClient[Array[Byte], Array[Byte]] = null + + implicit val byteOrder = new Ordering[Array[Byte]] { + override def compare(x: Array[Byte], y: Array[Byte]) = ByteUtils.compare(x, y) + } def getRefStorageFor(name: String): Option[Array[Byte]] = { - val result: Array[Byte] = refClient.get(RefKey(name).key) + val result: Array[Byte] = refClient.getValue(name) result match { case null => None case _ => Some(result) @@ -49,29 +59,41 @@ MapStorageBackend[Array[Byte], Array[Byte]] with } def insertRefStorageFor(name: String, element: Array[Byte]) = { - refClient.put(RefKey(name).key, element) + refClient.put(name, element) } def getMapStorageRangeFor(name: String, start: Option[Array[Byte]], finish: Option[Array[Byte]], count: Int): List[(Array[Byte], Array[Byte])] = { - + val allkeys: SortedSet[Array[Byte]] = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]) + val range = allkeys.rangeImpl(start, finish).take(count) + getKeyValues(range) } def getMapStorageFor(name: String): List[(Array[Byte], Array[Byte])] = { - val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) - val entries: ArrayBuffer[(Array[Byte], Array[Byte])] = new ArrayBuffer - keys.foreach { - entries += (_, mapValueClient.getValue(mapKey(name, _))) - } - entries.toList + val keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) + getKeyValues(keys) + } + + private def getKeyValues(keys: SortedSet[Array[Byte]]): List[(Array[Byte], Array[Byte])] = { + val all: Map[Array[Byte], Versioned[Array[Byte]]] = mapValueClient.getAll(JavaConversions.asIterable(keys)) + JavaConversions.asMap(all).foldLeft(new ArrayBuffer[(Array[Byte], Array[Byte])]) { + (buf, keyVal) => { + keyVal match { + case (key, versioned) => { + buf += key -> versioned.getValue + } + } + buf + } + }.toList } def getMapStorageSizeFor(name: String): Int = { - val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) + val keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) keys.size } def getMapStorageEntryFor(name: String, key: Array[Byte]): Option[Array[Byte]] = { - val result: Array[Byte] = mapValueClient.get(mapKey(name, key)) + val result: Array[Byte] = mapValueClient.getValue(mapKey(name, key)) result match { case null => None case _ => Some(result) @@ -79,7 +101,7 @@ MapStorageBackend[Array[Byte], Array[Byte]] with } def removeMapStorageFor(name: String, key: Array[Byte]) = { - val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) + var keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) keys -= key mapKeyClient.put(name, keys) mapValueClient.delete(mapKey(name, key)) @@ -87,33 +109,35 @@ MapStorageBackend[Array[Byte], Array[Byte]] with def removeMapStorageFor(name: String) = { - val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) + val keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) keys.foreach { - mapValueClient.delete(mapKey(name, _)) + key => + mapValueClient.delete(mapKey(name, key)) } mapKeyClient.delete(name) } def insertMapStorageEntryFor(name: String, key: Array[Byte], value: Array[Byte]) = { - mapValueClient.put(mapKey(name, key)) - val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) + mapValueClient.put(mapKey(name, key), value) + var keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) keys += key mapKeyClient.put(name, keys) } def insertMapStorageEntriesFor(name: String, entries: List[(Array[Byte], Array[Byte])]) = { - val newKeys = new HashSet[Array[Byte]] - entries.foreach { - (key, value) => mapValueClient.put(mapKey(name, key), value) - newKeys += key + val newKeys = entries.map { + case (key, value) => { + mapValueClient.put(mapKey(name, key), value) + key + } } - val keys: Set[Array[Byte]] = mapKeyClient.getValue(name, new HashSet[Array[Byte]](0)) - keys += key + var keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) + keys ++= newKeys mapKeyClient.put(name, keys) } - def getVectorStorageSizeFor(name: String): Int = null + def getVectorStorageSizeFor(name: String): Int = 0 def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[Array[Byte]] = null From b1816121cdebb96c8972780f48d5e907ce7994cf Mon Sep 17 00:00:00 2001 From: ticktock Date: Wed, 15 Sep 2010 16:25:23 -0400 Subject: [PATCH 03/14] finished ref map vector and some initial test scaffolding --- .../main/scala/VoldemortStorageBackend.scala | 165 ++++-- .../src/test/resources/cluster.xml | 0 .../src/test/resources/config/cluster.xml | 14 + .../test/resources/config/server.properties | 1 + .../test/resources/{ => config}/stores.xml | 41 +- .../src/test/resources/server.properties | 0 .../src/test/scala/EmbeddedVoldemort.scala | 33 ++ .../scala/VoldemortStorageBackendSuite.scala | 55 +- project/build/AkkaProject.scala | 549 ++++++++++-------- 9 files changed, 552 insertions(+), 306 deletions(-) delete mode 100644 akka-persistence/akka-persistence-voldemort/src/test/resources/cluster.xml create mode 100644 akka-persistence/akka-persistence-voldemort/src/test/resources/config/cluster.xml create mode 100644 akka-persistence/akka-persistence-voldemort/src/test/resources/config/server.properties rename akka-persistence/akka-persistence-voldemort/src/test/resources/{ => config}/stores.xml (54%) delete mode 100644 akka-persistence/akka-persistence-voldemort/src/test/resources/server.properties create mode 100644 akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala index 6849aa09b2..6915a7bca8 100644 --- a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala @@ -11,13 +11,14 @@ import se.scalablesolutions.akka.util.Helpers._ import se.scalablesolutions.akka.config.Config.config import voldemort.client._ -import collection.mutable.{Set, HashSet, ArrayBuffer} import java.lang.String import voldemort.utils.ByteUtils -import collection.immutable.{SortedSet, TreeSet} import voldemort.versioning.Versioned -import java.util.Map import collection.JavaConversions +import java.nio.ByteBuffer +import collection.immutable.{IndexedSeq, SortedSet, TreeSet} +import collection.mutable.{Map, Set, HashSet, ArrayBuffer} +import java.util.{Map => JMap} private[akka] object VoldemortStorageBackend extends @@ -25,26 +26,27 @@ MapStorageBackend[Array[Byte], Array[Byte]] with VectorStorageBackend[Array[Byte]] with RefStorageBackend[Array[Byte]] with Logging { - - /** - * Concat the owner+key+lenght of owner so owned data will be colocated - * Store the length of owner as last byte to work around the rare case - * where ownerbytes1 + keybytes1 == ownerbytes2 + keybytes2 but ownerbytes1 != ownerbytes2 - */ - private def mapKey(owner: String, key: Array[Byte]): Array[Byte] = { - val ownerBytes: Array[Byte] = owner.getBytes("UTF-8") - val ownerLenghtByte = ownerBytes.length.byteValue - val theMapKey = new Array[Byte](ownerBytes.length + key.length + 1) - System.arraycopy(ownerBytes, 0, theMapKey, 0, ownerBytes.length) - System.arraycopy(key, 0, theMapKey, ownerBytes.length, key.length) - theMapKey.update(theMapKey.length - 1, ownerLenghtByte) - theMapKey + val bootstrapUrl: String = config.getString("akka.storage.voldemort.bootstrap.url", "tcp://localhost:6666") + val refStore = config.getString("akka.storage.voldemort.store.ref", "Refs") + val mapKeyStore = config.getString("akka.storage.voldemort.store.map.key", "MapKeys") + val mapValueStore = config.getString("akka.storage.voldemort.store.map.value", "MapValues") + val vectorSizeStore = config.getString("akka.storage.voldemort.store.vector.size", "VectorSizes") + val vectorValueStore = config.getString("akka.storage.voldemort.store.vectore.value", "VectorValues") + val storeClientFactory = { + if (bootstrapUrl.startsWith("tcp")) { + new SocketStoreClientFactory(new ClientConfig().setBootstrapUrls(bootstrapUrl)) + } else if (bootstrapUrl.startsWith("http")) { + new HttpStoreClientFactory(new ClientConfig().setBootstrapUrls(bootstrapUrl)) + } else { + throw new IllegalArgumentException("Unknown boostrapUrl syntax" + bootstrapUrl) + } } - - var refClient: StoreClient[String, Array[Byte]] = null - var mapKeyClient: StoreClient[String, SortedSet[Array[Byte]]] = null - var mapValueClient: StoreClient[Array[Byte], Array[Byte]] = null - + var refClient: StoreClient[String, Array[Byte]] = storeClientFactory.getStoreClient(refStore) + var mapKeyClient: StoreClient[String, SortedSet[Array[Byte]]] = storeClientFactory.getStoreClient(mapKeyStore) + var mapValueClient: StoreClient[Array[Byte], Array[Byte]] = storeClientFactory.getStoreClient(mapValueStore) + var vectorSizeClient: StoreClient[String, Array[Byte]] = storeClientFactory.getStoreClient(vectorSizeStore) + var vectorValueClient: StoreClient[Array[Byte], Array[Byte]] = storeClientFactory.getStoreClient(vectorValueStore) + val underscoreBytesUTF8 = "_".getBytes("UTF-8") implicit val byteOrder = new Ordering[Array[Byte]] { override def compare(x: Array[Byte], y: Array[Byte]) = ByteUtils.compare(x, y) } @@ -74,8 +76,8 @@ MapStorageBackend[Array[Byte], Array[Byte]] with } private def getKeyValues(keys: SortedSet[Array[Byte]]): List[(Array[Byte], Array[Byte])] = { - val all: Map[Array[Byte], Versioned[Array[Byte]]] = mapValueClient.getAll(JavaConversions.asIterable(keys)) - JavaConversions.asMap(all).foldLeft(new ArrayBuffer[(Array[Byte], Array[Byte])]) { + val all: JMap[Array[Byte], Versioned[Array[Byte]]] = mapValueClient.getAll(JavaConversions.asIterable(keys)) + JavaConversions.asMap(all).foldLeft(new ArrayBuffer[(Array[Byte], Array[Byte])](all.size)) { (buf, keyVal) => { keyVal match { case (key, versioned) => { @@ -93,7 +95,7 @@ MapStorageBackend[Array[Byte], Array[Byte]] with } def getMapStorageEntryFor(name: String, key: Array[Byte]): Option[Array[Byte]] = { - val result: Array[Byte] = mapValueClient.getValue(mapKey(name, key)) + val result: Array[Byte] = mapValueClient.getValue(getKey(name, key)) result match { case null => None case _ => Some(result) @@ -104,7 +106,7 @@ MapStorageBackend[Array[Byte], Array[Byte]] with var keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) keys -= key mapKeyClient.put(name, keys) - mapValueClient.delete(mapKey(name, key)) + mapValueClient.delete(getKey(name, key)) } @@ -112,13 +114,13 @@ MapStorageBackend[Array[Byte], Array[Byte]] with val keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) keys.foreach { key => - mapValueClient.delete(mapKey(name, key)) + mapValueClient.delete(getKey(name, key)) } mapKeyClient.delete(name) } def insertMapStorageEntryFor(name: String, key: Array[Byte], value: Array[Byte]) = { - mapValueClient.put(mapKey(name, key), value) + mapValueClient.put(getKey(name, key), value) var keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) keys += key mapKeyClient.put(name, keys) @@ -127,7 +129,7 @@ MapStorageBackend[Array[Byte], Array[Byte]] with def insertMapStorageEntriesFor(name: String, entries: List[(Array[Byte], Array[Byte])]) = { val newKeys = entries.map { case (key, value) => { - mapValueClient.put(mapKey(name, key), value) + mapValueClient.put(getKey(name, key), value) key } } @@ -137,17 +139,110 @@ MapStorageBackend[Array[Byte], Array[Byte]] with } - def getVectorStorageSizeFor(name: String): Int = 0 + def getVectorStorageSizeFor(name: String): Int = { + IntSerializer.fromBytes(vectorSizeClient.getValue(name, IntSerializer.toBytes(0))) + } - def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[Array[Byte]] = null - def getVectorStorageEntryFor(name: String, index: Int): Array[Byte] = null + def getVectorStorageRangeFor(name: String, start: Option[Int], finish: Option[Int], count: Int): List[Array[Byte]] = { + val size = getVectorStorageSizeFor(name) + val st = start.getOrElse(0) + val cnt = + if (finish.isDefined) { + val f = finish.get + if (f >= st) (f - st) else count + } else { + count + } + val seq: IndexedSeq[Array[Byte]] = (st to st + cnt).map { + index => getVectorValueKey(name, index) + } - def updateVectorStorageEntryFor(name: String, index: Int, elem: Array[Byte]) = null + val all: JMap[Array[Byte], Versioned[Array[Byte]]] = vectorValueClient.getAll(JavaConversions.asIterable(seq)) - def insertVectorStorageEntriesFor(name: String, elements: List[Array[Byte]]) = null + val buf = new ArrayBuffer[Array[Byte]](seq.size) + seq.foreach { + key => { + val index = getIndexFromVectorValueKey(name, key) + var value: Array[Byte] = null + if (all.containsKey(key)) { + value = all.get(key).getValue + } else { + value = Array.empty[Byte] + } + buf.update(index, value) + } + } + buf.toList + } - def insertVectorStorageEntryFor(name: String, element: Array[Byte]) = null + def getVectorStorageEntryFor(name: String, index: Int): Array[Byte] = { + vectorValueClient.getValue(getVectorValueKey(name, index), Array.empty[Byte]) + } + + def updateVectorStorageEntryFor(name: String, index: Int, elem: Array[Byte]) = { + val size = getVectorStorageSizeFor(name) + vectorValueClient.put(getVectorValueKey(name, index), elem) + if (size < index + 1) { + vectorSizeClient.put(name, IntSerializer.toBytes(index + 1)) + } + } + + def insertVectorStorageEntriesFor(name: String, elements: List[Array[Byte]]) = { + var size = getVectorStorageSizeFor(name) + elements.foreach { + element => + vectorValueClient.put(getVectorValueKey(name, size), element) + size += 1 + } + vectorSizeClient.put(name, IntSerializer.toBytes(size)) + } + + def insertVectorStorageEntryFor(name: String, element: Array[Byte]) = { + insertVectorStorageEntriesFor(name, List(element)) + } + + + /** + * Concat the ownerlenght+owner+key+ of owner so owned data will be colocated + * Store the length of owner as first byte to work around the rare case + * where ownerbytes1 + keybytes1 == ownerbytes2 + keybytes2 but ownerbytes1 != ownerbytes2 + */ + def getKey(owner: String, key: Array[Byte]): Array[Byte] = { + val ownerBytes: Array[Byte] = owner.getBytes("UTF-8") + val ownerLenghtBytes: Array[Byte] = IntSerializer.toBytes(owner.length) + val theKey = new Array[Byte](ownerLenghtBytes.length + ownerBytes.length + key.length) + System.arraycopy(ownerLenghtBytes, 0, theKey, 0, ownerLenghtBytes.length) + System.arraycopy(ownerBytes, 0, theKey, ownerLenghtBytes.length, ownerBytes.length) + System.arraycopy(key, 0, theKey, ownerLenghtBytes.length + ownerBytes.length, key.length) + theKey + } + + def getVectorValueKey(owner: String, index: Int): Array[Byte] = { + val indexbytes = IntSerializer.toBytes(index) + val theIndexKey = new Array[Byte](underscoreBytesUTF8.length + indexbytes.length) + System.arraycopy(underscoreBytesUTF8, 0, theIndexKey, 0, underscoreBytesUTF8.length) + System.arraycopy(indexbytes, 0, theIndexKey, underscoreBytesUTF8.length, indexbytes.length) + getKey(owner, theIndexKey) + } + + def getIndexFromVectorValueKey(owner: String, key: Array[Byte]): Int = { + val indexBytes = new Array[Byte](IntSerializer.bytesPerInt) + System.arraycopy(key, key.length - IntSerializer.bytesPerInt - 1, indexBytes, 0, IntSerializer.bytesPerInt) + IntSerializer.fromBytes(indexBytes) + } + + object IntSerializer { + val bytesPerInt = java.lang.Integer.SIZE / java.lang.Byte.SIZE + + def toBytes(i: Int) = ByteBuffer.wrap(new Array[Byte](bytesPerInt)).putInt(i).array() + + def fromBytes(bytes: Array[Byte]) = ByteBuffer.wrap(bytes).getInt() + + def toString(obj: Int) = obj.toString + + def fromString(str: String) = str.toInt + } } \ No newline at end of file diff --git a/akka-persistence/akka-persistence-voldemort/src/test/resources/cluster.xml b/akka-persistence/akka-persistence-voldemort/src/test/resources/cluster.xml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/akka-persistence/akka-persistence-voldemort/src/test/resources/config/cluster.xml b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/cluster.xml new file mode 100644 index 0000000000..dcf806b0ca --- /dev/null +++ b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/cluster.xml @@ -0,0 +1,14 @@ + + + akka-test + + + 0 + localhost + 8081 + 6666 + 6667 + + 0,1,2,3 + + diff --git a/akka-persistence/akka-persistence-voldemort/src/test/resources/config/server.properties b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/server.properties new file mode 100644 index 0000000000..1e6af91e2d --- /dev/null +++ b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/server.properties @@ -0,0 +1 @@ +node.id=0 diff --git a/akka-persistence/akka-persistence-voldemort/src/test/resources/stores.xml b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/stores.xml similarity index 54% rename from akka-persistence/akka-persistence-voldemort/src/test/resources/stores.xml rename to akka-persistence/akka-persistence-voldemort/src/test/resources/config/stores.xml index f031238e59..b0491ea9a4 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/resources/stores.xml +++ b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/stores.xml @@ -6,7 +6,7 @@ 1 1 1 - bdb + memory client string @@ -23,10 +23,10 @@ 1 1 1 - bdb + memory client - + identity identity @@ -39,7 +39,40 @@ 1 1 1 - bdb + memory + client + + string + utf8 + + + java-serialization + + + + VectorValues + 1 + 1 + 1 + 1 + 1 + memory + client + + identity + + + identity + + + + VectorSizes + 1 + 1 + 1 + 1 + 1 + memory client string diff --git a/akka-persistence/akka-persistence-voldemort/src/test/resources/server.properties b/akka-persistence/akka-persistence-voldemort/src/test/resources/server.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala new file mode 100644 index 0000000000..5631542a78 --- /dev/null +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala @@ -0,0 +1,33 @@ +package se.scalablesolutions.akka.persistence.voldemort + +import org.scalatest.matchers.ShouldMatchers +import se.scalablesolutions.akka.util.UUID +import voldemort.server.{VoldemortServer, VoldemortConfig} +import org.scalatest.{Suite, BeforeAndAfterAll, FunSuite} +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import voldemort.utils.Utils +import java.io.File + +@RunWith(classOf[JUnitRunner]) +trait EmbeddedVoldemort extends BeforeAndAfterAll { + this: Suite => + var server: VoldemortServer = null + + override protected def beforeAll(): Unit = { + + try { + val dir = "./akka-persistence/akka-persistence-voldemort/src/test/resources" + val home = new File(dir) + val config = VoldemortConfig.loadFromVoldemortHome(home.getCanonicalPath) + server = new VoldemortServer(config) + server.start + } catch { + case e => e.printStackTrace + } + } + + override protected def afterAll(): Unit = { + server.stop + } +} \ No newline at end of file diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala index b11a4bba35..68f1ebed0f 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala @@ -2,16 +2,51 @@ package se.scalablesolutions.akka.persistence.voldemort import org.scalatest.FunSuite import org.scalatest.matchers.ShouldMatchers -import se.scalablesolutions.akka.util.UUID +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import se.scalablesolutions.akka.persistence.voldemort.VoldemortStorageBackend._ +import se.scalablesolutions.akka.util.{Logging, UUID} +import collection.immutable.TreeSet - -/** - * - */ - -class VoldemortStorageBackendSuite extends FunSuite with ShouldMatchers { - - test("UUID generation looks like"){ - System.out.println(UUID.newUuid.toString) +@RunWith(classOf[JUnitRunner]) +class VoldemortStorageBackendSuite extends FunSuite with ShouldMatchers with EmbeddedVoldemort with Logging { + test("that ref storage and retrieval works") { + refClient.put("testRef", "testRefValue".getBytes("UTF-8")) + new String(refClient.getValue("testRef", Array.empty[Byte]), "UTF-8") should be("testRefValue") } + + test("that map key storage and retrieval works") { + val mapKeys = new TreeSet[Array[Byte]] + "key1".getBytes + mapKeyClient.put("testMapKey", mapKeys) + val returned = mapKeyClient.getValue("testMapKey", new TreeSet[Array[Byte]]) + returned should equal(mapKeys) + } + + test("that map value storage and retrieval works") { + val key = "keyForTestingMapValueClient".getBytes("UTF-8") + val value = "value for testing map value client".getBytes("UTF-8") + mapValueClient.put(key, value) + mapValueClient.getValue(key) should equal(value) + } + + test("that vector size storage and retrieval works") { + val key = "vectorKey" + vectorSizeClient.put(key, IntSerializer.toBytes(17)) + vectorSizeClient.getValue(key) should equal(IntSerializer.toBytes(17)) + } + + test("that vector value storage and retrieval works") { + val key = "vectorValueKey" + val index = 3 + val value = "some bytes".getBytes("UTF-8") + val vecKey = getVectorValueKey(key, index) + try{ + val idx = getIndexFromVectorValueKey(key, vecKey) + vectorValueClient.put(vecKey, value) + vectorValueClient.get(vecKey) should equal(value) + } catch{ + case e => e.printStackTrace + } + } + } \ No newline at end of file diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index fe4fb19584..b74dfea6e2 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -1,4 +1,4 @@ - /*---------------------------------------------------------------------------\ +/*---------------------------------------------------------------------------\ | Copyright (C) 2009-2010 Scalable Solutions AB | \---------------------------------------------------------------------------*/ @@ -17,13 +17,14 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- override def compileOptions = super.compileOptions ++ - Seq("-deprecation", - "-Xmigration", - "-Xcheckinit", - "-Xstrict-warnings", - "-Xwarninit", - "-encoding", "utf8") - .map(x => CompileOption(x)) + Seq("-deprecation", + "-Xmigration", + "-Xcheckinit", + "-Xstrict-warnings", + "-Xwarninit", + "-encoding", "utf8") + .map(x => CompileOption(x)) + override def javaCompileOptions = JavaCompileOption("-Xlint:unchecked") :: super.javaCompileOptions.toList // ------------------------------------------------------------------------------------------------------------------- @@ -32,25 +33,28 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val deployPath = info.projectPath / "deploy" lazy val distPath = info.projectPath / "dist" + def distName = "%s_%s-%s.zip".format(name, buildScalaVersion, version) - lazy val dist = zipTask(allArtifacts, "dist", distName) dependsOn (`package`) describedAs("Zips up the distribution.") + + lazy val dist = zipTask(allArtifacts, "dist", distName) dependsOn (`package`) describedAs ("Zips up the distribution.") // ------------------------------------------------------------------------------------------------------------------- // All repositories *must* go here! See ModuleConigurations below. // ------------------------------------------------------------------------------------------------------------------- object Repositories { - lazy val AkkaRepo = MavenRepository("Akka Repository", "http://scalablesolutions.se/akka/repository") - lazy val CodehausRepo = MavenRepository("Codehaus Repo", "http://repository.codehaus.org") - lazy val EmbeddedRepo = MavenRepository("Embedded Repo", (info.projectPath / "embedded-repo").asURL.toString) + lazy val AkkaRepo = MavenRepository("Akka Repository", "http://scalablesolutions.se/akka/repository") + lazy val CodehausRepo = MavenRepository("Codehaus Repo", "http://repository.codehaus.org") + lazy val EmbeddedRepo = MavenRepository("Embedded Repo", (info.projectPath / "embedded-repo").asURL.toString) lazy val FusesourceSnapshotRepo = MavenRepository("Fusesource Snapshots", "http://repo.fusesource.com/nexus/content/repositories/snapshots") - lazy val GuiceyFruitRepo = MavenRepository("GuiceyFruit Repo", "http://guiceyfruit.googlecode.com/svn/repo/releases/") - lazy val JBossRepo = MavenRepository("JBoss Repo", "https://repository.jboss.org/nexus/content/groups/public/") - lazy val JavaNetRepo = MavenRepository("java.net Repo", "http://download.java.net/maven/2") + lazy val GuiceyFruitRepo = MavenRepository("GuiceyFruit Repo", "http://guiceyfruit.googlecode.com/svn/repo/releases/") + lazy val JBossRepo = MavenRepository("JBoss Repo", "https://repository.jboss.org/nexus/content/groups/public/") + lazy val JavaNetRepo = MavenRepository("java.net Repo", "http://download.java.net/maven/2") lazy val SonatypeSnapshotRepo = MavenRepository("Sonatype OSS Repo", "http://oss.sonatype.org/content/repositories/releases") - lazy val SunJDMKRepo = MavenRepository("Sun JDMK Repo", "http://wp5.e-taxonomy.eu/cdmlib/mavenrepo") - lazy val CasbahRepoReleases = MavenRepository("Casbah Release Repo", "http://repo.bumnetworks.com/releases") - lazy val ClojarsRepo = MavenRepository("Clojars Repo", "http://clojars.org/repo") + lazy val SunJDMKRepo = MavenRepository("Sun JDMK Repo", "http://wp5.e-taxonomy.eu/cdmlib/mavenrepo") + lazy val CasbahRepoReleases = MavenRepository("Casbah Release Repo", "http://repo.bumnetworks.com/releases") + lazy val ClojarsRepo = MavenRepository("Clojars Repo", "http://clojars.org/repo") + lazy val OracleRepo = MavenRepository("Oracle Repo", "http://download.oracle.com/maven") } // ------------------------------------------------------------------------------------------------------------------- @@ -61,44 +65,45 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- import Repositories._ - lazy val atmosphereModuleConfig = ModuleConfiguration("org.atmosphere", SonatypeSnapshotRepo) - lazy val jettyModuleConfig = ModuleConfiguration("org.eclipse.jetty", sbt.DefaultMavenRepository) + lazy val atmosphereModuleConfig = ModuleConfiguration("org.atmosphere", SonatypeSnapshotRepo) + lazy val jettyModuleConfig = ModuleConfiguration("org.eclipse.jetty", sbt.DefaultMavenRepository) lazy val guiceyFruitModuleConfig = ModuleConfiguration("org.guiceyfruit", GuiceyFruitRepo) // lazy val hawtdispatchModuleConfig = ModuleConfiguration("org.fusesource.hawtdispatch", FusesourceSnapshotRepo) - lazy val jbossModuleConfig = ModuleConfiguration("org.jboss", JBossRepo) - lazy val jdmkModuleConfig = ModuleConfiguration("com.sun.jdmk", SunJDMKRepo) - lazy val jmsModuleConfig = ModuleConfiguration("javax.jms", SunJDMKRepo) - lazy val jmxModuleConfig = ModuleConfiguration("com.sun.jmx", SunJDMKRepo) + lazy val jbossModuleConfig = ModuleConfiguration("org.jboss", JBossRepo) + lazy val jdmkModuleConfig = ModuleConfiguration("com.sun.jdmk", SunJDMKRepo) + lazy val jmsModuleConfig = ModuleConfiguration("javax.jms", SunJDMKRepo) + lazy val jmxModuleConfig = ModuleConfiguration("com.sun.jmx", SunJDMKRepo) lazy val jerseyContrModuleConfig = ModuleConfiguration("com.sun.jersey.contribs", JavaNetRepo) - lazy val jerseyModuleConfig = ModuleConfiguration("com.sun.jersey", JavaNetRepo) - lazy val jgroupsModuleConfig = ModuleConfiguration("jgroups", JBossRepo) - lazy val multiverseModuleConfig = ModuleConfiguration("org.multiverse", CodehausRepo) - lazy val nettyModuleConfig = ModuleConfiguration("org.jboss.netty", JBossRepo) - lazy val scalaTestModuleConfig = ModuleConfiguration("org.scalatest", ScalaToolsSnapshots) - lazy val logbackModuleConfig = ModuleConfiguration("ch.qos.logback",sbt.DefaultMavenRepository) - lazy val atomikosModuleConfig = ModuleConfiguration("com.atomikos",sbt.DefaultMavenRepository) - lazy val casbahRelease = ModuleConfiguration("com.novus",CasbahRepoReleases) - lazy val voldemortModuleConfig = ModuleConfiguration("voldemort", ClojarsRepo) - lazy val embeddedRepo = EmbeddedRepo // This is the only exception, because the embedded repo is fast! + lazy val jerseyModuleConfig = ModuleConfiguration("com.sun.jersey", JavaNetRepo) + lazy val jgroupsModuleConfig = ModuleConfiguration("jgroups", JBossRepo) + lazy val multiverseModuleConfig = ModuleConfiguration("org.multiverse", CodehausRepo) + lazy val nettyModuleConfig = ModuleConfiguration("org.jboss.netty", JBossRepo) + lazy val scalaTestModuleConfig = ModuleConfiguration("org.scalatest", ScalaToolsSnapshots) + lazy val logbackModuleConfig = ModuleConfiguration("ch.qos.logback", sbt.DefaultMavenRepository) + lazy val atomikosModuleConfig = ModuleConfiguration("com.atomikos", sbt.DefaultMavenRepository) + lazy val casbahRelease = ModuleConfiguration("com.novus", CasbahRepoReleases) + lazy val voldemortModuleConfig = ModuleConfiguration("voldemort", ClojarsRepo) + lazy val sleepycatModuleConfig = ModuleConfiguration("com.sleepycat", OracleRepo) + lazy val embeddedRepo = EmbeddedRepo // This is the only exception, because the embedded repo is fast! // ------------------------------------------------------------------------------------------------------------------- // Versions // ------------------------------------------------------------------------------------------------------------------- - lazy val ATMO_VERSION = "0.6.1" - lazy val CAMEL_VERSION = "2.4.0" - lazy val CASSANDRA_VERSION = "0.6.1" - lazy val DISPATCH_VERSION = "0.7.4" + lazy val ATMO_VERSION = "0.6.1" + lazy val CAMEL_VERSION = "2.4.0" + lazy val CASSANDRA_VERSION = "0.6.1" + lazy val DISPATCH_VERSION = "0.7.4" lazy val HAWT_DISPATCH_VERSION = "1.0" - lazy val JACKSON_VERSION = "1.2.1" - lazy val JERSEY_VERSION = "1.2" - lazy val MULTIVERSE_VERSION = "0.6.1" - lazy val SCALATEST_VERSION = "1.2-for-scala-2.8.0.final-SNAPSHOT" - lazy val LOGBACK_VERSION = "0.9.24" - lazy val SLF4J_VERSION = "1.6.0" - lazy val SPRING_VERSION = "3.0.3.RELEASE" - lazy val ASPECTWERKZ_VERSION = "2.2.1" - lazy val JETTY_VERSION = "7.1.4.v20100610" + lazy val JACKSON_VERSION = "1.2.1" + lazy val JERSEY_VERSION = "1.2" + lazy val MULTIVERSE_VERSION = "0.6.1" + lazy val SCALATEST_VERSION = "1.2-for-scala-2.8.0.final-SNAPSHOT" + lazy val LOGBACK_VERSION = "0.9.24" + lazy val SLF4J_VERSION = "1.6.0" + lazy val SPRING_VERSION = "3.0.3.RELEASE" + lazy val ASPECTWERKZ_VERSION = "2.2.1" + lazy val JETTY_VERSION = "7.1.4.v20100610" // ------------------------------------------------------------------------------------------------------------------- // Dependencies @@ -112,14 +117,14 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val aopalliance = "aopalliance" % "aopalliance" % "1.0" % "compile" - lazy val atmo = "org.atmosphere" % "atmosphere-annotations" % ATMO_VERSION % "compile" + lazy val atmo = "org.atmosphere" % "atmosphere-annotations" % ATMO_VERSION % "compile" lazy val atmo_jbossweb = "org.atmosphere" % "atmosphere-compat-jbossweb" % ATMO_VERSION % "compile" - lazy val atmo_jersey = "org.atmosphere" % "atmosphere-jersey" % ATMO_VERSION % "compile" - lazy val atmo_runtime = "org.atmosphere" % "atmosphere-runtime" % ATMO_VERSION % "compile" - lazy val atmo_tomcat = "org.atmosphere" % "atmosphere-compat-tomcat" % ATMO_VERSION % "compile" + lazy val atmo_jersey = "org.atmosphere" % "atmosphere-jersey" % ATMO_VERSION % "compile" + lazy val atmo_runtime = "org.atmosphere" % "atmosphere-runtime" % ATMO_VERSION % "compile" + lazy val atmo_tomcat = "org.atmosphere" % "atmosphere-compat-tomcat" % ATMO_VERSION % "compile" lazy val atmo_weblogic = "org.atmosphere" % "atmosphere-compat-weblogic" % ATMO_VERSION % "compile" - lazy val atomikos_transactions = "com.atomikos" % "transactions" % "3.2.3" % "compile" + lazy val atomikos_transactions = "com.atomikos" % "transactions" % "3.2.3" % "compile" lazy val atomikos_transactions_api = "com.atomikos" % "transactions-api" % "3.2.3" % "compile" lazy val atomikos_transactions_jta = "com.atomikos" % "transactions-jta" % "3.2.3" % "compile" @@ -138,9 +143,9 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val dispatch_http = "net.databinder" % "dispatch-http_2.8.0" % DISPATCH_VERSION % "compile" lazy val dispatch_json = "net.databinder" % "dispatch-json_2.8.0" % DISPATCH_VERSION % "compile" - lazy val jetty = "org.eclipse.jetty" % "jetty-server" % JETTY_VERSION % "compile" - lazy val jetty_util = "org.eclipse.jetty" % "jetty-util" % JETTY_VERSION % "compile" - lazy val jetty_xml = "org.eclipse.jetty" % "jetty-xml" % JETTY_VERSION % "compile" + lazy val jetty = "org.eclipse.jetty" % "jetty-server" % JETTY_VERSION % "compile" + lazy val jetty_util = "org.eclipse.jetty" % "jetty-util" % JETTY_VERSION % "compile" + lazy val jetty_xml = "org.eclipse.jetty" % "jetty-xml" % JETTY_VERSION % "compile" lazy val jetty_servlet = "org.eclipse.jetty" % "jetty-servlet" % JETTY_VERSION % "compile" lazy val guicey = "org.guiceyfruit" % "guice-all" % "2.0" % "compile" @@ -149,14 +154,14 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val hawtdispatch = "org.fusesource.hawtdispatch" % "hawtdispatch-scala" % HAWT_DISPATCH_VERSION % "compile" - lazy val jackson = "org.codehaus.jackson" % "jackson-mapper-asl" % JACKSON_VERSION % "compile" - lazy val jackson_core = "org.codehaus.jackson" % "jackson-core-asl" % JACKSON_VERSION % "compile" - lazy val jackson_core_asl = "org.codehaus.jackson" % "jackson-core-asl" % JACKSON_VERSION % "compile" + lazy val jackson = "org.codehaus.jackson" % "jackson-mapper-asl" % JACKSON_VERSION % "compile" + lazy val jackson_core = "org.codehaus.jackson" % "jackson-core-asl" % JACKSON_VERSION % "compile" + lazy val jackson_core_asl = "org.codehaus.jackson" % "jackson-core-asl" % JACKSON_VERSION % "compile" - lazy val jersey = "com.sun.jersey" % "jersey-core" % JERSEY_VERSION % "compile" - lazy val jersey_json = "com.sun.jersey" % "jersey-json" % JERSEY_VERSION % "compile" - lazy val jersey_server = "com.sun.jersey" % "jersey-server" % JERSEY_VERSION % "compile" - lazy val jersey_contrib = "com.sun.jersey.contribs" % "jersey-scala" % JERSEY_VERSION % "compile" + lazy val jersey = "com.sun.jersey" % "jersey-core" % JERSEY_VERSION % "compile" + lazy val jersey_json = "com.sun.jersey" % "jersey-json" % JERSEY_VERSION % "compile" + lazy val jersey_server = "com.sun.jersey" % "jersey-server" % JERSEY_VERSION % "compile" + lazy val jersey_contrib = "com.sun.jersey.contribs" % "jersey-scala" % JERSEY_VERSION % "compile" lazy val jgroups = "jgroups" % "jgroups" % "2.9.0.GA" % "compile" @@ -190,56 +195,64 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val sjson = "sjson.json" % "sjson" % "0.8-SNAPSHOT-2.8.0" % "compile" - lazy val slf4j = "org.slf4j" % "slf4j-api" % SLF4J_VERSION % "compile" + lazy val slf4j = "org.slf4j" % "slf4j-api" % SLF4J_VERSION % "compile" - lazy val logback = "ch.qos.logback" % "logback-classic" % LOGBACK_VERSION % "compile" + lazy val logback = "ch.qos.logback" % "logback-classic" % LOGBACK_VERSION % "compile" lazy val logback_core = "ch.qos.logback" % "logback-core" % LOGBACK_VERSION % "compile" - lazy val spring_beans = "org.springframework" % "spring-beans" % SPRING_VERSION % "compile" + lazy val spring_beans = "org.springframework" % "spring-beans" % SPRING_VERSION % "compile" lazy val spring_context = "org.springframework" % "spring-context" % SPRING_VERSION % "compile" lazy val stax_api = "javax.xml.stream" % "stax-api" % "1.0-2" % "compile" lazy val thrift = "com.facebook" % "thrift" % "r917130" % "compile" - lazy val voldemort = "voldemort" % "voldemort" % "0.81" % "compile" - lazy val voldemort_contrib = "voldemort" % "voldemort-contrib" % "0.81" % "compile" + lazy val voldemort = "voldemort" % "voldemort" % "0.81" % "compile" + lazy val voldemort_contrib = "voldemort" % "voldemort-contrib" % "0.81" % "compile" + lazy val voldemort_needs_log4j = "log4j" % "log4j" % "1.2.16" % "compile" - lazy val werkz = "org.codehaus.aspectwerkz" % "aspectwerkz-nodeps-jdk5" % ASPECTWERKZ_VERSION % "compile" - lazy val werkz_core = "org.codehaus.aspectwerkz" % "aspectwerkz-jdk5" % ASPECTWERKZ_VERSION % "compile" + lazy val werkz = "org.codehaus.aspectwerkz" % "aspectwerkz-nodeps-jdk5" % ASPECTWERKZ_VERSION % "compile" + lazy val werkz_core = "org.codehaus.aspectwerkz" % "aspectwerkz-jdk5" % ASPECTWERKZ_VERSION % "compile" // Test - lazy val camel_spring = "org.apache.camel" % "camel-spring" % CAMEL_VERSION % "test" - lazy val cassandra_clhm = "org.apache.cassandra" % "clhm-production" % CASSANDRA_VERSION % "test" - lazy val commons_coll = "commons-collections" % "commons-collections" % "3.2.1" % "test" - lazy val google_coll = "com.google.collections" % "google-collections" % "1.0" % "test" - lazy val high_scale = "org.apache.cassandra" % "high-scale-lib" % CASSANDRA_VERSION % "test" - lazy val testJetty = "org.eclipse.jetty" % "jetty-server" % JETTY_VERSION % "test" - lazy val testJettyWebApp= "org.eclipse.jetty" % "jetty-webapp" % JETTY_VERSION % "test" + lazy val camel_spring = "org.apache.camel" % "camel-spring" % CAMEL_VERSION % "test" + lazy val cassandra_clhm = "org.apache.cassandra" % "clhm-production" % CASSANDRA_VERSION % "test" + lazy val commons_coll = "commons-collections" % "commons-collections" % "3.2.1" % "test" + lazy val google_coll = "com.google.collections" % "google-collections" % "1.0" % "test" + lazy val high_scale = "org.apache.cassandra" % "high-scale-lib" % CASSANDRA_VERSION % "test" + lazy val testJetty = "org.eclipse.jetty" % "jetty-server" % JETTY_VERSION % "test" + lazy val testJettyWebApp = "org.eclipse.jetty" % "jetty-webapp" % JETTY_VERSION % "test" - lazy val junit = "junit" % "junit" % "4.5" % "test" - lazy val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" - lazy val scalatest = "org.scalatest" % "scalatest" % SCALATEST_VERSION % "test" + lazy val junit = "junit" % "junit" % "4.5" % "test" + lazy val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" + lazy val scalatest = "org.scalatest" % "scalatest" % SCALATEST_VERSION % "test" + + //voldemort testing /home/sclasen/projects/akka/akka-persistence-voldemort/src/test/resources/ + lazy val jdom = "org.jdom" % "jdom" % "1.1" % "test" + lazy val vold_jetty = "org.mortbay.jetty" % "jetty" % "6.1.18" % "test" + lazy val velocity = "org.apache.velocity" % "velocity" % "1.6.2" % "test" + lazy val bdb = "com.sleepycat" % "je" % "4.0.103" % "test" + lazy val dbcp = "commons-dbcp" % "commons-dbcp" % "1.2.2" % "test" } // ------------------------------------------------------------------------------------------------------------------- // Subprojects // ------------------------------------------------------------------------------------------------------------------- - lazy val akka_actor = project("akka-actor", "akka-actor", new AkkaActorProject(_)) + lazy val akka_actor = project("akka-actor", "akka-actor", new AkkaActorProject(_)) lazy val akka_typed_actor = project("akka-typed-actor", "akka-typed-actor", new AkkaTypedActorProject(_), akka_actor) - lazy val akka_remote = project("akka-remote", "akka-remote", new AkkaRemoteProject(_), akka_typed_actor) - lazy val akka_amqp = project("akka-amqp", "akka-amqp", new AkkaAMQPProject(_), akka_remote) - lazy val akka_http = project("akka-http", "akka-http", new AkkaHttpProject(_), akka_remote, akka_camel) - lazy val akka_camel = project("akka-camel", "akka-camel", new AkkaCamelProject(_), akka_remote) + lazy val akka_remote = project("akka-remote", "akka-remote", new AkkaRemoteProject(_), akka_typed_actor) + lazy val akka_amqp = project("akka-amqp", "akka-amqp", new AkkaAMQPProject(_), akka_remote) + lazy val akka_http = project("akka-http", "akka-http", new AkkaHttpProject(_), akka_remote, akka_camel) + lazy val akka_camel = project("akka-camel", "akka-camel", new AkkaCamelProject(_), akka_remote) lazy val akka_persistence = project("akka-persistence", "akka-persistence", new AkkaPersistenceParentProject(_)) - lazy val akka_spring = project("akka-spring", "akka-spring", new AkkaSpringProject(_), akka_remote, akka_camel) - lazy val akka_jta = project("akka-jta", "akka-jta", new AkkaJTAProject(_), akka_remote) - lazy val akka_kernel = project("akka-kernel", "akka-kernel", new AkkaKernelProject(_), - akka_remote, akka_jta, akka_http, akka_spring, akka_camel, akka_persistence, akka_amqp) - lazy val akka_osgi = project("akka-osgi", "akka-osgi", new AkkaOSGiParentProject(_)) - lazy val akka_samples = project("akka-samples", "akka-samples", new AkkaSamplesParentProject(_)) + lazy val akka_spring = project("akka-spring", "akka-spring", new AkkaSpringProject(_), akka_remote, akka_camel) + lazy val akka_jta = project("akka-jta", "akka-jta", new AkkaJTAProject(_), akka_remote) + lazy val akka_kernel = project("akka-kernel", "akka-kernel", new AkkaKernelProject(_), + akka_remote, akka_jta, akka_http, akka_spring, akka_camel, akka_persistence, akka_amqp) + lazy val akka_osgi = project("akka-osgi", "akka-osgi", new AkkaOSGiParentProject(_)) + lazy val akka_samples = project("akka-samples", "akka-samples", new AkkaSamplesParentProject(_)) // ------------------------------------------------------------------------------------------------------------------- // Miscellaneous @@ -253,37 +266,37 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { (IMPLEMENTATION_TITLE, "Akka"), (IMPLEMENTATION_URL, "http://akkasource.org"), (IMPLEMENTATION_VENDOR, "The Akka Project") - )).toList ::: - getMainClass(false).map(MainClass(_)).toList + )).toList ::: + getMainClass(false).map(MainClass(_)).toList // create a manifest with all akka jars and dependency jars on classpath override def manifestClassPath = Some(allArtifacts.getFiles - .filter(_.getName.endsWith(".jar")) - .filter(!_.getName.contains("servlet_2.4")) - .filter(!_.getName.contains("scala-library")) - .map("lib_managed/scala_%s/compile/".format(buildScalaVersion) + _.getName) - .mkString(" ") + - " config/" + - " scala-library.jar" + - " dist/akka-actor_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-typed-actor_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-remote_%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-amqp_%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-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) + .filter(_.getName.endsWith(".jar")) + .filter(!_.getName.contains("servlet_2.4")) + .filter(!_.getName.contains("scala-library")) + .map("lib_managed/scala_%s/compile/".format(buildScalaVersion) + _.getName) + .mkString(" ") + + " config/" + + " scala-library.jar" + + " dist/akka-actor_%s-%s.jar".format(buildScalaVersion, version) + + " dist/akka-typed-actor_%s-%s.jar".format(buildScalaVersion, version) + + " dist/akka-remote_%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-amqp_%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-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) ) //Exclude slf4j1.5.11 from the classpath, it's conflicting... override def fullClasspath(config: Configuration): PathFinder = { super.fullClasspath(config) --- - (super.fullClasspath(config) ** "slf4j*1.5.11.jar") + (super.fullClasspath(config) ** "slf4j*1.5.11.jar") } override def mainResources = super.mainResources +++ @@ -304,57 +317,60 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { //override def documentOptions = encodingUtf8.map(SimpleDocOption(_)) override def packageDocsJar = defaultJarPath("-docs.jar") - override def packageSrcJar= defaultJarPath("-sources.jar") + + override def packageSrcJar = defaultJarPath("-sources.jar") + override def packageToPublishActions = super.packageToPublishActions ++ Seq(packageDocs, packageSrc) override def pomExtra = 2009 - http://akkasource.org - - Scalable Solutions AB - http://scalablesolutions.se - - - - Apache 2 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - + http://akkasource.org + + Scalable Solutions AB + http://scalablesolutions.se + + + + Apache 2 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + // publish to local mvn import Process._ lazy val publishLocalMvn = runMvnInstall + def runMvnInstall = task { for (absPath <- akkaArtifacts.getPaths) { val artifactRE = """(.*)/dist/(.*)-(.*).jar""".r val artifactRE(path, artifactId, artifactVersion) = absPath val command = "mvn install:install-file" + - " -Dfile=" + absPath + - " -DgroupId=se.scalablesolutions.akka" + - " -DartifactId=" + artifactId + - " -Dversion=" + version + - " -Dpackaging=jar -DgeneratePom=true" + " -Dfile=" + absPath + + " -DgroupId=se.scalablesolutions.akka" + + " -DartifactId=" + artifactId + + " -Dversion=" + version + + " -Dpackaging=jar -DgeneratePom=true" command ! log } None - } dependsOn(dist) describedAs("Run mvn install for artifacts in dist.") + } dependsOn (dist) describedAs ("Run mvn install for artifacts in dist.") // ------------------------------------------------------------------------------------------------------------------- // akka-actor subproject // ------------------------------------------------------------------------------------------------------------------- class AkkaActorProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val configgy = Dependencies.configgy - val hawtdispatch = Dependencies.hawtdispatch - val multiverse = Dependencies.multiverse - val jsr166x = Dependencies.jsr166x - val slf4j = Dependencies.slf4j - val logback = Dependencies.logback - val logback_core = Dependencies.logback_core + val configgy = Dependencies.configgy + val hawtdispatch = Dependencies.hawtdispatch + val multiverse = Dependencies.multiverse + val jsr166x = Dependencies.jsr166x + val slf4j = Dependencies.slf4j + val logback = Dependencies.logback + val logback_core = Dependencies.logback_core // testing - val junit = Dependencies.junit + val junit = Dependencies.junit val scalatest = Dependencies.scalatest } @@ -363,13 +379,13 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaTypedActorProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val aopalliance = Dependencies.aopalliance - val werkz = Dependencies.werkz - val werkz_core = Dependencies.werkz_core - val guicey = Dependencies.guicey + val aopalliance = Dependencies.aopalliance + val werkz = Dependencies.werkz + val werkz_core = Dependencies.werkz_core + val guicey = Dependencies.guicey // testing - val junit = Dependencies.junit + val junit = Dependencies.junit val scalatest = Dependencies.scalatest } @@ -379,22 +395,22 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaRemoteProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val commons_codec = Dependencies.commons_codec - val commons_io = Dependencies.commons_io + val commons_io = Dependencies.commons_io val dispatch_http = Dependencies.dispatch_http val dispatch_json = Dependencies.dispatch_json - val guicey = Dependencies.guicey - val h2_lzf = Dependencies.h2_lzf - val jackson = Dependencies.jackson - val jackson_core = Dependencies.jackson_core - val jgroups = Dependencies.jgroups - val jta_1_1 = Dependencies.jta_1_1 - val netty = Dependencies.netty - val protobuf = Dependencies.protobuf - val sbinary = Dependencies.sbinary - val sjson = Dependencies.sjson + val guicey = Dependencies.guicey + val h2_lzf = Dependencies.h2_lzf + val jackson = Dependencies.jackson + val jackson_core = Dependencies.jackson_core + val jgroups = Dependencies.jgroups + val jta_1_1 = Dependencies.jta_1_1 + val netty = Dependencies.netty + val protobuf = Dependencies.protobuf + val sbinary = Dependencies.sbinary + val sjson = Dependencies.sjson // testing - val junit = Dependencies.junit + val junit = Dependencies.junit val scalatest = Dependencies.scalatest override def bndImportPackage = "javax.transaction;version=1.1" :: super.bndImportPackage.toList @@ -406,13 +422,13 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaAMQPProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val commons_io = Dependencies.commons_io - val rabbit = Dependencies.rabbit - val protobuf = Dependencies.protobuf + val rabbit = Dependencies.rabbit + val protobuf = Dependencies.protobuf // testing - val junit = Dependencies.junit + val junit = Dependencies.junit val multiverse = Dependencies.multiverse - val scalatest = Dependencies.scalatest + val scalatest = Dependencies.scalatest } // ------------------------------------------------------------------------------------------------------------------- @@ -420,28 +436,28 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaHttpProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val annotation = Dependencies.annotation - val atmo = Dependencies.atmo - val atmo_jbossweb = Dependencies.atmo_jbossweb - val atmo_jersey = Dependencies.atmo_jersey - val atmo_runtime = Dependencies.atmo_runtime - val atmo_tomcat = Dependencies.atmo_tomcat - val atmo_weblogic = Dependencies.atmo_weblogic - val jetty = Dependencies.jetty - val jetty_util = Dependencies.jetty_util - val jetty_xml = Dependencies.jetty_xml - val jetty_servlet = Dependencies.jetty_servlet + val annotation = Dependencies.annotation + val atmo = Dependencies.atmo + val atmo_jbossweb = Dependencies.atmo_jbossweb + val atmo_jersey = Dependencies.atmo_jersey + val atmo_runtime = Dependencies.atmo_runtime + val atmo_tomcat = Dependencies.atmo_tomcat + val atmo_weblogic = Dependencies.atmo_weblogic + val jetty = Dependencies.jetty + val jetty_util = Dependencies.jetty_util + val jetty_xml = Dependencies.jetty_xml + val jetty_servlet = Dependencies.jetty_servlet val jackson_core_asl = Dependencies.jackson_core_asl - val jersey = Dependencies.jersey - val jersey_contrib = Dependencies.jersey_contrib - val jersey_json = Dependencies.jersey_json - val jersey_server = Dependencies.jersey_server - val jsr311 = Dependencies.jsr311 - val stax_api = Dependencies.stax_api + val jersey = Dependencies.jersey + val jersey_contrib = Dependencies.jersey_contrib + val jersey_json = Dependencies.jersey_json + val jersey_server = Dependencies.jersey_server + val jsr311 = Dependencies.jsr311 + val stax_api = Dependencies.stax_api // testing - val junit = Dependencies.junit - val mockito = Dependencies.mockito + val junit = Dependencies.junit + val mockito = Dependencies.mockito val scalatest = Dependencies.scalatest } @@ -476,7 +492,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaPersistenceCommonProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val commons_pool = Dependencies.commons_pool - val thrift = Dependencies.thrift + val thrift = Dependencies.thrift } // ------------------------------------------------------------------------------------------------------------------- @@ -485,7 +501,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaRedisProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val commons_codec = Dependencies.commons_codec - val redis = Dependencies.redis + val redis = Dependencies.redis override def testOptions = TestFilter((name: String) => name.endsWith("Test")) :: Nil } @@ -506,30 +522,38 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaCassandraProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val cassandra = Dependencies.cassandra + val cassandra = Dependencies.cassandra // testing val cassandra_clhm = Dependencies.cassandra_clhm - val commons_coll = Dependencies.commons_coll - val google_coll = Dependencies.google_coll - val high_scale = Dependencies.high_scale + val commons_coll = Dependencies.commons_coll + val google_coll = Dependencies.google_coll + val high_scale = Dependencies.high_scale override def testOptions = TestFilter((name: String) => name.endsWith("Test")) :: Nil } - // ------------------------------------------------------------------------------------------------------------------- - // akka-persistence-voldemort subproject - // ------------------------------------------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------------------------------------------- + // akka-persistence-voldemort subproject + // ------------------------------------------------------------------------------------------------------------------- - class AkkaVoldemortProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val voldemort = Dependencies.voldemort - val voldemort_contrib = Dependencies.voldemort_contrib + class AkkaVoldemortProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { + val voldemort = Dependencies.voldemort + val voldemort_contrib = Dependencies.voldemort_contrib + val voldemort_needs_log4j = Dependencies.voldemort_needs_log4j - //testing - val scalatest = Dependencies.scalatest - override def testOptions = TestFilter((name: String) => name.endsWith("Test")) :: Nil - } + //testing + val scalatest = Dependencies.scalatest + val google_coll = Dependencies.google_coll + val jdom = Dependencies.jdom + val jetty = Dependencies.vold_jetty + val velocity = Dependencies.velocity + val bdb = Dependencies.bdb + val dbcp = Dependencies.dbcp + + override def testOptions = TestFilter((name: String) => name.endsWith("Suite")) :: Nil + } @@ -545,13 +569,13 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaSpringProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val spring_beans = Dependencies.spring_beans + val spring_beans = Dependencies.spring_beans val spring_context = Dependencies.spring_context // testing val camel_spring = Dependencies.camel_spring - val junit = Dependencies.junit - val scalatest = Dependencies.scalatest + val junit = Dependencies.junit + val scalatest = Dependencies.scalatest } // ------------------------------------------------------------------------------------------------------------------- @@ -559,7 +583,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaJTAProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val atomikos_transactions = Dependencies.atomikos_transactions + val atomikos_transactions = Dependencies.atomikos_transactions val atomikos_transactions_api = Dependencies.atomikos_transactions_api val atomikos_transactions_jta = Dependencies.atomikos_transactions_jta //val jta_1_1 = Dependencies.jta_1_1 @@ -575,15 +599,18 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { new AkkaOSGiDependenciesBundleProject(_), akka_kernel, akka_jta) // akka_kernel does not depend on akka_jta (why?) therefore we list akka_jta here lazy val akka_osgi_assembly = project("akka-osgi-assembly", "akka-osgi-assembly", new AkkaOSGiAssemblyProject(_), akka_osgi_dependencies_bundle, akka_remote, akka_amqp, akka_http, - akka_camel, akka_spring, akka_jta, akka_persistence.akka_persistence_common, - akka_persistence.akka_persistence_redis, akka_persistence.akka_persistence_mongo, - akka_persistence.akka_persistence_cassandra) + akka_camel, akka_spring, akka_jta, akka_persistence.akka_persistence_common, + akka_persistence.akka_persistence_redis, akka_persistence.akka_persistence_mongo, + akka_persistence.akka_persistence_cassandra) } class AkkaOSGiDependenciesBundleProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) with BNDPlugin { override def bndClasspath = compileClasspath + override def bndPrivatePackage = Seq("") + override def bndImportPackage = Seq("*;resolution:=optional") + override def bndExportPackage = Seq( "org.aopalliance.*;version=1.0.0", @@ -611,36 +638,36 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { val scala_bundle = "com.weiglewilczek.scala-lang-osgi" % "scala-library" % buildScalaVersion % "compile" intransitive // Camel bundles - val camel_core = Dependencies.camel_core.intransitive + val camel_core = Dependencies.camel_core.intransitive val fusesource_commonman = "org.fusesource.commonman" % "commons-management" % "1.0" intransitive // Spring bundles - val spring_beans = Dependencies.spring_beans.intransitive - val spring_context = Dependencies.spring_context.intransitive - val spring_aop = "org.springframework" % "spring-aop" % SPRING_VERSION % "compile" intransitive - val spring_asm = "org.springframework" % "spring-asm" % SPRING_VERSION % "compile" intransitive - val spring_core = "org.springframework" % "spring-core" % SPRING_VERSION % "compile" intransitive + val spring_beans = Dependencies.spring_beans.intransitive + val spring_context = Dependencies.spring_context.intransitive + val spring_aop = "org.springframework" % "spring-aop" % SPRING_VERSION % "compile" intransitive + val spring_asm = "org.springframework" % "spring-asm" % SPRING_VERSION % "compile" intransitive + val spring_core = "org.springframework" % "spring-core" % SPRING_VERSION % "compile" intransitive val spring_expression = "org.springframework" % "spring-expression" % SPRING_VERSION % "compile" intransitive - val spring_jms = "org.springframework" % "spring-jms" % SPRING_VERSION % "compile" intransitive - val spring_tx = "org.springframework" % "spring-tx" % SPRING_VERSION % "compile" intransitive + val spring_jms = "org.springframework" % "spring-jms" % SPRING_VERSION % "compile" intransitive + val spring_tx = "org.springframework" % "spring-tx" % SPRING_VERSION % "compile" intransitive - val commons_codec = Dependencies.commons_codec.intransitive - val commons_io = Dependencies.commons_io.intransitive - val commons_pool = Dependencies.commons_pool.intransitive - val guicey = Dependencies.guicey.intransitive - val jackson = Dependencies.jackson.intransitive - val jackson_core = Dependencies.jackson_core.intransitive - val jsr311 = Dependencies.jsr311.intransitive - val jta_1_1 = Dependencies.jta_1_1.intransitive - val netty = Dependencies.netty.intransitive - val commons_fileupload = "commons-fileupload" % "commons-fileupload" % "1.2.1" % "compile" intransitive - val jms_1_1 = "org.apache.geronimo.specs" % "geronimo-jms_1.1_spec" % "1.1.1" % "compile" intransitive - val joda = "joda-time" % "joda-time" % "1.6" intransitive + val commons_codec = Dependencies.commons_codec.intransitive + val commons_io = Dependencies.commons_io.intransitive + val commons_pool = Dependencies.commons_pool.intransitive + val guicey = Dependencies.guicey.intransitive + val jackson = Dependencies.jackson.intransitive + val jackson_core = Dependencies.jackson_core.intransitive + val jsr311 = Dependencies.jsr311.intransitive + val jta_1_1 = Dependencies.jta_1_1.intransitive + val netty = Dependencies.netty.intransitive + val commons_fileupload = "commons-fileupload" % "commons-fileupload" % "1.2.1" % "compile" intransitive + val jms_1_1 = "org.apache.geronimo.specs" % "geronimo-jms_1.1_spec" % "1.1.1" % "compile" intransitive + val joda = "joda-time" % "joda-time" % "1.6" intransitive override def packageAction = task { val libs: Seq[Path] = managedClasspath(config("compile")).get.toSeq - val prjs: Seq[Path] = info.dependencies.toSeq.asInstanceOf[Seq[DefaultProject]] map { _.jarPath } + val prjs: Seq[Path] = info.dependencies.toSeq.asInstanceOf[Seq[DefaultProject]] map {_.jarPath} val all = libs ++ prjs val destination = outputPath / "bundles" FileUtilities.copyFlat(all, destination, log) @@ -691,7 +718,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { - + @@ -702,8 +729,8 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaSampleSecurityProject(info: ProjectInfo) extends AkkaDefaultProject(info, deployPath) { val commons_codec = Dependencies.commons_codec - val jsr250 = Dependencies.jsr250 - val jsr311 = Dependencies.jsr311 + val jsr250 = Dependencies.jsr250 + val jsr311 = Dependencies.jsr311 } class AkkaSampleOSGiProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) with BNDPlugin { @@ -740,63 +767,71 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- def removeDupEntries(paths: PathFinder) = - Path.lazyPathFinder { - val mapped = paths.get map { p => (p.relativePath, p) } - (Map() ++ mapped).values.toList - } + Path.lazyPathFinder { + val mapped = paths.get map {p => (p.relativePath, p)} + (Map() ++ mapped).values.toList + } def allArtifacts = { Path.fromFile(buildScalaInstance.libraryJar) +++ - (removeDupEntries(runClasspath filter ClasspathUtilities.isArchive) +++ - ((outputPath ##) / defaultJarName) +++ - mainResources +++ - mainDependencies.scalaJars +++ - descendents(info.projectPath / "scripts", "run_akka.sh") +++ - descendents(info.projectPath / "scripts", "akka-init-script.sh") +++ - descendents(info.projectPath / "dist", "*.jar") +++ - descendents(info.projectPath / "deploy", "*.jar") +++ - descendents(path("lib") ##, "*.jar") +++ - descendents(configurationPath(Configurations.Compile) ##, "*.jar")) - .filter(jar => // remove redundant libs - !jar.toString.endsWith("stax-api-1.0.1.jar") || - !jar.toString.endsWith("scala-library-2.7.7.jar") - ) + (removeDupEntries(runClasspath filter ClasspathUtilities.isArchive) +++ + ((outputPath ##) / defaultJarName) +++ + mainResources +++ + mainDependencies.scalaJars +++ + descendents(info.projectPath / "scripts", "run_akka.sh") +++ + descendents(info.projectPath / "scripts", "akka-init-script.sh") +++ + descendents(info.projectPath / "dist", "*.jar") +++ + descendents(info.projectPath / "deploy", "*.jar") +++ + descendents(path("lib") ##, "*.jar") +++ + descendents(configurationPath(Configurations.Compile) ##, "*.jar")) + .filter(jar => // remove redundant libs + !jar.toString.endsWith("stax-api-1.0.1.jar") || + !jar.toString.endsWith("scala-library-2.7.7.jar") + ) } - def akkaArtifacts = descendents(info.projectPath / "dist", "*" + buildScalaVersion + "-" + version + ".jar") + def akkaArtifacts = descendents(info.projectPath / "dist", "*" + buildScalaVersion + "-" + version + ".jar") // ------------------------------------------------------------ class AkkaDefaultProject(info: ProjectInfo, val deployPath: Path) extends DefaultProject(info) with DeployProject with OSGiProject { lazy val sourceArtifact = Artifact(this.artifactID, "sources", "jar", Some("sources"), Nil, None) lazy val docsArtifact = Artifact(this.artifactID, "docs", "jar", Some("docs"), Nil, None) + override def runClasspath = super.runClasspath +++ (AkkaParentProject.this.info.projectPath / "config") + override def testClasspath = super.testClasspath +++ (AkkaParentProject.this.info.projectPath / "config") + override def packageDocsJar = this.defaultJarPath("-docs.jar") - override def packageSrcJar = this.defaultJarPath("-sources.jar") + + override def packageSrcJar = this.defaultJarPath("-sources.jar") + override def packageToPublishActions = super.packageToPublishActions ++ Seq(this.packageDocs, this.packageSrc) } } -trait DeployProject { self: BasicScalaProject => +trait DeployProject { + self: BasicScalaProject => // defines where the deployTask copies jars to def deployPath: Path - lazy val dist = deployTask(jarPath, packageDocsJar, packageSrcJar, deployPath, true, true, true) dependsOn( - `package`, packageDocs, packageSrc) describedAs("Deploying") + lazy val dist = deployTask(jarPath, packageDocsJar, packageSrcJar, deployPath, true, true, true) dependsOn ( + `package`, packageDocs, packageSrc) describedAs ("Deploying") + def deployTask(jar: Path, docs: Path, src: Path, toDir: Path, genJar: Boolean, genDocs: Boolean, genSource: Boolean) = task { def gen(jar: Path, toDir: Path, flag: Boolean, msg: String): Option[String] = - if (flag) { - log.info(msg + " " + jar) - FileUtilities.copyFile(jar, toDir / jar.name, log) - } else None + if (flag) { + log.info(msg + " " + jar) + FileUtilities.copyFile(jar, toDir / jar.name, log) + } else None gen(jar, toDir, genJar, "Deploying bits") orElse - gen(docs, toDir, genDocs, "Deploying docs") orElse - gen(src, toDir, genSource, "Deploying sources") + gen(docs, toDir, genDocs, "Deploying docs") orElse + gen(src, toDir, genSource, "Deploying sources") } } -trait OSGiProject extends BNDPlugin { self: DefaultProject => +trait OSGiProject extends BNDPlugin { + self: DefaultProject => override def bndExportPackage = Seq("se.scalablesolutions.akka.*;version=%s".format(projectVersion.value)) } From 46c24fd17041afd62fe9143c2c8f0a658c2dcfa6 Mon Sep 17 00:00:00 2001 From: ticktock Date: Wed, 15 Sep 2010 19:37:21 -0400 Subject: [PATCH 04/14] switched voldemort to log4j-over-slf4j --- project/build/AkkaProject.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index b74dfea6e2..baafa848f8 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -209,7 +209,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val voldemort = "voldemort" % "voldemort" % "0.81" % "compile" lazy val voldemort_contrib = "voldemort" % "voldemort-contrib" % "0.81" % "compile" - lazy val voldemort_needs_log4j = "log4j" % "log4j" % "1.2.16" % "compile" + lazy val voldemort_needs_log4j = "org.slf4j" % "log4j-over-slf4j" % SLF4J_VERSION % "compile" lazy val werkz = "org.codehaus.aspectwerkz" % "aspectwerkz-nodeps-jdk5" % ASPECTWERKZ_VERSION % "compile" lazy val werkz_core = "org.codehaus.aspectwerkz" % "aspectwerkz-jdk5" % ASPECTWERKZ_VERSION % "compile" From e617b1381079c828c568f42967d84916aaa5b08b Mon Sep 17 00:00:00 2001 From: ticktock Date: Wed, 15 Sep 2010 19:37:54 -0400 Subject: [PATCH 05/14] Initial tests working with bdb backed voldemort, --- .../main/scala/VoldemortStorageBackend.scala | 3 +- .../src/test/resources/config/stores.xml | 10 ++-- .../src/test/scala/EmbeddedVoldemort.scala | 14 +++-- .../scala/VoldemortStorageBackendSuite.scala | 56 +++++++++++++------ 4 files changed, 54 insertions(+), 29 deletions(-) diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala index 6915a7bca8..f0912a411d 100644 --- a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala @@ -21,6 +21,7 @@ import collection.mutable.{Map, Set, HashSet, ArrayBuffer} import java.util.{Map => JMap} + private[akka] object VoldemortStorageBackend extends MapStorageBackend[Array[Byte], Array[Byte]] with VectorStorageBackend[Array[Byte]] with @@ -229,7 +230,7 @@ MapStorageBackend[Array[Byte], Array[Byte]] with def getIndexFromVectorValueKey(owner: String, key: Array[Byte]): Int = { val indexBytes = new Array[Byte](IntSerializer.bytesPerInt) - System.arraycopy(key, key.length - IntSerializer.bytesPerInt - 1, indexBytes, 0, IntSerializer.bytesPerInt) + System.arraycopy(key, key.length - IntSerializer.bytesPerInt , indexBytes, 0, IntSerializer.bytesPerInt) IntSerializer.fromBytes(indexBytes) } diff --git a/akka-persistence/akka-persistence-voldemort/src/test/resources/config/stores.xml b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/stores.xml index b0491ea9a4..78f1b1385a 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/resources/config/stores.xml +++ b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/stores.xml @@ -6,7 +6,7 @@ 1 1 1 - memory + bdb client string @@ -23,7 +23,7 @@ 1 1 1 - memory + bdb client identity @@ -39,7 +39,7 @@ 1 1 1 - memory + bdb client string @@ -56,7 +56,7 @@ 1 1 1 - memory + bdb client identity @@ -72,7 +72,7 @@ 1 1 1 - memory + bdb client string diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala index 5631542a78..395825152e 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala @@ -1,29 +1,33 @@ package se.scalablesolutions.akka.persistence.voldemort import org.scalatest.matchers.ShouldMatchers -import se.scalablesolutions.akka.util.UUID import voldemort.server.{VoldemortServer, VoldemortConfig} import org.scalatest.{Suite, BeforeAndAfterAll, FunSuite} import org.junit.runner.RunWith import org.scalatest.junit.JUnitRunner import voldemort.utils.Utils import java.io.File +import se.scalablesolutions.akka.util.{Logging, UUID} @RunWith(classOf[JUnitRunner]) -trait EmbeddedVoldemort extends BeforeAndAfterAll { +trait EmbeddedVoldemort extends BeforeAndAfterAll with Logging { this: Suite => var server: VoldemortServer = null override protected def beforeAll(): Unit = { try { - val dir = "./akka-persistence/akka-persistence-voldemort/src/test/resources" + val dir = "./akka-persistence/akka-persistence-voldemort/target/scala_2.8.0/test-resources" val home = new File(dir) + log.info("Creating Voldemort Config") val config = VoldemortConfig.loadFromVoldemortHome(home.getCanonicalPath) + log.info("Starting Voldemort") server = new VoldemortServer(config) - server.start + server.start + log.info("Started") } catch { - case e => e.printStackTrace + case e => log.error(e, "Error Starting Voldemort") + throw e } } diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala index 68f1ebed0f..d589e79f0c 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala @@ -7,46 +7,66 @@ import org.scalatest.junit.JUnitRunner import se.scalablesolutions.akka.persistence.voldemort.VoldemortStorageBackend._ import se.scalablesolutions.akka.util.{Logging, UUID} import collection.immutable.TreeSet +import VoldemortStorageBackendSuite._ @RunWith(classOf[JUnitRunner]) class VoldemortStorageBackendSuite extends FunSuite with ShouldMatchers with EmbeddedVoldemort with Logging { test("that ref storage and retrieval works") { - refClient.put("testRef", "testRefValue".getBytes("UTF-8")) - new String(refClient.getValue("testRef", Array.empty[Byte]), "UTF-8") should be("testRefValue") + val key = "testRef" + val value = "testRefValue" + val valueBytes = bytes(value) + refClient.delete(key) + refClient.getValue(key, empty) should be(empty) + refClient.put(key, valueBytes) + refClient.getValue(key) should be(valueBytes) } test("that map key storage and retrieval works") { - val mapKeys = new TreeSet[Array[Byte]] + "key1".getBytes - mapKeyClient.put("testMapKey", mapKeys) - val returned = mapKeyClient.getValue("testMapKey", new TreeSet[Array[Byte]]) - returned should equal(mapKeys) + val key = "testmapKey" + val mapKeys = new TreeSet[Array[Byte]] + bytes("key1") + mapKeyClient.delete(key) + mapKeyClient.getValue(key, emptySet) should equal(emptySet) + mapKeyClient.put(key, mapKeys) + mapKeyClient.getValue(key, emptySet) should equal(mapKeys) + } test("that map value storage and retrieval works") { - val key = "keyForTestingMapValueClient".getBytes("UTF-8") - val value = "value for testing map value client".getBytes("UTF-8") + val key = bytes("keyForTestingMapValueClient") + val value = bytes("value for testing map value client") mapValueClient.put(key, value) - mapValueClient.getValue(key) should equal(value) + mapValueClient.getValue(key, empty) should equal(value) } test("that vector size storage and retrieval works") { val key = "vectorKey" - vectorSizeClient.put(key, IntSerializer.toBytes(17)) - vectorSizeClient.getValue(key) should equal(IntSerializer.toBytes(17)) + val size = IntSerializer.toBytes(17) + vectorSizeClient.delete(key) + vectorSizeClient.getValue(key, empty) should equal(empty) + vectorSizeClient.put(key, size) + vectorSizeClient.getValue(key) should equal(size) } test("that vector value storage and retrieval works") { val key = "vectorValueKey" val index = 3 - val value = "some bytes".getBytes("UTF-8") + val value = bytes("some bytes") val vecKey = getVectorValueKey(key, index) - try{ - val idx = getIndexFromVectorValueKey(key, vecKey) + getIndexFromVectorValueKey(key, vecKey) should be(index) + vectorValueClient.delete(vecKey) + vectorValueClient.getValue(vecKey, empty) should equal(empty) vectorValueClient.put(vecKey, value) - vectorValueClient.get(vecKey) should equal(value) - } catch{ - case e => e.printStackTrace - } + vectorValueClient.getValue(vecKey) should equal(value) + } + +} + +object VoldemortStorageBackendSuite { + val empty = Array.empty[Byte] + val emptySet = new TreeSet[Array[Byte]] + + def bytes(value: String): Array[Byte] = { + value.getBytes("UTF-8") } } \ No newline at end of file From 364ad7af6dda8015cde8a40efab5bf6b17b0ad6a Mon Sep 17 00:00:00 2001 From: ticktock Date: Wed, 15 Sep 2010 20:20:56 -0400 Subject: [PATCH 06/14] more tests, working on map api --- .../main/scala/VoldemortStorageBackend.scala | 16 +++++----- .../scala/VoldemortStorageBackendSuite.scala | 30 +++++++++++++++++++ 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala index f0912a411d..fb40614adc 100644 --- a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala @@ -21,7 +21,6 @@ import collection.mutable.{Map, Set, HashSet, ArrayBuffer} import java.util.{Map => JMap} - private[akka] object VoldemortStorageBackend extends MapStorageBackend[Array[Byte], Array[Byte]] with VectorStorageBackend[Array[Byte]] with @@ -78,16 +77,17 @@ MapStorageBackend[Array[Byte], Array[Byte]] with private def getKeyValues(keys: SortedSet[Array[Byte]]): List[(Array[Byte], Array[Byte])] = { val all: JMap[Array[Byte], Versioned[Array[Byte]]] = mapValueClient.getAll(JavaConversions.asIterable(keys)) - JavaConversions.asMap(all).foldLeft(new ArrayBuffer[(Array[Byte], Array[Byte])](all.size)) { - (buf, keyVal) => { - keyVal match { - case (key, versioned) => { + val buf = new ArrayBuffer[(Array[Byte], Array[Byte])](all.size) + JavaConversions.asMap(all).foreach { + (entry) => { + entry match { + case (key: Array[Byte], versioned: Versioned[Array[Byte]]) => { buf += key -> versioned.getValue } } - buf } - }.toList + } + buf.toList } def getMapStorageSizeFor(name: String): Int = { @@ -230,7 +230,7 @@ MapStorageBackend[Array[Byte], Array[Byte]] with def getIndexFromVectorValueKey(owner: String, key: Array[Byte]): Int = { val indexBytes = new Array[Byte](IntSerializer.bytesPerInt) - System.arraycopy(key, key.length - IntSerializer.bytesPerInt , indexBytes, 0, IntSerializer.bytesPerInt) + System.arraycopy(key, key.length - IntSerializer.bytesPerInt, indexBytes, 0, IntSerializer.bytesPerInt) IntSerializer.fromBytes(indexBytes) } diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala index d589e79f0c..0a2deb6463 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala @@ -21,6 +21,16 @@ class VoldemortStorageBackendSuite extends FunSuite with ShouldMatchers with Emb refClient.getValue(key) should be(valueBytes) } + test("PersistentRef apis function as expected") { + val key = "apiTestRef" + val value = "apiTestRefValue" + val valueBytes = bytes(value) + refClient.delete(key) + getRefStorageFor(key) should be(None) + insertRefStorageFor(key, valueBytes) + getRefStorageFor(key).get should equal(valueBytes) + } + test("that map key storage and retrieval works") { val key = "testmapKey" val mapKeys = new TreeSet[Array[Byte]] + bytes("key1") @@ -38,6 +48,26 @@ class VoldemortStorageBackendSuite extends FunSuite with ShouldMatchers with Emb mapValueClient.getValue(key, empty) should equal(value) } + + test("PersistentMap apis function as expected") { + val name = "theMap" + val key = bytes("mapkey") + val value = bytes("mapValue") + removeMapStorageFor(name,key) + removeMapStorageFor(name) + getMapStorageEntryFor(name,key) should be (None) + getMapStorageSizeFor(name) should be (0) + getMapStorageFor(name).length should be(0) + getMapStorageRangeFor(name,None,None,100).length should be (0) + insertMapStorageEntryFor(name,key,value) + getMapStorageEntryFor(name,key).get should equal(value) + getMapStorageSizeFor(name) should be (1) + getMapStorageFor(name).length should be(1) + getMapStorageRangeFor(name,None,None,100).length should be (1) + + + } + test("that vector size storage and retrieval works") { val key = "vectorKey" val size = IntSerializer.toBytes(17) From f69d1b73da58c7bad84206c2cc6a3735f29cbc9f Mon Sep 17 00:00:00 2001 From: ticktock Date: Wed, 15 Sep 2010 22:39:34 -0400 Subject: [PATCH 07/14] tests of PersistentRef,Map,Vector StorageBackend working --- .../main/scala/VoldemortStorageBackend.scala | 30 +++++---- .../scala/VoldemortStorageBackendSuite.scala | 64 ++++++++++++++++--- 2 files changed, 72 insertions(+), 22 deletions(-) diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala index fb40614adc..d0efd7347e 100644 --- a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala @@ -67,16 +67,20 @@ MapStorageBackend[Array[Byte], Array[Byte]] with def getMapStorageRangeFor(name: String, start: Option[Array[Byte]], finish: Option[Array[Byte]], count: Int): List[(Array[Byte], Array[Byte])] = { val allkeys: SortedSet[Array[Byte]] = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]) val range = allkeys.rangeImpl(start, finish).take(count) - getKeyValues(range) + getKeyValues(name, range) } def getMapStorageFor(name: String): List[(Array[Byte], Array[Byte])] = { val keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) - getKeyValues(keys) + getKeyValues(name, keys) } - private def getKeyValues(keys: SortedSet[Array[Byte]]): List[(Array[Byte], Array[Byte])] = { - val all: JMap[Array[Byte], Versioned[Array[Byte]]] = mapValueClient.getAll(JavaConversions.asIterable(keys)) + private def getKeyValues(name: String, keys: SortedSet[Array[Byte]]): List[(Array[Byte], Array[Byte])] = { + val all: JMap[Array[Byte], Versioned[Array[Byte]]] = + mapValueClient.getAll(JavaConversions.asIterable(keys.map { + mapKey => getKey(name, mapKey) + })) + val buf = new ArrayBuffer[(Array[Byte], Array[Byte])](all.size) JavaConversions.asMap(all).foreach { (entry) => { @@ -155,26 +159,26 @@ MapStorageBackend[Array[Byte], Array[Byte]] with } else { count } - val seq: IndexedSeq[Array[Byte]] = (st to st + cnt).map { + val seq: IndexedSeq[Array[Byte]] = (st until st + cnt).map { index => getVectorValueKey(name, index) } val all: JMap[Array[Byte], Versioned[Array[Byte]]] = vectorValueClient.getAll(JavaConversions.asIterable(seq)) - val buf = new ArrayBuffer[Array[Byte]](seq.size) + var storage = new ArrayBuffer[Array[Byte]](seq.size) + storage = storage.padTo(seq.size, Array.empty[Byte]) + var idx = 0; seq.foreach { key => { - val index = getIndexFromVectorValueKey(name, key) - var value: Array[Byte] = null if (all.containsKey(key)) { - value = all.get(key).getValue - } else { - value = Array.empty[Byte] + storage.update(idx, all.get(key).getValue) } - buf.update(index, value) + idx += 1 } } - buf.toList + log.info("StorageSize:" + storage.size) + log.info("SeqSize:" + seq.size) + storage.toList } diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala index 0a2deb6463..8906daa5fb 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala @@ -53,18 +53,33 @@ class VoldemortStorageBackendSuite extends FunSuite with ShouldMatchers with Emb val name = "theMap" val key = bytes("mapkey") val value = bytes("mapValue") - removeMapStorageFor(name,key) + removeMapStorageFor(name, key) removeMapStorageFor(name) - getMapStorageEntryFor(name,key) should be (None) - getMapStorageSizeFor(name) should be (0) + getMapStorageEntryFor(name, key) should be(None) + getMapStorageSizeFor(name) should be(0) getMapStorageFor(name).length should be(0) - getMapStorageRangeFor(name,None,None,100).length should be (0) - insertMapStorageEntryFor(name,key,value) - getMapStorageEntryFor(name,key).get should equal(value) - getMapStorageSizeFor(name) should be (1) - getMapStorageFor(name).length should be(1) - getMapStorageRangeFor(name,None,None,100).length should be (1) + getMapStorageRangeFor(name, None, None, 100).length should be(0) + insertMapStorageEntryFor(name, key, value) + + getMapStorageEntryFor(name, key).get should equal(value) + getMapStorageSizeFor(name) should be(1) + getMapStorageFor(name).length should be(1) + getMapStorageRangeFor(name, None, None, 100).length should be(1) + + removeMapStorageFor(name, key) + removeMapStorageFor(name) + getMapStorageEntryFor(name, key) should be(None) + getMapStorageSizeFor(name) should be(0) + getMapStorageFor(name).length should be(0) + getMapStorageRangeFor(name, None, None, 100).length should be(0) + + insertMapStorageEntriesFor(name, List(key -> value)) + + getMapStorageEntryFor(name, key).get should equal(value) + getMapStorageSizeFor(name) should be(1) + getMapStorageFor(name).length should be(1) + getMapStorageRangeFor(name, None, None, 100).length should be(1) } @@ -89,6 +104,37 @@ class VoldemortStorageBackendSuite extends FunSuite with ShouldMatchers with Emb vectorValueClient.getValue(vecKey) should equal(value) } + test("PersistentVector apis function as expected") { + val key = "vectorApiKey" + val value = bytes("Some bytes we want to store in a vector") + val updatedValue = bytes("Some updated bytes we want to store in a vector") + vectorSizeClient.delete(key) + vectorValueClient.delete(getVectorValueKey(key, 0)) + vectorValueClient.delete(getVectorValueKey(key, 1)) + getVectorStorageEntryFor(key, 0) should be(empty) + getVectorStorageEntryFor(key, 1) should be(empty) + getVectorStorageRangeFor(key, None, None, 1).head should be(empty) + + insertVectorStorageEntryFor(key, value) + //again + insertVectorStorageEntryFor(key, value) + + getVectorStorageEntryFor(key, 0) should be(value) + getVectorStorageEntryFor(key, 1) should be(value) + getVectorStorageRangeFor(key, None, None, 1).head should be(value) + getVectorStorageRangeFor(key, Some(1), None, 1).head should be(value) + getVectorStorageSizeFor(key) should be(2) + + updateVectorStorageEntryFor(key, 1, updatedValue) + + getVectorStorageEntryFor(key, 0) should be(value) + getVectorStorageEntryFor(key, 1) should be(updatedValue) + getVectorStorageRangeFor(key, None, None, 1).head should be(value) + getVectorStorageRangeFor(key, Some(1), None, 1).head should be(updatedValue) + getVectorStorageSizeFor(key) should be(2) + + } + } object VoldemortStorageBackendSuite { From e9cb289e5c328738a6c808c0a99c461f78f12fa7 Mon Sep 17 00:00:00 2001 From: ticktock Date: Thu, 16 Sep 2010 11:47:35 -0400 Subject: [PATCH 08/14] sorted set hand serialization and working actor test --- .../main/scala/VoldemortStorageBackend.scala | 73 ++++++-- .../src/test/resources/config/stores.xml | 2 +- .../scala/VoldemortPersistentActorSuite.scala | 176 ++++++++++++++++++ .../scala/VoldemortStorageBackendSuite.scala | 7 +- 4 files changed, 240 insertions(+), 18 deletions(-) create mode 100644 akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentActorSuite.scala diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala index d0efd7347e..77fd7acedb 100644 --- a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala @@ -42,7 +42,7 @@ MapStorageBackend[Array[Byte], Array[Byte]] with } } var refClient: StoreClient[String, Array[Byte]] = storeClientFactory.getStoreClient(refStore) - var mapKeyClient: StoreClient[String, SortedSet[Array[Byte]]] = storeClientFactory.getStoreClient(mapKeyStore) + var mapKeyClient: StoreClient[String, Array[Byte]] = storeClientFactory.getStoreClient(mapKeyStore) var mapValueClient: StoreClient[Array[Byte], Array[Byte]] = storeClientFactory.getStoreClient(mapValueStore) var vectorSizeClient: StoreClient[String, Array[Byte]] = storeClientFactory.getStoreClient(vectorSizeStore) var vectorValueClient: StoreClient[Array[Byte], Array[Byte]] = storeClientFactory.getStoreClient(vectorValueStore) @@ -65,13 +65,13 @@ MapStorageBackend[Array[Byte], Array[Byte]] with } def getMapStorageRangeFor(name: String, start: Option[Array[Byte]], finish: Option[Array[Byte]], count: Int): List[(Array[Byte], Array[Byte])] = { - val allkeys: SortedSet[Array[Byte]] = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]) + val allkeys: SortedSet[Array[Byte]] = getMapKeys(name) val range = allkeys.rangeImpl(start, finish).take(count) getKeyValues(name, range) } def getMapStorageFor(name: String): List[(Array[Byte], Array[Byte])] = { - val keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) + val keys = getMapKeys(name) getKeyValues(name, keys) } @@ -95,7 +95,7 @@ MapStorageBackend[Array[Byte], Array[Byte]] with } def getMapStorageSizeFor(name: String): Int = { - val keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) + val keys = getMapKeys(name) keys.size } @@ -108,15 +108,15 @@ MapStorageBackend[Array[Byte], Array[Byte]] with } def removeMapStorageFor(name: String, key: Array[Byte]) = { - var keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) + var keys = getMapKeys(name) keys -= key - mapKeyClient.put(name, keys) + putMapKeys(name, keys) mapValueClient.delete(getKey(name, key)) } def removeMapStorageFor(name: String) = { - val keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) + val keys = getMapKeys(name) keys.foreach { key => mapValueClient.delete(getKey(name, key)) @@ -126,9 +126,9 @@ MapStorageBackend[Array[Byte], Array[Byte]] with def insertMapStorageEntryFor(name: String, key: Array[Byte], value: Array[Byte]) = { mapValueClient.put(getKey(name, key), value) - var keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) + var keys = getMapKeys(name) keys += key - mapKeyClient.put(name, keys) + putMapKeys(name, keys) } def insertMapStorageEntriesFor(name: String, entries: List[(Array[Byte], Array[Byte])]) = { @@ -138,9 +138,17 @@ MapStorageBackend[Array[Byte], Array[Byte]] with key } } - var keys = mapKeyClient.getValue(name, new TreeSet[Array[Byte]]()) + var keys = getMapKeys(name) keys ++= newKeys - mapKeyClient.put(name, keys) + putMapKeys(name, keys) + } + + def putMapKeys(name: String, keys: SortedSet[Array[Byte]]) = { + mapKeyClient.put(name, SortedSetSerializer.toBytes(keys)) + } + + def getMapKeys(name: String): SortedSet[Array[Byte]] = { + SortedSetSerializer.fromBytes(mapKeyClient.getValue(name, Array.empty[Byte])) } @@ -176,8 +184,7 @@ MapStorageBackend[Array[Byte], Array[Byte]] with idx += 1 } } - log.info("StorageSize:" + storage.size) - log.info("SeqSize:" + seq.size) + storage.toList } @@ -250,4 +257,44 @@ MapStorageBackend[Array[Byte], Array[Byte]] with def fromString(str: String) = str.toInt } + object SortedSetSerializer { + def toBytes(set: SortedSet[Array[Byte]]): Array[Byte] = { + val length = set.foldLeft(0) { + (total, bytes) => { + total + bytes.length + IntSerializer.bytesPerInt + } + } + val allBytes = new Array[Byte](length) + val written = set.foldLeft(0) { + (total, bytes) => { + val sizeBytes = IntSerializer.toBytes(bytes.length) + System.arraycopy(sizeBytes, 0, allBytes, total, sizeBytes.length) + System.arraycopy(bytes, 0, allBytes, total + sizeBytes.length, bytes.length) + total + sizeBytes.length + bytes.length + } + } + require(length == written, "Bytes Written Did not equal Calculated Length, written %d, length %d".format(written, length)) + allBytes + } + + def fromBytes(bytes: Array[Byte]): SortedSet[Array[Byte]] = { + var set = new TreeSet[Array[Byte]] + if (bytes.length > IntSerializer.bytesPerInt) { + var pos = 0 + while (pos < bytes.length) { + val lengthBytes = new Array[Byte](IntSerializer.bytesPerInt) + System.arraycopy(bytes, pos, lengthBytes, 0, IntSerializer.bytesPerInt) + pos += IntSerializer.bytesPerInt + val length = IntSerializer.fromBytes(lengthBytes) + val item = new Array[Byte](length) + System.arraycopy(bytes, pos, item, 0, length) + set = set + item + pos += length + } + } + set + } + + } + } \ No newline at end of file diff --git a/akka-persistence/akka-persistence-voldemort/src/test/resources/config/stores.xml b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/stores.xml index 78f1b1385a..f2dd6ac099 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/resources/config/stores.xml +++ b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/stores.xml @@ -46,7 +46,7 @@ utf8 - java-serialization + identity diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentActorSuite.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentActorSuite.scala new file mode 100644 index 0000000000..ae575e1e96 --- /dev/null +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentActorSuite.scala @@ -0,0 +1,176 @@ +package se.scalablesolutions.akka.persistence.voldemort + +import org.scalatest.Spec +import org.scalatest.matchers.ShouldMatchers +import org.scalatest.BeforeAndAfterEach +import org.scalatest.junit.JUnitRunner +import org.junit.runner.RunWith + +import se.scalablesolutions.akka.actor.{Transactor, Actor, ActorRef} +import Actor._ +import BankAccountActor._ + + +case class Balance(accountNo: String) +case class Debit(accountNo: String, amount: Int, failer: ActorRef) +case class MultiDebit(accountNo: String, amounts: List[Int], failer: ActorRef) +case class Credit(accountNo: String, amount: Int) +case class Log(start: Int, finish: Int) +case object LogSize + +object BankAccountActor { + val state = "accountState" + val tx = "txnLog" +} + +class BankAccountActor extends Transactor { + private lazy val accountState = VoldemortStorage.newMap(state) + private lazy val txnLog = VoldemortStorage.newVector(tx) + + import sjson.json.DefaultProtocol._ + import sjson.json.JsonSerialization._ + + def receive: Receive = { + // check balance + case Balance(accountNo) => + txnLog.add(("Balance:" + accountNo).getBytes) + self.reply( + accountState.get(accountNo.getBytes) + .map(frombinary[Int](_)) + .getOrElse(0)) + + // debit amount: can fail + case Debit(accountNo, amount, failer) => + txnLog.add(("Debit:" + accountNo + " " + amount).getBytes) + val m = accountState.get(accountNo.getBytes) + .map(frombinary[Int](_)) + .getOrElse(0) + + accountState.put(accountNo.getBytes, tobinary(m - amount)) + if (amount > m) failer !! "Failure" + + self.reply(m - amount) + + // many debits: can fail + // demonstrates true rollback even if multiple puts have been done + case MultiDebit(accountNo, amounts, failer) => + val sum = amounts.foldRight(0)(_ + _) + txnLog.add(("MultiDebit:" + accountNo + " " + sum).getBytes) + + val m = accountState.get(accountNo.getBytes) + .map(frombinary[Int](_)) + .getOrElse(0) + + var cbal = m + amounts.foreach { + amount => + accountState.put(accountNo.getBytes, tobinary(m - amount)) + cbal = cbal - amount + if (cbal < 0) failer !! "Failure" + } + + self.reply(m - sum) + + // credit amount + case Credit(accountNo, amount) => + txnLog.add(("Credit:" + accountNo + " " + amount).getBytes) + val m = accountState.get(accountNo.getBytes) + .map(frombinary[Int](_)) + .getOrElse(0) + + accountState.put(accountNo.getBytes, tobinary(m + amount)) + + self.reply(m + amount) + + case LogSize => + self.reply(txnLog.length) + + case Log(start, finish) => + self.reply(txnLog.slice(start, finish).map(new String(_))) + } +} + +@serializable class PersistentFailerActor extends Transactor { + def receive = { + case "Failure" => + throw new RuntimeException("Expected exception; to test fault-tolerance") + } +} + +@RunWith(classOf[JUnitRunner]) +class VoldemortPersistentActorSuite extends +Spec with + ShouldMatchers with + BeforeAndAfterEach with EmbeddedVoldemort { + import VoldemortStorageBackend._ + + + override def beforeEach { + removeMapStorageFor(state) + var size = getVectorStorageSizeFor(tx) + (0 to size).foreach { + index => { + vectorValueClient.delete(getVectorValueKey(tx, index)) + } + } + vectorSizeClient.delete(tx) + } + + override def afterEach { + beforeEach + } + + describe("successful debit") { + it("should debit successfully") { + val bactor = actorOf[BankAccountActor] + bactor.start + val failer = actorOf[PersistentFailerActor] + failer.start + bactor !! Credit("a-123", 5000) + bactor !! Debit("a-123", 3000, failer) + + (bactor !! Balance("a-123")).get.asInstanceOf[Int] should equal(2000) + + bactor !! Credit("a-123", 7000) + (bactor !! Balance("a-123")).get.asInstanceOf[Int] should equal(9000) + + bactor !! Debit("a-123", 8000, failer) + (bactor !! Balance("a-123")).get.asInstanceOf[Int] should equal(1000) + + (bactor !! LogSize).get.asInstanceOf[Int] should equal(7) + (bactor !! Log(0, 7)).get.asInstanceOf[Iterable[String]].size should equal(7) + } + } + + describe("unsuccessful debit") { + it("debit should fail") { + val bactor = actorOf[BankAccountActor] + bactor.start + val failer = actorOf[PersistentFailerActor] + failer.start + bactor !! Credit("a-123", 5000) + (bactor !! Balance("a-123")).get.asInstanceOf[Int] should equal(5000) + evaluating { + bactor !! Debit("a-123", 7000, failer) + } should produce[Exception] + (bactor !! Balance("a-123")).get.asInstanceOf[Int] should equal(5000) + (bactor !! LogSize).get.asInstanceOf[Int] should equal(3) + } + } + + describe("unsuccessful multidebit") { + it("multidebit should fail") { + val bactor = actorOf[BankAccountActor] + bactor.start + val failer = actorOf[PersistentFailerActor] + failer.start + bactor !! Credit("a-123", 5000) + (bactor !! Balance("a-123")).get.asInstanceOf[Int] should equal(5000) + evaluating { + bactor !! MultiDebit("a-123", List(1000, 2000, 4000), failer) + } should produce[Exception] + (bactor !! Balance("a-123")).get.asInstanceOf[Int] should equal(5000) + (bactor !! LogSize).get.asInstanceOf[Int] should equal(3) + } + } +} diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala index 8906daa5fb..419bd05555 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortStorageBackendSuite.scala @@ -35,10 +35,9 @@ class VoldemortStorageBackendSuite extends FunSuite with ShouldMatchers with Emb val key = "testmapKey" val mapKeys = new TreeSet[Array[Byte]] + bytes("key1") mapKeyClient.delete(key) - mapKeyClient.getValue(key, emptySet) should equal(emptySet) - mapKeyClient.put(key, mapKeys) - mapKeyClient.getValue(key, emptySet) should equal(mapKeys) - + mapKeyClient.getValue(key, SortedSetSerializer.toBytes(emptySet)) should equal(SortedSetSerializer.toBytes(emptySet)) + putMapKeys(key, mapKeys) + getMapKeys(key) should equal(mapKeys) } test("that map value storage and retrieval works") { From c2295bbeb308c14449704ff44a17ed2574db4677 Mon Sep 17 00:00:00 2001 From: ticktock Date: Mon, 20 Sep 2010 21:25:20 -0400 Subject: [PATCH 09/14] fixing the formatting damage I did --- project/build/AkkaProject.scala | 510 +++++++++++++++----------------- 1 file changed, 246 insertions(+), 264 deletions(-) diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index baafa848f8..499440a741 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -17,14 +17,13 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- override def compileOptions = super.compileOptions ++ - Seq("-deprecation", - "-Xmigration", - "-Xcheckinit", - "-Xstrict-warnings", - "-Xwarninit", - "-encoding", "utf8") - .map(x => CompileOption(x)) - + Seq("-deprecation", + "-Xmigration", + "-Xcheckinit", + "-Xstrict-warnings", + "-Xwarninit", + "-encoding", "utf8") + .map(x => CompileOption(x)) override def javaCompileOptions = JavaCompileOption("-Xlint:unchecked") :: super.javaCompileOptions.toList // ------------------------------------------------------------------------------------------------------------------- @@ -33,28 +32,26 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val deployPath = info.projectPath / "deploy" lazy val distPath = info.projectPath / "dist" - def distName = "%s_%s-%s.zip".format(name, buildScalaVersion, version) - - lazy val dist = zipTask(allArtifacts, "dist", distName) dependsOn (`package`) describedAs ("Zips up the distribution.") + lazy val dist = zipTask(allArtifacts, "dist", distName) dependsOn (`package`) describedAs("Zips up the distribution.") // ------------------------------------------------------------------------------------------------------------------- // All repositories *must* go here! See ModuleConigurations below. // ------------------------------------------------------------------------------------------------------------------- object Repositories { - lazy val AkkaRepo = MavenRepository("Akka Repository", "http://scalablesolutions.se/akka/repository") - lazy val CodehausRepo = MavenRepository("Codehaus Repo", "http://repository.codehaus.org") - lazy val EmbeddedRepo = MavenRepository("Embedded Repo", (info.projectPath / "embedded-repo").asURL.toString) + lazy val AkkaRepo = MavenRepository("Akka Repository", "http://scalablesolutions.se/akka/repository") + lazy val CodehausRepo = MavenRepository("Codehaus Repo", "http://repository.codehaus.org") + lazy val EmbeddedRepo = MavenRepository("Embedded Repo", (info.projectPath / "embedded-repo").asURL.toString) lazy val FusesourceSnapshotRepo = MavenRepository("Fusesource Snapshots", "http://repo.fusesource.com/nexus/content/repositories/snapshots") - lazy val GuiceyFruitRepo = MavenRepository("GuiceyFruit Repo", "http://guiceyfruit.googlecode.com/svn/repo/releases/") - lazy val JBossRepo = MavenRepository("JBoss Repo", "https://repository.jboss.org/nexus/content/groups/public/") - lazy val JavaNetRepo = MavenRepository("java.net Repo", "http://download.java.net/maven/2") + lazy val GuiceyFruitRepo = MavenRepository("GuiceyFruit Repo", "http://guiceyfruit.googlecode.com/svn/repo/releases/") + lazy val JBossRepo = MavenRepository("JBoss Repo", "https://repository.jboss.org/nexus/content/groups/public/") + lazy val JavaNetRepo = MavenRepository("java.net Repo", "http://download.java.net/maven/2") lazy val SonatypeSnapshotRepo = MavenRepository("Sonatype OSS Repo", "http://oss.sonatype.org/content/repositories/releases") - lazy val SunJDMKRepo = MavenRepository("Sun JDMK Repo", "http://wp5.e-taxonomy.eu/cdmlib/mavenrepo") - lazy val CasbahRepoReleases = MavenRepository("Casbah Release Repo", "http://repo.bumnetworks.com/releases") - lazy val ClojarsRepo = MavenRepository("Clojars Repo", "http://clojars.org/repo") - lazy val OracleRepo = MavenRepository("Oracle Repo", "http://download.oracle.com/maven") + lazy val SunJDMKRepo = MavenRepository("Sun JDMK Repo", "http://wp5.e-taxonomy.eu/cdmlib/mavenrepo") + lazy val CasbahRepoReleases = MavenRepository("Casbah Release Repo", "http://repo.bumnetworks.com/releases") + lazy val ClojarsRepo = MavenRepository("Clojars Repo", "http://clojars.org/repo") + lazy val OracleRepo = MavenRepository("Oracle Repo", "http://download.oracle.com/maven") } // ------------------------------------------------------------------------------------------------------------------- @@ -65,45 +62,45 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- import Repositories._ - lazy val atmosphereModuleConfig = ModuleConfiguration("org.atmosphere", SonatypeSnapshotRepo) - lazy val jettyModuleConfig = ModuleConfiguration("org.eclipse.jetty", sbt.DefaultMavenRepository) + lazy val atmosphereModuleConfig = ModuleConfiguration("org.atmosphere", SonatypeSnapshotRepo) + lazy val jettyModuleConfig = ModuleConfiguration("org.eclipse.jetty", sbt.DefaultMavenRepository) lazy val guiceyFruitModuleConfig = ModuleConfiguration("org.guiceyfruit", GuiceyFruitRepo) // lazy val hawtdispatchModuleConfig = ModuleConfiguration("org.fusesource.hawtdispatch", FusesourceSnapshotRepo) - lazy val jbossModuleConfig = ModuleConfiguration("org.jboss", JBossRepo) - lazy val jdmkModuleConfig = ModuleConfiguration("com.sun.jdmk", SunJDMKRepo) - lazy val jmsModuleConfig = ModuleConfiguration("javax.jms", SunJDMKRepo) - lazy val jmxModuleConfig = ModuleConfiguration("com.sun.jmx", SunJDMKRepo) + lazy val jbossModuleConfig = ModuleConfiguration("org.jboss", JBossRepo) + lazy val jdmkModuleConfig = ModuleConfiguration("com.sun.jdmk", SunJDMKRepo) + lazy val jmsModuleConfig = ModuleConfiguration("javax.jms", SunJDMKRepo) + lazy val jmxModuleConfig = ModuleConfiguration("com.sun.jmx", SunJDMKRepo) lazy val jerseyContrModuleConfig = ModuleConfiguration("com.sun.jersey.contribs", JavaNetRepo) - lazy val jerseyModuleConfig = ModuleConfiguration("com.sun.jersey", JavaNetRepo) - lazy val jgroupsModuleConfig = ModuleConfiguration("jgroups", JBossRepo) - lazy val multiverseModuleConfig = ModuleConfiguration("org.multiverse", CodehausRepo) - lazy val nettyModuleConfig = ModuleConfiguration("org.jboss.netty", JBossRepo) - lazy val scalaTestModuleConfig = ModuleConfiguration("org.scalatest", ScalaToolsSnapshots) - lazy val logbackModuleConfig = ModuleConfiguration("ch.qos.logback", sbt.DefaultMavenRepository) - lazy val atomikosModuleConfig = ModuleConfiguration("com.atomikos", sbt.DefaultMavenRepository) - lazy val casbahRelease = ModuleConfiguration("com.novus", CasbahRepoReleases) - lazy val voldemortModuleConfig = ModuleConfiguration("voldemort", ClojarsRepo) - lazy val sleepycatModuleConfig = ModuleConfiguration("com.sleepycat", OracleRepo) - lazy val embeddedRepo = EmbeddedRepo // This is the only exception, because the embedded repo is fast! + lazy val jerseyModuleConfig = ModuleConfiguration("com.sun.jersey", JavaNetRepo) + lazy val jgroupsModuleConfig = ModuleConfiguration("jgroups", JBossRepo) + lazy val multiverseModuleConfig = ModuleConfiguration("org.multiverse", CodehausRepo) + lazy val nettyModuleConfig = ModuleConfiguration("org.jboss.netty", JBossRepo) + lazy val scalaTestModuleConfig = ModuleConfiguration("org.scalatest", ScalaToolsSnapshots) + lazy val logbackModuleConfig = ModuleConfiguration("ch.qos.logback",sbt.DefaultMavenRepository) + lazy val atomikosModuleConfig = ModuleConfiguration("com.atomikos",sbt.DefaultMavenRepository) + lazy val casbahRelease = ModuleConfiguration("com.novus",CasbahRepoReleases) + lazy val voldemortModuleConfig = ModuleConfiguration("voldemort", ClojarsRepo) + lazy val sleepycatModuleConfig = ModuleConfiguration("com.sleepycat", OracleRepo) + lazy val embeddedRepo = EmbeddedRepo // This is the only exception, because the embedded repo is fast! // ------------------------------------------------------------------------------------------------------------------- // Versions // ------------------------------------------------------------------------------------------------------------------- - lazy val ATMO_VERSION = "0.6.1" - lazy val CAMEL_VERSION = "2.4.0" - lazy val CASSANDRA_VERSION = "0.6.1" - lazy val DISPATCH_VERSION = "0.7.4" + lazy val ATMO_VERSION = "0.6.1" + lazy val CAMEL_VERSION = "2.4.0" + lazy val CASSANDRA_VERSION = "0.6.1" + lazy val DISPATCH_VERSION = "0.7.4" lazy val HAWT_DISPATCH_VERSION = "1.0" - lazy val JACKSON_VERSION = "1.2.1" - lazy val JERSEY_VERSION = "1.2" - lazy val MULTIVERSE_VERSION = "0.6.1" - lazy val SCALATEST_VERSION = "1.2-for-scala-2.8.0.final-SNAPSHOT" - lazy val LOGBACK_VERSION = "0.9.24" - lazy val SLF4J_VERSION = "1.6.0" - lazy val SPRING_VERSION = "3.0.3.RELEASE" - lazy val ASPECTWERKZ_VERSION = "2.2.1" - lazy val JETTY_VERSION = "7.1.4.v20100610" + lazy val JACKSON_VERSION = "1.2.1" + lazy val JERSEY_VERSION = "1.2" + lazy val MULTIVERSE_VERSION = "0.6.1" + lazy val SCALATEST_VERSION = "1.2-for-scala-2.8.0.final-SNAPSHOT" + lazy val LOGBACK_VERSION = "0.9.24" + lazy val SLF4J_VERSION = "1.6.0" + lazy val SPRING_VERSION = "3.0.3.RELEASE" + lazy val ASPECTWERKZ_VERSION = "2.2.1" + lazy val JETTY_VERSION = "7.1.4.v20100610" // ------------------------------------------------------------------------------------------------------------------- // Dependencies @@ -117,14 +114,14 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val aopalliance = "aopalliance" % "aopalliance" % "1.0" % "compile" - lazy val atmo = "org.atmosphere" % "atmosphere-annotations" % ATMO_VERSION % "compile" + lazy val atmo = "org.atmosphere" % "atmosphere-annotations" % ATMO_VERSION % "compile" lazy val atmo_jbossweb = "org.atmosphere" % "atmosphere-compat-jbossweb" % ATMO_VERSION % "compile" - lazy val atmo_jersey = "org.atmosphere" % "atmosphere-jersey" % ATMO_VERSION % "compile" - lazy val atmo_runtime = "org.atmosphere" % "atmosphere-runtime" % ATMO_VERSION % "compile" - lazy val atmo_tomcat = "org.atmosphere" % "atmosphere-compat-tomcat" % ATMO_VERSION % "compile" + lazy val atmo_jersey = "org.atmosphere" % "atmosphere-jersey" % ATMO_VERSION % "compile" + lazy val atmo_runtime = "org.atmosphere" % "atmosphere-runtime" % ATMO_VERSION % "compile" + lazy val atmo_tomcat = "org.atmosphere" % "atmosphere-compat-tomcat" % ATMO_VERSION % "compile" lazy val atmo_weblogic = "org.atmosphere" % "atmosphere-compat-weblogic" % ATMO_VERSION % "compile" - lazy val atomikos_transactions = "com.atomikos" % "transactions" % "3.2.3" % "compile" + lazy val atomikos_transactions = "com.atomikos" % "transactions" % "3.2.3" % "compile" lazy val atomikos_transactions_api = "com.atomikos" % "transactions-api" % "3.2.3" % "compile" lazy val atomikos_transactions_jta = "com.atomikos" % "transactions-jta" % "3.2.3" % "compile" @@ -143,9 +140,9 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val dispatch_http = "net.databinder" % "dispatch-http_2.8.0" % DISPATCH_VERSION % "compile" lazy val dispatch_json = "net.databinder" % "dispatch-json_2.8.0" % DISPATCH_VERSION % "compile" - lazy val jetty = "org.eclipse.jetty" % "jetty-server" % JETTY_VERSION % "compile" - lazy val jetty_util = "org.eclipse.jetty" % "jetty-util" % JETTY_VERSION % "compile" - lazy val jetty_xml = "org.eclipse.jetty" % "jetty-xml" % JETTY_VERSION % "compile" + lazy val jetty = "org.eclipse.jetty" % "jetty-server" % JETTY_VERSION % "compile" + lazy val jetty_util = "org.eclipse.jetty" % "jetty-util" % JETTY_VERSION % "compile" + lazy val jetty_xml = "org.eclipse.jetty" % "jetty-xml" % JETTY_VERSION % "compile" lazy val jetty_servlet = "org.eclipse.jetty" % "jetty-servlet" % JETTY_VERSION % "compile" lazy val guicey = "org.guiceyfruit" % "guice-all" % "2.0" % "compile" @@ -154,14 +151,14 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val hawtdispatch = "org.fusesource.hawtdispatch" % "hawtdispatch-scala" % HAWT_DISPATCH_VERSION % "compile" - lazy val jackson = "org.codehaus.jackson" % "jackson-mapper-asl" % JACKSON_VERSION % "compile" - lazy val jackson_core = "org.codehaus.jackson" % "jackson-core-asl" % JACKSON_VERSION % "compile" - lazy val jackson_core_asl = "org.codehaus.jackson" % "jackson-core-asl" % JACKSON_VERSION % "compile" + lazy val jackson = "org.codehaus.jackson" % "jackson-mapper-asl" % JACKSON_VERSION % "compile" + lazy val jackson_core = "org.codehaus.jackson" % "jackson-core-asl" % JACKSON_VERSION % "compile" + lazy val jackson_core_asl = "org.codehaus.jackson" % "jackson-core-asl" % JACKSON_VERSION % "compile" - lazy val jersey = "com.sun.jersey" % "jersey-core" % JERSEY_VERSION % "compile" - lazy val jersey_json = "com.sun.jersey" % "jersey-json" % JERSEY_VERSION % "compile" - lazy val jersey_server = "com.sun.jersey" % "jersey-server" % JERSEY_VERSION % "compile" - lazy val jersey_contrib = "com.sun.jersey.contribs" % "jersey-scala" % JERSEY_VERSION % "compile" + lazy val jersey = "com.sun.jersey" % "jersey-core" % JERSEY_VERSION % "compile" + lazy val jersey_json = "com.sun.jersey" % "jersey-json" % JERSEY_VERSION % "compile" + lazy val jersey_server = "com.sun.jersey" % "jersey-server" % JERSEY_VERSION % "compile" + lazy val jersey_contrib = "com.sun.jersey.contribs" % "jersey-scala" % JERSEY_VERSION % "compile" lazy val jgroups = "jgroups" % "jgroups" % "2.9.0.GA" % "compile" @@ -195,12 +192,12 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val sjson = "sjson.json" % "sjson" % "0.8-SNAPSHOT-2.8.0" % "compile" - lazy val slf4j = "org.slf4j" % "slf4j-api" % SLF4J_VERSION % "compile" + lazy val slf4j = "org.slf4j" % "slf4j-api" % SLF4J_VERSION % "compile" - lazy val logback = "ch.qos.logback" % "logback-classic" % LOGBACK_VERSION % "compile" + lazy val logback = "ch.qos.logback" % "logback-classic" % LOGBACK_VERSION % "compile" lazy val logback_core = "ch.qos.logback" % "logback-core" % LOGBACK_VERSION % "compile" - lazy val spring_beans = "org.springframework" % "spring-beans" % SPRING_VERSION % "compile" + lazy val spring_beans = "org.springframework" % "spring-beans" % SPRING_VERSION % "compile" lazy val spring_context = "org.springframework" % "spring-context" % SPRING_VERSION % "compile" lazy val stax_api = "javax.xml.stream" % "stax-api" % "1.0-2" % "compile" @@ -211,22 +208,22 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val voldemort_contrib = "voldemort" % "voldemort-contrib" % "0.81" % "compile" lazy val voldemort_needs_log4j = "org.slf4j" % "log4j-over-slf4j" % SLF4J_VERSION % "compile" - lazy val werkz = "org.codehaus.aspectwerkz" % "aspectwerkz-nodeps-jdk5" % ASPECTWERKZ_VERSION % "compile" - lazy val werkz_core = "org.codehaus.aspectwerkz" % "aspectwerkz-jdk5" % ASPECTWERKZ_VERSION % "compile" + lazy val werkz = "org.codehaus.aspectwerkz" % "aspectwerkz-nodeps-jdk5" % ASPECTWERKZ_VERSION % "compile" + lazy val werkz_core = "org.codehaus.aspectwerkz" % "aspectwerkz-jdk5" % ASPECTWERKZ_VERSION % "compile" // Test - lazy val camel_spring = "org.apache.camel" % "camel-spring" % CAMEL_VERSION % "test" - lazy val cassandra_clhm = "org.apache.cassandra" % "clhm-production" % CASSANDRA_VERSION % "test" - lazy val commons_coll = "commons-collections" % "commons-collections" % "3.2.1" % "test" - lazy val google_coll = "com.google.collections" % "google-collections" % "1.0" % "test" - lazy val high_scale = "org.apache.cassandra" % "high-scale-lib" % CASSANDRA_VERSION % "test" - lazy val testJetty = "org.eclipse.jetty" % "jetty-server" % JETTY_VERSION % "test" - lazy val testJettyWebApp = "org.eclipse.jetty" % "jetty-webapp" % JETTY_VERSION % "test" + lazy val camel_spring = "org.apache.camel" % "camel-spring" % CAMEL_VERSION % "test" + lazy val cassandra_clhm = "org.apache.cassandra" % "clhm-production" % CASSANDRA_VERSION % "test" + lazy val commons_coll = "commons-collections" % "commons-collections" % "3.2.1" % "test" + lazy val google_coll = "com.google.collections" % "google-collections" % "1.0" % "test" + lazy val high_scale = "org.apache.cassandra" % "high-scale-lib" % CASSANDRA_VERSION % "test" + lazy val testJetty = "org.eclipse.jetty" % "jetty-server" % JETTY_VERSION % "test" + lazy val testJettyWebApp= "org.eclipse.jetty" % "jetty-webapp" % JETTY_VERSION % "test" - lazy val junit = "junit" % "junit" % "4.5" % "test" - lazy val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" - lazy val scalatest = "org.scalatest" % "scalatest" % SCALATEST_VERSION % "test" + lazy val junit = "junit" % "junit" % "4.5" % "test" + lazy val mockito = "org.mockito" % "mockito-all" % "1.8.1" % "test" + lazy val scalatest = "org.scalatest" % "scalatest" % SCALATEST_VERSION % "test" //voldemort testing /home/sclasen/projects/akka/akka-persistence-voldemort/src/test/resources/ lazy val jdom = "org.jdom" % "jdom" % "1.1" % "test" @@ -240,19 +237,19 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // Subprojects // ------------------------------------------------------------------------------------------------------------------- - lazy val akka_actor = project("akka-actor", "akka-actor", new AkkaActorProject(_)) + lazy val akka_actor = project("akka-actor", "akka-actor", new AkkaActorProject(_)) lazy val akka_typed_actor = project("akka-typed-actor", "akka-typed-actor", new AkkaTypedActorProject(_), akka_actor) - lazy val akka_remote = project("akka-remote", "akka-remote", new AkkaRemoteProject(_), akka_typed_actor) - lazy val akka_amqp = project("akka-amqp", "akka-amqp", new AkkaAMQPProject(_), akka_remote) - lazy val akka_http = project("akka-http", "akka-http", new AkkaHttpProject(_), akka_remote, akka_camel) - lazy val akka_camel = project("akka-camel", "akka-camel", new AkkaCamelProject(_), akka_remote) + lazy val akka_remote = project("akka-remote", "akka-remote", new AkkaRemoteProject(_), akka_typed_actor) + lazy val akka_amqp = project("akka-amqp", "akka-amqp", new AkkaAMQPProject(_), akka_remote) + lazy val akka_http = project("akka-http", "akka-http", new AkkaHttpProject(_), akka_remote, akka_camel) + lazy val akka_camel = project("akka-camel", "akka-camel", new AkkaCamelProject(_), akka_remote) lazy val akka_persistence = project("akka-persistence", "akka-persistence", new AkkaPersistenceParentProject(_)) - lazy val akka_spring = project("akka-spring", "akka-spring", new AkkaSpringProject(_), akka_remote, akka_camel) - lazy val akka_jta = project("akka-jta", "akka-jta", new AkkaJTAProject(_), akka_remote) - lazy val akka_kernel = project("akka-kernel", "akka-kernel", new AkkaKernelProject(_), - akka_remote, akka_jta, akka_http, akka_spring, akka_camel, akka_persistence, akka_amqp) - lazy val akka_osgi = project("akka-osgi", "akka-osgi", new AkkaOSGiParentProject(_)) - lazy val akka_samples = project("akka-samples", "akka-samples", new AkkaSamplesParentProject(_)) + lazy val akka_spring = project("akka-spring", "akka-spring", new AkkaSpringProject(_), akka_remote, akka_camel) + lazy val akka_jta = project("akka-jta", "akka-jta", new AkkaJTAProject(_), akka_remote) + lazy val akka_kernel = project("akka-kernel", "akka-kernel", new AkkaKernelProject(_), + akka_remote, akka_jta, akka_http, akka_spring, akka_camel, akka_persistence, akka_amqp) + lazy val akka_osgi = project("akka-osgi", "akka-osgi", new AkkaOSGiParentProject(_)) + lazy val akka_samples = project("akka-samples", "akka-samples", new AkkaSamplesParentProject(_)) // ------------------------------------------------------------------------------------------------------------------- // Miscellaneous @@ -266,37 +263,37 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { (IMPLEMENTATION_TITLE, "Akka"), (IMPLEMENTATION_URL, "http://akkasource.org"), (IMPLEMENTATION_VENDOR, "The Akka Project") - )).toList ::: - getMainClass(false).map(MainClass(_)).toList + )).toList ::: + getMainClass(false).map(MainClass(_)).toList // create a manifest with all akka jars and dependency jars on classpath override def manifestClassPath = Some(allArtifacts.getFiles - .filter(_.getName.endsWith(".jar")) - .filter(!_.getName.contains("servlet_2.4")) - .filter(!_.getName.contains("scala-library")) - .map("lib_managed/scala_%s/compile/".format(buildScalaVersion) + _.getName) - .mkString(" ") + - " config/" + - " scala-library.jar" + - " dist/akka-actor_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-typed-actor_%s-%s.jar".format(buildScalaVersion, version) + - " dist/akka-remote_%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-amqp_%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-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) + .filter(_.getName.endsWith(".jar")) + .filter(!_.getName.contains("servlet_2.4")) + .filter(!_.getName.contains("scala-library")) + .map("lib_managed/scala_%s/compile/".format(buildScalaVersion) + _.getName) + .mkString(" ") + + " config/" + + " scala-library.jar" + + " dist/akka-actor_%s-%s.jar".format(buildScalaVersion, version) + + " dist/akka-typed-actor_%s-%s.jar".format(buildScalaVersion, version) + + " dist/akka-remote_%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-amqp_%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-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) ) //Exclude slf4j1.5.11 from the classpath, it's conflicting... override def fullClasspath(config: Configuration): PathFinder = { super.fullClasspath(config) --- - (super.fullClasspath(config) ** "slf4j*1.5.11.jar") + (super.fullClasspath(config) ** "slf4j*1.5.11.jar") } override def mainResources = super.mainResources +++ @@ -317,60 +314,57 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { //override def documentOptions = encodingUtf8.map(SimpleDocOption(_)) override def packageDocsJar = defaultJarPath("-docs.jar") - - override def packageSrcJar = defaultJarPath("-sources.jar") - + override def packageSrcJar= defaultJarPath("-sources.jar") override def packageToPublishActions = super.packageToPublishActions ++ Seq(packageDocs, packageSrc) override def pomExtra = 2009 - http://akkasource.org - - Scalable Solutions AB - http://scalablesolutions.se - - - - Apache 2 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - + http://akkasource.org + + Scalable Solutions AB + http://scalablesolutions.se + + + + Apache 2 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + // publish to local mvn import Process._ lazy val publishLocalMvn = runMvnInstall - def runMvnInstall = task { for (absPath <- akkaArtifacts.getPaths) { val artifactRE = """(.*)/dist/(.*)-(.*).jar""".r val artifactRE(path, artifactId, artifactVersion) = absPath val command = "mvn install:install-file" + - " -Dfile=" + absPath + - " -DgroupId=se.scalablesolutions.akka" + - " -DartifactId=" + artifactId + - " -Dversion=" + version + - " -Dpackaging=jar -DgeneratePom=true" + " -Dfile=" + absPath + + " -DgroupId=se.scalablesolutions.akka" + + " -DartifactId=" + artifactId + + " -Dversion=" + version + + " -Dpackaging=jar -DgeneratePom=true" command ! log } None - } dependsOn (dist) describedAs ("Run mvn install for artifacts in dist.") + } dependsOn(dist) describedAs("Run mvn install for artifacts in dist.") // ------------------------------------------------------------------------------------------------------------------- // akka-actor subproject // ------------------------------------------------------------------------------------------------------------------- class AkkaActorProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val configgy = Dependencies.configgy - val hawtdispatch = Dependencies.hawtdispatch - val multiverse = Dependencies.multiverse - val jsr166x = Dependencies.jsr166x - val slf4j = Dependencies.slf4j - val logback = Dependencies.logback - val logback_core = Dependencies.logback_core + val configgy = Dependencies.configgy + val hawtdispatch = Dependencies.hawtdispatch + val multiverse = Dependencies.multiverse + val jsr166x = Dependencies.jsr166x + val slf4j = Dependencies.slf4j + val logback = Dependencies.logback + val logback_core = Dependencies.logback_core // testing - val junit = Dependencies.junit + val junit = Dependencies.junit val scalatest = Dependencies.scalatest } @@ -379,13 +373,13 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaTypedActorProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val aopalliance = Dependencies.aopalliance - val werkz = Dependencies.werkz - val werkz_core = Dependencies.werkz_core - val guicey = Dependencies.guicey + val aopalliance = Dependencies.aopalliance + val werkz = Dependencies.werkz + val werkz_core = Dependencies.werkz_core + val guicey = Dependencies.guicey // testing - val junit = Dependencies.junit + val junit = Dependencies.junit val scalatest = Dependencies.scalatest } @@ -395,22 +389,22 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaRemoteProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val commons_codec = Dependencies.commons_codec - val commons_io = Dependencies.commons_io + val commons_io = Dependencies.commons_io val dispatch_http = Dependencies.dispatch_http val dispatch_json = Dependencies.dispatch_json - val guicey = Dependencies.guicey - val h2_lzf = Dependencies.h2_lzf - val jackson = Dependencies.jackson - val jackson_core = Dependencies.jackson_core - val jgroups = Dependencies.jgroups - val jta_1_1 = Dependencies.jta_1_1 - val netty = Dependencies.netty - val protobuf = Dependencies.protobuf - val sbinary = Dependencies.sbinary - val sjson = Dependencies.sjson + val guicey = Dependencies.guicey + val h2_lzf = Dependencies.h2_lzf + val jackson = Dependencies.jackson + val jackson_core = Dependencies.jackson_core + val jgroups = Dependencies.jgroups + val jta_1_1 = Dependencies.jta_1_1 + val netty = Dependencies.netty + val protobuf = Dependencies.protobuf + val sbinary = Dependencies.sbinary + val sjson = Dependencies.sjson // testing - val junit = Dependencies.junit + val junit = Dependencies.junit val scalatest = Dependencies.scalatest override def bndImportPackage = "javax.transaction;version=1.1" :: super.bndImportPackage.toList @@ -422,13 +416,13 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaAMQPProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val commons_io = Dependencies.commons_io - val rabbit = Dependencies.rabbit - val protobuf = Dependencies.protobuf + val rabbit = Dependencies.rabbit + val protobuf = Dependencies.protobuf // testing - val junit = Dependencies.junit + val junit = Dependencies.junit val multiverse = Dependencies.multiverse - val scalatest = Dependencies.scalatest + val scalatest = Dependencies.scalatest } // ------------------------------------------------------------------------------------------------------------------- @@ -436,28 +430,28 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaHttpProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val annotation = Dependencies.annotation - val atmo = Dependencies.atmo - val atmo_jbossweb = Dependencies.atmo_jbossweb - val atmo_jersey = Dependencies.atmo_jersey - val atmo_runtime = Dependencies.atmo_runtime - val atmo_tomcat = Dependencies.atmo_tomcat - val atmo_weblogic = Dependencies.atmo_weblogic - val jetty = Dependencies.jetty - val jetty_util = Dependencies.jetty_util - val jetty_xml = Dependencies.jetty_xml - val jetty_servlet = Dependencies.jetty_servlet + val annotation = Dependencies.annotation + val atmo = Dependencies.atmo + val atmo_jbossweb = Dependencies.atmo_jbossweb + val atmo_jersey = Dependencies.atmo_jersey + val atmo_runtime = Dependencies.atmo_runtime + val atmo_tomcat = Dependencies.atmo_tomcat + val atmo_weblogic = Dependencies.atmo_weblogic + val jetty = Dependencies.jetty + val jetty_util = Dependencies.jetty_util + val jetty_xml = Dependencies.jetty_xml + val jetty_servlet = Dependencies.jetty_servlet val jackson_core_asl = Dependencies.jackson_core_asl - val jersey = Dependencies.jersey - val jersey_contrib = Dependencies.jersey_contrib - val jersey_json = Dependencies.jersey_json - val jersey_server = Dependencies.jersey_server - val jsr311 = Dependencies.jsr311 - val stax_api = Dependencies.stax_api + val jersey = Dependencies.jersey + val jersey_contrib = Dependencies.jersey_contrib + val jersey_json = Dependencies.jersey_json + val jersey_server = Dependencies.jersey_server + val jsr311 = Dependencies.jsr311 + val stax_api = Dependencies.stax_api // testing - val junit = Dependencies.junit - val mockito = Dependencies.mockito + val junit = Dependencies.junit + val mockito = Dependencies.mockito val scalatest = Dependencies.scalatest } @@ -492,7 +486,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaPersistenceCommonProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val commons_pool = Dependencies.commons_pool - val thrift = Dependencies.thrift + val thrift = Dependencies.thrift } // ------------------------------------------------------------------------------------------------------------------- @@ -501,7 +495,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaRedisProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { val commons_codec = Dependencies.commons_codec - val redis = Dependencies.redis + val redis = Dependencies.redis override def testOptions = TestFilter((name: String) => name.endsWith("Test")) :: Nil } @@ -522,18 +516,17 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaCassandraProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val cassandra = Dependencies.cassandra + val cassandra = Dependencies.cassandra // testing val cassandra_clhm = Dependencies.cassandra_clhm - val commons_coll = Dependencies.commons_coll - val google_coll = Dependencies.google_coll - val high_scale = Dependencies.high_scale + val commons_coll = Dependencies.commons_coll + val google_coll = Dependencies.google_coll + val high_scale = Dependencies.high_scale override def testOptions = TestFilter((name: String) => name.endsWith("Test")) :: Nil } - // ------------------------------------------------------------------------------------------------------------------- // akka-persistence-voldemort subproject // ------------------------------------------------------------------------------------------------------------------- @@ -569,13 +562,13 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaSpringProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val spring_beans = Dependencies.spring_beans + val spring_beans = Dependencies.spring_beans val spring_context = Dependencies.spring_context // testing val camel_spring = Dependencies.camel_spring - val junit = Dependencies.junit - val scalatest = Dependencies.scalatest + val junit = Dependencies.junit + val scalatest = Dependencies.scalatest } // ------------------------------------------------------------------------------------------------------------------- @@ -583,7 +576,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- class AkkaJTAProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val atomikos_transactions = Dependencies.atomikos_transactions + val atomikos_transactions = Dependencies.atomikos_transactions val atomikos_transactions_api = Dependencies.atomikos_transactions_api val atomikos_transactions_jta = Dependencies.atomikos_transactions_jta //val jta_1_1 = Dependencies.jta_1_1 @@ -599,18 +592,15 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { new AkkaOSGiDependenciesBundleProject(_), akka_kernel, akka_jta) // akka_kernel does not depend on akka_jta (why?) therefore we list akka_jta here lazy val akka_osgi_assembly = project("akka-osgi-assembly", "akka-osgi-assembly", new AkkaOSGiAssemblyProject(_), akka_osgi_dependencies_bundle, akka_remote, akka_amqp, akka_http, - akka_camel, akka_spring, akka_jta, akka_persistence.akka_persistence_common, - akka_persistence.akka_persistence_redis, akka_persistence.akka_persistence_mongo, - akka_persistence.akka_persistence_cassandra) + akka_camel, akka_spring, akka_jta, akka_persistence.akka_persistence_common, + akka_persistence.akka_persistence_redis, akka_persistence.akka_persistence_mongo, + akka_persistence.akka_persistence_cassandra,akka_persistence.akka_persistence_voldemort) } class AkkaOSGiDependenciesBundleProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) with BNDPlugin { override def bndClasspath = compileClasspath - override def bndPrivatePackage = Seq("") - override def bndImportPackage = Seq("*;resolution:=optional") - override def bndExportPackage = Seq( "org.aopalliance.*;version=1.0.0", @@ -638,36 +628,36 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { val scala_bundle = "com.weiglewilczek.scala-lang-osgi" % "scala-library" % buildScalaVersion % "compile" intransitive // Camel bundles - val camel_core = Dependencies.camel_core.intransitive + val camel_core = Dependencies.camel_core.intransitive val fusesource_commonman = "org.fusesource.commonman" % "commons-management" % "1.0" intransitive // Spring bundles - val spring_beans = Dependencies.spring_beans.intransitive - val spring_context = Dependencies.spring_context.intransitive - val spring_aop = "org.springframework" % "spring-aop" % SPRING_VERSION % "compile" intransitive - val spring_asm = "org.springframework" % "spring-asm" % SPRING_VERSION % "compile" intransitive - val spring_core = "org.springframework" % "spring-core" % SPRING_VERSION % "compile" intransitive + val spring_beans = Dependencies.spring_beans.intransitive + val spring_context = Dependencies.spring_context.intransitive + val spring_aop = "org.springframework" % "spring-aop" % SPRING_VERSION % "compile" intransitive + val spring_asm = "org.springframework" % "spring-asm" % SPRING_VERSION % "compile" intransitive + val spring_core = "org.springframework" % "spring-core" % SPRING_VERSION % "compile" intransitive val spring_expression = "org.springframework" % "spring-expression" % SPRING_VERSION % "compile" intransitive - val spring_jms = "org.springframework" % "spring-jms" % SPRING_VERSION % "compile" intransitive - val spring_tx = "org.springframework" % "spring-tx" % SPRING_VERSION % "compile" intransitive + val spring_jms = "org.springframework" % "spring-jms" % SPRING_VERSION % "compile" intransitive + val spring_tx = "org.springframework" % "spring-tx" % SPRING_VERSION % "compile" intransitive - val commons_codec = Dependencies.commons_codec.intransitive - val commons_io = Dependencies.commons_io.intransitive - val commons_pool = Dependencies.commons_pool.intransitive - val guicey = Dependencies.guicey.intransitive - val jackson = Dependencies.jackson.intransitive - val jackson_core = Dependencies.jackson_core.intransitive - val jsr311 = Dependencies.jsr311.intransitive - val jta_1_1 = Dependencies.jta_1_1.intransitive - val netty = Dependencies.netty.intransitive - val commons_fileupload = "commons-fileupload" % "commons-fileupload" % "1.2.1" % "compile" intransitive - val jms_1_1 = "org.apache.geronimo.specs" % "geronimo-jms_1.1_spec" % "1.1.1" % "compile" intransitive - val joda = "joda-time" % "joda-time" % "1.6" intransitive + val commons_codec = Dependencies.commons_codec.intransitive + val commons_io = Dependencies.commons_io.intransitive + val commons_pool = Dependencies.commons_pool.intransitive + val guicey = Dependencies.guicey.intransitive + val jackson = Dependencies.jackson.intransitive + val jackson_core = Dependencies.jackson_core.intransitive + val jsr311 = Dependencies.jsr311.intransitive + val jta_1_1 = Dependencies.jta_1_1.intransitive + val netty = Dependencies.netty.intransitive + val commons_fileupload = "commons-fileupload" % "commons-fileupload" % "1.2.1" % "compile" intransitive + val jms_1_1 = "org.apache.geronimo.specs" % "geronimo-jms_1.1_spec" % "1.1.1" % "compile" intransitive + val joda = "joda-time" % "joda-time" % "1.6" intransitive override def packageAction = task { val libs: Seq[Path] = managedClasspath(config("compile")).get.toSeq - val prjs: Seq[Path] = info.dependencies.toSeq.asInstanceOf[Seq[DefaultProject]] map {_.jarPath} + val prjs: Seq[Path] = info.dependencies.toSeq.asInstanceOf[Seq[DefaultProject]] map { _.jarPath } val all = libs ++ prjs val destination = outputPath / "bundles" FileUtilities.copyFlat(all, destination, log) @@ -718,7 +708,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { - + @@ -729,8 +719,8 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { class AkkaSampleSecurityProject(info: ProjectInfo) extends AkkaDefaultProject(info, deployPath) { val commons_codec = Dependencies.commons_codec - val jsr250 = Dependencies.jsr250 - val jsr311 = Dependencies.jsr311 + val jsr250 = Dependencies.jsr250 + val jsr311 = Dependencies.jsr311 } class AkkaSampleOSGiProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) with BNDPlugin { @@ -767,71 +757,63 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { // ------------------------------------------------------------------------------------------------------------------- def removeDupEntries(paths: PathFinder) = - Path.lazyPathFinder { - val mapped = paths.get map {p => (p.relativePath, p)} - (Map() ++ mapped).values.toList - } + Path.lazyPathFinder { + val mapped = paths.get map { p => (p.relativePath, p) } + (Map() ++ mapped).values.toList + } def allArtifacts = { Path.fromFile(buildScalaInstance.libraryJar) +++ - (removeDupEntries(runClasspath filter ClasspathUtilities.isArchive) +++ - ((outputPath ##) / defaultJarName) +++ - mainResources +++ - mainDependencies.scalaJars +++ - descendents(info.projectPath / "scripts", "run_akka.sh") +++ - descendents(info.projectPath / "scripts", "akka-init-script.sh") +++ - descendents(info.projectPath / "dist", "*.jar") +++ - descendents(info.projectPath / "deploy", "*.jar") +++ - descendents(path("lib") ##, "*.jar") +++ - descendents(configurationPath(Configurations.Compile) ##, "*.jar")) - .filter(jar => // remove redundant libs - !jar.toString.endsWith("stax-api-1.0.1.jar") || - !jar.toString.endsWith("scala-library-2.7.7.jar") - ) + (removeDupEntries(runClasspath filter ClasspathUtilities.isArchive) +++ + ((outputPath ##) / defaultJarName) +++ + mainResources +++ + mainDependencies.scalaJars +++ + descendents(info.projectPath / "scripts", "run_akka.sh") +++ + descendents(info.projectPath / "scripts", "akka-init-script.sh") +++ + descendents(info.projectPath / "dist", "*.jar") +++ + descendents(info.projectPath / "deploy", "*.jar") +++ + descendents(path("lib") ##, "*.jar") +++ + descendents(configurationPath(Configurations.Compile) ##, "*.jar")) + .filter(jar => // remove redundant libs + !jar.toString.endsWith("stax-api-1.0.1.jar") || + !jar.toString.endsWith("scala-library-2.7.7.jar") + ) } - def akkaArtifacts = descendents(info.projectPath / "dist", "*" + buildScalaVersion + "-" + version + ".jar") + def akkaArtifacts = descendents(info.projectPath / "dist", "*" + buildScalaVersion + "-" + version + ".jar") // ------------------------------------------------------------ class AkkaDefaultProject(info: ProjectInfo, val deployPath: Path) extends DefaultProject(info) with DeployProject with OSGiProject { lazy val sourceArtifact = Artifact(this.artifactID, "sources", "jar", Some("sources"), Nil, None) lazy val docsArtifact = Artifact(this.artifactID, "docs", "jar", Some("docs"), Nil, None) - override def runClasspath = super.runClasspath +++ (AkkaParentProject.this.info.projectPath / "config") - override def testClasspath = super.testClasspath +++ (AkkaParentProject.this.info.projectPath / "config") - override def packageDocsJar = this.defaultJarPath("-docs.jar") - - override def packageSrcJar = this.defaultJarPath("-sources.jar") - + override def packageSrcJar = this.defaultJarPath("-sources.jar") override def packageToPublishActions = super.packageToPublishActions ++ Seq(this.packageDocs, this.packageSrc) } } -trait DeployProject { - self: BasicScalaProject => +trait DeployProject { self: BasicScalaProject => // defines where the deployTask copies jars to def deployPath: Path - lazy val dist = deployTask(jarPath, packageDocsJar, packageSrcJar, deployPath, true, true, true) dependsOn ( - `package`, packageDocs, packageSrc) describedAs ("Deploying") - + lazy val dist = deployTask(jarPath, packageDocsJar, packageSrcJar, deployPath, true, true, true) dependsOn( + `package`, packageDocs, packageSrc) describedAs("Deploying") def deployTask(jar: Path, docs: Path, src: Path, toDir: Path, genJar: Boolean, genDocs: Boolean, genSource: Boolean) = task { def gen(jar: Path, toDir: Path, flag: Boolean, msg: String): Option[String] = - if (flag) { - log.info(msg + " " + jar) - FileUtilities.copyFile(jar, toDir / jar.name, log) - } else None + if (flag) { + log.info(msg + " " + jar) + FileUtilities.copyFile(jar, toDir / jar.name, log) + } else None gen(jar, toDir, genJar, "Deploying bits") orElse - gen(docs, toDir, genDocs, "Deploying docs") orElse - gen(src, toDir, genSource, "Deploying sources") + gen(docs, toDir, genDocs, "Deploying docs") orElse + gen(src, toDir, genSource, "Deploying sources") } } -trait OSGiProject extends BNDPlugin { - self: DefaultProject => +trait OSGiProject extends BNDPlugin { self: DefaultProject => override def bndExportPackage = Seq("se.scalablesolutions.akka.*;version=%s".format(projectVersion.value)) } From 4afdbf3498a1e9fdf54463eb95fcf70291b12187 Mon Sep 17 00:00:00 2001 From: ticktock Date: Mon, 20 Sep 2010 21:28:09 -0400 Subject: [PATCH 10/14] provide better voldemort configuration support, and defaults definition in akka-reference.conf, and made the backend more easily testable --- config/akka-reference.conf | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config/akka-reference.conf b/config/akka-reference.conf index a66e12be0a..8758138df7 100644 --- a/config/akka-reference.conf +++ b/config/akka-reference.conf @@ -162,5 +162,18 @@ akka { hostname = "127.0.0.1" # IP address or hostname of the Redis instance port = 6379 # Port to Redis } + + voldemort { + store { + refs = "Refs" # Voldemort Store Used to Persist Refs. Use string serializer for keys, identity serializer for values + map-keys = "MapKeys" # Voldemort Store Used to Persist Map Keys. Use string serializer for keys, identity serializer for values + map-values = "MapValues" # Voldemort Store Used to Persist Map Values. Use identity serializer for keys, identity serializer for values + vector-sizes = "VectorSizes" # Voldemort Store Used to Persist Vector Sizes. Use string serializer for keys, identity serializer for values + vector-values = "VectorValues" # Voldemort Store Used to Persist Vector Values. Use identity serializer for keys, identity serializer for values + } + client { # The KeyValue pairs under client are converted to java Properties and used to construct the ClientConfig + bootstrap_urls = "tcp://localhost:6666" # All Valid Voldemort Client properties are valid here, in string form + } + } } } From aa69604555794295885437dadd7ecfea71899df5 Mon Sep 17 00:00:00 2001 From: ticktock Date: Mon, 20 Sep 2010 21:29:17 -0400 Subject: [PATCH 11/14] provide better voldemort configuration support, and defaults definition in akka-reference.conf, and made the backend more easily testable --- .../main/scala/VoldemortStorageBackend.scala | 76 +++++++++++++------ .../src/test/scala/EmbeddedVoldemort.scala | 3 +- 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala index 77fd7acedb..6331378356 100644 --- a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala @@ -16,36 +16,34 @@ import voldemort.utils.ByteUtils import voldemort.versioning.Versioned import collection.JavaConversions import java.nio.ByteBuffer -import collection.immutable.{IndexedSeq, SortedSet, TreeSet} -import collection.mutable.{Map, Set, HashSet, ArrayBuffer} -import java.util.{Map => JMap} - +import collection.Map +import collection.immutable.{IndexedSeq, SortedSet, TreeSet, HashMap} +import collection.mutable.{Set, HashSet, ArrayBuffer} +import java.util.{Properties, Map => JMap} private[akka] object VoldemortStorageBackend extends MapStorageBackend[Array[Byte], Array[Byte]] with VectorStorageBackend[Array[Byte]] with RefStorageBackend[Array[Byte]] with Logging { - val bootstrapUrl: String = config.getString("akka.storage.voldemort.bootstrap.url", "tcp://localhost:6666") - val refStore = config.getString("akka.storage.voldemort.store.ref", "Refs") - val mapKeyStore = config.getString("akka.storage.voldemort.store.map.key", "MapKeys") - val mapValueStore = config.getString("akka.storage.voldemort.store.map.value", "MapValues") - val vectorSizeStore = config.getString("akka.storage.voldemort.store.vector.size", "VectorSizes") - val vectorValueStore = config.getString("akka.storage.voldemort.store.vectore.value", "VectorValues") - val storeClientFactory = { - if (bootstrapUrl.startsWith("tcp")) { - new SocketStoreClientFactory(new ClientConfig().setBootstrapUrls(bootstrapUrl)) - } else if (bootstrapUrl.startsWith("http")) { - new HttpStoreClientFactory(new ClientConfig().setBootstrapUrls(bootstrapUrl)) - } else { - throw new IllegalArgumentException("Unknown boostrapUrl syntax" + bootstrapUrl) - } + val clientConfig = config.getConfigMap("akka.storage.voldemort.client") match { + case Some(configMap) => getClientConfig(configMap.asMap) + case None => getClientConfig(new HashMap[String, String] + ("boostrap_urls" -> "tcp://localhost:6666")) } - var refClient: StoreClient[String, Array[Byte]] = storeClientFactory.getStoreClient(refStore) - var mapKeyClient: StoreClient[String, Array[Byte]] = storeClientFactory.getStoreClient(mapKeyStore) - var mapValueClient: StoreClient[Array[Byte], Array[Byte]] = storeClientFactory.getStoreClient(mapValueStore) - var vectorSizeClient: StoreClient[String, Array[Byte]] = storeClientFactory.getStoreClient(vectorSizeStore) - var vectorValueClient: StoreClient[Array[Byte], Array[Byte]] = storeClientFactory.getStoreClient(vectorValueStore) + val refStore = config.getString("akka.storage.voldemort.store.ref", "Refs") + val mapKeyStore = config.getString("akka.storage.voldemort.store.map-key", "MapKeys") + val mapValueStore = config.getString("akka.storage.voldemort.store.map-value", "MapValues") + val vectorSizeStore = config.getString("akka.storage.voldemort.store.vector-size", "VectorSizes") + val vectorValueStore = config.getString("akka.storage.voldemort.store.vector-value", "VectorValues") + + var storeClientFactory: StoreClientFactory = null + var refClient: StoreClient[String, Array[Byte]] = null + var mapKeyClient: StoreClient[String, Array[Byte]] = null + var mapValueClient: StoreClient[Array[Byte], Array[Byte]] = null + var vectorSizeClient: StoreClient[String, Array[Byte]] = null + var vectorValueClient: StoreClient[Array[Byte], Array[Byte]] = null + initStoreClients + val underscoreBytesUTF8 = "_".getBytes("UTF-8") implicit val byteOrder = new Ordering[Array[Byte]] { override def compare(x: Array[Byte], y: Array[Byte]) = ByteUtils.compare(x, y) @@ -245,6 +243,38 @@ MapStorageBackend[Array[Byte], Array[Byte]] with IntSerializer.fromBytes(indexBytes) } + + def getClientConfig(configMap: Map[String, String]): Properties = { + val properites = new Properties + configMap.foreach { + keyval => keyval match { + case (key, value) => properites.setProperty(key.asInstanceOf[java.lang.String], value.asInstanceOf[java.lang.String]) + } + } + properites + } + + def initStoreClients() = { + if (storeClientFactory != null) { + storeClientFactory.close + } + + storeClientFactory = { + if (clientConfig.getProperty("bootstrap_urls", "none").startsWith("tcp")) { + new SocketStoreClientFactory(new ClientConfig(clientConfig)) + } else if (clientConfig.getProperty("bootstrap_urls", "none").startsWith("http")) { + new HttpStoreClientFactory(new ClientConfig(clientConfig)) + } else { + throw new IllegalArgumentException("Unknown boostrapUrl syntax" + clientConfig.getProperty("boostrap_urls", "No Bootstrap URLs defined")) + } + } + refClient = storeClientFactory.getStoreClient(refStore) + mapKeyClient = storeClientFactory.getStoreClient(mapKeyStore) + mapValueClient = storeClientFactory.getStoreClient(mapValueStore) + vectorSizeClient = storeClientFactory.getStoreClient(vectorSizeStore) + vectorValueClient = storeClientFactory.getStoreClient(vectorValueStore) + } + object IntSerializer { val bytesPerInt = java.lang.Integer.SIZE / java.lang.Byte.SIZE diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala index 395825152e..034b493006 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/EmbeddedVoldemort.scala @@ -15,7 +15,7 @@ trait EmbeddedVoldemort extends BeforeAndAfterAll with Logging { var server: VoldemortServer = null override protected def beforeAll(): Unit = { - + try { val dir = "./akka-persistence/akka-persistence-voldemort/target/scala_2.8.0/test-resources" val home = new File(dir) @@ -24,6 +24,7 @@ trait EmbeddedVoldemort extends BeforeAndAfterAll with Logging { log.info("Starting Voldemort") server = new VoldemortServer(config) server.start + VoldemortStorageBackend.initStoreClients log.info("Started") } catch { case e => log.error(e, "Error Starting Voldemort") From ed7cfe27a87c8c2f913eab116c1f7518a49cec3c Mon Sep 17 00:00:00 2001 From: ticktock Date: Tue, 21 Sep 2010 11:00:28 -0400 Subject: [PATCH 12/14] adding sjson as a test dependency to voldemort persistence --- project/build/AkkaProject.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index c6ccd783f3..6d800cdc36 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -191,6 +191,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { lazy val sbinary = "sbinary" % "sbinary" % "2.8.0-0.3.1" % "compile" lazy val sjson = "sjson.json" % "sjson" % "0.8-2.8.0" % "compile" + lazy val sjson_test = "sjson.json" % "sjson" % "0.8-2.8.0" % "test" lazy val slf4j = "org.slf4j" % "slf4j-api" % SLF4J_VERSION % "compile" @@ -544,6 +545,7 @@ class AkkaParentProject(info: ProjectInfo) extends DefaultProject(info) { val velocity = Dependencies.velocity val bdb = Dependencies.bdb val dbcp = Dependencies.dbcp + val sjson = Dependencies.sjson_test override def testOptions = TestFilter((name: String) => name.endsWith("Suite")) :: Nil } From 81b61a2e0e3b5a33babed4720fd09c3a59b2e5d9 Mon Sep 17 00:00:00 2001 From: ticktock Date: Tue, 21 Sep 2010 11:29:55 -0400 Subject: [PATCH 13/14] Adding a direct test of PersistentRef, since after merging master over, something is blowing up there with the Actor tests --- .../main/scala/VoldemortStorageBackend.scala | 9 ++-- ...oldemortPersistentDatastructureSuite.scala | 46 +++++++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentDatastructureSuite.scala diff --git a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala index 6331378356..83b74a4a05 100644 --- a/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala +++ b/akka-persistence/akka-persistence-voldemort/src/main/scala/VoldemortStorageBackend.scala @@ -26,9 +26,10 @@ MapStorageBackend[Array[Byte], Array[Byte]] with VectorStorageBackend[Array[Byte]] with RefStorageBackend[Array[Byte]] with Logging { + val bootstrapUrlsProp = "bootstrap_urls" val clientConfig = config.getConfigMap("akka.storage.voldemort.client") match { case Some(configMap) => getClientConfig(configMap.asMap) - case None => getClientConfig(new HashMap[String, String] + ("boostrap_urls" -> "tcp://localhost:6666")) + case None => getClientConfig(new HashMap[String, String] + (bootstrapUrlsProp -> "tcp://localhost:6666")) } val refStore = config.getString("akka.storage.voldemort.store.ref", "Refs") val mapKeyStore = config.getString("akka.storage.voldemort.store.map-key", "MapKeys") @@ -260,12 +261,12 @@ MapStorageBackend[Array[Byte], Array[Byte]] with } storeClientFactory = { - if (clientConfig.getProperty("bootstrap_urls", "none").startsWith("tcp")) { + if (clientConfig.getProperty(bootstrapUrlsProp, "none").startsWith("tcp")) { new SocketStoreClientFactory(new ClientConfig(clientConfig)) - } else if (clientConfig.getProperty("bootstrap_urls", "none").startsWith("http")) { + } else if (clientConfig.getProperty(bootstrapUrlsProp, "none").startsWith("http")) { new HttpStoreClientFactory(new ClientConfig(clientConfig)) } else { - throw new IllegalArgumentException("Unknown boostrapUrl syntax" + clientConfig.getProperty("boostrap_urls", "No Bootstrap URLs defined")) + throw new IllegalArgumentException("Unknown boostrapUrl syntax" + clientConfig.getProperty(bootstrapUrlsProp, "No Bootstrap URLs defined")) } } refClient = storeClientFactory.getStoreClient(refStore) diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentDatastructureSuite.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentDatastructureSuite.scala new file mode 100644 index 0000000000..8c439f8d85 --- /dev/null +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentDatastructureSuite.scala @@ -0,0 +1,46 @@ +package se.scalablesolutions.akka.persistence.voldemort + +import org.scalatest.FunSuite +import org.scalatest.matchers.ShouldMatchers +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import se.scalablesolutions.akka.persistence.voldemort.VoldemortStorageBackend._ +import se.scalablesolutions.akka.util.{Logging, UUID} +import collection.immutable.TreeSet +import VoldemortStorageBackendSuite._ + +import se.scalablesolutions.akka.stm._ +import se.scalablesolutions.akka.stm.global._ +import se.scalablesolutions.akka.config.ScalaConfig._ +import se.scalablesolutions.akka.persistence.common._ +import se.scalablesolutions.akka.util.Logging +import se.scalablesolutions.akka.config.Config.config + +@RunWith(classOf[JUnitRunner]) +class VoldemortPersistentDatastructureSuite extends FunSuite with ShouldMatchers with EmbeddedVoldemort with Logging { + test("persistentRefs work as expected") { + val name = UUID.newUuid.toString + val one = "one".getBytes + atomic { + val ref = VoldemortStorage.getRef(name) + ref.isDefined should be(false) + ref.swap(one) + ref.get match { + case Some(bytes) => bytes should be(one) + case None => true should be(false) + } + } + val two = "two".getBytes + atomic { + val ref = VoldemortStorage.getRef(name) + ref.isDefined should be(true) + ref.swap(two) + ref.get match { + case Some(bytes) => bytes should be(two) + case None => true should be(false) + } + } + } + + +} \ No newline at end of file From 5abf5cd849cd9b21d22c5f387b056f5512ebd6f1 Mon Sep 17 00:00:00 2001 From: ticktock Date: Tue, 21 Sep 2010 15:35:18 -0400 Subject: [PATCH 14/14] making the persistent data sturctures non lazy in the ActorTest made things work...hmm seems strange though --- .../test/resources/config/server.properties | 1 + .../scala/VoldemortPersistentActorSuite.scala | 16 +++++--- ...oldemortPersistentDatastructureSuite.scala | 41 +++++++++++++++++++ 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/akka-persistence/akka-persistence-voldemort/src/test/resources/config/server.properties b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/server.properties index 1e6af91e2d..8f5a8ff884 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/resources/config/server.properties +++ b/akka-persistence/akka-persistence-voldemort/src/test/resources/config/server.properties @@ -1 +1,2 @@ node.id=0 +enable.rebalancing=false diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentActorSuite.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentActorSuite.scala index ae575e1e96..f76c370667 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentActorSuite.scala +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentActorSuite.scala @@ -24,8 +24,8 @@ object BankAccountActor { } class BankAccountActor extends Transactor { - private lazy val accountState = VoldemortStorage.newMap(state) - private lazy val txnLog = VoldemortStorage.newVector(tx) + private val accountState = VoldemortStorage.newMap(state) + private val txnLog = VoldemortStorage.newVector(tx) import sjson.json.DefaultProtocol._ import sjson.json.JsonSerialization._ @@ -122,21 +122,25 @@ Spec with describe("successful debit") { it("should debit successfully") { + log.info("Succesful Debit starting") val bactor = actorOf[BankAccountActor] bactor.start val failer = actorOf[PersistentFailerActor] failer.start bactor !! Credit("a-123", 5000) + log.info("credited") bactor !! Debit("a-123", 3000, failer) - + log.info("debited") (bactor !! Balance("a-123")).get.asInstanceOf[Int] should equal(2000) - + log.info("balane matched") bactor !! Credit("a-123", 7000) + log.info("Credited") (bactor !! Balance("a-123")).get.asInstanceOf[Int] should equal(9000) - + log.info("Balance matched") bactor !! Debit("a-123", 8000, failer) + log.info("Debited") (bactor !! Balance("a-123")).get.asInstanceOf[Int] should equal(1000) - + log.info("Balance matched") (bactor !! LogSize).get.asInstanceOf[Int] should equal(7) (bactor !! Log(0, 7)).get.asInstanceOf[Iterable[String]].size should equal(7) } diff --git a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentDatastructureSuite.scala b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentDatastructureSuite.scala index 8c439f8d85..89e7426e03 100644 --- a/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentDatastructureSuite.scala +++ b/akka-persistence/akka-persistence-voldemort/src/test/scala/VoldemortPersistentDatastructureSuite.scala @@ -43,4 +43,45 @@ class VoldemortPersistentDatastructureSuite extends FunSuite with ShouldMatchers } + test("Persistent Vectors function as expected") { + val name = UUID.newUuid.toString + val one = "one".getBytes + val two = "two".getBytes + atomic { + val vec = VoldemortStorage.getVector(name) + vec.add(one) + } + atomic { + val vec = VoldemortStorage.getVector(name) + vec.size should be(1) + vec.add(two) + } + atomic { + val vec = VoldemortStorage.getVector(name) + + vec.get(0) should be(one) + vec.get(1) should be(two) + vec.size should be(2) + vec.update(0, two) + } + + atomic { + val vec = VoldemortStorage.getVector(name) + vec.get(0) should be(two) + vec.get(1) should be(two) + vec.size should be(2) + vec.update(0, Array.empty[Byte]) + vec.update(1, Array.empty[Byte]) + } + + atomic { + val vec = VoldemortStorage.getVector(name) + vec.get(0) should be(Array.empty[Byte]) + vec.get(1) should be(Array.empty[Byte]) + vec.size should be(2) + } + + + } + } \ No newline at end of file