Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2018-01-06 11:12:41 -0500
committerEike Stepper2018-01-06 11:12:41 -0500
commit1ec6ab4762a0c39feca3b37ec3a7f76faf545d65 (patch)
tree1bee586fdb752026a7fbd50022511d4ce5194607 /plugins/org.eclipse.emf.cdo.tests/src
parent14d63d828cbf9cc5b72745cc71e12d988caad2fd (diff)
downloadcdo-1ec6ab4762a0c39feca3b37ec3a7f76faf545d65.tar.gz
cdo-1ec6ab4762a0c39feca3b37ec3a7f76faf545d65.tar.xz
cdo-1ec6ab4762a0c39feca3b37ec3a7f76faf545d65.zip
[528129] Transient objects are attached to CDOTransaction
https://bugs.eclipse.org/bugs/show_bug.cgi?id=528129
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.tests/src')
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CrossReferenceTest.java1
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_528129_Test.java208
2 files changed, 208 insertions, 1 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CrossReferenceTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CrossReferenceTest.java
index ebab329708..9bed83030a 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CrossReferenceTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CrossReferenceTest.java
@@ -330,7 +330,6 @@ public class CrossReferenceTest extends AbstractCDOTest
@Requires(IRepositoryConfig.CAPABILITY_EXTERNAL_REFS)
public void testDetachXRefExternal() throws Exception
{
-
Customer customer = getModel1Factory().createCustomer();
customer.setName("customer");
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_528129_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_528129_Test.java
new file mode 100644
index 0000000000..53338aa508
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_528129_Test.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 2018 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:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.bugzilla;
+
+import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.CDOState;
+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.config.IModelConfig;
+import org.eclipse.emf.cdo.tests.model3.ClassWithTransientContainment;
+import org.eclipse.emf.cdo.tests.model3.Model3Factory;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.util.CDOUtil;
+import org.eclipse.emf.cdo.view.CDOObjectHandler;
+import org.eclipse.emf.cdo.view.CDOView;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * Bug 528129: Transient objects are attached to CDOTransaction.
+ *
+ * @author Eike Stepper
+ */
+public class Bugzilla_528129_Test extends AbstractCDOTest
+{
+ @Skips(IModelConfig.CAPABILITY_LEGACY)
+ public void testTransientContainment() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource(getResourcePath("res"));
+
+ ClassWithTransientContainment root = createObject("root");
+ new StateChangeDetector(transaction, root);
+ resource.getContents().add(root);
+ assertNew(root, transaction);
+
+ ClassWithTransientContainment child = createObject("child");
+ root.getTransientChildren().add(child);
+ assertTransient(child);
+ }
+
+ public void testTransientContainmentTree() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource(getResourcePath("res"));
+
+ ClassWithTransientContainment root = createObject("root");
+ resource.getContents().add(root);
+ assertNew(root, transaction);
+
+ ClassWithTransientContainment child = createObject("child");
+ child.getTransientChildren().add(createObject("subchild1"));
+ child.getTransientChildren().add(createObject("subchild2"));
+ child.getTransientChildren().add(createObject("subchild3"));
+ root.getTransientChildren().add(child);
+
+ for (ClassWithTransientContainment c : child.getTransientChildren())
+ {
+ assertTransient(c);
+ }
+ }
+
+ public void testPersistentContainment() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource(getResourcePath("res"));
+
+ ClassWithTransientContainment root = Model3Factory.eINSTANCE.createClassWithTransientContainment();
+ resource.getContents().add(root);
+ assertNew(root, transaction);
+
+ ClassWithTransientContainment child = createObject("child");
+ root.getPersistentChildren().add(child);
+ assertNew(child, transaction);
+ }
+
+ public void testPersistentContainmentTree() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource(getResourcePath("res"));
+
+ ClassWithTransientContainment root = createObject("root");
+ resource.getContents().add(root);
+ assertNew(root, transaction);
+
+ ClassWithTransientContainment child = createObject("child");
+ child.getPersistentChildren().add(createObject("subchild1"));
+ child.getPersistentChildren().add(createObject("subchild2"));
+ child.getPersistentChildren().add(createObject("subchild3"));
+ root.getPersistentChildren().add(child);
+
+ for (ClassWithTransientContainment c : child.getTransientChildren())
+ {
+ assertNew(c, transaction);
+ }
+ }
+
+ @Skips(IModelConfig.CAPABILITY_LEGACY)
+ public void testMoveToTransientContainment() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource(getResourcePath("res"));
+
+ ClassWithTransientContainment root = createObject("root");
+ resource.getContents().add(root);
+ assertNew(root, transaction);
+
+ ClassWithTransientContainment child = createObject("child");
+ root.getPersistentChildren().add(child);
+ assertNew(child, transaction);
+
+ root.getTransientChildren().add(child);
+ assertTransient(child);
+ }
+
+ @Skips(IModelConfig.CAPABILITY_LEGACY)
+ public void testMoveToPersistentContainment() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource(getResourcePath("res"));
+
+ ClassWithTransientContainment root = createObject("root");
+ resource.getContents().add(root);
+ assertNew(root, transaction);
+
+ ClassWithTransientContainment child = createObject("child");
+ root.getTransientChildren().add(child);
+ assertTransient(child);
+
+ root.getPersistentChildren().add(child);
+ assertNew(child, transaction);
+ }
+
+ public void testMoveWithinView() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource(getResourcePath("res"));
+
+ ClassWithTransientContainment root1 = createObject("root1");
+ resource.getContents().add(root1);
+ assertNew(root1, transaction);
+
+ ClassWithTransientContainment root2 = createObject("root2");
+ resource.getContents().add(root2);
+ assertNew(root2, transaction);
+
+ ClassWithTransientContainment child = createObject("child");
+ root1.getPersistentChildren().add(child);
+ assertNew(child, transaction);
+
+ StateChangeDetector detector = new StateChangeDetector(transaction, child);
+ root2.getPersistentChildren().add(child);
+ assertNew(child, transaction);
+ assertFalse(detector.isStateChanged());
+ }
+
+ private ClassWithTransientContainment createObject(String name)
+ {
+ ClassWithTransientContainment object = getModel3Factory().createClassWithTransientContainment();
+ object.setName(name);
+ return object;
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static final class StateChangeDetector implements CDOObjectHandler
+ {
+ private final CDOObject object;
+
+ private boolean stateChanged;
+
+ public StateChangeDetector(CDOView view, EObject object)
+ {
+ this.object = CDOUtil.getCDOObject(object);
+ view.addObjectHandler(this);
+ }
+
+ public boolean isStateChanged()
+ {
+ return stateChanged;
+ }
+
+ public void objectStateChanged(CDOView view, CDOObject object, CDOState oldState, CDOState newState)
+ {
+ if (object == this.object)
+ {
+ stateChanged = true;
+ }
+ }
+ }
+}

Back to the top