Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OQueryUtil.java80
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ORevision.java62
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStore.java29
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStoreAccessor.java147
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.db4o/CDO AllTests (DB4O).launch6
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java4
6 files changed, 130 insertions, 198 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OQueryUtil.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OQueryUtil.java
deleted file mode 100644
index 22b3d6f8d1..0000000000
--- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OQueryUtil.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * Copyright (c) 2004 - 2010 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:
- * Victor Roldan Betancort - initial API and implementation
- */
-package org.eclipse.emf.cdo.server.internal.db4o;
-
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.id.CDOIDUtil;
-
-import com.db4o.ObjectContainer;
-import com.db4o.ObjectSet;
-import com.db4o.query.Query;
-
-/**
- * @author Victor Roldan Betancort
- */
-public final class DB4OQueryUtil
-{
- public static DB4ORevision getRevision(ObjectContainer container, CDOID id, int branchID)
- {
- // TODO Optimize this loop away
- DB4ORevision result = null;
- for (Object value : getRevisions(container, id, branchID))
- {
- DB4ORevision revision = (DB4ORevision)value;
- if (result == null)
- {
- result = revision;
- }
-
- if (revision.getVersion() > result.getVersion())
- {
- result = revision;
- }
- }
-
- return result;
- }
-
- public static DB4ORevision getRevisionByVersion(ObjectContainer container, CDOID id, int branchID, int version)
- {
- // TODO Optimize this loop away
- for (Object value : getRevisions(container, id, branchID))
- {
- DB4ORevision revision = (DB4ORevision)value;
- if (revision.getVersion() == version)
- {
- return revision;
- }
- }
-
- return null;
- }
-
- private static ObjectSet<?> getRevisions(ObjectContainer container, CDOID id, int branchID)
- {
- Query query = container.query();
- query.constrain(DB4ORevision.class);
- query.descend("id").constrain(CDOIDUtil.getLong(id));
- query.descend("branchID").constrain(branchID);
- return query.execute();
- }
-
- public static void removeRevisionFromContainer(ObjectContainer container, int branchID, CDOID id)
- {
- DB4ORevision primitiveRevision = DB4OQueryUtil.getRevision(container, id, branchID);
- if (primitiveRevision == null)
- {
- throw new IllegalArgumentException("Revision with ID " + id + " not found");
- }
-
- container.delete(primitiveRevision);
- }
-}
diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ORevision.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ORevision.java
index 394b416930..d8359b4674 100644
--- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ORevision.java
+++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4ORevision.java
@@ -46,15 +46,14 @@ public class DB4ORevision
private int version;
- private int branchID;
-
- private long revised;
-
private long timeStamp;
private long resourceID;
- private long containerID;
+ /**
+ * Can be an external ID!
+ */
+ private Object containerID;
private int containingFeatureID;
@@ -69,16 +68,14 @@ public class DB4ORevision
private boolean isRootResource;
- public DB4ORevision(String packageURI, String className, long id, int version, int branchID, long revised,
- long resourceID, long containerID, int containingFeatureID, List<Object> values, long timestamp,
- boolean isResource, boolean isResourceNode, boolean isResourceFolder, boolean isRootResource)
+ public DB4ORevision(String packageURI, String className, long id, int version, long resourceID, Object containerID,
+ int containingFeatureID, List<Object> values, long timestamp, boolean isResource, boolean isResourceNode,
+ boolean isResourceFolder, boolean isRootResource)
{
setPackageURI(packageURI);
setClassName(className);
setID(id);
setVersion(version);
- setBranchID(branchID);
- setRevised(revised);
setResourceID(resourceID);
setContainerID(containerID);
setContainingFeatureID(containingFeatureID);
@@ -120,6 +117,11 @@ public class DB4ORevision
return id;
}
+ public int getBranchID()
+ {
+ return CDOBranch.MAIN_BRANCH_ID;
+ }
+
public void setVersion(int version)
{
this.version = version;
@@ -130,24 +132,9 @@ public class DB4ORevision
return version;
}
- public void setBranchID(int branchID)
- {
- this.branchID = branchID;
- }
-
- public int getBranchID()
- {
- return branchID;
- }
-
- public void setRevised(long revised)
- {
- this.revised = revised;
- }
-
public long getRevised()
{
- return revised;
+ return CDORevision.UNSPECIFIED_DATE;
}
public void setResourceID(long resourceID)
@@ -160,12 +147,12 @@ public class DB4ORevision
return resourceID;
}
- public void setContainerID(long containerID)
+ public void setContainerID(Object containerID)
{
this.containerID = containerID;
}
- public long getContainerID()
+ public Object getContainerID()
{
return containerID;
}
@@ -258,13 +245,11 @@ public class DB4ORevision
boolean isResourceFolder = revision.isResourceFolder();
boolean isRootResource = CDOIDUtil.getLong(revisionID) == 1;
- long id = (Long)getDB4OID(revisionID);
+ long id = CDOIDUtil.getLong(revisionID);
int version = revision.getVersion();
- int branchID = revision.getBranch().getID();
long timeStamp = revision.getTimeStamp();
- long revised = revision.getRevised();
- long resourceID = (Long)getDB4OID(revision.getResourceID());
- long containerID = (Long)getDB4OID((CDOID)revision.getContainerID());
+ long resourceID = CDOIDUtil.getLong(revision.getResourceID());
+ Object containerID = getDB4OID((CDOID)revision.getContainerID());
int containingFeatureID = revision.getContainingFeatureID();
EStructuralFeature[] features = classInfo.getAllPersistentFeatures();
@@ -304,8 +289,8 @@ public class DB4ORevision
}
}
- return new DB4ORevision(packageURI, className, id, version, branchID, revised, resourceID, containerID,
- containingFeatureID, values, timeStamp, isResource, isResourceNode, isResourceFolder, isRootResource);
+ return new DB4ORevision(packageURI, className, id, version, resourceID, containerID, containingFeatureID, values,
+ timeStamp, isResource, isResourceNode, isResourceFolder, isRootResource);
}
public static InternalCDORevision getCDORevision(IStore store, DB4ORevision primitiveRevision)
@@ -316,7 +301,7 @@ public class DB4ORevision
EClass eClass = (EClass)ePackage.getEClassifier(className);
InternalCDORevision revision = (InternalCDORevision)CDORevisionFactory.DEFAULT.createRevision(eClass);
- CDOBranch branch = store.getRepository().getBranchManager().getBranch(primitiveRevision.getBranchID());
+ CDOBranch branch = store.getRepository().getBranchManager().getMainBranch();
CDOBranchPoint point = branch.getPoint(primitiveRevision.getTimeStamp());
revision.setID(getCDOID(primitiveRevision.getID()));
@@ -372,6 +357,11 @@ public class DB4ORevision
return CDOIDUtil.createExternal((String)id);
}
+ if (id instanceof CDOID)
+ {
+ return (CDOID)id;
+ }
+
return CDOIDUtil.createLong((Long)id);
}
}
diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStore.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStore.java
index 003c7d37b0..3735db2df0 100644
--- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStore.java
+++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStore.java
@@ -10,6 +10,8 @@
*/
package org.eclipse.emf.cdo.server.internal.db4o;
+import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.server.ISession;
import org.eclipse.emf.cdo.server.IStore;
import org.eclipse.emf.cdo.server.IStoreAccessor;
@@ -26,6 +28,7 @@ import com.db4o.ObjectContainer;
import com.db4o.ObjectServer;
import com.db4o.ObjectSet;
import com.db4o.config.Configuration;
+import com.db4o.query.Query;
import java.util.HashMap;
import java.util.Map;
@@ -261,6 +264,32 @@ public class DB4OStore extends LongIDStore implements IDB4OStore
return writerPool;
}
+ public static DB4ORevision getRevision(ObjectContainer container, CDOID id)
+ {
+ Query query = container.query();
+ query.constrain(DB4ORevision.class);
+ query.descend("id").constrain(CDOIDUtil.getLong(id));
+
+ ObjectSet<?> revisions = query.execute();
+ if (revisions.isEmpty())
+ {
+ return null;
+ }
+
+ return (DB4ORevision)revisions.get(0);
+ }
+
+ public static void removeRevision(ObjectContainer container, CDOID id)
+ {
+ DB4ORevision revision = getRevision(container, id);
+ if (revision == null)
+ {
+ throw new IllegalArgumentException("Revision with ID " + id + " not found");
+ }
+
+ container.delete(revision);
+ }
+
/**
* Carries {@link IStore}-related information.
*
diff --git a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStoreAccessor.java
index 8904fed144..9db2500f60 100644
--- a/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStoreAccessor.java
+++ b/plugins/org.eclipse.emf.cdo.server.db4o/src/org/eclipse/emf/cdo/server/internal/db4o/DB4OStoreAccessor.java
@@ -139,8 +139,14 @@ public class DB4OStoreAccessor extends LongIDStoreAccessor
public InternalCDORevision readRevision(CDOID id, CDOBranchPoint branchPoint, int listChunk,
CDORevisionCacheAdder cache)
{
- int branchID = branchPoint.getBranch().getID();
- return getRevisionFromContainer(branchID, id);
+ DB4ORevision lastRevision = DB4OStore.getRevision(getObjectContainer(), id);
+ if (lastRevision == null)
+ {
+ // Revision does not exist. Return null to signal inexistent Revision
+ return null;
+ }
+
+ return DB4ORevision.getCDORevision(getStore(), lastRevision);
}
public void queryResources(QueryResourcesContext context)
@@ -248,35 +254,16 @@ public class DB4OStoreAccessor extends LongIDStoreAccessor
getObjectContainer().rollback();
}
- /**
- * TODO Branching can only be supported with auditing. Where is the timeStamp parameter?
- */
- private InternalCDORevision getRevisionFromContainer(int branchID, CDOID id)
- {
- DB4ORevision lastRevision = DB4OQueryUtil.getRevision(getObjectContainer(), id, branchID);
- if (lastRevision == null)
- {
- // Revision does not exist. Return null to signal inexistent Revision
- return null;
- }
-
- return DB4ORevision.getCDORevision(getStore(), lastRevision);
- }
-
public InternalCDORevision readRevisionByVersion(CDOID id, CDOBranchVersion branchVersion, int listChunk,
CDORevisionCacheAdder cache)
{
- int branchID = branchVersion.getBranch().getID();
- int version = branchVersion.getVersion();
- DB4ORevision revisionByVersion = DB4OQueryUtil.getRevisionByVersion(getObjectContainer(), id, branchID, version);
-
- // Revision does not exist. Return null to signal inexistent Revision
- if (revisionByVersion == null)
+ DB4ORevision revision = DB4OStore.getRevision(getObjectContainer(), id);
+ if (revision == null || revision.getVersion() != branchVersion.getVersion())
{
return null;
}
- return DB4ORevision.getCDORevision(getStore(), revisionByVersion);
+ return DB4ORevision.getCDORevision(getStore(), revision);
}
public void handleRevisions(EClass eClass, CDOBranch branch, long timeStamp, CDORevisionHandler handler)
@@ -295,8 +282,6 @@ public class DB4OStoreAccessor extends LongIDStoreAccessor
for (final CDOID target : context.getTargetObjects().keySet())
{
- final long targetID = CDOIDUtil.getLong(target);
-
for (final EClass eClass : context.getSourceCandidates().keySet())
{
final String eClassName = eClass.getName();
@@ -309,43 +294,53 @@ public class DB4OStoreAccessor extends LongIDStoreAccessor
private boolean moreResults = true;
@Override
- public boolean match(DB4ORevision primitiveRevision)
+ public boolean match(DB4ORevision revision)
{
if (!moreResults)
{
return false;
}
- if (!primitiveRevision.getClassName().equals(eClassName))
+
+ if (!revision.getClassName().equals(eClassName))
{
return false;
}
- if (!primitiveRevision.getPackageURI().equals(nsURI))
+ if (!revision.getPackageURI().equals(nsURI))
{
return false;
}
- if (!(primitiveRevision.getBranchID() == branchID))
+ if (!(revision.getBranchID() == branchID))
{
return false;
}
+ CDOID id = DB4ORevision.getCDOID(revision.getID());
for (EReference eReference : eReferences)
{
- Object obj = primitiveRevision.getValues().get(eReference.getFeatureID());
+ Object obj = revision.getValues().get(eReference.getFeatureID());
if (obj instanceof List)
{
List<?> list = (List<?>)obj;
- if (list.contains(targetID))
+ int index = 0;
+ for (Object element : list)
{
- moreResults = context.addXRef(target, DB4ORevision.getCDOID(primitiveRevision.getID()), eReference, 0);
+ CDOID ref = DB4ORevision.getCDOID(element);
+ if (ObjectUtil.equals(ref, target))
+ {
+ moreResults = context.addXRef(target, id, eReference, index);
+ }
+
+ ++index;
}
}
- else if (obj instanceof CDOID)
+ else
{
- if (CDOIDUtil.getLong((CDOID)obj) == targetID)
+ CDOID ref = DB4ORevision.getCDOID(obj);
+ if (ObjectUtil.equals(ref, target))
{
- moreResults = context.addXRef(target, DB4ORevision.getCDOID(primitiveRevision.getID()), eReference, 0);
+ moreResults = context.addXRef(target, id, eReference, 0);
}
}
}
@@ -353,9 +348,7 @@ public class DB4OStoreAccessor extends LongIDStoreAccessor
return false;
}
});
-
}
-
}
}
@@ -495,41 +488,6 @@ public class DB4OStoreAccessor extends LongIDStoreAccessor
}
}
- protected void checkDuplicateResources(CDORevision revision) throws IllegalStateException
- {
- final long folderID = CDOIDUtil.getLong((CDOID)revision.data().getContainerID());
- final long revisionID = CDOIDUtil.getLong(revision.getID());
- final String name = (String)revision.data().get(EresourcePackage.eINSTANCE.getCDOResourceNode_Name(), 0);
-
- ObjectSet<DB4ORevision> resultSet = getObjectContainer().query(new Predicate<DB4ORevision>()
- {
- private static final long serialVersionUID = 1L;
-
- @Override
- public boolean match(DB4ORevision revision)
- {
- if (revision.isResourceNode() && ObjectUtil.equals(revision.getContainerID(), folderID))
- {
- String candidateName = (String)revision.getValues().get(EresourcePackage.CDO_RESOURCE__NAME);
- if (StringUtil.compare(name, candidateName) == 0)
- {
- if (!ObjectUtil.equals(revision.getID(), revisionID))
- {
- return true;
- }
- }
- }
-
- return false;
- }
- });
-
- if (!resultSet.isEmpty())
- {
- throw new IllegalStateException("Duplicate resource or folder: " + name + " in folder " + folderID); //$NON-NLS-1$ //$NON-NLS-2$
- }
- }
-
protected void writeRevision(InternalCDORevision revision, OMMonitor monitor)
{
Async async = null;
@@ -555,12 +513,11 @@ public class DB4OStoreAccessor extends LongIDStoreAccessor
// If revision is in the store, remove old, store new
ObjectContainer objectContainer = getObjectContainer();
- int branchID = revision.getBranch().getID();
CDOID id = revision.getID();
- DB4ORevision revisionAlreadyInStore = DB4OQueryUtil.getRevision(objectContainer, id, branchID);
+ DB4ORevision revisionAlreadyInStore = DB4OStore.getRevision(objectContainer, id);
if (revisionAlreadyInStore != null)
{
- DB4OQueryUtil.removeRevisionFromContainer(objectContainer, branchID, id);
+ DB4OStore.removeRevision(objectContainer, id);
}
DB4ORevision primitiveRevision = DB4ORevision.getDB4ORevision(revision);
@@ -606,10 +563,9 @@ public class DB4OStoreAccessor extends LongIDStoreAccessor
try
{
- int branchID = branch.getID();
for (CDOID id : detachedObjects)
{
- DB4OQueryUtil.removeRevisionFromContainer(getObjectContainer(), branchID, id);
+ DB4OStore.removeRevision(getObjectContainer(), id);
monitor.worked();
}
}
@@ -618,4 +574,39 @@ public class DB4OStoreAccessor extends LongIDStoreAccessor
monitor.done();
}
}
+
+ protected void checkDuplicateResources(CDORevision revision) throws IllegalStateException
+ {
+ final long folderID = CDOIDUtil.getLong((CDOID)revision.data().getContainerID());
+ final long revisionID = CDOIDUtil.getLong(revision.getID());
+ final String name = (String)revision.data().get(EresourcePackage.eINSTANCE.getCDOResourceNode_Name(), 0);
+
+ ObjectSet<DB4ORevision> resultSet = getObjectContainer().query(new Predicate<DB4ORevision>()
+ {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public boolean match(DB4ORevision revision)
+ {
+ if (revision.isResourceNode() && ObjectUtil.equals(revision.getContainerID(), folderID))
+ {
+ String candidateName = (String)revision.getValues().get(EresourcePackage.CDO_RESOURCE__NAME);
+ if (StringUtil.compare(name, candidateName) == 0)
+ {
+ if (!ObjectUtil.equals(revision.getID(), revisionID))
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+ });
+
+ if (!resultSet.isEmpty())
+ {
+ throw new IllegalStateException("Duplicate resource or folder: " + name + " in folder " + folderID); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.tests.db4o/CDO AllTests (DB4O).launch b/plugins/org.eclipse.emf.cdo.tests.db4o/CDO AllTests (DB4O).launch
index 2feae1d46f..ad6e12de3b 100644
--- a/plugins/org.eclipse.emf.cdo.tests.db4o/CDO AllTests (DB4O).launch
+++ b/plugins/org.eclipse.emf.cdo.tests.db4o/CDO AllTests (DB4O).launch
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/com.eclipse.emf.cdo.test.db4o/src/com/eclipse/emf/cdo/test/db4o/DB4OTestConfing.java"/>
+<listEntry value="/org.eclipse.emf.cdo.tests.db4o/src/com/eclipse/emf/cdo/test/db4o/AllTestsDB4O.java"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
@@ -9,7 +9,7 @@
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.eclipse.emf.cdo.test.db4o.AllTestsDB4O"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.eclipse.emf.cdo.test.db4o"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.emf.cdo.tests.db4o"/>
</launchConfiguration>
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
index c1821d8f7b..150835a248 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java
@@ -104,6 +104,7 @@ import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.spi.cdo.CDOSessionProtocol;
@@ -1205,7 +1206,8 @@ public class CDOViewImpl extends Lifecycle implements InternalCDOView
}
}
- if (eObject.eResource() != null)
+ Resource eResource = eObject.eResource();
+ if (eResource != null)
{
return CDOIDUtil.createExternal(uri);
}

Back to the top