/* * Copyright (c) 2007-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: * Eike Stepper - initial API and implementation * Christian W. Damus (CEA) - test case for cross-reference to container */ package org.eclipse.emf.cdo.tests; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.revision.CDORevisionData; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.tests.model1.Company; import org.eclipse.emf.cdo.tests.model1.Customer; import org.eclipse.emf.cdo.tests.model1.SalesOrder; import org.eclipse.emf.cdo.tests.model5.Child; import org.eclipse.emf.cdo.tests.model5.Parent; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.cdo.util.CommitException; import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.impl.ResourceImpl; /** * @author Eike Stepper */ public class CrossReferenceTest extends AbstractCDOTest { public void testLoadViaContainment() throws Exception { msg("Opening session"); CDOSession session = openSession(); // ************************************************************* // msg("Creating customer"); Customer customerA = getModel1Factory().createCustomer(); customerA.setName("customer"); msg("Creating salesOrder1"); SalesOrder salesOrder1A = getModel1Factory().createSalesOrder(); salesOrder1A.setId(1); salesOrder1A.setCustomer(customerA); msg("Creating salesOrder2"); SalesOrder salesOrder2A = getModel1Factory().createSalesOrder(); salesOrder2A.setId(2); salesOrder2A.setCustomer(customerA); msg("Creating company"); Company companyA = getModel1Factory().createCompany(); companyA.getCustomers().add(customerA); companyA.getSalesOrders().add(salesOrder1A); companyA.getSalesOrders().add(salesOrder2A); msg("Attaching transaction"); CDOTransaction transaction = session.openTransaction(); msg("Creating resource"); CDOResource resourceA = transaction.createResource(getResourcePath("/test1")); msg("Adding company"); resourceA.getContents().add(companyA); msg("Committing"); transaction.commit(); assertEquals(2, customerA.getSalesOrders().size()); // ************************************************************* // msg("Attaching viewB"); CDOView viewB = session.openTransaction(); msg("Loading resource"); CDOResource resourceB = viewB.getResource(getResourcePath("/test1")); assertProxy(resourceB); EList<EObject> contents = resourceB.getContents(); Company companyB = (Company)contents.get(0); assertClean(companyB, viewB); assertClean(resourceB, viewB); assertContent(resourceB, companyB); Customer customerB = companyB.getCustomers().get(0); assertClean(customerB, viewB); assertClean(companyB, viewB); assertContent(companyB, customerB); SalesOrder salesOrder1B = companyB.getSalesOrders().get(0); assertClean(salesOrder1B, viewB); assertClean(companyB, viewB); assertContent(companyB, salesOrder1B); SalesOrder salesOrder2B = companyB.getSalesOrders().get(1); assertClean(salesOrder2B, viewB); assertClean(companyB, viewB); assertContent(companyB, salesOrder2B); assertClean(salesOrder2B, viewB); assertEquals(2, customerB.getSalesOrders().size()); } public void testLoadViaXRef() throws Exception { msg("Opening session"); CDOSession session = openSession(); // ************************************************************* // msg("Creating customer"); Customer customerA = getModel1Factory().createCustomer(); customerA.setName("customer"); msg("Creating salesOrder1"); SalesOrder salesOrder1A = getModel1Factory().createSalesOrder(); salesOrder1A.setId(1); salesOrder1A.setCustomer(customerA); msg("Creating salesOrder2"); SalesOrder salesOrder2A = getModel1Factory().createSalesOrder(); salesOrder2A.setId(2); salesOrder2A.setCustomer(customerA); msg("Creating company"); Company companyA = getModel1Factory().createCompany(); companyA.getCustomers().add(customerA); companyA.getSalesOrders().add(salesOrder1A); companyA.getSalesOrders().add(salesOrder2A); msg("Attaching transaction"); CDOTransaction transaction = session.openTransaction(); msg("Creating resource"); CDOResource resourceA = transaction.createResource(getResourcePath("/test1")); msg("Adding company"); resourceA.getContents().add(companyA); msg("Committing"); transaction.commit(); assertEquals(2, customerA.getSalesOrders().size()); // ************************************************************* // msg("Attaching viewB"); CDOView viewB = session.openTransaction(); msg("Loading resource"); CDOResource resourceB = viewB.getResource(getResourcePath("/test1")); assertProxy(resourceB); EList<EObject> contents = resourceB.getContents(); Company companyB = (Company)contents.get(0); assertClean(companyB, viewB); assertClean(resourceB, viewB); assertContent(resourceB, companyB); Customer customerB = companyB.getCustomers().get(0); assertClean(customerB, viewB); assertClean(companyB, viewB); assertContent(companyB, customerB); SalesOrder salesOrder1B = customerB.getSalesOrders().get(0); assertClean(salesOrder1B, viewB); assertClean(companyB, viewB); assertContent(companyB, salesOrder1B); SalesOrder salesOrder2B = customerB.getSalesOrders().get(1); assertClean(salesOrder2B, viewB); assertClean(companyB, viewB); assertContent(companyB, salesOrder2B); assertClean(salesOrder2B, viewB); } public void testTwoResources() throws Exception { msg("Opening session"); CDOSession session = openSession(); msg("Attaching transaction"); CDOTransaction transaction = session.openTransaction(); // ************************************************************* // msg("Creating customer"); Customer customerA = getModel1Factory().createCustomer(); customerA.setName("customer"); msg("Creating company1"); Company company1A = getModel1Factory().createCompany(); company1A.getCustomers().add(customerA); msg("Creating resource1"); CDOResource resource1A = transaction.createResource(getResourcePath("/test1")); msg("Adding company1"); resource1A.getContents().add(company1A); // ************************************************************* // msg("Creating salesOrder1"); SalesOrder salesOrder1A = getModel1Factory().createSalesOrder(); assertTransient(salesOrder1A); salesOrder1A.setId(1); salesOrder1A.setCustomer(customerA); assertTransient(salesOrder1A); msg("Creating salesOrder2"); SalesOrder salesOrder2A = getModel1Factory().createSalesOrder(); assertTransient(salesOrder2A); salesOrder2A.setId(2); salesOrder2A.setCustomer(customerA); assertTransient(salesOrder2A); msg("Creating company2"); Company company2A = getModel1Factory().createCompany(); company2A.getSalesOrders().add(salesOrder1A); company2A.getSalesOrders().add(salesOrder2A); msg("Creating resource2"); CDOResource resource2A = transaction.createResource(getResourcePath("/test2")); msg("Adding company"); resource2A.getContents().add(company2A); // ************************************************************* // msg("Committing"); transaction.commit(); assertEquals(2, customerA.getSalesOrders().size()); // ************************************************************* // msg("Attaching viewB"); CDOView viewB = session.openTransaction(); msg("Loading resource1"); CDOResource resource1B = viewB.getResource(getResourcePath("/test1")); assertProxy(resource1B); EList<EObject> contents = resource1B.getContents(); Company company1B = (Company)contents.get(0); assertClean(company1B, viewB); assertClean(resource1B, viewB); assertContent(resource1B, company1B); Customer customerB = company1B.getCustomers().get(0); assertClean(customerB, viewB); assertClean(company1B, viewB); assertContent(company1B, customerB); SalesOrder salesOrder1B = customerB.getSalesOrders().get(0); assertClean(salesOrder1B, viewB); SalesOrder salesOrder2B = customerB.getSalesOrders().get(1); assertClean(salesOrder2B, viewB); } public void testDetachXRef() throws Exception { Customer customer = getModel1Factory().createCustomer(); customer.setName("customer"); SalesOrder salesOrder = getModel1Factory().createSalesOrder(); salesOrder.setId(4711); salesOrder.setCustomer(customer); Company company = getModel1Factory().createCompany(); company.getCustomers().add(customer); company.getSalesOrders().add(salesOrder); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/my/company/resource")); resource.getContents().add(company); transaction.commit(); company.getCustomers().remove(customer); try { transaction.commit(); fail("CommitException expected"); } catch (CommitException expected) { } } public void testDetachXRefReattach() throws Exception { Customer customer = getModel1Factory().createCustomer(); customer.setName("customer"); SalesOrder salesOrder = getModel1Factory().createSalesOrder(); salesOrder.setId(4711); salesOrder.setCustomer(customer); Company company = getModel1Factory().createCompany(); company.getCustomers().add(customer); company.getSalesOrders().add(salesOrder); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/my/company/resource")); resource.getContents().add(company); transaction.commit(); company.getCustomers().remove(customer); company.getCustomers().add(customer); assertEquals(1, company.getCustomers().size()); transaction.commit(); } @Skips("Hibernate") public void testDetachXRefExternal() throws Exception { skipStoreWithoutExternalReferences(); Customer customer = getModel1Factory().createCustomer(); customer.setName("customer"); SalesOrder salesOrder = getModel1Factory().createSalesOrder(); salesOrder.setId(4711); salesOrder.setCustomer(customer); Company company = getModel1Factory().createCompany(); company.getCustomers().add(customer); company.getSalesOrders().add(salesOrder); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/my/company/resource")); resource.getContents().add(company); transaction.commit(); Resource externalResource = new ResourceImpl(URI.createFileURI("/x/y/z")); transaction.getResourceSet().getResources().add(externalResource); externalResource.getContents().add(customer); transaction.commit(); CDORevisionData data = CDOUtil.getCDOObject(salesOrder).cdoRevision().data(); CDOID id = (CDOID)data.get(getModel1Package().getSalesOrder_Customer(), 0); assertEquals(true, id.isExternal()); } public void _testDetachXRefExternalReattach() throws Exception { Customer customer = getModel1Factory().createCustomer(); customer.setName("customer"); SalesOrder salesOrder = getModel1Factory().createSalesOrder(); salesOrder.setId(4711); salesOrder.setCustomer(customer); Company company = getModel1Factory().createCompany(); company.getCustomers().add(customer); company.getSalesOrders().add(salesOrder); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/my/company/resource")); resource.getContents().add(company); transaction.commit(); Resource externalResource = new ResourceImpl(URI.createFileURI("/x/y/z")); transaction.getResourceSet().getResources().add(externalResource); externalResource.getContents().add(customer); transaction.commit(); CDORevisionData data = CDOUtil.getCDOObject(salesOrder).cdoRevision().data(); CDOID id = (CDOID)data.get(getModel1Package().getSalesOrder_Customer(), 0); assertEquals(true, id.isExternal()); company.getCustomers().add(customer); transaction.commit(); data = CDOUtil.getCDOObject(salesOrder).cdoRevision().data(); id = (CDOID)data.get(getModel1Package().getSalesOrder_Customer(), 0); assertEquals(false, id.isExternal()); } @Skips("Hibernate") public void testNewMakeExternal() throws Exception { skipStoreWithoutExternalReferences(); Customer customer = getModel1Factory().createCustomer(); customer.setName("customer"); SalesOrder salesOrder = getModel1Factory().createSalesOrder(); salesOrder.setId(4711); salesOrder.setCustomer(customer); Company company = getModel1Factory().createCompany(); company.getCustomers().add(customer); company.getSalesOrders().add(salesOrder); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/my/company/resource")); resource.getContents().add(company); // DO NOT: transaction.commit(); Resource externalResource = new ResourceImpl(URI.createFileURI("/x/y/z")); transaction.getResourceSet().getResources().add(externalResource); externalResource.getContents().add(customer); transaction.commit(); CDORevisionData data = CDOUtil.getCDOObject(salesOrder).cdoRevision().data(); CDOID id = (CDOID)data.get(getModel1Package().getSalesOrder_Customer(), 0); assertEquals(true, id.isExternal()); } public void testExternalMakeNew() throws Exception { Customer customer = getModel1Factory().createCustomer(); customer.setName("customer"); SalesOrder salesOrder = getModel1Factory().createSalesOrder(); salesOrder.setId(4711); salesOrder.setCustomer(customer); Company company = getModel1Factory().createCompany(); // DO NOT: company.getCustomers().add(customer); company.getSalesOrders().add(salesOrder); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/my/company/resource")); resource.getContents().add(company); // DO NOT: transaction.commit(); Resource externalResource = new ResourceImpl(URI.createFileURI("/x/y/z")); transaction.getResourceSet().getResources().add(externalResource); externalResource.getContents().add(customer); company.getCustomers().add(customer); transaction.commit(); CDORevisionData data = CDOUtil.getCDOObject(salesOrder).cdoRevision().data(); CDOID id = (CDOID)data.get(getModel1Package().getSalesOrder_Customer(), 0); assertEquals(true, id.isExternal()); } @Skips("Hibernate") public void testExternalMakeDangling() throws Exception { skipStoreWithoutExternalReferences(); Customer customer = getModel1Factory().createCustomer(); customer.setName("customer"); SalesOrder salesOrder = getModel1Factory().createSalesOrder(); salesOrder.setId(4711); salesOrder.setCustomer(customer); Company company = getModel1Factory().createCompany(); // DO NOT: company.getCustomers().add(customer); company.getSalesOrders().add(salesOrder); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/my/company/resource")); resource.getContents().add(company); // DO NOT: transaction.commit(); Resource externalResource = new ResourceImpl(URI.createFileURI("/x/y/z")); transaction.getResourceSet().getResources().add(externalResource); externalResource.getContents().add(customer); transaction.commit(); CDORevisionData data = CDOUtil.getCDOObject(salesOrder).cdoRevision().data(); CDOID id = (CDOID)data.get(getModel1Package().getSalesOrder_Customer(), 0); assertEquals(true, id.isExternal()); externalResource.getContents().remove(customer); transaction.commit(); // Should be dangling reference now, but we can not detect ;-( } /** * Bug 369253: bidirectional cross-reference between containing and contained object that * is not a containment reference. */ public void testCrossCreferenceBetweenContainerAndContained() throws Exception { Parent parent = getModel5Factory().createParent(); Child blackSheep = getModel5Factory().createChild(); Child whiteSheep = getModel5Factory().createChild(); // children *is* a containment reference parent.getChildren().add(blackSheep); parent.getChildren().add(whiteSheep); // favourite *is not* a containment reference parent.setFavourite(whiteSheep); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath("/my/resource")); resource.getContents().add(parent); transaction.commit(); session.close(); session = openSession(); transaction = session.openTransaction(); resource = transaction.getResource(getResourcePath("/my/resource")); EList<EObject> contents = resource.getContents(); assertEquals(1, contents.size()); Parent newParent = (Parent)contents.get(0); assertEquals(2, newParent.getChildren().size()); assertSame(newParent.getChildren().get(1), newParent.getFavourite()); assertSame(newParent, newParent.getChildren().get(1).getPreferredBy()); } }