Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2012-07-22 03:37:05 +0000
committerEike Stepper2012-07-22 03:37:05 +0000
commit1b9ff584fade91fd11088dc86da780ed4c54e787 (patch)
treeefdd9ffc07064577d2636f9532f52473b522e7ba
parent291fab7cd6020858323877ebdc5a9e31ed8c08ce (diff)
downloadcdo-1b9ff584fade91fd11088dc86da780ed4c54e787.tar.gz
cdo-1b9ff584fade91fd11088dc86da780ed4c54e787.tar.xz
cdo-1b9ff584fade91fd11088dc86da780ed4c54e787.zip
Transmit detached versions during commit
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java652
-rw-r--r--plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java19
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java12
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java220
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java13
6 files changed, 480 insertions, 438 deletions
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java
index 60ccc656dd..1480982ac4 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java
@@ -1,323 +1,329 @@
-/*
- * Copyright (c) 2004 - 2012 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
- * Simon McDuff - bug 201266
- * Simon McDuff - bug 215688
- * Simon McDuff - bug 213402
- * Andre Dietisheim - bug 256649
- */
-package org.eclipse.emf.cdo.internal.net4j.protocol;
-
-import org.eclipse.emf.cdo.CDOObject;
-import org.eclipse.emf.cdo.CDOObjectReference;
-import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
-import org.eclipse.emf.cdo.common.commit.CDOCommitData;
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.id.CDOIDProvider;
-import org.eclipse.emf.cdo.common.id.CDOIDReference;
-import org.eclipse.emf.cdo.common.id.CDOIDTemp;
-import org.eclipse.emf.cdo.common.id.CDOIDUtil;
-import org.eclipse.emf.cdo.common.lob.CDOBlob;
-import org.eclipse.emf.cdo.common.lob.CDOClob;
-import org.eclipse.emf.cdo.common.lob.CDOLob;
-import org.eclipse.emf.cdo.common.lock.CDOLockState;
-import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
-import org.eclipse.emf.cdo.common.protocol.CDODataInput;
-import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
-import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants;
-import org.eclipse.emf.cdo.common.revision.CDOIDAndVersion;
-import org.eclipse.emf.cdo.common.revision.CDORevision;
-import org.eclipse.emf.cdo.common.revision.CDORevisionKey;
-import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
-import org.eclipse.emf.cdo.internal.net4j.bundle.OM;
-import org.eclipse.emf.cdo.transaction.CDOTransaction;
-
-import org.eclipse.emf.internal.cdo.object.CDOObjectReferenceImpl;
-
-import org.eclipse.net4j.util.concurrent.ConcurrencyUtil;
-import org.eclipse.net4j.util.io.ExtendedDataOutputStream;
-import org.eclipse.net4j.util.io.IOUtil;
-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.spi.cdo.CDOSessionProtocol.CommitTransactionResult;
-import org.eclipse.emf.spi.cdo.InternalCDOTransaction.InternalCDOCommitContext;
-
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author Eike Stepper
- */
-public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<CommitTransactionResult>
-{
- private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_PROTOCOL, CommitTransactionRequest.class);
-
- private static long sleepMillisForTesting = 0L;
-
- private CDOIDProvider idProvider; // CDOTransaction
-
- private String comment;
-
- private boolean releaseLocks;
-
- private CDOCommitData commitData;
-
- private Collection<CDOLob<?>> lobs;
-
- private Collection<CDOLockState> locksOnNewObjects;
-
- private int viewID;
-
- private CDOTransaction transaction;
-
- public CommitTransactionRequest(CDOClientProtocol protocol, InternalCDOCommitContext context)
- {
- this(protocol, CDOProtocolConstants.SIGNAL_COMMIT_TRANSACTION, context);
- }
-
- public CommitTransactionRequest(CDOClientProtocol protocol, short signalID, InternalCDOCommitContext context)
- {
- super(protocol, signalID);
-
- transaction = context.getTransaction();
- comment = context.getCommitComment();
- releaseLocks = context.isAutoReleaseLocks();
- idProvider = context.getTransaction();
- commitData = context.getCommitData();
- lobs = context.getLobs();
- locksOnNewObjects = context.getLocksOnNewObjects();
- viewID = context.getViewID();
- }
-
- @Override
- protected int getMonitorTimeoutSeconds()
- {
- org.eclipse.emf.cdo.net4j.CDONet4jSession session = (org.eclipse.emf.cdo.net4j.CDONet4jSession)getSession();
- return session.options().getCommitTimeout();
- }
-
- @Override
- protected CDOIDProvider getIDProvider()
- {
- return idProvider;
- }
-
- @Override
- protected void requesting(CDODataOutput out, OMMonitor monitor) throws IOException
- {
- requestingTransactionInfo(out);
- requestingCommit(out);
- }
-
- protected void requestingTransactionInfo(CDODataOutput out) throws IOException
- {
- out.writeInt(viewID);
- }
-
- protected void requestingCommit(CDODataOutput out) throws IOException
- {
- List<CDOPackageUnit> newPackageUnits = commitData.getNewPackageUnits();
- List<CDOIDAndVersion> newObjects = commitData.getNewObjects();
- List<CDORevisionKey> changedObjects = commitData.getChangedObjects();
- List<CDOIDAndVersion> detachedObjects = commitData.getDetachedObjects();
-
- out.writeBoolean(releaseLocks);
- out.writeString(comment);
- out.writeInt(newPackageUnits.size());
- out.writeInt(locksOnNewObjects.size());
- out.writeInt(newObjects.size());
- out.writeInt(changedObjects.size());
- out.writeInt(detachedObjects.size());
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Writing {0} new package units", newPackageUnits.size()); //$NON-NLS-1$
- }
-
- for (CDOPackageUnit newPackageUnit : newPackageUnits)
- {
- out.writeCDOPackageUnit(newPackageUnit, true);
- }
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Writing {0} locks on new objects", locksOnNewObjects.size()); //$NON-NLS-1$
- }
-
- for (CDOLockState lockState : locksOnNewObjects)
- {
- out.writeCDOLockState(lockState);
- }
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Writing {0} new objects", newObjects.size()); //$NON-NLS-1$
- }
-
- for (CDOIDAndVersion newObject : newObjects)
- {
- out.writeCDORevision((CDORevision)newObject, CDORevision.UNCHUNKED);
-
- if (sleepMillisForTesting != 0L)
- {
- ConcurrencyUtil.sleep(sleepMillisForTesting);
- }
- }
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Writing {0} dirty objects", changedObjects.size()); //$NON-NLS-1$
- }
-
- for (CDORevisionKey changedObject : changedObjects)
- {
- out.writeCDORevisionDelta((CDORevisionDelta)changedObject);
- }
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Writing {0} detached objects", detachedObjects.size()); //$NON-NLS-1$
- }
-
- boolean ensuringReferentialIntegrity = getSession().getRepositoryInfo().isEnsuringReferentialIntegrity();
- for (CDOIDAndVersion detachedObject : detachedObjects)
- {
- CDOID id = detachedObject.getID();
- out.writeCDOID(id);
- if (ensuringReferentialIntegrity)
- {
- EClass eClass = getObjectType(id);
- out.writeCDOClassifierRef(eClass);
- }
- }
-
- requestingLobs();
- }
-
- protected void requestingLobs() throws IOException
- {
- ExtendedDataOutputStream out = getRequestStream();
- out.writeInt(lobs.size());
- for (CDOLob<?> lob : lobs)
- {
- out.writeByteArray(lob.getID());
- long size = lob.getSize();
- if (lob instanceof CDOBlob)
- {
- CDOBlob blob = (CDOBlob)lob;
- out.writeLong(size);
- IOUtil.copyBinary(blob.getContents(), out, size);
- }
- else
- {
- CDOClob clob = (CDOClob)lob;
- out.writeLong(-size);
- IOUtil.copyCharacter(clob.getContents(), new OutputStreamWriter(out), size);
- }
- }
- }
-
- protected EClass getObjectType(CDOID id)
- {
- CDOObject object = transaction.getObject(id);
- return object.eClass();
- }
-
- @Override
- protected CommitTransactionResult confirming(CDODataInput in, OMMonitor monitor) throws IOException
- {
- CommitTransactionResult result = confirmingCheckError(in);
- if (result != null)
- {
- return result;
- }
-
- result = confirmingResult(in);
- confirmingMappingNewObjects(in, result);
- confirmingNewLockStates(in, result);
- return result;
- }
-
- protected CommitTransactionResult confirmingCheckError(CDODataInput in) throws IOException
- {
- boolean success = in.readBoolean();
- if (!success)
- {
- String rollbackMessage = in.readString();
- OM.LOG.error(rollbackMessage);
-
- CDOBranchPoint branchPoint = in.readCDOBranchPoint();
- long previousTimeStamp = in.readLong();
-
- List<CDOObjectReference> xRefs = null;
- int size = in.readInt();
- if (size != 0)
- {
- xRefs = new ArrayList<CDOObjectReference>(size);
- for (int i = 0; i < size; i++)
- {
- CDOIDReference idReference = in.readCDOIDReference();
- xRefs.add(new CDOObjectReferenceImpl(transaction, idReference));
- }
- }
-
- return new CommitTransactionResult(idProvider, rollbackMessage, branchPoint, previousTimeStamp, xRefs);
- }
-
- return null;
- }
-
- protected CommitTransactionResult confirmingResult(CDODataInput in) throws IOException
- {
- CDOBranchPoint branchPoint = in.readCDOBranchPoint();
- long previousTimeStamp = in.readLong();
- return new CommitTransactionResult(idProvider, branchPoint, previousTimeStamp);
- }
-
- protected void confirmingMappingNewObjects(CDODataInput in, CommitTransactionResult result) throws IOException
- {
- for (;;)
- {
- CDOID id = in.readCDOID();
- if (CDOIDUtil.isNull(id))
- {
- break;
- }
-
- if (id instanceof CDOIDTemp)
- {
- CDOIDTemp oldID = (CDOIDTemp)id;
- CDOID newID = in.readCDOID();
- result.addIDMapping(oldID, newID);
- }
- else
- {
- throw new ClassCastException("Not a temporary ID: " + id);
- }
- }
- }
-
- protected void confirmingNewLockStates(CDODataInput in, CommitTransactionResult result) throws IOException
- {
- int n = in.readInt();
- CDOLockState[] newLockStates = new CDOLockState[n];
-
- for (int i = 0; i < n; i++)
- {
- newLockStates[i] = in.readCDOLockState();
- }
-
- result.setNewLockStates(newLockStates);
- }
-}
+/*
+ * Copyright (c) 2004 - 2012 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
+ * Simon McDuff - bug 201266
+ * Simon McDuff - bug 215688
+ * Simon McDuff - bug 213402
+ * Andre Dietisheim - bug 256649
+ */
+package org.eclipse.emf.cdo.internal.net4j.protocol;
+
+import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.CDOObjectReference;
+import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
+import org.eclipse.emf.cdo.common.commit.CDOCommitData;
+import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDProvider;
+import org.eclipse.emf.cdo.common.id.CDOIDReference;
+import org.eclipse.emf.cdo.common.id.CDOIDTemp;
+import org.eclipse.emf.cdo.common.id.CDOIDUtil;
+import org.eclipse.emf.cdo.common.lob.CDOBlob;
+import org.eclipse.emf.cdo.common.lob.CDOClob;
+import org.eclipse.emf.cdo.common.lob.CDOLob;
+import org.eclipse.emf.cdo.common.lock.CDOLockState;
+import org.eclipse.emf.cdo.common.model.CDOPackageUnit;
+import org.eclipse.emf.cdo.common.protocol.CDODataInput;
+import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
+import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants;
+import org.eclipse.emf.cdo.common.revision.CDOIDAndVersion;
+import org.eclipse.emf.cdo.common.revision.CDORevision;
+import org.eclipse.emf.cdo.common.revision.CDORevisionKey;
+import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
+import org.eclipse.emf.cdo.internal.net4j.bundle.OM;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+
+import org.eclipse.emf.internal.cdo.object.CDOObjectReferenceImpl;
+
+import org.eclipse.net4j.util.concurrent.ConcurrencyUtil;
+import org.eclipse.net4j.util.io.ExtendedDataOutputStream;
+import org.eclipse.net4j.util.io.IOUtil;
+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.spi.cdo.CDOSessionProtocol.CommitTransactionResult;
+import org.eclipse.emf.spi.cdo.InternalCDOTransaction.InternalCDOCommitContext;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author Eike Stepper
+ */
+public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<CommitTransactionResult>
+{
+ private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_PROTOCOL, CommitTransactionRequest.class);
+
+ private static long sleepMillisForTesting = 0L;
+
+ private CDOIDProvider idProvider; // CDOTransaction
+
+ private String comment;
+
+ private boolean releaseLocks;
+
+ private CDOCommitData commitData;
+
+ private Collection<CDOLob<?>> lobs;
+
+ private Collection<CDOLockState> locksOnNewObjects;
+
+ private int viewID;
+
+ private CDOTransaction transaction;
+
+ public CommitTransactionRequest(CDOClientProtocol protocol, InternalCDOCommitContext context)
+ {
+ this(protocol, CDOProtocolConstants.SIGNAL_COMMIT_TRANSACTION, context);
+ }
+
+ public CommitTransactionRequest(CDOClientProtocol protocol, short signalID, InternalCDOCommitContext context)
+ {
+ super(protocol, signalID);
+
+ transaction = context.getTransaction();
+ comment = context.getCommitComment();
+ releaseLocks = context.isAutoReleaseLocks();
+ idProvider = context.getTransaction();
+ commitData = context.getCommitData();
+ lobs = context.getLobs();
+ locksOnNewObjects = context.getLocksOnNewObjects();
+ viewID = context.getViewID();
+ }
+
+ @Override
+ protected int getMonitorTimeoutSeconds()
+ {
+ org.eclipse.emf.cdo.net4j.CDONet4jSession session = (org.eclipse.emf.cdo.net4j.CDONet4jSession)getSession();
+ return session.options().getCommitTimeout();
+ }
+
+ @Override
+ protected CDOIDProvider getIDProvider()
+ {
+ return idProvider;
+ }
+
+ @Override
+ protected void requesting(CDODataOutput out, OMMonitor monitor) throws IOException
+ {
+ requestingTransactionInfo(out);
+ requestingCommit(out);
+ }
+
+ protected void requestingTransactionInfo(CDODataOutput out) throws IOException
+ {
+ out.writeInt(viewID);
+ }
+
+ protected void requestingCommit(CDODataOutput out) throws IOException
+ {
+ List<CDOPackageUnit> newPackageUnits = commitData.getNewPackageUnits();
+ List<CDOIDAndVersion> newObjects = commitData.getNewObjects();
+ List<CDORevisionKey> changedObjects = commitData.getChangedObjects();
+ List<CDOIDAndVersion> detachedObjects = commitData.getDetachedObjects();
+
+ out.writeBoolean(releaseLocks);
+ out.writeString(comment);
+ out.writeInt(newPackageUnits.size());
+ out.writeInt(locksOnNewObjects.size());
+ out.writeInt(newObjects.size());
+ out.writeInt(changedObjects.size());
+ out.writeInt(detachedObjects.size());
+
+ if (TRACER.isEnabled())
+ {
+ TRACER.format("Writing {0} new package units", newPackageUnits.size()); //$NON-NLS-1$
+ }
+
+ for (CDOPackageUnit newPackageUnit : newPackageUnits)
+ {
+ out.writeCDOPackageUnit(newPackageUnit, true);
+ }
+
+ if (TRACER.isEnabled())
+ {
+ TRACER.format("Writing {0} locks on new objects", locksOnNewObjects.size()); //$NON-NLS-1$
+ }
+
+ for (CDOLockState lockState : locksOnNewObjects)
+ {
+ out.writeCDOLockState(lockState);
+ }
+
+ if (TRACER.isEnabled())
+ {
+ TRACER.format("Writing {0} new objects", newObjects.size()); //$NON-NLS-1$
+ }
+
+ for (CDOIDAndVersion newObject : newObjects)
+ {
+ out.writeCDORevision((CDORevision)newObject, CDORevision.UNCHUNKED);
+
+ if (sleepMillisForTesting != 0L)
+ {
+ ConcurrencyUtil.sleep(sleepMillisForTesting);
+ }
+ }
+
+ if (TRACER.isEnabled())
+ {
+ TRACER.format("Writing {0} dirty objects", changedObjects.size()); //$NON-NLS-1$
+ }
+
+ for (CDORevisionKey changedObject : changedObjects)
+ {
+ out.writeCDORevisionDelta((CDORevisionDelta)changedObject);
+ }
+
+ if (TRACER.isEnabled())
+ {
+ TRACER.format("Writing {0} detached objects", detachedObjects.size()); //$NON-NLS-1$
+ }
+
+ boolean auditing = getSession().getRepositoryInfo().isSupportingAudits();
+ boolean ensuringReferentialIntegrity = getSession().getRepositoryInfo().isEnsuringReferentialIntegrity();
+ for (CDOIDAndVersion detachedObject : detachedObjects)
+ {
+ CDOID id = detachedObject.getID();
+ out.writeCDOID(id);
+ if (auditing || ensuringReferentialIntegrity)
+ {
+ EClass eClass = getObjectType(id);
+ out.writeCDOClassifierRef(eClass);
+ }
+
+ if (auditing)
+ {
+ out.writeInt(detachedObject.getVersion());
+ }
+ }
+
+ requestingLobs();
+ }
+
+ protected void requestingLobs() throws IOException
+ {
+ ExtendedDataOutputStream out = getRequestStream();
+ out.writeInt(lobs.size());
+ for (CDOLob<?> lob : lobs)
+ {
+ out.writeByteArray(lob.getID());
+ long size = lob.getSize();
+ if (lob instanceof CDOBlob)
+ {
+ CDOBlob blob = (CDOBlob)lob;
+ out.writeLong(size);
+ IOUtil.copyBinary(blob.getContents(), out, size);
+ }
+ else
+ {
+ CDOClob clob = (CDOClob)lob;
+ out.writeLong(-size);
+ IOUtil.copyCharacter(clob.getContents(), new OutputStreamWriter(out), size);
+ }
+ }
+ }
+
+ protected EClass getObjectType(CDOID id)
+ {
+ CDOObject object = transaction.getObject(id);
+ return object.eClass();
+ }
+
+ @Override
+ protected CommitTransactionResult confirming(CDODataInput in, OMMonitor monitor) throws IOException
+ {
+ CommitTransactionResult result = confirmingCheckError(in);
+ if (result != null)
+ {
+ return result;
+ }
+
+ result = confirmingResult(in);
+ confirmingMappingNewObjects(in, result);
+ confirmingNewLockStates(in, result);
+ return result;
+ }
+
+ protected CommitTransactionResult confirmingCheckError(CDODataInput in) throws IOException
+ {
+ boolean success = in.readBoolean();
+ if (!success)
+ {
+ String rollbackMessage = in.readString();
+ OM.LOG.error(rollbackMessage);
+
+ CDOBranchPoint branchPoint = in.readCDOBranchPoint();
+ long previousTimeStamp = in.readLong();
+
+ List<CDOObjectReference> xRefs = null;
+ int size = in.readInt();
+ if (size != 0)
+ {
+ xRefs = new ArrayList<CDOObjectReference>(size);
+ for (int i = 0; i < size; i++)
+ {
+ CDOIDReference idReference = in.readCDOIDReference();
+ xRefs.add(new CDOObjectReferenceImpl(transaction, idReference));
+ }
+ }
+
+ return new CommitTransactionResult(idProvider, rollbackMessage, branchPoint, previousTimeStamp, xRefs);
+ }
+
+ return null;
+ }
+
+ protected CommitTransactionResult confirmingResult(CDODataInput in) throws IOException
+ {
+ CDOBranchPoint branchPoint = in.readCDOBranchPoint();
+ long previousTimeStamp = in.readLong();
+ return new CommitTransactionResult(idProvider, branchPoint, previousTimeStamp);
+ }
+
+ protected void confirmingMappingNewObjects(CDODataInput in, CommitTransactionResult result) throws IOException
+ {
+ for (;;)
+ {
+ CDOID id = in.readCDOID();
+ if (CDOIDUtil.isNull(id))
+ {
+ break;
+ }
+
+ if (id instanceof CDOIDTemp)
+ {
+ CDOIDTemp oldID = (CDOIDTemp)id;
+ CDOID newID = in.readCDOID();
+ result.addIDMapping(oldID, newID);
+ }
+ else
+ {
+ throw new ClassCastException("Not a temporary ID: " + id);
+ }
+ }
+ }
+
+ protected void confirmingNewLockStates(CDODataInput in, CommitTransactionResult result) throws IOException
+ {
+ int n = in.readInt();
+ CDOLockState[] newLockStates = new CDOLockState[n];
+
+ for (int i = 0; i < n; i++)
+ {
+ newLockStates[i] = in.readCDOLockState();
+ }
+
+ result.setNewLockStates(newLockStates);
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java
index 841d3dd25b..99b84e8611 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java
@@ -192,12 +192,21 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori
monitor.worked();
}
+ boolean auditing = getRepository().isSupportingAudits();
+ boolean ensuringReferentialIntegrity = getRepository().isEnsuringReferentialIntegrity();
+
Map<CDOID, EClass> detachedObjectTypes = null;
- if (getRepository().isEnsuringReferentialIntegrity())
+ if (auditing || ensuringReferentialIntegrity)
{
detachedObjectTypes = new HashMap<CDOID, EClass>();
}
+ int[] detachedObjectVersions = null;
+ if (auditing && detachedObjects.length != 0)
+ {
+ detachedObjectVersions = new int[detachedObjects.length];
+ }
+
for (int i = 0; i < detachedObjects.length; i++)
{
CDOID id = in.readCDOID();
@@ -209,6 +218,11 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori
detachedObjectTypes.put(id, eClass);
}
+ if (detachedObjectVersions != null)
+ {
+ detachedObjectVersions[i] = in.readInt();
+ }
+
monitor.worked();
}
@@ -223,6 +237,7 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori
commitContext.setDirtyObjectDeltas(dirtyObjectDeltas);
commitContext.setDetachedObjects(detachedObjects);
commitContext.setDetachedObjectTypes(detachedObjectTypes);
+ commitContext.setDetachedObjectVersions(detachedObjectVersions);
commitContext.setCommitComment(commitComment);
commitContext.setLobs(getIndicationStream());
}
@@ -239,7 +254,7 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori
@Override
protected void demandLoad(Resource resource) throws IOException
{
- // Do nothing: we don't want this ResourceSet to attempt demandloads.
+ // Do nothing: we don't want this ResourceSet to attempt demand-loads.
}
};
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java
index b99e803d72..ec3a2b6d3c 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java
@@ -140,6 +140,8 @@ public class TransactionCommitContext implements InternalCommitContext
private Map<CDOID, EClass> detachedObjectTypes;
+ private int[] detachedObjectVersions;
+
private InternalCDORevision[] dirtyObjects = new InternalCDORevision[0];
private InternalCDORevision[] cachedDetachedRevisions = new InternalCDORevision[0];
@@ -253,6 +255,11 @@ public class TransactionCommitContext implements InternalCommitContext
return detachedObjectTypes;
}
+ public int[] getDetachedObjectVersions()
+ {
+ return detachedObjectVersions;
+ }
+
public InternalCDORevision[] getDetachedRevisions()
{
// This array can contain null values as they only come from the cache!
@@ -418,6 +425,11 @@ public class TransactionCommitContext implements InternalCommitContext
this.detachedObjectTypes = detachedObjectTypes;
}
+ public void setDetachedObjectVersions(int[] detachedObjectVersions)
+ {
+ this.detachedObjectVersions = detachedObjectVersions;
+ }
+
public void setAutoReleaseLocksEnabled(boolean on)
{
autoReleaseLocksEnabled = on;
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java
index 2c9f205e5f..0164b07772 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java
@@ -365,6 +365,8 @@ public interface IStoreAccessor extends IQueryHandlerProvider, BranchLoader, Com
*/
public Map<CDOID, EClass> getDetachedObjectTypes();
+ public int[] getDetachedObjectVersions();
+
/**
* Returns a stream that all {@link CDOLob lobs} can be read from. The format of the data delivered through the
* stream is:
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java
index b3b1cbe22c..d0ed2be7b1 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalCommitContext.java
@@ -1,109 +1,111 @@
-/*
- * Copyright (c) 2004 - 2012 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.spi.server;
-
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.lock.CDOLockState;
-import org.eclipse.emf.cdo.server.IStoreAccessor;
-import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;
-import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
-import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionDelta;
-
-import org.eclipse.net4j.util.io.ExtendedDataInputStream;
-import org.eclipse.net4j.util.om.monitor.OMMonitor;
-import org.eclipse.net4j.util.om.monitor.ProgressDistributable;
-import org.eclipse.net4j.util.om.monitor.ProgressDistributor;
-
-import org.eclipse.emf.ecore.EClass;
-
-import java.util.Map;
-
-/**
- * @author Eike Stepper
- * @since 3.0
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface InternalCommitContext extends IStoreAccessor.CommitContext
-{
- @SuppressWarnings("unchecked")
- public static final ProgressDistributable<InternalCommitContext>[] OPS = ProgressDistributor.array( //
- new ProgressDistributable.Default<InternalCommitContext>()
- {
- public void runLoop(int index, InternalCommitContext commitContext, OMMonitor monitor) throws Exception
- {
- commitContext.write(monitor.fork());
- }
- }, //
-
- new ProgressDistributable.Default<InternalCommitContext>()
- {
- public void runLoop(int index, InternalCommitContext commitContext, OMMonitor monitor) throws Exception
- {
- if (commitContext.getRollbackMessage() == null)
- {
- commitContext.commit(monitor.fork());
- }
- else
- {
- monitor.worked();
- }
- }
- });
-
- public InternalTransaction getTransaction();
-
- public void preWrite();
-
- public void write(OMMonitor monitor);
-
- public void commit(OMMonitor monitor);
-
- public void rollback(String message);
-
- public void postCommit(boolean success);
-
- /**
- * @since 4.0
- */
- public InternalCDORevision[] getDetachedRevisions();
-
- public void setNewPackageUnits(InternalCDOPackageUnit[] newPackageUnits);
-
- /**
- * @since 4.1
- */
- public void setLocksOnNewObjects(CDOLockState[] locksOnNewObjects);
-
- public void setNewObjects(InternalCDORevision[] newObjects);
-
- public void setDirtyObjectDeltas(InternalCDORevisionDelta[] dirtyObjectDeltas);
-
- public void setDetachedObjects(CDOID[] detachedObjects);
-
- /**
- * @since 4.0
- */
- public void setDetachedObjectTypes(Map<CDOID, EClass> detachedObjectTypes);
-
- public void setAutoReleaseLocksEnabled(boolean on);
-
- public void setCommitComment(String comment);
-
- /**
- * @since 4.0
- */
- public void setLobs(ExtendedDataInputStream in);
-
- public void addIDMapping(CDOID oldID, CDOID newID);
-
- public void applyIDMappings(OMMonitor monitor);
-}
+/*
+ * Copyright (c) 2004 - 2012 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.spi.server;
+
+import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.lock.CDOLockState;
+import org.eclipse.emf.cdo.server.IStoreAccessor;
+import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;
+import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
+import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionDelta;
+
+import org.eclipse.net4j.util.io.ExtendedDataInputStream;
+import org.eclipse.net4j.util.om.monitor.OMMonitor;
+import org.eclipse.net4j.util.om.monitor.ProgressDistributable;
+import org.eclipse.net4j.util.om.monitor.ProgressDistributor;
+
+import org.eclipse.emf.ecore.EClass;
+
+import java.util.Map;
+
+/**
+ * @author Eike Stepper
+ * @since 3.0
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
+ */
+public interface InternalCommitContext extends IStoreAccessor.CommitContext
+{
+ @SuppressWarnings("unchecked")
+ public static final ProgressDistributable<InternalCommitContext>[] OPS = ProgressDistributor.array( //
+ new ProgressDistributable.Default<InternalCommitContext>()
+ {
+ public void runLoop(int index, InternalCommitContext commitContext, OMMonitor monitor) throws Exception
+ {
+ commitContext.write(monitor.fork());
+ }
+ }, //
+
+ new ProgressDistributable.Default<InternalCommitContext>()
+ {
+ public void runLoop(int index, InternalCommitContext commitContext, OMMonitor monitor) throws Exception
+ {
+ if (commitContext.getRollbackMessage() == null)
+ {
+ commitContext.commit(monitor.fork());
+ }
+ else
+ {
+ monitor.worked();
+ }
+ }
+ });
+
+ public InternalTransaction getTransaction();
+
+ public void preWrite();
+
+ public void write(OMMonitor monitor);
+
+ public void commit(OMMonitor monitor);
+
+ public void rollback(String message);
+
+ public void postCommit(boolean success);
+
+ /**
+ * @since 4.0
+ */
+ public InternalCDORevision[] getDetachedRevisions();
+
+ public void setNewPackageUnits(InternalCDOPackageUnit[] newPackageUnits);
+
+ /**
+ * @since 4.1
+ */
+ public void setLocksOnNewObjects(CDOLockState[] locksOnNewObjects);
+
+ public void setNewObjects(InternalCDORevision[] newObjects);
+
+ public void setDirtyObjectDeltas(InternalCDORevisionDelta[] dirtyObjectDeltas);
+
+ public void setDetachedObjects(CDOID[] detachedObjects);
+
+ /**
+ * @since 4.0
+ */
+ public void setDetachedObjectTypes(Map<CDOID, EClass> detachedObjectTypes);
+
+ public void setDetachedObjectVersions(int[] detachedObjectVersions);
+
+ public void setAutoReleaseLocksEnabled(boolean on);
+
+ public void setCommitComment(String comment);
+
+ /**
+ * @since 4.0
+ */
+ public void setLobs(ExtendedDataInputStream in);
+
+ public void addIDMapping(CDOID oldID, CDOID newID);
+
+ public void applyIDMappings(OMMonitor monitor);
+}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
index b93d998e1f..d7a9071f7f 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
@@ -2618,11 +2618,16 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
detachedObjects = filterCommittables(transaction.getDetachedObjects());
List<CDOIDAndVersion> detached = new ArrayList<CDOIDAndVersion>(detachedObjects.size());
- for (CDOID id : detachedObjects.keySet())
+ for (Entry<CDOID, CDOObject> entry : detachedObjects.entrySet())
{
- // Add "version-less" key.
- // CDOSessionImpl.reviseRevisions() will call reviseLatest() accordingly.
- detached.add(CDOIDUtil.createIDAndVersion(id, CDOBranchVersion.UNSPECIFIED_VERSION));
+ CDOID id = entry.getKey();
+ CDOObject object = entry.getValue();
+
+ InternalCDORevision cleanRevision = cleanRevisions.get(object);
+ boolean sameBranch = cleanRevision.getBranch() == getBranch();
+ int version = sameBranch ? cleanRevision.getVersion() + 1 : CDOBranchVersion.FIRST_VERSION;
+
+ detached.add(CDOIDUtil.createIDAndVersion(id, version));
}
dirtyObjects = filterCommittables(transaction.getDirtyObjects());

Back to the top