| /* |
| * Copyright (c) 2012, 2014 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.common.revision.CDORevision; |
| import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; |
| import org.eclipse.emf.cdo.eresource.CDOResource; |
| import org.eclipse.emf.cdo.session.CDOSession; |
| import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; |
| import org.eclipse.emf.cdo.tests.AbstractCDOTest; |
| import org.eclipse.emf.cdo.tests.model1.Category; |
| import org.eclipse.emf.cdo.tests.model1.OrderDetail; |
| import org.eclipse.emf.cdo.tests.model1.Product1; |
| 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.common.util.EList; |
| import org.eclipse.emf.spi.cdo.InternalCDOObject; |
| import org.eclipse.emf.spi.cdo.InternalCDOTransaction; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Map; |
| |
| /** |
| * Bug 350987: Revision compare does not consider EObject values in references |
| * |
| * @author Egidijus Vaisnora |
| */ |
| public class Bugzilla_350987_Test extends AbstractCDOTest |
| { |
| public void testRestoringReferences() throws CommitException |
| { |
| { |
| CDOSession session = openSession(); |
| CDOTransaction transaction = session.openTransaction(); |
| CDOResource resource = transaction.createResource(getResourcePath("test")); |
| |
| Category category = getModel1Factory().createCategory(); |
| resource.getContents().add(category); |
| |
| Product1 product = getModel1Factory().createProduct1(); |
| product.setName("test1"); |
| category.getProducts().add(product); |
| |
| OrderDetail orderDetail = getModel1Factory().createOrderDetail(); |
| orderDetail.setProduct(product); |
| resource.getContents().add(orderDetail); |
| |
| transaction.commit(); |
| session.close(); |
| } |
| |
| CDOSession session = openSession(); |
| CDOTransaction transaction = session.openTransaction(); |
| CDOResource resource = transaction.getResource(getResourcePath("test")); |
| |
| Category category = (Category)resource.getContents().get(0); |
| OrderDetail orderDetail = (OrderDetail)resource.getContents().get(1); |
| |
| EList<Product1> products = category.getProducts(); |
| List<Product1> productList = new ArrayList<Product1>(products); |
| products.clear(); // Detach |
| products.addAll(productList); // Reattach |
| |
| CDOObject cdoOrderDetail = CDOUtil.getCDOObject(orderDetail); |
| CDORevision revision = cdoOrderDetail.cdoRevision(); |
| |
| Map<InternalCDOObject, InternalCDORevision> cleanRevisions = ((InternalCDOTransaction)transaction) |
| .getCleanRevisions(); |
| InternalCDORevision originRevision = cleanRevisions.get(cdoOrderDetail); |
| |
| if (originRevision != null) |
| { |
| CDORevisionDelta delta = revision.compare(originRevision); |
| |
| // Comparing with clean revision should not give changes |
| assertEquals(0, delta.size()); |
| assertEquals(true, delta.isEmpty()); |
| } |
| |
| Product1 product = products.get(0); |
| resource.getContents().remove(1); |
| resource.getContents().add(orderDetail); |
| |
| CDOObject cdoProduct = CDOUtil.getCDOObject(product); |
| revision = cdoProduct.cdoRevision(); |
| int previousSize = product.getOrderDetails().size(); |
| product.getOrderDetails().add(orderDetail); |
| |
| // Element shouldn't be added |
| assertEquals(previousSize, product.getOrderDetails().size()); |
| originRevision = cleanRevisions.get(cdoProduct); |
| CDORevisionDelta delta2 = revision.compare(originRevision); |
| |
| // Comparing with clean revision should not give changes |
| assertEquals(true, delta2.isEmpty()); |
| } |
| } |