| /* |
| * Copyright (c) 2010-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: |
| * Pascal Lehmann - initial API and implementation |
| * Eike Stepper - maintenance |
| */ |
| package org.eclipse.emf.cdo.tests.bugzilla; |
| |
| import org.eclipse.emf.cdo.common.branch.CDOBranch; |
| import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; |
| import org.eclipse.emf.cdo.eresource.CDOResource; |
| import org.eclipse.emf.cdo.server.IRepository; |
| import org.eclipse.emf.cdo.session.CDOSession; |
| import org.eclipse.emf.cdo.tests.AbstractCDOTest; |
| import org.eclipse.emf.cdo.tests.config.IRepositoryConfig; |
| import org.eclipse.emf.cdo.tests.config.impl.RepositoryConfig; |
| import org.eclipse.emf.cdo.tests.model4.GenRefMultiContained; |
| import org.eclipse.emf.cdo.transaction.CDOMerger; |
| import org.eclipse.emf.cdo.transaction.CDOTransaction; |
| import org.eclipse.emf.cdo.view.CDOAdapterPolicy; |
| |
| import org.eclipse.emf.spi.cdo.DefaultCDOMerger; |
| |
| import java.util.Map; |
| |
| /** |
| * IllegalStateException when committing a reattached containment of a detached container after branch merge with XRef |
| * enabled. |
| * <p> |
| * See bug 325866 |
| * |
| * @author Pascal Lehmann |
| */ |
| public class Bugzilla_325866_Test extends AbstractCDOTest |
| { |
| @Override |
| public synchronized Map<String, Object> getTestProperties() |
| { |
| Map<String, Object> map = super.getTestProperties(); |
| map.put(IRepository.Props.ENSURE_REFERENTIAL_INTEGRITY, "true"); |
| return map; |
| } |
| |
| @Requires(IRepositoryConfig.CAPABILITY_BRANCHING) |
| public void testXRefReattachBranch() throws Exception |
| { |
| skipStoreWithoutQueryXRefs(); |
| |
| // setup transaction. |
| final CDOSession session1 = openSession(); |
| final CDOTransaction s1Tr1 = session1.openTransaction(); |
| s1Tr1.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL); |
| |
| // create resource, and container tree using transaction 1. |
| final CDOResource resource = s1Tr1.createResource(getResourcePath("/test1")); |
| GenRefMultiContained container1 = getModel4Factory().createGenRefMultiContained(); |
| GenRefMultiContained container2 = getModel4Factory().createGenRefMultiContained(); |
| GenRefMultiContained container3 = getModel4Factory().createGenRefMultiContained(); |
| resource.getContents().add(container1); |
| container1.getElements().add(container2); |
| container2.getElements().add(container3); |
| |
| s1Tr1.commit(); |
| sleep(1000L); |
| |
| // setup another branch. |
| final CDOBranch otherBranch = s1Tr1.getBranch().createBranch("other"); |
| final CDOTransaction s1Tr3 = session1.openTransaction(otherBranch); |
| |
| CDOResource branchResource = s1Tr3.getObject(resource); |
| assertNotSame(null, branchResource); |
| |
| GenRefMultiContained otherContainer1 = (GenRefMultiContained)branchResource.getContents().get(0); |
| assertNotSame(null, otherContainer1); |
| |
| GenRefMultiContained otherContainer2 = (GenRefMultiContained)otherContainer1.getElements().get(0); |
| assertNotSame(null, otherContainer2); |
| |
| GenRefMultiContained otherContainer3 = (GenRefMultiContained)otherContainer2.getElements().get(0); |
| assertNotSame(null, otherContainer3); |
| |
| // detach the middle container on branch. |
| otherContainer1.getElements().remove(otherContainer2); |
| |
| // re-attach detached's child container. |
| otherContainer1.getElements().add(otherContainer3); |
| |
| s1Tr3.commit(); |
| assertEquals(false, s1Tr3.isDirty()); |
| |
| // merge the other branch to main. |
| sleep(1000L); |
| s1Tr1.merge(s1Tr3.getBranch().getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); |
| |
| s1Tr1.commit(); |
| assertEquals(false, s1Tr1.isDirty()); |
| } |
| |
| @Requires(RepositoryConfig.CAPABILITY_BRANCHING) |
| public void testXRefReattachBranchLevel2() throws Exception |
| { |
| // setup transaction. |
| final CDOSession session1 = openSession(); |
| final CDOTransaction s1Tr1 = session1.openTransaction(); |
| s1Tr1.options().addChangeSubscriptionPolicy(CDOAdapterPolicy.ALL); |
| |
| // create resource, and container tree using transaction 1. |
| final CDOResource resource = s1Tr1.createResource(getResourcePath("/test1")); |
| GenRefMultiContained container1 = getModel4Factory().createGenRefMultiContained(); |
| GenRefMultiContained container2 = getModel4Factory().createGenRefMultiContained(); |
| GenRefMultiContained container3 = getModel4Factory().createGenRefMultiContained(); |
| GenRefMultiContained container4 = getModel4Factory().createGenRefMultiContained(); |
| GenRefMultiContained container5 = getModel4Factory().createGenRefMultiContained(); |
| resource.getContents().add(container1); |
| resource.getContents().add(container2); |
| resource.getContents().add(container3); |
| container1.getElements().add(container4); |
| container4.getElements().add(container5); |
| |
| s1Tr1.commit(); |
| sleep(1000L); |
| |
| // setup another branch. |
| final CDOBranch otherBranch = s1Tr1.getBranch().createBranch("other"); |
| final CDOTransaction s1Tr3 = session1.openTransaction(otherBranch); |
| |
| CDOResource branchResource = s1Tr3.getObject(resource); |
| assertNotSame(null, branchResource); |
| |
| GenRefMultiContained otherContainer1 = (GenRefMultiContained)branchResource.getContents().get(0); |
| assertNotSame(null, otherContainer1); |
| GenRefMultiContained otherContainer2 = (GenRefMultiContained)branchResource.getContents().get(1); |
| assertNotSame(null, otherContainer2); |
| GenRefMultiContained otherContainer3 = (GenRefMultiContained)branchResource.getContents().get(2); |
| assertNotSame(null, otherContainer3); |
| GenRefMultiContained otherContainer4 = (GenRefMultiContained)otherContainer1.getElements().get(0); |
| assertNotSame(null, otherContainer4); |
| GenRefMultiContained otherContainer5 = (GenRefMultiContained)otherContainer4.getElements().get(0); |
| assertNotSame(null, otherContainer5); |
| |
| // detach the container1 on branch. |
| branchResource.getContents().remove(otherContainer1); |
| |
| // re-attach container1 child. |
| otherContainer2.getElements().add(otherContainer4); |
| |
| // re-attach container1 child. |
| otherContainer3.getElements().add(otherContainer5); |
| |
| s1Tr3.commit(); |
| assertEquals(false, s1Tr3.isDirty()); |
| |
| sleep(1000L); |
| |
| // merge the other branch to main. |
| CDOBranchPoint head = s1Tr3.getBranch().getHead(); |
| CDOMerger merger = new DefaultCDOMerger.PerFeature.ManyValued(); |
| s1Tr1.merge(head, merger); |
| |
| s1Tr1.commit(); |
| assertEquals(false, s1Tr1.isDirty()); |
| } |
| } |