From 3af5f5efd3e7fa64e9359451f99d8ff984cefe76 Mon Sep 17 00:00:00 2001 From: Debasish Ghosh Date: Tue, 25 May 2010 18:44:17 +0530 Subject: [PATCH] implemented updateVectorStorageEntryFor in akka-persistence-mongo (issue #165) and upgraded mongo-java-driver to 1.4 --- .../src/main/scala/MongoStorageBackend.scala | 17 +++++++++++++++-- .../src/test/scala/MongoStorageSpec.scala | 19 +++++++++++++++++++ project/build/AkkaProject.scala | 2 +- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala b/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala index 97245cff02..5643e51391 100644 --- a/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala +++ b/akka-persistence/akka-persistence-mongo/src/main/scala/MongoStorageBackend.scala @@ -268,8 +268,21 @@ private[akka] object MongoStorageBackend extends } } - def updateVectorStorageEntryFor(name: String, index: Int, elem: AnyRef) = - throw new UnsupportedOperationException("MongoStorageBackend::insertVectorStorageEntriesFor is not implemented") + def updateVectorStorageEntryFor(name: String, index: Int, elem: AnyRef) = { + val q = new BasicDBObject + q.put(KEY, name) + + val dbobj = + coll.findOneNS(q) match { + case None => + throw new NoSuchElementException(name + " not present") + case Some(dbo) => dbo + } + val currentList = dbobj.get(VALUE).asInstanceOf[JArrayList[AnyRef]] + currentList.set(index, serializer.out(elem)) + coll.update(q, + new BasicDBObject().append(KEY, name).append(VALUE, currentList)) + } def getVectorStorageSizeFor(name: String): Int = { nullSafeFindOne(name) match { diff --git a/akka-persistence/akka-persistence-mongo/src/test/scala/MongoStorageSpec.scala b/akka-persistence/akka-persistence-mongo/src/test/scala/MongoStorageSpec.scala index 6317365e77..e518b28d66 100644 --- a/akka-persistence/akka-persistence-mongo/src/test/scala/MongoStorageSpec.scala +++ b/akka-persistence/akka-persistence-mongo/src/test/scala/MongoStorageSpec.scala @@ -119,6 +119,25 @@ class MongoStorageSpec extends JUnitSuite { } catch {case e: NoSuchElementException => {}} } + @Test + def testVectorUpdateForTransactionId = { + import MongoStorageBackend._ + + changeSetV += "debasish" // string + changeSetV += List(1, 2, 3) // Scala List + changeSetV += List(100, 200) + + insertVectorStorageEntriesFor("U-A1", changeSetV.toList) + assertEquals(3, getVectorStorageSizeFor("U-A1")) + updateVectorStorageEntryFor("U-A1", 0, "maulindu") + val JsString(str) = getVectorStorageEntryFor("U-A1", 0).asInstanceOf[JsString] + assertEquals("maulindu", str) + + updateVectorStorageEntryFor("U-A1", 1, Map("1"->"dg", "2"->"mc")) + val JsObject(m) = getVectorStorageEntryFor("U-A1", 1).asInstanceOf[JsObject] + assertEquals(m.keySet.size, 2) + } + @Test def testMapInsertForTransactionId = { fillMap diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index cd3243599f..a26396c8e8 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -226,7 +226,7 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { } class AkkaMongoProject(info: ProjectInfo) extends AkkaDefaultProject(info, distPath) { - val mongo = "org.mongodb" % "mongo-java-driver" % "1.1" % "compile" + val mongo = "org.mongodb" % "mongo-java-driver" % "1.4" % "compile" override def testOptions = TestFilter((name: String) => name.endsWith("Test")) :: Nil }