Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2010-10-30 08:35:44 +0000
committerEike Stepper2010-10-30 08:35:44 +0000
commit5b561dec0973ac652198ce154c48db5e7e197239 (patch)
tree7a6a17ca0c17d51c5f860c6664fb359377e2a1e1
parent00b546825d6fd2073c3efc948127625803b64a7f (diff)
downloadcdo-5b561dec0973ac652198ce154c48db5e7e197239.tar.gz
cdo-5b561dec0973ac652198ce154c48db5e7e197239.tar.xz
cdo-5b561dec0973ac652198ce154c48db5e7e197239.zip
[322754] NullPointerException after deleting a resource
https://bugs.eclipse.org/bugs/show_bug.cgi?id=322754
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_322754_Test.java36
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java13
2 files changed, 45 insertions, 4 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_322754_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_322754_Test.java
index b3dfefd8da..60be164621 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_322754_Test.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_322754_Test.java
@@ -13,7 +13,11 @@ package org.eclipse.emf.cdo.tests.bugzilla;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
+import org.eclipse.emf.cdo.tests.model1.OrderDetail;
+import org.eclipse.emf.cdo.tests.model1.Product1;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.util.CommitException;
+import org.eclipse.emf.cdo.util.DanglingReferenceException;
/**
* Bug 322754 - NullPointerException after deleting a resource
@@ -48,6 +52,36 @@ public class Bugzilla_322754_Test extends AbstractCDOTest
msg("Delete and commit the resource");
resource.delete(null);
transaction.commit();
- session.close();
+ }
+
+ public void testResourceDeleteWithDanglingReferences() throws Exception
+ {
+ Product1 product = getModel1Factory().createProduct1();
+ OrderDetail orderDetail = getModel1Factory().createOrderDetail();
+ orderDetail.setProduct(product);
+
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+
+ CDOResource resource1 = transaction.createResource("/r1");
+ resource1.getContents().add(product);
+
+ CDOResource resource2 = transaction.createResource("/r2");
+ resource2.getContents().add(orderDetail);
+
+ transaction.commit();
+
+ msg("Delete and commit the resource");
+ resource1.delete(null);
+
+ try
+ {
+ transaction.commit();
+ fail("CommitException expected");
+ }
+ catch (CommitException expected)
+ {
+ assertInstanceOf(DanglingReferenceException.class, expected.getCause());
+ }
}
}
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 8d4a001af2..f80bba6c21 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
@@ -106,6 +106,7 @@ import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.spi.cdo.CDOSessionProtocol;
@@ -1197,19 +1198,25 @@ public class CDOViewImpl extends Lifecycle implements InternalCDOView
else if (idOrObject instanceof InternalEObject)
{
InternalEObject eObject = (InternalEObject)idOrObject;
- String uri = EcoreUtil.getURI(eObject).toString();
if (eObject instanceof InternalCDOObject)
{
InternalCDOObject object = (InternalCDOObject)idOrObject;
if (object.cdoView() != null && FSMUtil.isNew(object))
{
+ String uri = EcoreUtil.getURI(eObject).toString();
return CDOIDUtil.createTempObjectExternal(uri);
}
}
- if (eObject.eResource() != null)
+ Resource eResource = eObject.eResource();
+ if (eResource != null)
{
- return CDOIDUtil.createExternal(uri);
+ // Check if eObject is contained by a deleted resource
+ if (!(eResource instanceof CDOResource) || ((CDOResource)eResource).cdoState() != CDOState.TRANSIENT)
+ {
+ String uri = EcoreUtil.getURI(eObject).toString();
+ return CDOIDUtil.createExternal(uri);
+ }
}
throw new DanglingReferenceException(eObject);

Back to the top