Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2013-08-31 09:21:40 +0000
committerEike Stepper2013-08-31 09:21:40 +0000
commit43aef21f14b9e4f8f3893e5a4086a386ea0b8037 (patch)
treed7686a4b49ade42f031b23ff09dcc080c9dd89ba
parent6d83c197be646b2a96c7dd68f51748eeea6e9843 (diff)
downloadcdo-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
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java37
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/AbstractMappingStrategy.java12
-rw-r--r--plugins/org.eclipse.emf.cdo.server.ocl/META-INF/MANIFEST.MF4
-rw-r--r--plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/CDOExtentCreator.java19
-rw-r--r--plugins/org.eclipse.emf.cdo.server.ocl/src/org/eclipse/emf/cdo/server/ocl/OCLQueryHandler.java9
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OCLQueryTest.java14
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;
}

Back to the top