Author: simoneg
Date: Tue Jul 10 01:20:24 2012
New Revision: 1359452

URL: http://svn.apache.org/viewvc?rev=1359452&view=rev
Log:
Implementation of DatabaseState for mongo entities, fixed a missed cache, fixed 
concurrency issue when many threads starts in a short time

Added:
    
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoGetDatabaseState.aj
Modified:
    
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/InstallMongoDatabase.aj
    
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java
    
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/QueryList.java

Modified: 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/InstallMongoDatabase.aj
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/InstallMongoDatabase.aj?rev=1359452&r1=1359451&r2=1359452&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/InstallMongoDatabase.aj
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/InstallMongoDatabase.aj
 Tue Jul 10 01:20:24 2012
@@ -13,7 +13,7 @@ import com.mongodb.MongoException;
 public aspect InstallMongoDatabase {
 
        private MongoDatabase Cycle.currentMDb = null;
-       private Mongo m = null;
+       private volatile Mongo m = null;
        
        public pointcut databaseCreation() : call(Database.new(..));
        
@@ -34,18 +34,22 @@ public aspect InstallMongoDatabase {
                Cycle cycle = Cycle.get();
                if (cycle.currentMDb == null) {
                        if (m == null) {
-                               try {
-                                       m = new 
Mongo(Settings.get("mongodb.host"));
-                                       String clientThread = 
Settings.get("mongodb.clientThread");
-                                       if (clientThread != null && 
clientThread.equalsIgnoreCase("true")) {
-                                               MongoDB sptmongo = new 
MongoDB(m);
-                                               TransactionSecondPhaseThread 
spt = new 
TransactionSecondPhaseThread(sptmongo,Settings.get("mongodb.defaultDb"));
-                                               Thread t = new Thread(spt);
-                                               t.setDaemon(true);
-                                               t.start();
+                               synchronized (this) {
+                                       if (m == null) {
+                                               try {
+                                                       m = new 
Mongo(Settings.get("mongodb.host"));
+                                                       String clientThread = 
Settings.get("mongodb.clientThread");
+                                                       if (clientThread != 
null && clientThread.equalsIgnoreCase("true")) {
+                                                               MongoDB 
sptmongo = new MongoDB(m);
+                                                               
TransactionSecondPhaseThread spt = new 
TransactionSecondPhaseThread(sptmongo,Settings.get("mongodb.defaultDb"));
+                                                               Thread t = new 
Thread(spt);
+                                                               
t.setDaemon(true);
+                                                               t.start();
+                                                       }
+                                               } catch (Exception e) {
+                                                       throw new 
MagmaException(e, "Error connecting to mongo on {0}", 
Settings.get("mongodb.host"));
+                                               }
                                        }
-                               } catch (Exception e) {
-                                       throw new MagmaException(e, "Error 
connecting to mongo on {0}", Settings.get("mongodb.host"));
                                }
                        }
                        MongoDB mdb = new MongoDB(m);

Added: 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoGetDatabaseState.aj
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoGetDatabaseState.aj?rev=1359452&view=auto
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoGetDatabaseState.aj
 (added)
+++ 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoGetDatabaseState.aj
 Tue Jul 10 01:20:24 2012
@@ -0,0 +1,56 @@
+package org.apache.magma.database.mongo;
+
+import org.apache.magma.database.DatabaseState;
+
+public aspect MongoGetDatabaseState {
+
+       public static class MongoDBState extends DatabaseState {
+
+               private MongoEntity entity;
+               
+               public MongoDBState(MongoEntity entity) {
+                       this.entity = entity;
+               }
+
+               @Override
+               public boolean isFromdb() {
+                       return entity.isFromDb();
+               }
+
+               @Override
+               public boolean isDetached() {
+                       return false;
+               }
+
+               @Override
+               public boolean isPersisted() {
+                       return entity.isOnDb();
+               }
+
+               @Override
+               public boolean isDeleted() {
+                       return entity.getPart().isDeleted();
+               }
+
+               @Override
+               public boolean isUpdated() {
+                       return entity.isFromDb() && !this.isDeleted();
+               }
+
+               @Override
+               public boolean isDirty() {
+                       return entity.isDirty();
+               }
+               
+       }
+       
+       private MongoDBState MongoEntity.myDatabaseState = null;
+       
+       public DatabaseState MongoEntity.getDatabaseState() {
+               if (this.myDatabaseState == null) {
+                       this.myDatabaseState = new MongoDBState(this);
+               }
+               return this.myDatabaseState;
+       }
+       
+}

Modified: 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java?rev=1359452&r1=1359451&r2=1359452&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java
 Tue Jul 10 01:20:24 2012
@@ -190,4 +190,20 @@ public class MongoUtils {
                        }
                }
        }
+       
+       public static String extractId(Class clazz, BSONObject obj) {
+               Object val = obj.get("_id");
+               if (val == null) return null;
+               // Special case for WithDefaultId, where id is read only from 
the bean handler
+               if (WithDefaultId.class.isAssignableFrom(clazz)) {
+                       long id = 0;
+                       if (val instanceof String) {
+                               id = Long.parseLong((String)val, 16);
+                       } else if (!(val instanceof Long)) {
+                               throw new MagmaException("Cannot convert {0} to 
a long for id", val); 
+                       }
+                       return Long.toString(id);
+               }
+               return val.toString();
+       }
 }

Modified: 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/QueryList.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/QueryList.java?rev=1359452&r1=1359451&r2=1359452&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/QueryList.java
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/QueryList.java
 Tue Jul 10 01:20:24 2012
@@ -8,6 +8,7 @@ import java.util.List;
 import java.util.ListIterator;
 
 import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
 
 public class QueryList<E extends MongoEntity> extends 
AbstractSequentialList<E> {
 
@@ -42,9 +43,18 @@ public class QueryList<E extends MongoEn
 
                        public E next() {
                                while (acpos >= loadeds.size()) {
-                                       E ent = 
(E)MongoUtils.convertToObject(clazz, cursor.next());
-                                       transaction.addEntity(ent);
-                                       ent.setFromDb(true);
+                                       DBObject next = cursor.next();
+                                       String idstr = 
MongoUtils.extractId(clazz, next);
+                                       E ent = null;
+                                       if (idstr != null) {
+                                               ent = 
transaction.checkCache(clazz, idstr);
+                                       }
+                                       if (ent == null) {
+                                               ent = 
(E)MongoUtils.convertToObject(clazz, next);
+                                               transaction.addEntity(ent);
+                                               transaction.cache(clazz, idstr, 
ent);
+                                               ent.setFromDb(true);
+                                       }
                                        loadeds.add(ent);
                                }
                                E ret =loadeds.get(acpos);



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to