diff options
author | Eike Stepper | 2013-08-31 09:21:40 +0000 |
---|---|---|
committer | Eike Stepper | 2013-08-31 09:21:40 +0000 |
commit | 43aef21f14b9e4f8f3893e5a4086a386ea0b8037 (patch) | |
tree | d7686a4b49ade42f031b23ff09dcc080c9dd89ba | |
parent | 6d83c197be646b2a96c7dd68f51748eeea6e9843 (diff) | |
download | cdo-43aef21f14b9e4f8f3893e5a4086a386ea0b8037.tar.gz cdo-43aef21f14b9e4f8f3893e5a4086a386ea0b8037.tar.xz cdo-43aef21f14b9e4f8f3893e5a4086a386ea0b8037.zip |
[416285] OCLExtendCreator fails for abstract subtypes
https://bugs.eclipse.org/bugs/show_bug.cgi?id=416285
6 files changed, 73 insertions, 22 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java index c219ce9272..1363eb3054 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java @@ -67,6 +67,8 @@ import java.util.Set; */ public final class CDOModelUtil implements CDOModelConstants { + private static final EClass ROOT_TYPE = EcorePackage.eINSTANCE.getEObject(); + private static CDOType[] coreTypes; static @@ -705,24 +707,31 @@ public final class CDOModelUtil implements CDOModelConstants if (classifier instanceof EClass) { EClass eClass = (EClass)classifier; + getSubType(eClass, ROOT_TYPE, result); + for (EClass eSuperType : eClass.getEAllSuperTypes()) { - if (eSuperType.eIsProxy()) - { - OM.LOG.warn("getSubTypes encountered a proxy EClass which will be ignored: " + eSuperType); - continue; - } - - List<EClass> list = result.get(eSuperType); - if (list == null) - { - list = new ArrayList<EClass>(); - result.put(eSuperType, list); - } - - list.add(eClass); + getSubType(eClass, eSuperType, result); } } } } + + private static void getSubType(EClass eClass, EClass eSuperType, Map<EClass, List<EClass>> result) + { + if (eSuperType.eIsProxy()) + { + OM.LOG.warn("getSubTypes encountered a proxy EClass which will be ignored: " + eSuperType); + return; + } + + List<EClass> list = result.get(eSuperType); + if (list == null) + { + list = new ArrayList<EClass>(); + result.put(eSuperType, list); + } + + list.add(eClass); + } } diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/AbstractMappingStrategy.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/AbstractMappingStrategy.java index d577b65794..e5ceb6a82f 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/AbstractMappingStrategy.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/AbstractMappingStrategy.java @@ -20,6 +20,7 @@ import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDUtil; +import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.model.EMFUtil; @@ -204,6 +205,17 @@ public abstract class AbstractMappingStrategy extends Lifecycle implements IMapp } else { + EPackage ePackage = eClass.getEPackage(); + if (CDOModelUtil.isCorePackage(ePackage) && !systemPackageMappingInfo.ecoreMapped) + { + return; + } + + if (CDOModelUtil.isTypesPackage(ePackage) && !systemPackageMappingInfo.etypesMapped) + { + return; + } + IClassMapping classMapping = getClassMapping(eClass); classMapping.handleRevisions(accessor, branch, timeStamp, exactTime, handler); } diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF index be2b78349a..d0708b73e9 100644 --- a/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.emf.cdo.server.ocl;singleton:=true Bundle-Name: %pluginName -Bundle-Version: 4.1.0.qualifier +Bundle-Version: 4.2.0.qualifier Bundle-ClassPath: . Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -10,4 +10,4 @@ Bundle-RequiredExecutionEnvironment: J2SE-1.5 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)", org.eclipse.ocl.ecore;bundle-version="[3.0.0,4.0.0)", org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)" -Export-Package: org.eclipse.emf.cdo.server.ocl;version="4.1.0" +Export-Package: org.eclipse.emf.cdo.server.ocl;version="4.2.0" diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java index 1969ba3042..292e0783e0 100644 --- a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java +++ b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java @@ -144,10 +144,7 @@ public class CDOExtentCreator implements OCLExtentCreator protected void createExtent(EClass eClass, IStoreAccessor accessor, CDOBranch branch, long timeStamp, final AtomicBoolean canceled, CDORevisionHandler revisionHandler) { - if (!eClass.isAbstract() && !eClass.isInterface()) - { - accessor.handleRevisions(eClass, branch, timeStamp, false, revisionHandler); - } + handleRevisions(eClass, accessor, branch, timeStamp, revisionHandler); CDOPackageRegistry packageRegistry = accessor.getStore().getRepository().getPackageRegistry(); List<EClass> subTypes = packageRegistry.getSubTypes().get(eClass); @@ -160,11 +157,23 @@ public class CDOExtentCreator implements OCLExtentCreator break; } - accessor.handleRevisions(subType, branch, timeStamp, false, revisionHandler); + handleRevisions(subType, accessor, branch, timeStamp, revisionHandler); } } } + /** + * @since 4.2 + */ + protected void handleRevisions(EClass eClass, IStoreAccessor accessor, CDOBranch branch, long timeStamp, + CDORevisionHandler revisionHandler) + { + if (!eClass.isAbstract() && !eClass.isInterface()) + { + accessor.handleRevisions(eClass, branch, timeStamp, false, revisionHandler); + } + } + protected boolean isDetached(CDOID id) { if (changeSetData == null) diff --git a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java index 1f95f6603a..8b13b075f2 100644 --- a/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java +++ b/plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java @@ -157,8 +157,9 @@ public class OCLQueryHandler implements IQueryHandler helper.setContext(classifier); + Environment<?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject> environment = ocl.getEnvironment(); Map<String, Object> parameters = new HashMap<String, Object>(queryParameters); - initEnvironment(ocl.getEnvironment(), packageRegistry, parameters); + initEnvironment(environment, packageRegistry, parameters); OCLExpression<EClassifier> expr = helper.createQuery(queryString); Query<EClassifier, EClass, EObject> query = ocl.createQuery(expr); @@ -182,6 +183,12 @@ public class OCLQueryHandler implements IQueryHandler } Object result = evaluate(query, object); + if (result == environment.getOCLStandardLibrary().getInvalid()) + { + throw new Exception( + "OCL query evaluated to 'invalid'. Run with '-Dorg.eclipse.ocl.debug=true' and visit the log for failure details."); + } + if (result instanceof Collection<?>) { for (Object element : (Collection<?>)result) diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OCLQueryTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OCLQueryTest.java index 2a769b34cd..561d7d10cf 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OCLQueryTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OCLQueryTest.java @@ -28,6 +28,7 @@ import org.eclipse.net4j.util.collection.CloseableIterator; import org.eclipse.net4j.util.io.IOUtil; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EcorePackage; import java.util.ArrayList; import java.util.List; @@ -60,6 +61,8 @@ public class OCLQueryTest extends AbstractCDOTest private List<SalesOrder> salesOrders = new ArrayList<SalesOrder>(); + private int objectCount; + @Override protected void doSetUp() throws Exception { @@ -83,6 +86,13 @@ public class OCLQueryTest extends AbstractCDOTest super.doTearDown(); } + public void testAllEObjects() throws Exception + { + CDOQuery query = createQuery("EObject.allInstances()", EcorePackage.eINSTANCE.getEObject()); + List<EObject> eObjects = query.getResult(); + assertEquals(objectCount, eObjects.size()); + } + public void testAllProducts() throws Exception { CDOQuery query = createQuery("Product1.allInstances()", getModel1Package().getProduct1()); @@ -286,9 +296,13 @@ public class OCLQueryTest extends AbstractCDOTest private CDOResource createTestSet(CDOTransaction transaction) throws CommitException { disableConsole(); + CDOResource resource = transaction.createResource(getResourcePath("/test1")); fillResource(resource); + + objectCount = 1 + transaction.getNewObjects().size(); // Root resource + new objects transaction.commit(); + enableConsole(); return resource; } |