Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon McDuff2008-10-09 09:56:46 +0000
committerSimon McDuff2008-10-09 09:56:46 +0000
commit5efcdc5a08d2d92e48ef1b1833d47cfb8c519d27 (patch)
tree3bea1902639d3dc0ca850d2903726c1bdf707b2d /plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo
parent9b0f15814110cb6dba3942b651a27f3cf93ffe28 (diff)
downloadcdo-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')
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOLegacyWrapper.java4
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOMetaWrapper.java5
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java87
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOViewImpl.java2
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/InternalCDOLoadable.java20
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/InternalCDOObject.java4
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();

Back to the top