diff options
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); } |