diff options
author | Eike Stepper | 2012-07-22 03:37:05 +0000 |
---|---|---|
committer | Eike Stepper | 2012-07-22 03:37:05 +0000 |
commit | 1b9ff584fade91fd11088dc86da780ed4c54e787 (patch) | |
tree | efdd9ffc07064577d2636f9532f52473b522e7ba | |
parent | 291fab7cd6020858323877ebdc5a9e31ed8c08ce (diff) | |
download | cdo-1b9ff584fade91fd11088dc86da780ed4c54e787.tar.gz cdo-1b9ff584fade91fd11088dc86da780ed4c54e787.tar.xz cdo-1b9ff584fade91fd11088dc86da780ed4c54e787.zip |
Transmit detached versions during commit
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()); |