Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2011-02-17 05:48:30 +0000
committerEike Stepper2011-02-17 05:48:30 +0000
commit51f589e3a8da67dadca14b6a4dcd7f6736331eb7 (patch)
treeb792f887bc872d032985e4f609d2a1845b87915e /plugins/org.eclipse.emf.cdo.server.mongodb/src
parent192c1d67b86383bd8d88ce9c3ee07376a3144f0b (diff)
downloadcdo-51f589e3a8da67dadca14b6a4dcd7f6736331eb7.tar.gz
cdo-51f589e3a8da67dadca14b6a4dcd7f6736331eb7.tar.xz
cdo-51f589e3a8da67dadca14b6a4dcd7f6736331eb7.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/src')
-rw-r--r--plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/LongIDHandler.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Mapper.java (renamed from plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBMapper.java)48
-rw-r--r--plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Mode.java90
-rw-r--r--plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBBrowserPage.java42
-rw-r--r--plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStore.java33
-rw-r--r--plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBStoreAccessor.java62
-rw-r--r--plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/mongodb/IMongoDBStore.java2
7 files changed, 221 insertions, 62 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/LongIDHandler.java b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/LongIDHandler.java
index 2b1fbaed97..3d9456acbb 100644
--- a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/LongIDHandler.java
+++ b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/LongIDHandler.java
@@ -127,4 +127,10 @@ public class LongIDHandler extends Lifecycle implements IDHandler
long value = CDOIDUtil.getLong(id);
doc.put(key, value);
}
+
+ public CDOID read(DBObject doc, String key)
+ {
+ long value = (Long)doc.get(key);
+ return CDOIDUtil.createLong(value);
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBMapper.java b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Mapper.java
index 697fcfb337..98606cfdc6 100644
--- a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBMapper.java
+++ b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Mapper.java
@@ -10,7 +10,7 @@
*/
package org.eclipse.emf.cdo.server.internal.mongodb;
-import org.eclipse.emf.cdo.server.IStoreAccessor.QueryResourcesContext;
+import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.net4j.util.concurrent.QueueWorker;
@@ -18,7 +18,6 @@ import org.eclipse.emf.ecore.EClass;
import com.mongodb.DB;
import com.mongodb.DBCollection;
-import com.mongodb.DBObject;
import java.util.HashMap;
import java.util.Map;
@@ -26,13 +25,13 @@ import java.util.Map;
/**
* @author Eike Stepper
*/
-public class MongoDBMapper extends QueueWorker<DBObject>
+public class Mapper extends QueueWorker<CDOCommitInfo>
{
private Map<EClass, DBCollection> collections = new HashMap<EClass, DBCollection>();
private MongoDBStore store;
- public MongoDBMapper(MongoDBStore store)
+ public Mapper(MongoDBStore store)
{
this.store = store;
}
@@ -55,47 +54,8 @@ public class MongoDBMapper extends QueueWorker<DBObject>
return db.getCollection(name);
}
- public boolean queryResources(QueryResourcesContext context, EClass eClass)
- {
- DBCollection collection = getCollection(eClass);
-
- // IDHandler idHandler = getStore().getIDHandler();
- // PreparedStatement stmt = null;
- // ResultSet resultSet = null;
- //
- // CDOID folderID = context.getFolderID();
- // String name = context.getName();
- // boolean exactMatch = context.exactMatch();
-
- try
- {
- // stmt = classMapping.createResourceQueryStatement(accessor, folderID, name, exactMatch, context);
- // resultSet = stmt.executeQuery();
- //
- // while (resultSet.next())
- // {
- // CDOID id = idHandler.getCDOID(resultSet, 1);
- // if (TRACER.isEnabled())
- // {
- // TRACER.trace("Resource query returned ID " + id); //$NON-NLS-1$
- // }
- //
- // if (!context.addResource(id))
- // {
- // // No more results allowed
- // return false; // don't continue
- // }
- // }
-
- return true; // Continue with other results
- }
- finally
- {
- }
- }
-
@Override
- protected void work(WorkContext context, DBObject commitInfo)
+ protected void work(WorkContext context, CDOCommitInfo commitInfo)
{
}
diff --git a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Mode.java b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Mode.java
new file mode 100644
index 0000000000..d195bbf52b
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/Mode.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2004 - 2011 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.server.internal.mongodb;
+
+import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.server.IStoreAccessor.QueryResourcesContext;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBObject;
+
+/**
+ * @author Eike Stepper
+ */
+public abstract class Mode
+{
+ private MongoDBStore store;
+
+ protected Mode()
+ {
+ }
+
+ public MongoDBStore getStore()
+ {
+ return store;
+ }
+
+ public void setStore(MongoDBStore store)
+ {
+ this.store = store;
+ }
+
+ public abstract DBObject createResourcesQuery(CDOID folderID, String name, boolean exactMatch,
+ QueryResourcesContext context);
+
+ /**
+ * @author Eike Stepper
+ */
+ public static class Normal extends Mode
+ {
+ @Override
+ public DBObject createResourcesQuery(CDOID folderID, String name, boolean exactMatch, QueryResourcesContext context)
+ {
+ DBObject query = new BasicDBObject();
+ query.put("_version", new BasicDBObject("$gt", 0));
+ getStore().getIDHandler().write(query, "_container", folderID);
+ if (name == null)
+ {
+ query.put("name", new BasicDBObject("$exists", false));
+ }
+ else
+ {
+ query.put("name", exactMatch ? name : new BasicDBObject("$regex", "/^" + name + "/"));
+ }
+
+ return query;
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static class Audditing extends Mode
+ {
+ @Override
+ public DBObject createResourcesQuery(CDOID folderID, String name, boolean exactMatch, QueryResourcesContext context)
+ {
+ return null;
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static class Branching extends Mode
+ {
+ @Override
+ public DBObject createResourcesQuery(CDOID folderID, String name, boolean exactMatch, QueryResourcesContext context)
+ {
+ return null;
+ }
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBBrowserPage.java b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBBrowserPage.java
index a9896110a7..76cfd8d760 100644
--- a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBBrowserPage.java
+++ b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/internal/mongodb/MongoDBBrowserPage.java
@@ -53,9 +53,6 @@ public class MongoDBBrowserPage extends AbstractPage
out.print("</table>\r\n");
}
- /**
- * @since 4.0
- */
protected String showCollections(CDOServerBrowser browser, PrintStream pout, DB db, String repo)
{
String collection = browser.getParam("collection");
@@ -82,21 +79,24 @@ public class MongoDBBrowserPage extends AbstractPage
return collection;
}
- /**
- * @since 4.0
- */
protected void showCollection(CDOServerBrowser browser, PrintStream pout, DB db, String collection)
{
DBCursor cursor = null;
-
+
try
{
+ pout.print("<ol>\r\n");
+ pout.print("<ol>\r\n");
cursor = db.getCollection(collection).find();
while (cursor.hasNext())
{
DBObject doc = cursor.next();
- pout.print(browser.escape(doc.toString()) + "<br>\r\n");
+ pout.print("<li>");
+ showDocument(browser, pout, doc, "");
+ pout.print("<p>\r\n");
}
+
+ pout.print("</ol>\r\n");
}
finally
{
@@ -107,6 +107,32 @@ public class MongoDBBrowserPage extends AbstractPage
}
}
+ protected void showDocument(CDOServerBrowser browser, PrintStream pout, DBObject doc, String level)
+ {
+ for (String key : doc.keySet())
+ {
+ pout.print(level);
+ pout.print("<b>");
+ pout.print(key);
+ pout.print("</b> = ");
+
+ Object value = doc.get(key);
+ if (value instanceof DBObject)
+ {
+ DBObject child = (DBObject)value;
+ pout.print("<br>");
+ showDocument(browser, pout, child, level + "&nbsp;&nbsp;");
+ }
+ else
+ {
+ pout.print(value);
+ pout.print("<em>&nbsp;&nbsp;(");
+ pout.print(value.getClass().getSimpleName().toLowerCase());
+ pout.print(")</em><br>");
+ }
+ }
+ }
+
/**
* @author Eike Stepper
*/
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 25d072c03c..1080c1089f 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
@@ -71,7 +71,9 @@ public class MongoDBStore extends Store implements IMongoDBStore
private IDHandler idHandler = new LongIDHandler(this);
- private MongoDBMapper mapper = new MongoDBMapper(this);
+ private Mapper mapper = new Mapper(this);
+
+ private Mode mode;
private DB db;
@@ -127,11 +129,16 @@ public class MongoDBStore extends Store implements IMongoDBStore
this.idHandler = idHandler;
}
- public MongoDBMapper getMapper()
+ public Mapper getMapper()
{
return mapper;
}
+ public Mode getMode()
+ {
+ return mode;
+ }
+
public DB getDB()
{
return db;
@@ -276,7 +283,6 @@ public class MongoDBStore extends Store implements IMongoDBStore
REPOS.put(getRepository().getName(), getRepository());
super.doActivate();
- setObjectIDTypes(idHandler.getObjectIDTypes());
Mongo mongo = new Mongo(mongoURI);
db = mongo.getDB(dbName);
@@ -289,7 +295,10 @@ public class MongoDBStore extends Store implements IMongoDBStore
commitInfosCollection = db.getCollection("cdo.commitInfos");
LifecycleUtil.activate(idHandler);
+ setObjectIDTypes(idHandler.getObjectIDTypes());
+
LifecycleUtil.activate(mapper);
+ initMode();
if (firstStart)
{
@@ -329,6 +338,24 @@ public class MongoDBStore extends Store implements IMongoDBStore
super.doDeactivate();
}
+ protected void initMode()
+ {
+ if (getRepository().isSupportingBranches())
+ {
+ mode = new Mode.Branching();
+ }
+ else if (getRepository().isSupportingBranches())
+ {
+ mode = new Mode.Audditing();
+ }
+ else
+ {
+ mode = new Mode.Normal();
+ }
+
+ mode.setStore(this);
+ }
+
protected void firstStart()
{
setCreationTime(getRepository().getTimeStamp());
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 c0d7a225ce..9dd746a9f1 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
@@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.common.branch.CDOBranchHandler;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.branch.CDOBranchVersion;
import org.eclipse.emf.cdo.common.commit.CDOCommitData;
+import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDUtil;
@@ -30,6 +31,7 @@ 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.IMongoDBStore.IDHandler;
import org.eclipse.emf.cdo.server.mongodb.IMongoDBStoreAccessor;
import org.eclipse.emf.cdo.spi.common.commit.CDOChangeSetSegment;
@@ -44,6 +46,7 @@ import org.eclipse.emf.cdo.spi.server.StoreAccessorBase;
import org.eclipse.net4j.util.ObjectUtil;
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;
@@ -51,6 +54,7 @@ import org.eclipse.emf.ecore.EStructuralFeature;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import java.io.IOException;
@@ -67,6 +71,8 @@ import java.util.Set;
*/
public class MongoDBStoreAccessor extends StoreAccessorBase implements IMongoDBStoreAccessor
{
+ private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, MongoDBStoreAccessor.class);
+
private static final boolean ZIP_PACKAGE_BYTES = true;
public MongoDBStoreAccessor(Store store, ISession session)
@@ -137,16 +143,57 @@ public class MongoDBStoreAccessor extends StoreAccessorBase implements IMongoDBS
throw new IllegalArgumentException("Auditing not supported");
}
- MongoDBMapper mapper = getStore().getMapper();
EresourcePackage resourcesPackage = EresourcePackage.eINSTANCE;
// First query folders
- boolean shallContinue = mapper.queryResources(context, resourcesPackage.getCDOResourceFolder());
+ boolean shallContinue = queryResources(context, resourcesPackage.getCDOResourceFolder());
// Not enough results? -> query resources
if (shallContinue)
{
- mapper.queryResources(context, resourcesPackage.getCDOResource());
+ queryResources(context, resourcesPackage.getCDOResource());
+ }
+ }
+
+ private boolean queryResources(QueryResourcesContext context, EClass eClass)
+ {
+ IDHandler idHandler = getStore().getIDHandler();
+ Mapper mapper = getStore().getMapper();
+
+ DBCollection collection = mapper.getCollection(eClass);
+ DBCursor cursor = null;
+
+ CDOID folderID = context.getFolderID();
+ String name = context.getName();
+ boolean exactMatch = context.exactMatch();
+
+ try
+ {
+
+ DBObject query = getStore().getMode().createResourcesQuery(folderID, name, exactMatch, context);
+ DBObject keys = new BasicDBObject("_cdoid", 1);
+ cursor = collection.find(query, keys);
+ while (cursor.hasNext())
+ {
+ DBObject doc = cursor.next();
+
+ CDOID id = idHandler.read(doc, "_cdoid");
+ if (TRACER.isEnabled())
+ {
+ TRACER.trace("Resources query returned ID " + id); //$NON-NLS-1$
+ }
+
+ if (!context.addResource(id))
+ {
+ // No more results allowed
+ return false; // Don't continue
+ }
+ }
+
+ return true; // Continue with other results
+ }
+ finally
+ {
}
}
@@ -221,7 +268,7 @@ public class MongoDBStoreAccessor extends StoreAccessorBase implements IMongoDBS
{
try
{
- monitor.begin(106);
+ monitor.begin(107);
CDOBranchPoint branchPoint = context.getBranchPoint();
DBObject doc = new BasicDBObject();
@@ -284,7 +331,8 @@ public class MongoDBStoreAccessor extends StoreAccessorBase implements IMongoDBS
getStore().getCommitInfosCollection().insert(doc);
monitor.worked(100);
- getStore().getMapper().addWork(doc);
+ CDOCommitInfo commitInfo = context.createCommitInfo();
+ getStore().getMapper().addWork(commitInfo);
}
finally
{
@@ -363,7 +411,7 @@ public class MongoDBStoreAccessor extends StoreAccessorBase implements IMongoDBS
doc.put("_revised", revised);
}
- doc.put("_class", new CDOClassifierRef(revision.getEClass()).toString());
+ doc.put("_class", new CDOClassifierRef(revision.getEClass()).getURI());
CDOID resourceID = revision.getResourceID();
if (!CDOIDUtil.isNull(resourceID))
@@ -427,7 +475,7 @@ public class MongoDBStoreAccessor extends StoreAccessorBase implements IMongoDBS
DBObject doc = new BasicDBObject();
idHandler.write(doc, "id", id);
- doc.put("type", new CDOClassifierRef(type).toString());
+ doc.put("type", new CDOClassifierRef(type).getURI());
result[i] = doc;
}
diff --git a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/mongodb/IMongoDBStore.java b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/mongodb/IMongoDBStore.java
index 8ff67bdfc3..93ae61c4d7 100644
--- a/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/mongodb/IMongoDBStore.java
+++ b/plugins/org.eclipse.emf.cdo.server.mongodb/src/org/eclipse/emf/cdo/server/mongodb/IMongoDBStore.java
@@ -78,5 +78,7 @@ public interface IMongoDBStore extends IStore
public void setLastObjectID(CDOID lastObjectID);
public void write(DBObject doc, String key, CDOID id);
+
+ public CDOID read(DBObject doc, String key);
}
}

Back to the top