Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java76
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java12
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java5
3 files changed, 88 insertions, 5 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java
index 01c45091ae..cdd63e8643 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java
@@ -27,13 +27,17 @@ import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.Resource.Factory.Registry;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.EcoreUtil.Copier;
import org.eclipse.emf.internal.cdo.CDOSessionImpl;
+import java.util.List;
import java.util.Map;
/**
@@ -184,4 +188,76 @@ public final class CDOUtil
eClass.getEStructuralFeatures().add(eReference);
return eReference;
}
+
+ /**
+ * Returns a self-contained copy of the eObject with all proxies resolved.
+ *
+ * @param eObject
+ * the object to copy.
+ * @return the copy.
+ * @see EcoreUtil#copy(EObject)
+ */
+ public static EObject copy(EObject eObject, CDOView view)
+ {
+ Copier copier = new CDOCopier(view);
+ EObject result = copier.copy(eObject);
+ copier.copyReferences();
+ return result;
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static final class CDOCopier extends Copier
+ {
+ private static final long serialVersionUID = 1L;
+
+ private CDOView view;
+
+ public CDOCopier(CDOView view)
+ {
+ this.view = view;
+ }
+
+ @Override
+ protected void copyReference(EReference eReference, EObject eObject, EObject copyEObject)
+ {
+ resolve(eReference, eObject);
+ super.copyReference(eReference, eObject, copyEObject);
+ }
+
+ @Override
+ protected void copyContainment(EReference eReference, EObject eObject, EObject copyEObject)
+ {
+ resolve(eReference, eObject);
+ super.copyContainment(eReference, eObject, copyEObject);
+ }
+
+ protected void resolve(EReference eReference, EObject eObject)
+ {
+ if (eObject.eIsSet(eReference))
+ {
+ if (eReference.isMany())
+ {
+ @SuppressWarnings("unchecked")
+ List<EObject> list = (List<EObject>)eObject.eGet(eReference);
+ for (EObject element : list)
+ {
+ if (element.eIsProxy())
+ {
+ EcoreUtil.resolve(element, view.getResourceSet());
+ }
+ }
+ }
+ else
+ {
+ EObject childEObject = (EObject)eObject.eGet(eReference);
+ if (childEObject.eIsProxy())
+ {
+ EcoreUtil.resolve(childEObject, view.getResourceSet());
+ }
+ }
+ }
+ }
+ }
}
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 0b3c55b736..f0d20e541d 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
@@ -506,6 +506,12 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec
}
@Override
+ protected boolean hasProxies()
+ {
+ return true;
+ }
+
+ @Override
protected List<E> delegateList()
{
throw new UnsupportedOperationException();
@@ -717,6 +723,12 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec
}
@Override
+ protected boolean hasProxies()
+ {
+ return true;
+ }
+
+ @Override
protected List<FeatureMap.Entry> delegateList()
{
throw new UnsupportedOperationException();
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java
index 48cea1a52a..7b0ad62d1e 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java
@@ -291,11 +291,6 @@ public class CDOSessionImpl extends Lifecycle implements CDOSession
--nextTemporaryID;
--nextTemporaryID;
- // for (EReference reference : metaInstance.eClass().getEAllReferences())
- // {
- // metaInstance.eGet(reference);
- // }
-
for (EObject content : metaInstance.eContents())
{
registerMetaInstance((InternalEObject)content);

Back to the top