From b0a698bc30310fd540a01a1b9d76179890de5315 Mon Sep 17 00:00:00 2001 From: Christian W. Damus Date: Fri, 5 Apr 2013 08:30:57 -0400 Subject: [404318] DynamicCDOObjects throw NPEs when their Ecore models are unloaded https://bugs.eclipse.org/bugs/show_bug.cgi?id=404318 --- .../internal/common/model/CDOClassInfoImpl.java | 5 +- .../model/Bug404318.ecore | 9 ++ .../org.eclipse.emf.cdo.tests/model/Bug404318.xmi | 9 ++ .../cdo/tests/bugzilla/Bugzilla_404318_Test.java | 99 ++++++++++++++++++++++ 4 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 plugins/org.eclipse.emf.cdo.tests/model/Bug404318.ecore create mode 100644 plugins/org.eclipse.emf.cdo.tests/model/Bug404318.xmi create mode 100644 plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_404318_Test.java diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java index 9db71b24d1..13300a754b 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOClassInfoImpl.java @@ -8,6 +8,7 @@ * Contributors: * Eike Stepper - initial API and implementation * Christian W. Damus (CEA) - support partially persistent features + * Christian W. Damus (CEA) - bug 404318: NPEs in dynamic objects whose EClasses are unloaded */ package org.eclipse.emf.cdo.internal.common.model; @@ -112,7 +113,9 @@ public final class CDOClassInfoImpl implements InternalCDOClassInfo, Adapter.Int public void unsetTarget(Notifier oldTarget) { - eClass = null; + // pass. In particular, don't forget the EClass because it may still + // be required by dependents such as DynamicCDOObjectImpls that retain + // me as a descriptor of their class } public EClass getEClass() diff --git a/plugins/org.eclipse.emf.cdo.tests/model/Bug404318.ecore b/plugins/org.eclipse.emf.cdo.tests/model/Bug404318.ecore new file mode 100644 index 0000000000..b24fac7171 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/model/Bug404318.ecore @@ -0,0 +1,9 @@ + + + + + + + diff --git a/plugins/org.eclipse.emf.cdo.tests/model/Bug404318.xmi b/plugins/org.eclipse.emf.cdo.tests/model/Bug404318.xmi new file mode 100644 index 0000000000..5699ee3684 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/model/Bug404318.xmi @@ -0,0 +1,9 @@ + + + + + diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_404318_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_404318_Test.java new file mode 100644 index 0000000000..9225f7bb6a --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_404318_Test.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2004 - 2013 Eike Stepper (Berlin, Germany) and others. + * 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: + * Christian W. Damus (CEA) - initial API and implementation + */ +package org.eclipse.emf.cdo.tests.bugzilla; + +import org.eclipse.emf.cdo.server.IRepository; +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.tests.AbstractCDOTest; +import org.eclipse.emf.cdo.transaction.CDOTransaction; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; + +import java.net.URL; +import java.util.Map; + +/** + * Bug 404318: Tests that we don't get certain NPEs when processing dynamic objects whose + * EClasses have been unloaded. + * + * @author Christian W. Damus (CEA) + */ +public class Bugzilla_404318_Test extends AbstractCDOTest +{ + public void testUnloadedEClass() throws Exception + { + CDOSession session = openSession(); + + CDOTransaction transaction = session.openTransaction(); + + // get our dynamic package + EPackage epackage = getTestPackage(transaction.getResourceSet()); + + // and the instance model + Resource resource = getTestInstance(transaction.getResourceSet()); + + session.getPackageRegistry().putEPackage(epackage); + + EObject anA = resource.getContents().get(0); + EObject aB = resource.getContents().get(1); + + // sanity check + assertSame(anA, aB.eGet(aB.eClass().getEStructuralFeature("a"))); + + try + { + // unload the models. This would NPE without the fix + epackage.eResource().unload(); + resource.unload(); + + // unloaded EClass still supports the unloaded instance + assertSame(anA, aB.eGet(aB.eClass().getEStructuralFeature("a"))); + } + catch (Exception e) + { + e.printStackTrace(); + fail("Threw exception: " + e.getLocalizedMessage()); + } + } + + // + // test framework + + @Override + public Map getRepositoryProperties() + { + Map result = super.getRepositoryProperties(); + result.put(IRepository.Props.SUPPORTING_ECORE, Boolean.toString(true)); + return result; + } + + protected EPackage getTestPackage(ResourceSet rset) throws Exception + { + rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new EcoreResourceFactoryImpl()); + URL location = getClass().getClassLoader().getResource("Bug404318.ecore"); + Resource result = rset.getResource(URI.createURI(location.toExternalForm(), true), true); + return (EPackage)result.getContents().get(0); + } + + protected Resource getTestInstance(ResourceSet rset) throws Exception + { + rset.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl()); + URL location = getClass().getClassLoader().getResource("Bug404318.xmi"); + Resource result = rset.getResource(URI.createURI(location.toExternalForm(), true), true); + return result; + } +} -- cgit v1.2.3