diff options
author | Eike Stepper | 2016-10-05 15:09:22 +0000 |
---|---|---|
committer | Eike Stepper | 2016-10-05 15:09:22 +0000 |
commit | a4d4b343dce31f29ac4bf477e63cbb4f9d0eba7e (patch) | |
tree | 435a881ef124bbf44f9b3ba8828ac1aab4e54906 /plugins/org.eclipse.emf.cdo | |
parent | 53a350e8a852a2d448ee2ec755bd35e45545795e (diff) | |
download | cdo-a4d4b343dce31f29ac4bf477e63cbb4f9d0eba7e.tar.gz cdo-a4d4b343dce31f29ac4bf477e63cbb4f9d0eba7e.tar.xz cdo-a4d4b343dce31f29ac4bf477e63cbb4f9d0eba7e.zip |
[503573] Adapt method in CDODeltaNotificationImpl fails to adapt for GregorianCalendar
https://bugs.eclipse.org/bugs/show_bug.cgi?id=503573
Diffstat (limited to 'plugins/org.eclipse.emf.cdo')
4 files changed, 54 insertions, 38 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDODeltaNotificationImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDODeltaNotificationImpl.java index 415532febf..47da7389b0 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDODeltaNotificationImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/object/CDODeltaNotificationImpl.java @@ -184,18 +184,12 @@ public class CDODeltaNotificationImpl extends ENotificationImpl implements CDODe EDataType eAttributeType = ((EAttribute)feature).getEAttributeType(); if (eAttributeType != null) { - String stringValue; if (eAttributeType instanceof EEnum && object instanceof Integer) { EEnumLiteral literal = ((EEnum)eAttributeType).getEEnumLiteral((Integer)object); - stringValue = literal.getLiteral(); + String stringValue = literal.getLiteral(); + object = eAttributeType.getEPackage().getEFactoryInstance().createFromString(eAttributeType, stringValue); } - else - { - stringValue = String.valueOf(object); - } - - object = eAttributeType.getEPackage().getEFactoryInstance().createFromString(eAttributeType, stringValue); } } } 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 978caadc5c..d54811c3f7 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 @@ -3543,13 +3543,14 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa * * @since 3.0 */ - /* - * Synchronized through InvlidationRunner.run() - */ @Override - protected Map<CDOObject, Pair<CDORevision, CDORevisionDelta>> invalidate(List<CDORevisionKey> allChangedObjects, - List<CDOIDAndVersion> allDetachedObjects, List<CDORevisionDelta> deltas, - Map<CDOObject, CDORevisionDelta> revisionDeltas, Set<CDOObject> detachedObjects) + protected Map<CDOObject, Pair<CDORevision, CDORevisionDelta>> invalidate( // + List<CDORevisionKey> allChangedObjects, // + List<CDOIDAndVersion> allDetachedObjects, // + List<CDORevisionDelta> deltas, // + Map<CDOObject, CDORevisionDelta> revisionDeltas, // + Set<CDOObject> detachedObjects, // + Map<CDOID, InternalCDORevision> oldRevisions) { if (!allDetachedObjects.isEmpty()) { @@ -3567,8 +3568,13 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa session.clearCommittedSinceLastRefresh(); } - Map<CDOObject, Pair<CDORevision, CDORevisionDelta>> conflicts = // - super.invalidate(allChangedObjects, allDetachedObjects, deltas, revisionDeltas, detachedObjects); + Map<CDOObject, Pair<CDORevision, CDORevisionDelta>> conflicts = super.invalidate( // + allChangedObjects, // + allDetachedObjects, // + deltas, // + revisionDeltas, // + detachedObjects, // + oldRevisions); if (!allChangedObjects.isEmpty()) { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java index 0c5d7c6083..de7e0b01dc 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java @@ -2541,9 +2541,13 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb /* * Synchronized through InvalidationRunner.run() */ - protected Map<CDOObject, Pair<CDORevision, CDORevisionDelta>> invalidate(List<CDORevisionKey> allChangedObjects, - List<CDOIDAndVersion> allDetachedObjects, List<CDORevisionDelta> deltas, - Map<CDOObject, CDORevisionDelta> revisionDeltas, Set<CDOObject> detachedObjects) + protected Map<CDOObject, Pair<CDORevision, CDORevisionDelta>> invalidate( // + List<CDORevisionKey> allChangedObjects, // + List<CDOIDAndVersion> allDetachedObjects, // + List<CDORevisionDelta> deltas, // + Map<CDOObject, CDORevisionDelta> revisionDeltas, // + Set<CDOObject> detachedObjects, // + Map<CDOID, InternalCDORevision> oldRevisions) { boolean hasConflictResolvers = this instanceof CDOTransaction && ((CDOTransaction)this).options().getConflictResolvers().length != 0; @@ -2552,15 +2556,15 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb // Bug 363355: manage detached objects before changed objects to avoid issue on eContainer for (CDOIDAndVersion key : allDetachedObjects) { - InternalCDOObject detachedObject = removeObject(key.getID()); + CDOID id = key.getID(); + + InternalCDOObject detachedObject = removeObject(id); if (detachedObject != null) { - Pair<CDORevision, CDORevisionDelta> oldInfo = Pair.create((CDORevision)detachedObject.cdoRevision(), - CDORevisionDelta.DETACHED); - // if (!isLocked(detachedObject)) - { - CDOStateMachine.INSTANCE.detachRemote(detachedObject); - } + CDORevision oldRevision = detachedObject.cdoRevision(); + oldRevisions.put(id, (InternalCDORevision)oldRevision); + + CDOStateMachine.INSTANCE.detachRemote(detachedObject); detachedObjects.add(detachedObject); if (detachedObject.cdoConflict()) @@ -2570,7 +2574,7 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb conflicts = new HashMap<CDOObject, Pair<CDORevision, CDORevisionDelta>>(); } - conflicts.put(detachedObject, oldInfo); + conflicts.put(detachedObject, Pair.create(oldRevision, CDORevisionDelta.DETACHED)); } } } @@ -2581,6 +2585,7 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb if (key instanceof CDORevisionDelta) { delta = (CDORevisionDelta)key; + // Copy the revision delta so that conflict resolvers can modify it. if (hasConflictResolvers) { @@ -2590,14 +2595,15 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb deltas.add(delta); } - CDOObject changedObject = objects.get(key.getID()); + CDOID id = key.getID(); + + CDOObject changedObject = objects.get(id); if (changedObject != null) { - Pair<CDORevision, CDORevisionDelta> oldInfo = Pair.create(changedObject.cdoRevision(), delta); - // if (!isLocked(changedObject)) - { - CDOStateMachine.INSTANCE.invalidate((InternalCDOObject)changedObject, key); - } + CDORevision oldRevision = changedObject.cdoRevision(); + oldRevisions.put(id, (InternalCDORevision)oldRevision); + + CDOStateMachine.INSTANCE.invalidate((InternalCDOObject)changedObject, key); if (changedObject instanceof CDOResourceNodeImpl) { @@ -2615,7 +2621,7 @@ public abstract class AbstractCDOView extends CDOCommitHistoryProviderImpl<CDOOb conflicts = new HashMap<CDOObject, Pair<CDORevision, CDORevisionDelta>>(); } - conflicts.put(changedObject, oldInfo); + conflicts.put(changedObject, Pair.create(oldRevision, delta)); } } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java index 6322ba8f9e..99a21df448 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java @@ -1218,10 +1218,20 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv List<CDORevisionDelta> deltas = new ArrayList<CDORevisionDelta>(); Map<CDOObject, CDORevisionDelta> revisionDeltas = new HashMap<CDOObject, CDORevisionDelta>(); Set<CDOObject> detachedObjects = new HashSet<CDOObject>(); + Map<CDOID, InternalCDORevision> oldRevisions = invalidationData.getOldRevisions(); + if (oldRevisions == null) + { + oldRevisions = CDOIDUtil.createMap(); + } + + Map<CDOObject, Pair<CDORevision, CDORevisionDelta>> conflicts = invalidate( // + invalidationData.getAllChangedObjects(), // + invalidationData.getAllDetachedObjects(), // + deltas, // + revisionDeltas, // + detachedObjects, // + oldRevisions); - Map<CDOObject, Pair<CDORevision, CDORevisionDelta>> conflicts = invalidate( - invalidationData.getAllChangedObjects(), invalidationData.getAllDetachedObjects(), deltas, revisionDeltas, - detachedObjects); handleConflicts(lastUpdateTime, conflicts, deltas); sendInvalidationNotifications(revisionDeltas.keySet(), detachedObjects); @@ -1231,7 +1241,7 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv // Then send the notifications. The deltas could have been modified by the conflict resolvers. if (!deltas.isEmpty() || !detachedObjects.isEmpty()) { - sendDeltaNotifications(deltas, detachedObjects, invalidationData.getOldRevisions()); + sendDeltaNotifications(deltas, detachedObjects, oldRevisions); } fireAdaptersNotifiedEvent(lastUpdateTime); |