diff options
author | Eike Stepper | 2010-10-30 08:35:44 +0000 |
---|---|---|
committer | Eike Stepper | 2010-10-30 08:35:44 +0000 |
commit | 5b561dec0973ac652198ce154c48db5e7e197239 (patch) | |
tree | 7a6a17ca0c17d51c5f860c6664fb359377e2a1e1 | |
parent | 00b546825d6fd2073c3efc948127625803b64a7f (diff) | |
download | cdo-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
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); |