diff options
author | Simon McDuff | 2008-10-09 09:56:46 +0000 |
---|---|---|
committer | Simon McDuff | 2008-10-09 09:56:46 +0000 |
commit | 5efcdc5a08d2d92e48ef1b1833d47cfb8c519d27 (patch) | |
tree | 3bea1902639d3dc0ca850d2903726c1bdf707b2d /plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo | |
parent | 9b0f15814110cb6dba3942b651a27f3cf93ffe28 (diff) | |
download | cdo-5efcdc5a08d2d92e48ef1b1833d47cfb8c519d27.tar.gz cdo-5efcdc5a08d2d92e48ef1b1833d47cfb8c519d27.tar.xz cdo-5efcdc5a08d2d92e48ef1b1833d47cfb8c519d27.zip |
[250036] Invalidation doesn't work for EMap Feature
https://bugs.eclipse.org/bugs/show_bug.cgi?id=250036
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo')
6 files changed, 119 insertions, 3 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOLegacyWrapper.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOLegacyWrapper.java index aabf53e308..b293b47603 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOLegacyWrapper.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOLegacyWrapper.java @@ -193,6 +193,10 @@ public final class CDOLegacyWrapper extends CDOObjectWrapper revisionToInstance(); } + public void cdoInternalCleanup() + { + } + public synchronized void handleRead(InternalEObject object, int featureID) { if (!handlingCallback) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOMetaWrapper.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOMetaWrapper.java index 228bcc93d6..bd42b60abf 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOMetaWrapper.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOMetaWrapper.java @@ -81,6 +81,11 @@ public class CDOMetaWrapper extends CDOObjectWrapper throw new UnsupportedOperationException(); } + public void cdoInternalCleanup() + { + throw new UnsupportedOperationException(); + } + public void cdoInternalPostAttach() { throw new UnsupportedOperationException(); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java index f5c502f5bc..1d3262c13b 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java @@ -206,6 +206,28 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec for (int i = 0; i < eClass.getFeatureCount(); i++) { EStructuralFeature eFeature = cdoInternalDynamicFeature(i); + // We need to keep the existing list if possible. + if (!eFeature.isTransient() && eSettings[i] instanceof InternalCDOLoadable) + { + ((InternalCDOLoadable)eSettings[i]).cdoInternalPostLoad(); + } + } + } + } + + /** + * @since 2.0 + */ + public void cdoInternalCleanup() + { + if (eSettings != null) + { + // Make sure transient feature are kept but persisted value are not cached. + EClass eClass = eClass(); + for (int i = 0; i < eClass.getFeatureCount(); i++) + { + EStructuralFeature eFeature = cdoInternalDynamicFeature(i); + // We need to keep the existing list if possible. if (!eFeature.isTransient()) { eSettings[i] = null; @@ -437,7 +459,7 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec // more efficient than .equals() and it's correct if (eType.getInstanceClassName() == "java.util.Map$Entry") { - class EStoreEcoreEMap extends EcoreEMap<Object, Object> + class EStoreEcoreEMap extends EcoreEMap<Object, Object> implements InternalCDOLoadable { private static final long serialVersionUID = 1L; @@ -483,6 +505,69 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec size = delegateEList.size(); } + + private void checkListForReading() + { + CDOStateMachine.INSTANCE.read(CDOObjectImpl.this); + } + + /** + * Ensures that the entry data is created and is populated with contents of the delegate list. + */ + @Override + synchronized protected void ensureEntryDataExists() + { + checkListForReading(); + super.ensureEntryDataExists(); + } + + @Override + public int size() + { + checkListForReading(); + return size; + } + + @Override + public boolean isEmpty() + { + checkListForReading(); + return size == 0; + } + + @Override + public boolean contains(Object object) + { + checkListForReading(); + return super.contains(object); + } + + @Override + public boolean containsAll(Collection<?> collection) + { + checkListForReading(); + return super.containsAll(collection); + } + + @Override + public boolean containsKey(Object key) + { + checkListForReading(); + return super.containsKey(key); + } + + @Override + public boolean containsValue(Object value) + { + checkListForReading(); + return super.containsValue(value); + } + + public void cdoInternalPostLoad() + { + entryData = null; + size = delegateEList.size(); + } } return new EStoreEcoreEMap(); 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 3c11efcaf7..d7b8136c52 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 @@ -585,6 +585,7 @@ public class CDOViewImpl extends org.eclipse.net4j.util.event.Notifier implement */ protected void cleanObject(InternalCDOObject object, InternalCDORevision revision) { + object.cdoInternalCleanup(); if (object instanceof CDOResourceImpl) { object.cdoInternalSetResource((CDOResourceImpl)object); @@ -603,6 +604,7 @@ public class CDOViewImpl extends org.eclipse.net4j.util.event.Notifier implement object.cdoInternalSetRevision(revision); object.cdoInternalSetID(revision.getID()); object.cdoInternalSetState(CDOState.CLEAN); + object.cdoInternalPostLoad(); } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/InternalCDOLoadable.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/InternalCDOLoadable.java new file mode 100644 index 0000000000..bbefac9fe0 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/InternalCDOLoadable.java @@ -0,0 +1,20 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2008 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: + * Simon McDuff - initial API and implementation + **************************************************************************/ +package org.eclipse.emf.internal.cdo; + +/** + * @author Simon McDuff + * @since 2.0 + */ +public interface InternalCDOLoadable +{ + public void cdoInternalPostLoad(); +} diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/InternalCDOObject.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/InternalCDOObject.java index 2f979f8283..f1499e4810 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/InternalCDOObject.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/InternalCDOObject.java @@ -23,9 +23,9 @@ import org.eclipse.emf.ecore.InternalEObject; /** * @author Eike Stepper */ -public interface InternalCDOObject extends CDOObject, InternalEObject +public interface InternalCDOObject extends CDOObject, InternalEObject, InternalCDOLoadable { - public void cdoInternalPostLoad(); + public void cdoInternalCleanup(); public void cdoInternalPostAttach(); |