You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by rm...@apache.org on 2012/10/17 16:46:22 UTC
svn commit: r1399282 - in
/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql: ./
src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/
src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/
src/main/java/org/apache/i...
Author: rmatthews
Date: Wed Oct 17 14:46:21 2012
New Revision: 1399282
URL: http://svn.apache.org/viewvc?rev=1399282&view=rev
Log:
ISIS-176 - upgraded mongo version and incorporated basic searching.
Modified:
incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/pom.xml
incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/NoSqlObjectStore.java
incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/ObjectReader.java
incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/NoSqlDataDatabase.java
incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java
incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/mongo/MongoDb.java
Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/pom.xml
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/pom.xml?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/pom.xml (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/pom.xml Wed Oct 17 14:46:21 2012
@@ -143,7 +143,7 @@
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
- <version>1.3</version>
+ <version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/NoSqlObjectStore.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/NoSqlObjectStore.java?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/NoSqlObjectStore.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/NoSqlObjectStore.java Wed Oct 17 14:46:21 2012
@@ -48,6 +48,9 @@ import org.apache.isis.runtimes.dflt.run
import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.SaveObjectCommand;
import org.apache.isis.runtimes.dflt.runtime.persistence.query.PersistenceQueryBuiltIn;
+import org.apache.isis.runtimes.dflt.runtime.persistence.query.PersistenceQueryFindAllInstances;
+import org.apache.isis.runtimes.dflt.runtime.persistence.query.PersistenceQueryFindByPattern;
+import org.apache.isis.runtimes.dflt.runtime.persistence.query.PersistenceQueryFindByTitle;
import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
import org.apache.isis.runtimes.dflt.runtime.system.persistence.IdentifierGenerator;
import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
@@ -122,17 +125,60 @@ public class NoSqlObjectStore implements
public void execute(final List<PersistenceCommand> commands) {
database.write(commands);
}
-
+
@Override
public List<ObjectAdapter> loadInstancesAndAdapt(final PersistenceQuery persistenceQuery) {
+ if (persistenceQuery instanceof PersistenceQueryFindByTitle) {
+ return getAllInstances((PersistenceQueryFindByTitle) persistenceQuery);
+ } else if (persistenceQuery instanceof PersistenceQueryFindAllInstances) {
+ return getAllInstances((PersistenceQueryFindAllInstances) persistenceQuery);
+ } else if (persistenceQuery instanceof PersistenceQueryFindByPattern) {
+ return findByPattern((PersistenceQueryFindByPattern) persistenceQuery);
+ } else {
+ return findDefaultr(persistenceQuery);
+ }
+ }
+
+ private List<ObjectAdapter> findDefaultr(PersistenceQuery persistenceQuery) {
+ final List<ObjectAdapter> instances = Lists.newArrayList();
final ObjectSpecification specification = persistenceQuery.getSpecification();
+ final Iterator<StateReader> instanceData = database.instancesOf(specification.getSpecId());
+ while (instanceData.hasNext()) {
+ final StateReader reader = instanceData.next();
+ final ObjectAdapter instance = objectReader.load(reader, versionCreator, availableDataEncrypters);
+ instances.add(instance);
+ }
+ return instances;
+ }
+
+ private List<ObjectAdapter> findByPattern(PersistenceQueryFindByPattern query) {
+ final ObjectSpecification specification = query.getSpecification();
final List<ObjectAdapter> instances = Lists.newArrayList();
- appendInstances(persistenceQuery, specification, instances);
+ appendPatternInstances(query, specification, instances);
return instances;
}
+
+ private void appendPatternInstances(final PersistenceQueryFindByPattern persistenceQuery, final ObjectSpecification specification, final List<ObjectAdapter> instances) {
+ final Iterator<StateReader> instanceData = database.instancesOf(specification.getSpecId(), persistenceQuery.getPattern());
+ while (instanceData.hasNext()) {
+ final StateReader reader = instanceData.next();
+ final ObjectAdapter instance = objectReader.load(reader, versionCreator, availableDataEncrypters);
+ instances.add(instance);
+ }
+ for (final ObjectSpecification spec : specification.subclasses()) {
+ appendPatternInstances(persistenceQuery, spec, instances);
+ }
+ }
- private void appendInstances(final PersistenceQuery persistenceQuery, final ObjectSpecification specification, final List<ObjectAdapter> instances) {
-
+
+ private List<ObjectAdapter> getAllInstances(PersistenceQuery query) {
+ final ObjectSpecification specification = query.getSpecification();
+ final List<ObjectAdapter> instances = Lists.newArrayList();
+ appendInstances(query, specification, instances);
+ return instances;
+ }
+
+ private void appendInstances(final PersistenceQuery persistenceQuery, final ObjectSpecification specification, final List<ObjectAdapter> instances) {
final Iterator<StateReader> instanceData = database.instancesOf(specification.getSpecId());
while (instanceData.hasNext()) {
final StateReader reader = instanceData.next();
@@ -186,13 +232,7 @@ public class NoSqlObjectStore implements
@Override
public void resolveImmediately(final ObjectAdapter adapter) {
final Oid oid = adapter.getOid();
- ;
- if (oid instanceof AggregatedOid) {
- // throw new
- // UnexpectedCallException("Aggregated objects should not need to be resolved: "
- // +
- // object);
- } else {
+ if (!(oid instanceof AggregatedOid)) {
final ObjectSpecification objectSpec = adapter.getSpecification();
final String key = keyCreator.getIdentifierForPersistentRoot(oid);
final StateReader reader = database.getInstance(key, objectSpec.getSpecId());
Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/ObjectReader.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/ObjectReader.java?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/ObjectReader.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/ObjectReader.java Wed Oct 17 14:46:21 2012
@@ -22,19 +22,16 @@ package org.apache.isis.runtimes.dflt.ob
import java.util.List;
import java.util.Map;
-import org.apache.isis.core.commons.exceptions.UnexpectedCallException;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ResolveState;
import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
import org.apache.isis.core.metamodel.adapter.oid.AggregatedOid;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
import org.apache.isis.core.metamodel.adapter.version.Version;
import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationContainer;
@@ -45,11 +42,12 @@ import org.apache.isis.runtimes.dflt.obj
import org.apache.isis.runtimes.dflt.objectstores.nosql.keys.KeyCreatorDefault;
import org.apache.isis.runtimes.dflt.objectstores.nosql.versions.VersionCreator;
import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
-import org.apache.isis.runtimes.dflt.runtime.system.persistence.AdapterManagerSpi;
-import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
import org.apache.isis.runtimes.dflt.runtime.system.persistence.Persistor;
+import org.apache.log4j.Logger;
public class ObjectReader {
+
+ private static final Logger LOG = Logger.getLogger(ObjectReader.class);
private final KeyCreatorDefault keyCreator = new KeyCreatorDefault();
@@ -69,7 +67,7 @@ public class ObjectReader {
}
if (version.different(adapter.getVersion())) {
// TODO - do we need to CHECK version and update
- throw new UnexpectedCallException();
+ LOG.warn("while reading data into " + oidStr + " version was " + version + " when existing adapter was already " + adapter.getVersion());
}
} else {
@@ -138,8 +136,6 @@ public class ObjectReader {
}
private ObjectAdapter restoreAggregatedObject(final StateReader aggregateReader, final AggregatedOid aggregatedOid, final DataEncryption dataEncrypter) {
- final ObjectSpecification specification = getSpecificationLoader().lookupBySpecId(aggregatedOid.getObjectSpecId());
-
final ObjectAdapter fieldObject = getAdapter(aggregatedOid);
final ResolveState resolveState = ResolveState.RESOLVING;
fieldObject.changeState(resolveState);
@@ -173,7 +169,6 @@ public class ObjectReader {
throw new NoSqlStoreException("Invalid reference field (an empty string) in data for " + association.getName() + " in " + object);
}
final RootOid oid = keyCreator.unmarshal(ref);
- final ObjectSpecification specification = keyCreator.specificationFromOidStr(ref);
fieldObject = getAdapter(oid);
}
try {
Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/NoSqlDataDatabase.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/NoSqlDataDatabase.java?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/NoSqlDataDatabase.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/NoSqlDataDatabase.java Wed Oct 17 14:46:21 2012
@@ -22,6 +22,7 @@ package org.apache.isis.runtimes.dflt.ob
import java.util.Iterator;
import java.util.List;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
@@ -38,6 +39,7 @@ public interface NoSqlDataDatabase {
boolean hasInstances(ObjectSpecId objectSpecId);
StateReader getInstance(String key, ObjectSpecId objectSpecId);
Iterator<StateReader> instancesOf(ObjectSpecId objectSpecId);
+ Iterator<StateReader> instancesOf(ObjectSpecId specId, ObjectAdapter pattern);
long nextSerialNumberBatch(ObjectSpecId objectSpecId, int batchSize);
Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java Wed Oct 17 14:46:21 2012
@@ -27,8 +27,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.zip.CRC32;
-import org.apache.log4j.Logger;
-
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.runtimes.dflt.objectstores.nosql.NoSqlCommandContext;
@@ -36,6 +36,7 @@ import org.apache.isis.runtimes.dflt.obj
import org.apache.isis.runtimes.dflt.objectstores.nosql.db.NoSqlDataDatabase;
import org.apache.isis.runtimes.dflt.objectstores.nosql.db.StateReader;
import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
+import org.apache.log4j.Logger;
public class FileServerDb implements NoSqlDataDatabase {
@@ -252,4 +253,9 @@ public class FileServerDb implements NoS
returnConnection(connection);
return hasInstances;
}
+
+ public Iterator<StateReader> instancesOf(ObjectSpecId specId, ObjectAdapter pattern) {
+ // TODO implement
+ throw new NotImplementedException();
+ }
}
Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/mongo/MongoDb.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/mongo/MongoDb.java?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/mongo/MongoDb.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/mongo/MongoDb.java Wed Oct 17 14:46:21 2012
@@ -23,19 +23,9 @@ import java.net.UnknownHostException;
import java.util.Iterator;
import java.util.List;
-import com.mongodb.BasicDBObject;
-import com.mongodb.DB;
-import com.mongodb.DB.WriteConcern;
-import com.mongodb.DBCollection;
-import com.mongodb.DBCursor;
-import com.mongodb.DBObject;
-import com.mongodb.Mongo;
-import com.mongodb.MongoException;
-import com.mongodb.ObjectId;
-
-import org.apache.log4j.Logger;
-
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
import org.apache.isis.runtimes.dflt.objectstores.nosql.NoSqlCommandContext;
import org.apache.isis.runtimes.dflt.objectstores.nosql.NoSqlStoreException;
import org.apache.isis.runtimes.dflt.objectstores.nosql.db.NoSqlDataDatabase;
@@ -43,6 +33,16 @@ import org.apache.isis.runtimes.dflt.obj
import org.apache.isis.runtimes.dflt.objectstores.nosql.db.StateWriter;
import org.apache.isis.runtimes.dflt.objectstores.nosql.keys.KeyCreatorDefault;
import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
+import org.apache.log4j.Logger;
+import org.bson.types.ObjectId;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DB;
+import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+import com.mongodb.Mongo;
+import com.mongodb.MongoException;
public class MongoDb implements NoSqlDataDatabase {
@@ -74,11 +74,14 @@ public class MongoDb implements NoSqlDat
@Override
public void open() {
try {
- mongo = new Mongo(host, port);
- db = mongo.getDB(dbName);
- db.setWriteConcern(WriteConcern.STRICT);
-
- LOG.info("opened database (" + dbName + "): " + db);
+ if (mongo == null) {
+ mongo = new Mongo(host, port);
+ db = mongo.getDB(dbName);
+ db.setWriteConcern(com.mongodb.WriteConcern.SAFE);
+ LOG.info("opened database (" + dbName + "): " + mongo);
+ } else {
+ LOG.info(" using opened database " + db);
+ }
} catch (final UnknownHostException e) {
throw new NoSqlStoreException(e);
} catch (final MongoException e) {
@@ -88,7 +91,6 @@ public class MongoDb implements NoSqlDat
@Override
public void close() {
- // TODO is there a close mechanism?
}
public NoSqlCommandContext createTransactionContext() {
@@ -172,6 +174,43 @@ public class MongoDb implements NoSqlDat
};
}
+
+ @Override
+ public Iterator<StateReader> instancesOf(ObjectSpecId objectSpecId, ObjectAdapter pattern) {
+ final DBCollection instances = db.getCollection(objectSpecId.asString());
+
+ // REVIEW check the right types are used in matches
+ final BasicDBObject query = new BasicDBObject();
+ for ( ObjectAssociation association : pattern.getSpecification().getAssociations()) {
+ ObjectAdapter field = association.get(pattern);
+ if (!association.isEmpty(pattern)) {
+ if (field.isValue()) {
+ query.put(association.getIdentifier().getMemberName(), field.titleString());
+ } else if (association.isOneToOneAssociation()) {
+ query.put(association.getIdentifier().getMemberName(), field.getOid());
+ }
+ }
+ }
+ final DBCursor cursor = instances.find(query);
+ LOG.info("searching for instances of: " + objectSpecId);
+ return new Iterator<StateReader>() {
+ @Override
+ public boolean hasNext() {
+ return cursor.hasNext();
+ }
+
+ @Override
+ public StateReader next() {
+ return new MongoStateReader(cursor.next());
+ }
+
+ @Override
+ public void remove() {
+ throw new NoSqlStoreException("Can't remove elements");
+ }
+
+ };
+ }
@Override
public StateReader getInstance(final String key, final ObjectSpecId objectSpecId) {