diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse')
25 files changed, 149 insertions, 54 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOInvalidationNotification.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOInvalidationNotification.java index f099d7ce74..e2ff82f691 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOInvalidationNotification.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOInvalidationNotification.java @@ -15,7 +15,6 @@ import org.eclipse.emf.common.notify.Notification; /** * @author Simon McDuff - * @author Eike Stepper */ public interface CDOInvalidationNotification extends Notification { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOTransaction.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOTransaction.java index ee4a56bdae..f641012152 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOTransaction.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOTransaction.java @@ -7,6 +7,7 @@ * * Contributors: * Eike Stepper - initial API and implementation + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201266 **************************************************************************/ package org.eclipse.emf.cdo; @@ -14,6 +15,7 @@ import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.protocol.CDOID; import org.eclipse.emf.cdo.protocol.model.CDOClass; import org.eclipse.emf.cdo.protocol.model.CDOPackage; +import org.eclipse.emf.cdo.protocol.revision.delta.CDORevisionDelta; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; @@ -55,4 +57,6 @@ public interface CDOTransaction extends CDOView public Map<CDOID, CDOObject> getNewObjects(); public Map<CDOID, CDOObject> getDirtyObjects(); + + public Map<CDOID, CDORevisionDelta> getRevisionDeltas(); } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOTransactionHandler.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOTransactionHandler.java index 8769fa518e..2014c79899 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOTransactionHandler.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOTransactionHandler.java @@ -7,9 +7,12 @@ * * Contributors: * Eike Stepper - initial API and implementation + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201266 **************************************************************************/ package org.eclipse.emf.cdo; +import org.eclipse.emf.cdo.protocol.revision.delta.CDOFeatureDelta; + /** * @author Eike Stepper */ @@ -27,7 +30,7 @@ public interface CDOTransactionHandler * <p> * Note: This method will be called at most once per object until the associated transaction is committed. */ - public void modifyingObject(CDOTransaction transaction, CDOObject object); + public void modifyingObject(CDOTransaction transaction, CDOObject object, CDOFeatureDelta featureDelta); /** * Called by a <code>CDOTransaction</code> <b>before</b> it is being committed. The implementor of this method is diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOView.java index 9b1b798c70..6ea8fb345e 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOView.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOView.java @@ -7,7 +7,8 @@ * * Contributors: * Eike Stepper - initial API and implementation - * Simon McDuff - EMF invalidation notifications + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201266 + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201997 **************************************************************************/ package org.eclipse.emf.cdo; @@ -22,7 +23,6 @@ import org.eclipse.net4j.util.event.INotifier; /** * @author Eike Stepper - * @author Simon McDuff */ public interface CDOView extends INotifier { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/analyzer/CDOFeatureAnalyzer.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/analyzer/CDOFeatureAnalyzer.java index ff2230b1c7..2c4c3cac64 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/analyzer/CDOFeatureAnalyzer.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/analyzer/CDOFeatureAnalyzer.java @@ -18,7 +18,6 @@ import org.eclipse.emf.internal.cdo.analyzer.NOOPFeatureAnalyzer; /** * @author Simon McDuff - * @author Eike Stepper */ public interface CDOFeatureAnalyzer { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/analyzer/CDOFetchRuleManager.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/analyzer/CDOFetchRuleManager.java index 17965be5e4..2af0390db3 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/analyzer/CDOFetchRuleManager.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/analyzer/CDOFetchRuleManager.java @@ -21,7 +21,6 @@ import java.util.List; /** * @author Simon McDuff - * @author Eike Stepper */ public interface CDOFetchRuleManager { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOCallbackImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOCallbackImpl.java index bee9cc8f9f..8c1620d11f 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOCallbackImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOCallbackImpl.java @@ -44,6 +44,7 @@ public class CDOCallbackImpl extends CDOLegacyImpl implements CDOCallback CDOStateMachine.INSTANCE.write(this); } + @Override public boolean isAdapterForType(Object type) { return type == CDOCallbackImpl.class; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOInvalidationNotificationImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOInvalidationNotificationImpl.java index e651892654..0f42bbd559 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOInvalidationNotificationImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOInvalidationNotificationImpl.java @@ -18,7 +18,6 @@ import org.eclipse.emf.ecore.EObject; /** * @author Simon McDuff - * @author Eike Stepper */ public class CDOInvalidationNotificationImpl implements CDOInvalidationNotification { @@ -56,26 +55,22 @@ public class CDOInvalidationNotificationImpl implements CDOInvalidationNotificat public boolean wasSet() { - // TODO Clarify return value or throw UOE throw new UnsupportedOperationException(); } public boolean isReset() { - // TODO Clarify return value or throw UOE throw new UnsupportedOperationException(); } public boolean isTouch() { - // TODO Clarify return value or throw UOE - return false; + throw new UnsupportedOperationException(); } public boolean merge(Notification notification) { - // TODO Clarify return value or throw UOE - return false; + throw new UnsupportedOperationException(); } public boolean getNewBooleanValue() diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOLegacyImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOLegacyImpl.java index 0ad8d3c729..9aa3653ace 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOLegacyImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOLegacyImpl.java @@ -7,6 +7,7 @@ * * Contributors: * Eike Stepper - initial API and implementation + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201266 **************************************************************************/ package org.eclipse.emf.internal.cdo; @@ -162,6 +163,14 @@ public abstract class CDOLegacyImpl extends CDOWrapperImpl implements Adapter.In public void cdoInternalPreCommit() { transferInstanceToRevision(); + + CDORevisionManagerImpl revisionManager = view.getSession().getRevisionManager(); + CDORevisionImpl revision = cdoRevision(); + CDORevisionImpl originRevision = revisionManager.getRevisionByVersion(revision.getID(), CDORevision.UNCHUNKED, + revision.getVersion() - 1, false); + + CDOTransactionImpl transaction = cdoView().toTransaction(); + transaction.registerRevisionDelta(this.cdoRevision().createDelta(originRevision)); } public void cdoInternalPostLoad() diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDORevisionManagerImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDORevisionManagerImpl.java index 8fcd5c12d6..e2a8e774fe 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDORevisionManagerImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDORevisionManagerImpl.java @@ -18,6 +18,7 @@ import org.eclipse.emf.cdo.internal.protocol.revision.CDORevisionImpl.MoveableLi import org.eclipse.emf.cdo.protocol.CDOID; import org.eclipse.emf.cdo.protocol.model.CDOFeature; import org.eclipse.emf.cdo.protocol.revision.CDOReferenceProxy; +import org.eclipse.emf.cdo.protocol.revision.CDORevision; import org.eclipse.emf.cdo.protocol.util.TransportException; import org.eclipse.emf.internal.cdo.bundle.OM; @@ -64,7 +65,7 @@ public class CDORevisionManagerImpl extends CDORevisionResolverImpl implements C // Get appropriate chunk size int chunkSize = session.getReferenceChunkSize(); - if (chunkSize == CDORevisionImpl.UNCHUNKED) + if (chunkSize == CDORevision.UNCHUNKED) { // Can happen if CDOSession.setReferenceChunkSize() was called meanwhile chunkSize = Integer.MAX_VALUE; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java index e839a364fa..f4bf2733cf 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java @@ -1,3 +1,14 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * 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 - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201266 + **************************************************************************/ package org.eclipse.emf.internal.cdo; import org.eclipse.emf.cdo.CDOSession; @@ -8,6 +19,7 @@ import org.eclipse.emf.cdo.internal.protocol.model.CDOClassImpl; import org.eclipse.emf.cdo.internal.protocol.revision.CDORevisionImpl; import org.eclipse.emf.cdo.protocol.CDOID; import org.eclipse.emf.cdo.protocol.revision.CDORevision; +import org.eclipse.emf.cdo.protocol.revision.delta.CDOFeatureDelta; import org.eclipse.emf.cdo.protocol.util.TransportException; import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.cdo.util.ServerException; @@ -94,7 +106,7 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent init(CDOState.DIRTY, CDOEvent.ATTACH, FAIL); init(CDOState.DIRTY, CDOEvent.DETACH, FAIL); init(CDOState.DIRTY, CDOEvent.READ, IGNORE); - init(CDOState.DIRTY, CDOEvent.WRITE, IGNORE); + init(CDOState.DIRTY, CDOEvent.WRITE, new RewriteTransition()); init(CDOState.DIRTY, CDOEvent.INVALIDATE, new ConflictTransition()); init(CDOState.DIRTY, CDOEvent.RELOAD, new ReloadTransition()); init(CDOState.DIRTY, CDOEvent.COMMIT, new CommitTransition()); @@ -151,8 +163,13 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent public void write(InternalCDOObject object) { + write(object, null); + } + + public void write(InternalCDOObject object, CDOFeatureDelta featureChange) + { if (TRACER.isEnabled()) trace(object, CDOEvent.WRITE); - process(object, CDOEvent.WRITE, null); + process(object, CDOEvent.WRITE, featureChange); } public void reload(InternalCDOObject... objects) @@ -387,7 +404,7 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent */ private final class WriteTransition implements ITransition<CDOState, CDOEvent, InternalCDOObject, Object> { - public void execute(InternalCDOObject object, CDOState state, CDOEvent event, Object NULL) + public void execute(InternalCDOObject object, CDOState state, CDOEvent event, Object featureChange) { // Copy revision CDORevisionImpl revision = new CDORevisionImpl((CDORevisionImpl)object.cdoRevision()); @@ -396,13 +413,25 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent CDOViewImpl view = (CDOViewImpl)object.cdoView(); CDOTransactionImpl transaction = view.toTransaction(); - transaction.registerDirty(object); - + transaction.registerDirty(object, (CDOFeatureDelta)featureChange); changeState(object, CDOState.DIRTY); } } /** + * @author Simon McDuff + */ + private final class RewriteTransition implements ITransition<CDOState, CDOEvent, InternalCDOObject, Object> + { + public void execute(InternalCDOObject object, CDOState state, CDOEvent event, Object featureChange) + { + CDOViewImpl view = (CDOViewImpl)object.cdoView(); + CDOTransactionImpl transaction = view.toTransaction(); + transaction.registerFeatureDelta(object, (CDOFeatureDelta)featureChange); + } + } + + /** * @author Eike Stepper */ private final class ReloadTransition implements ITransition<CDOState, CDOEvent, InternalCDOObject, Object> diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java index 8eaf1cf050..42f5aecfb3 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java @@ -7,15 +7,24 @@ * * Contributors: * Eike Stepper - initial API and implementation + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201266 **************************************************************************/ package org.eclipse.emf.internal.cdo; import org.eclipse.emf.cdo.internal.protocol.model.CDOFeatureImpl; import org.eclipse.emf.cdo.internal.protocol.revision.CDORevisionImpl; import org.eclipse.emf.cdo.internal.protocol.revision.CDORevisionImpl.MoveableList; +import org.eclipse.emf.cdo.internal.protocol.revision.delta.CDOAddFeatureDeltaImpl; +import org.eclipse.emf.cdo.internal.protocol.revision.delta.CDOClearFeatureDeltaImpl; +import org.eclipse.emf.cdo.internal.protocol.revision.delta.CDOContainerFeatureDeltaImpl; +import org.eclipse.emf.cdo.internal.protocol.revision.delta.CDOMoveFeatureDeltaImpl; +import org.eclipse.emf.cdo.internal.protocol.revision.delta.CDORemoveFeatureDeltaImpl; +import org.eclipse.emf.cdo.internal.protocol.revision.delta.CDOSetFeatureDeltaImpl; +import org.eclipse.emf.cdo.internal.protocol.revision.delta.CDOUnsetFeatureDeltaImpl; import org.eclipse.emf.cdo.protocol.CDOID; import org.eclipse.emf.cdo.protocol.model.CDOFeature; import org.eclipse.emf.cdo.protocol.revision.CDOReferenceProxy; +import org.eclipse.emf.cdo.protocol.revision.delta.CDOFeatureDelta; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; @@ -61,7 +70,8 @@ public final class CDOStore implements EStore CDOID containerID = (CDOID)((CDOViewImpl)cdoObject.cdoView()).convertObjectToID(newContainer); - CDORevisionImpl revision = getRevisionForWriting(cdoObject); + CDOContainerFeatureDeltaImpl delta = new CDOContainerFeatureDeltaImpl(containerID, newContainerFeatureID); + CDORevisionImpl revision = getRevisionForWriting(cdoObject, delta); revision.setContainerID(containerID); revision.setContainingFeature(newContainerFeatureID); } @@ -338,7 +348,8 @@ public final class CDOStore implements EStore TRACER.format("set({0}, {1}, {2}, {3})", cdoObject, cdoFeature, index, value); } - CDORevisionImpl revision = getRevisionForWriting(cdoObject); + CDOSetFeatureDeltaImpl delta = new CDOSetFeatureDeltaImpl(cdoFeature, index, value); + CDORevisionImpl revision = getRevisionForWriting(cdoObject, delta); if (cdoFeature.isReference()) { Object oldValue = revision.get(cdoFeature, index); @@ -351,11 +362,10 @@ public final class CDOStore implements EStore { handleContainmentAdd(cdoObject, cdoFeature, value); } - - value = ((CDOViewImpl)cdoObject.cdoView()).convertObjectToID(value); } Object result = revision.set(cdoFeature, index, value); + if (cdoFeature.isReference()) { result = ((CDOViewImpl)cdoObject.cdoView()).convertIDToObject(result); @@ -373,7 +383,8 @@ public final class CDOStore implements EStore TRACER.format("unset({0}, {1})", cdoObject, cdoFeature); } - CDORevisionImpl revision = getRevisionForWriting(cdoObject); + CDOUnsetFeatureDeltaImpl delta = new CDOUnsetFeatureDeltaImpl(cdoFeature); + CDORevisionImpl revision = getRevisionForWriting(cdoObject, delta); revision.unset(cdoFeature); } @@ -396,7 +407,8 @@ public final class CDOStore implements EStore value = ((CDOViewImpl)cdoObject.cdoView()).convertObjectToID(value); } - CDORevisionImpl revision = getRevisionForWriting(cdoObject); + CDOAddFeatureDeltaImpl delta = new CDOAddFeatureDeltaImpl(cdoFeature, index, value); + CDORevisionImpl revision = getRevisionForWriting(cdoObject, delta); revision.add(cdoFeature, index, value); } @@ -409,7 +421,8 @@ public final class CDOStore implements EStore TRACER.format("remove({0}, {1}, {2})", cdoObject, cdoFeature, index); } - CDORevisionImpl revision = getRevisionForWriting(cdoObject); + CDORemoveFeatureDeltaImpl delta = new CDORemoveFeatureDeltaImpl(cdoFeature, index); + CDORevisionImpl revision = getRevisionForWriting(cdoObject, delta); Object result = revision.remove(cdoFeature, index); if (cdoFeature.isReference()) { @@ -433,7 +446,8 @@ public final class CDOStore implements EStore TRACER.format("clear({0}, {1})", cdoObject, cdoFeature); } - CDORevisionImpl revision = getRevisionForWriting(cdoObject); + CDOClearFeatureDeltaImpl delta = new CDOClearFeatureDeltaImpl(cdoFeature); + CDORevisionImpl revision = getRevisionForWriting(cdoObject, delta); revision.clear(cdoFeature); } @@ -446,7 +460,8 @@ public final class CDOStore implements EStore TRACER.format("move({0}, {1}, {2}, {3})", cdoObject, cdoFeature, target, source); } - CDORevisionImpl revision = getRevisionForWriting(cdoObject); + CDOMoveFeatureDeltaImpl delta = new CDOMoveFeatureDeltaImpl(cdoFeature, target, source); + CDORevisionImpl revision = getRevisionForWriting(cdoObject, delta); Object result = revision.move(cdoFeature, target, source); if (cdoFeature.isReference()) { @@ -495,9 +510,9 @@ public final class CDOStore implements EStore return getRevision(cdoObject); } - private static CDORevisionImpl getRevisionForWriting(InternalCDOObject cdoObject) + private static CDORevisionImpl getRevisionForWriting(InternalCDOObject cdoObject, CDOFeatureDelta delta) { - CDOStateMachine.INSTANCE.write(cdoObject); + CDOStateMachine.INSTANCE.write(cdoObject, delta); return getRevision(cdoObject); } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java index 151e54f427..eff78dbb58 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOTransactionImpl.java @@ -7,6 +7,7 @@ * * Contributors: * Eike Stepper - initial API and implementation + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201266 **************************************************************************/ package org.eclipse.emf.internal.cdo; @@ -20,8 +21,11 @@ import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.eresource.impl.CDOResourceImpl; import org.eclipse.emf.cdo.internal.protocol.CDOIDImpl; import org.eclipse.emf.cdo.internal.protocol.model.CDOPackageImpl; +import org.eclipse.emf.cdo.internal.protocol.revision.delta.CDORevisionDeltaImpl; import org.eclipse.emf.cdo.protocol.CDOID; import org.eclipse.emf.cdo.protocol.model.CDOPackage; +import org.eclipse.emf.cdo.protocol.revision.delta.CDOFeatureDelta; +import org.eclipse.emf.cdo.protocol.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.common.util.URI; @@ -72,6 +76,8 @@ public class CDOTransactionImpl extends CDOViewImpl implements CDOTransaction private Map<CDOID, CDOObject> dirtyObjects = new HashMap<CDOID, CDOObject>(); + private Map<CDOID, CDORevisionDelta> revisionDeltas = new HashMap<CDOID, CDORevisionDelta>(); + private boolean dirty; private boolean conflict; @@ -150,6 +156,11 @@ public class CDOTransactionImpl extends CDOViewImpl implements CDOTransaction return dirtyObjects; } + public Map<CDOID, CDORevisionDelta> getRevisionDeltas() + { + return revisionDeltas; + } + public CDOID getNextTemporaryID() { long id = nextTemporaryID; @@ -298,18 +309,39 @@ public class CDOTransactionImpl extends CDOViewImpl implements CDOTransaction } } - public void registerDirty(InternalCDOObject object) + public void registerFeatureDelta(InternalCDOObject object, CDOFeatureDelta featureDelta) { - if (TRACER.isEnabled()) + CDORevisionDeltaImpl revisionDelta = (CDORevisionDeltaImpl)revisionDeltas.get(object.cdoID()); + if (revisionDelta == null) { - TRACER.format("Registering dirty object {0}", object); + revisionDelta = new CDORevisionDeltaImpl(object.cdoRevision()); + revisionDeltas.put(object.cdoID(), revisionDelta); } + revisionDelta.addFeatureDelta(featureDelta); for (CDOTransactionHandler handler : getHandlers()) { - handler.modifyingObject(this, object); + handler.modifyingObject(this, object, featureDelta); + } + } + + public void registerRevisionDelta(CDORevisionDelta delta) + { + CDORevisionDelta changeSet = revisionDeltas.get(delta.getId()); + if (changeSet == null) + { + revisionDeltas.put(delta.getId(), changeSet); + } + } + + public void registerDirty(InternalCDOObject object, CDOFeatureDelta featureDelta) + { + if (TRACER.isEnabled()) + { + TRACER.format("Registering dirty object {0}", object); } + registerFeatureDelta(object, featureDelta); register(dirtyObjects, object); } @@ -402,6 +434,7 @@ public class CDOTransactionImpl extends CDOViewImpl implements CDOTransaction newResources.clear(); newObjects.clear(); dirtyObjects.clear(); + revisionDeltas.clear(); dirty = false; conflict = false; nextTemporaryID = INITIAL_TEMPORARY_ID; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOViewImpl.java index b20ce0e2ca..64b3b9d00a 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOViewImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOViewImpl.java @@ -7,9 +7,10 @@ * * Contributors: * Eike Stepper - initial API and implementation - * Simon McDuff - EMF invalidation notifications, - * IFeatureAnalyzer, - * LoadRevisionCollectionChunk + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201265 + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201266 + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201997 + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=202064 **************************************************************************/ package org.eclipse.emf.internal.cdo; @@ -64,7 +65,6 @@ import java.util.concurrent.ConcurrentMap; /** * @author Eike Stepper - * @author Simon McDuff */ public class CDOViewImpl extends org.eclipse.net4j.internal.util.event.Notifier implements CDOView, CDOIDProvider, Adapter.Internal diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOAbstractFeatureRuleAnalyzer.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOAbstractFeatureRuleAnalyzer.java index a45c11eec4..72b2915186 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOAbstractFeatureRuleAnalyzer.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOAbstractFeatureRuleAnalyzer.java @@ -22,7 +22,6 @@ import org.eclipse.net4j.internal.util.om.trace.ContextTracer; /** * @author Simon McDuff - * @author Eike Stepper */ public abstract class CDOAbstractFeatureRuleAnalyzer implements CDOFeatureAnalyzer, CDOFetchRuleManager { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOAnalyzerFeatureInfo.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOAnalyzerFeatureInfo.java index e202fdcf3c..ab32620eee 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOAnalyzerFeatureInfo.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOAnalyzerFeatureInfo.java @@ -26,7 +26,6 @@ import java.util.Map; /** * @author Simon McDuff - * @author Eike Stepper */ public class CDOAnalyzerFeatureInfo { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOClusterOfFetchRule.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOClusterOfFetchRule.java index 803d30c6ba..2c4c5be2fe 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOClusterOfFetchRule.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOClusterOfFetchRule.java @@ -16,7 +16,6 @@ import org.eclipse.emf.cdo.protocol.model.CDOFeature; /** * @author Simon McDuff - * @author Eike Stepper */ public class CDOClusterOfFetchRule { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerModelBased.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerModelBased.java index afda4ae2b3..43693275be 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerModelBased.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerModelBased.java @@ -11,7 +11,6 @@ **************************************************************************/ package org.eclipse.emf.internal.cdo.analyzer; -import org.eclipse.emf.cdo.internal.protocol.CDOIDNull; import org.eclipse.emf.cdo.protocol.CDOID; import org.eclipse.emf.cdo.protocol.analyzer.CDOFetchRule; import org.eclipse.emf.cdo.protocol.model.CDOFeature; @@ -24,7 +23,6 @@ import java.util.List; /** * @author Simon McDuff - * @author Eike Stepper */ public class CDOFeatureAnalyzerModelBased extends CDOAbstractFeatureRuleAnalyzer { @@ -50,7 +48,7 @@ public class CDOFeatureAnalyzerModelBased extends CDOAbstractFeatureRuleAnalyzer public CDOID getContext() { - return CDOIDNull.NULL; + return CDOID.NULL; } public List<CDOFetchRule> getFetchRules(Collection<CDOID> ids) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerUI.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerUI.java index bc529144ec..bb68698f91 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerUI.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerUI.java @@ -11,7 +11,6 @@ **************************************************************************/ package org.eclipse.emf.internal.cdo.analyzer; -import org.eclipse.emf.cdo.internal.protocol.CDOIDNull; import org.eclipse.emf.cdo.protocol.CDOID; import org.eclipse.emf.cdo.protocol.analyzer.CDOFetchRule; import org.eclipse.emf.cdo.protocol.model.CDOClass; @@ -27,7 +26,6 @@ import java.util.Map; /** * @author Simon McDuff - * @author Eike Stepper */ public class CDOFeatureAnalyzerUI extends CDOAbstractFeatureRuleAnalyzer { @@ -53,7 +51,7 @@ public class CDOFeatureAnalyzerUI extends CDOAbstractFeatureRuleAnalyzer { if (this.lastTraverseFeature.isMany()) { - return CDOIDNull.NULL; + return CDOID.NULL; } return lastTraverseCDOObject.cdoID(); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFetchFeatureInfo.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFetchFeatureInfo.java index 7d71f4fe6e..42a22efbfa 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFetchFeatureInfo.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFetchFeatureInfo.java @@ -16,7 +16,6 @@ import org.eclipse.emf.cdo.protocol.model.CDOFeature; /** * @author Simon McDuff - * @author Eike Stepper */ public class CDOFetchFeatureInfo { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFetchRuleManagerThreadLocal.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFetchRuleManagerThreadLocal.java index b7b74076a5..e2d8eb181b 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFetchRuleManagerThreadLocal.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFetchRuleManagerThreadLocal.java @@ -20,7 +20,6 @@ import java.util.List; /** * @author Simon McDuff - * @author Eike Stepper */ public class CDOFetchRuleManagerThreadLocal implements CDOFetchRuleManager { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/NOOPFeatureAnalyzer.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/NOOPFeatureAnalyzer.java index dbd06acc79..dc4672ec73 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/NOOPFeatureAnalyzer.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/NOOPFeatureAnalyzer.java @@ -18,7 +18,6 @@ import org.eclipse.emf.internal.cdo.InternalCDOObject; /** * @author Simon McDuff - * @author Eike Stepper */ public class NOOPFeatureAnalyzer implements CDOFeatureAnalyzer { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/NOOPFetchRuleManager.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/NOOPFetchRuleManager.java index 067a75f493..583f627f07 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/NOOPFetchRuleManager.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/NOOPFetchRuleManager.java @@ -12,7 +12,6 @@ package org.eclipse.emf.internal.cdo.analyzer; import org.eclipse.emf.cdo.analyzer.CDOFetchRuleManager; -import org.eclipse.emf.cdo.internal.protocol.CDOIDNull; import org.eclipse.emf.cdo.protocol.CDOID; import org.eclipse.emf.cdo.protocol.analyzer.CDOFetchRule; @@ -21,7 +20,6 @@ import java.util.List; /** * @author Simon McDuff - * @author Eike Stepper */ public class NOOPFetchRuleManager implements CDOFetchRuleManager { @@ -31,7 +29,7 @@ public class NOOPFetchRuleManager implements CDOFetchRuleManager public CDOID getContext() { - return CDOIDNull.NULL; + return CDOID.NULL; } public List<CDOFetchRule> getFetchRules(Collection<CDOID> ids) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/protocol/CommitTransactionRequest.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/protocol/CommitTransactionRequest.java index 5381d3b0a1..e8d87173e9 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/protocol/CommitTransactionRequest.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/protocol/CommitTransactionRequest.java @@ -7,6 +7,7 @@ * * Contributors: * Eike Stepper - initial API and implementation + * Simon McDuff - https://bugs.eclipse.org/bugs/show_bug.cgi?id=201266 **************************************************************************/ package org.eclipse.emf.internal.cdo.protocol; @@ -16,11 +17,13 @@ import org.eclipse.emf.cdo.internal.protocol.CDOIDImpl; import org.eclipse.emf.cdo.internal.protocol.CDOIDRangeImpl; import org.eclipse.emf.cdo.internal.protocol.model.CDOPackageImpl; import org.eclipse.emf.cdo.internal.protocol.revision.CDORevisionImpl; +import org.eclipse.emf.cdo.internal.protocol.revision.delta.CDORevisionDeltaImpl; import org.eclipse.emf.cdo.protocol.CDOID; import org.eclipse.emf.cdo.protocol.CDOIDRange; import org.eclipse.emf.cdo.protocol.CDOProtocolConstants; import org.eclipse.emf.cdo.protocol.model.CDOPackage; import org.eclipse.emf.cdo.protocol.revision.CDORevision; +import org.eclipse.emf.cdo.protocol.revision.delta.CDORevisionDelta; import org.eclipse.emf.internal.cdo.CDOTransactionImpl; import org.eclipse.emf.internal.cdo.InternalCDOObject; @@ -64,7 +67,7 @@ public class CommitTransactionRequest extends CDOClientRequest<CommitTransaction writeNewPackages(out); writeNewResources(out); writeNewObjects(out); - writeDirtyObjects(out); + writeRevisionDeltas(out); } @Override @@ -159,6 +162,21 @@ public class CommitTransactionRequest extends CDOClientRequest<CommitTransaction writeRevisions(out, dirtyObjects); } + private void writeRevisionDeltas(ExtendedDataOutputStream out) throws IOException + { + Collection<CDORevisionDelta> revisionDeltas = transaction.getRevisionDeltas().values(); + if (PROTOCOL.isEnabled()) + { + PROTOCOL.format("Writing {0} revision deltas", revisionDeltas.size()); + } + + out.writeInt(revisionDeltas.size()); + for (CDORevisionDelta revisionDelta : revisionDeltas) + { + ((CDORevisionDeltaImpl)revisionDelta).write(out, transaction); + } + } + private void writeRevisions(ExtendedDataOutputStream out, Collection<?> objects) throws IOException { out.writeInt(objects.size()); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CrossReferencesPackageClosure.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CrossReferencesPackageClosure.java index b56dbeaab8..6998d77fe7 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CrossReferencesPackageClosure.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/util/CrossReferencesPackageClosure.java @@ -27,6 +27,7 @@ public class CrossReferencesPackageClosure extends PackageClosure { } + @Override public Set<EPackage> calculate(EPackage ePackage) { Set<EPackage> visited = new HashSet<EPackage>(); @@ -34,6 +35,7 @@ public class CrossReferencesPackageClosure extends PackageClosure return visited; } + @Override protected void collectContents(EPackage ePackage, Set<EPackage> visited) { visited.add(ePackage); |