Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2011-02-19 11:03:42 +0000
committerEike Stepper2011-02-19 11:03:42 +0000
commitfbdfbdaa150be99b62848d8149b7d3c42ec84358 (patch)
tree996789e248a0b9ea40b3b59f31ab1785a430e29a /plugins/org.eclipse.emf.cdo.server.mongodb
parent6e99cdd14e293af3c5877f195063b781faa2141e (diff)
downloadcdo-fbdfbdaa150be99b62848d8149b7d3c42ec84358.tar.gz
cdo-fbdfbdaa150be99b62848d8149b7d3c42ec84358.tar.xz
cdo-fbdfbdaa150be99b62848d8149b7d3c42ec84358.zip
[337152] [Mongo] Create a MongoDBStore
https://bugs.eclipse.org/bugs/show_bug.cgi?id=337152
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.mongodb')
-rw-r--r--plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Commits.java133
-rw-r--r--plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStore.java189
-rw-r--r--plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStoreAccessor.java4
3 files changed, 270 insertions, 56 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Commits.java b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Commits.java
index 48b0dd0bdb..a48f857ead 100644
--- a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Commits.java
+++ b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Commits.java
@@ -15,10 +15,13 @@ import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.model.CDOClassInfo;
import org.eclipse.emf.cdo.common.model.CDOModelUtil;
+import org.eclipse.emf.cdo.common.model.CDOType;
import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.common.revision.CDOList;
import org.eclipse.emf.cdo.common.revision.CDORevisionCacheAdder;
+import org.eclipse.emf.cdo.common.revision.CDORevisionData;
import org.eclipse.emf.cdo.server.IStoreAccessor.QueryResourcesContext;
+import org.eclipse.emf.cdo.server.internal.mongodb.MongoDBStore.ValueHandler;
import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry;
@@ -33,7 +36,6 @@ import org.eclipse.net4j.util.om.monitor.OMMonitor;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject.EStore;
@@ -79,6 +81,8 @@ public class Commits extends Coll
public static final String CLASSIFIER_PREFIX = "c";
+ public static final String SET_SUFFIX = "___set";
+
public static final String REVISIONS = "revisions";
public static final String REVISIONS_ID = "cdo_id";
@@ -284,11 +288,6 @@ public class Commits extends Coll
{
DBObject doc = new BasicDBObject();
idHandler.write(doc, REVISIONS_ID, revision.getID());
- // if (store.isBranching())
- // {
- // int branch = revision.getBranch().getID();
- // doc.put(REVISIONS_BRANCH, branch);
- // }
doc.put(REVISIONS_VERSION, revision.getVersion());
@@ -308,33 +307,47 @@ public class Commits extends Coll
for (EStructuralFeature feature : classInfo.getAllPersistentFeatures())
{
Object value = revision.getValue(feature);
- if (value == null)
+ if (value != null && value.getClass() == Object.class)
+ {
+ System.out.println();
+ }
+
+ if (feature.isUnsettable())
{
- continue;
+ boolean set = value != null;
+ doc.put(feature.getName() + SET_SUFFIX, set);
+ if (!set)
+ {
+ continue;
+ }
+
+ if (value == CDORevisionData.NIL)
+ {
+ value = null;
+ }
}
+ CDOType type = CDOModelUtil.getType(feature);
+ ValueHandler valueHandler = store.getValueHandler(type);
+
if (feature.isMany())
{
- List<?> list = (List<?>)value;
- Object[] array = new Object[list.size()];
- int i = 0;
- for (Object element : list)
+ if (value != null)
{
- if (feature instanceof EReference) // TODO Remove loop invariant
+ List<?> cdoList = (List<?>)value;
+ BasicDBList mongoList = new BasicDBList();
+ for (Object element : cdoList)
{
- CDOID id = (CDOID)element;
- element = idHandler.toValue(id);
+ element = valueHandler.toMongo(element);
+ mongoList.add(element);
}
- array[i++] = element;
+ value = mongoList;
}
-
- value = array;
}
- else if (feature instanceof EReference)
+ else
{
- CDOID id = (CDOID)value;
- value = idHandler.toValue(id);
+ value = valueHandler.toMongo(value);
}
doc.put(feature.getName(), value);
@@ -405,7 +418,7 @@ public class Commits extends Coll
}
else
{
- String revisionName = (String)revision.get("name");
+ String revisionName = (String)revision.get("name"); // TODO Use ValueHandler?
if (revisionName == null)
{
return null;
@@ -501,41 +514,57 @@ public class Commits extends Coll
result.setContainerID(containerID);
result.setContainingFeatureID(featureID);
- CDOClassInfo classInfo = CDOModelUtil.getClassInfo(eClass); // TODO Cache id-->classInfo
- for (EStructuralFeature feature : classInfo.getAllPersistentFeatures())
+ unmarshallRevision(revision, result);
+
+ return result;
+ }
+ }.execute();
+ }
+
+ private void unmarshallRevision(DBObject revision, InternalCDORevision result)
+ {
+ CDOClassInfo classInfo = result.getClassInfo();
+ for (EStructuralFeature feature : classInfo.getAllPersistentFeatures())
+ {
+ Object value = revision.get(feature.getName());
+
+ if (feature.isUnsettable())
+ {
+ boolean set = (Boolean)revision.get(feature.getName() + SET_SUFFIX);
+ if (!set)
{
- Object value = revision.get(feature.getName());
- if (feature.isMany())
- {
- if (value != null)
- {
- List<?> list = (List<?>)value;
- CDOList revisionList = result.getList(feature, list.size());
- for (Object element : list)
- {
- if (element != null && feature instanceof EReference)
- {
- element = idHandler.fromValue(element);
- }
-
- revisionList.add(element);
- }
- }
- }
- else
- {
- if (value != null && feature instanceof EReference)
- {
- value = idHandler.fromValue(value);
- }
+ continue;
+ }
- result.set(feature, EStore.NO_INDEX, value);
- }
+ if (value == null)
+ {
+ result.set(feature, EStore.NO_INDEX, CDORevisionData.NIL);
+ continue;
}
+ }
- return result;
+ CDOType type = CDOModelUtil.getType(feature);
+ ValueHandler valueHandler = store.getValueHandler(type);
+
+ if (feature.isMany())
+ {
+ if (value != null)
+ {
+ List<?> list = (List<?>)value;
+ CDOList revisionList = result.getList(feature, list.size());
+ for (Object element : list)
+ {
+ element = valueHandler.fromMongo(element);
+ revisionList.add(element);
+ }
+ }
}
- }.execute();
+ else
+ {
+ value = valueHandler.fromMongo(value);
+ result.set(feature, EStore.NO_INDEX, value);
+ }
+ }
}
/**
diff --git a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStore.java b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStore.java
index 1e86dff4d9..47fab2c440 100644
--- a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStore.java
+++ b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStore.java
@@ -11,6 +11,7 @@
package org.eclipse.emf.cdo.server.internal.mongodb;
import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.model.CDOType;
import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
import org.eclipse.emf.cdo.server.ISession;
import org.eclipse.emf.cdo.server.IStoreAccessor;
@@ -29,6 +30,9 @@ import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.MongoURI;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -48,6 +52,8 @@ public class MongoDBStore extends Store implements IMongoDBStore
{
public static final String TYPE = "mongodb"; //$NON-NLS-1$
+ private ValueHandler[] valueHandlers = new ValueHandler[Byte.MAX_VALUE - Byte.MIN_VALUE + 1];
+
private MongoURI mongoURI;
private String dbName;
@@ -77,6 +83,11 @@ public class MongoDBStore extends Store implements IMongoDBStore
set(RevisionParallelism.NONE, RevisionParallelism.BRANCHING));
}
+ public ValueHandler getValueHandler(CDOType type)
+ {
+ return valueHandlers[type.getTypeID() - Byte.MIN_VALUE];
+ }
+
public MongoURI getMongoURI()
{
return mongoURI;
@@ -248,6 +259,9 @@ public class MongoDBStore extends Store implements IMongoDBStore
LifecycleUtil.activate(idHandler);
setObjectIDTypes(idHandler.getObjectIDTypes());
+ Arrays.fill(valueHandlers, new ValueHandler());
+ initValueHandlers();
+
if (firstStart)
{
firstStart();
@@ -258,6 +272,165 @@ public class MongoDBStore extends Store implements IMongoDBStore
}
}
+ protected void initValueHandlers()
+ {
+ initValueHandler(CDOType.OBJECT, new ValueHandler()
+ {
+ @Override
+ public Object toMongo(Object value)
+ {
+ if (value != null)
+ {
+ return idHandler.toValue((CDOID)value);
+ }
+
+ return null;
+ }
+
+ @Override
+ public Object fromMongo(Object value)
+ {
+ if (value != null)
+ {
+ return idHandler.fromValue(value);
+ }
+
+ return null;
+ }
+ });
+
+ initValueHandler(CDOType.CHAR, new ValueHandler()
+ {
+ @Override
+ public Object toMongo(Object value)
+ {
+ return Character.toString((Character)value);
+ }
+
+ @Override
+ public Object fromMongo(Object value)
+ {
+ if (value instanceof String)
+ {
+ return ((String)value).charAt(0);
+ }
+
+ return value;
+ }
+ });
+
+ initValueHandler(CDOType.BYTE, new ValueHandler()
+ {
+ @Override
+ public Object fromMongo(Object value)
+ {
+ if (value instanceof Integer)
+ {
+ return (byte)(int)(Integer)value;
+ }
+
+ return value;
+ }
+ });
+
+ initValueHandler(CDOType.SHORT, new ValueHandler()
+ {
+ @Override
+ public Object fromMongo(Object value)
+ {
+ if (value instanceof Integer)
+ {
+ return (short)(int)(Integer)value;
+ }
+
+ return value;
+ }
+ });
+
+ initValueHandler(CDOType.LONG, new ValueHandler()
+ {
+ @Override
+ public Object fromMongo(Object value)
+ {
+ if (value instanceof Integer)
+ {
+ return (long)(Integer)value;
+ }
+
+ return value;
+ }
+ });
+
+ initValueHandler(CDOType.FLOAT, new ValueHandler()
+ {
+ @Override
+ public Object fromMongo(Object value)
+ {
+ if (value instanceof Double)
+ {
+ return (float)(double)(Double)value;
+ }
+
+ return value;
+ }
+ });
+
+ initValueHandler(CDOType.BIG_DECIMAL, new ValueHandler()
+ {
+ @Override
+ public Object toMongo(Object value)
+ {
+ if (value != null)
+ {
+ return ((BigDecimal)value).toPlainString();
+ }
+
+ return null;
+ }
+
+ @Override
+ public Object fromMongo(Object value)
+ {
+ if (value != null)
+ {
+ return new BigDecimal((String)value);
+ }
+
+ return null;
+ }
+ });
+
+ initValueHandler(CDOType.BIG_INTEGER, new ValueHandler()
+ {
+ @Override
+ public Object toMongo(Object value)
+ {
+ if (value != null)
+ {
+ return ((BigInteger)value).toString();
+ }
+
+ return null;
+ }
+
+ @Override
+ public Object fromMongo(Object value)
+ {
+ if (value != null)
+ {
+ return new BigInteger((String)value);
+ }
+
+ return null;
+ }
+ });
+ }
+
+ protected void initValueHandler(CDOType type, ValueHandler valueHandler)
+ {
+ valueHandlers[type.getTypeID() - Byte.MIN_VALUE] = valueHandler;
+ }
+
@Override
protected void doDeactivate() throws Exception
{
@@ -333,4 +506,20 @@ public class MongoDBStore extends Store implements IMongoDBStore
{
throw new UnsupportedOperationException("Not yet implemented"); // TODO Implement me
}
+
+ /**
+ * @author Eike Stepper
+ */
+ public static class ValueHandler
+ {
+ public Object toMongo(Object value)
+ {
+ return value;
+ }
+
+ public Object fromMongo(Object value)
+ {
+ return value;
+ }
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStoreAccessor.java
index b11eae206f..03fa867f7f 100644
--- a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStoreAccessor.java
+++ b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStoreAccessor.java
@@ -26,7 +26,6 @@ import org.eclipse.emf.cdo.server.IQueryHandler;
import org.eclipse.emf.cdo.server.ISession;
import org.eclipse.emf.cdo.server.IStoreChunkReader;
import org.eclipse.emf.cdo.server.ITransaction;
-import org.eclipse.emf.cdo.server.internal.mongodb.bundle.OM;
import org.eclipse.emf.cdo.server.mongodb.IMongoDBStoreAccessor;
import org.eclipse.emf.cdo.spi.common.commit.CDOChangeSetSegment;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;
@@ -37,7 +36,6 @@ import org.eclipse.emf.cdo.spi.server.StoreAccessorBase;
import org.eclipse.net4j.util.collection.Pair;
import org.eclipse.net4j.util.om.monitor.OMMonitor;
-import org.eclipse.net4j.util.om.trace.ContextTracer;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
@@ -54,8 +52,6 @@ import java.util.Set;
*/
public class MongoDBStoreAccessor extends StoreAccessorBase implements IMongoDBStoreAccessor
{
- private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, MongoDBStoreAccessor.class);
-
public MongoDBStoreAccessor(Store store, ISession session)
{
super(store, session);

Back to the top