/* * Copyright (c) 2011, 2012, 2016 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.eresource.CDOResource; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.tests.AbstractCDOTest; import org.eclipse.emf.cdo.tests.model6.A; import org.eclipse.emf.cdo.tests.model6.D; import org.eclipse.emf.cdo.tests.model6.E; import org.eclipse.emf.cdo.tests.model6.F; import org.eclipse.emf.cdo.transaction.CDOPushTransaction; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.gmf.runtime.notation.MeasurementUnit; import org.eclipse.gmf.runtime.notation.Node; import org.eclipse.gmf.runtime.notation.NotationFactory; import java.io.File; import java.io.IOException; /** * Bug 365832: Issues when trying to import changes: Cannot modify a frozen exception issue * * @author Alex Lagarde */ public class Bugzilla_365832_Test extends AbstractCDOTest { private static final String MODEL_LOCATION_PATH = "myResource"; public void testWithoutPushTransaction() throws Exception { CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath(MODEL_LOCATION_PATH)); resource.getContents().add(createModel()); transaction.commit(); addNewChildren(transaction); checkDiagramAsCorrectlyBeenModified(transaction); transaction.commit(); checkDiagramAsCorrectlyBeenModified(transaction); } public void testWithReconstructSavepoints() throws Exception { importWithNewLegacyElements(true); } public void testWithoutReconstructSavepoints() throws Exception { importWithNewLegacyElements(false); } private void importWithNewLegacyElements(boolean reconstructSavePoints) throws Exception { // Step 1 : create model CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(getResourcePath(MODEL_LOCATION_PATH)); resource.getContents().add(createModel()); transaction.commit(); session.close(); // Step 2 : open a push transaction a save locally a modification // Step 2.1 : open a push transaction File fileForStoringChanges = createTempFile(); CDOPushTransaction pushTransaction = createPushTransaction(fileForStoringChanges, reconstructSavePoints); // Step 2.2 : create a new element addNewChildren(pushTransaction); // => make sure that diagram is modified as expected checkDiagramAsCorrectlyBeenModified(pushTransaction); // Step 2.3 : save locally pushTransaction.commit(); pushTransaction.getSession().close(); // Step 3 : load changes pushTransaction = createPushTransaction(fileForStoringChanges, reconstructSavePoints); // => check that diagram is modified as expected checkDiagramAsCorrectlyBeenModified(pushTransaction); // => check that diagram is modified as expected checkDiagramAsCorrectlyBeenModified(pushTransaction); // Step 4 : try to modify objects and commit Diagram diagram = getDiagram(pushTransaction); @SuppressWarnings("unchecked") EList<Node> children = (EList<Node>)(EList<?>)diagram.getPersistedChildren(); Node newElement = children.get(1); newElement.setType("newType"); pushTransaction.commit(); pushTransaction.getSession().close(); } /** * Creates a Push Transaction with the given options. * * @param fileForStoringChanges * the file that CDOPushTransaction should use to store changes (can be null) * @param reconstructSavePoints * if CDOSavePoints should be reconstructed when creating the PushTransaction */ private CDOPushTransaction createPushTransaction(File fileForStoringChanges, boolean reconstructSavePoints) throws IOException { CDOSession session = openSession(); CDOTransaction delegate = session.openTransaction(); return new CDOPushTransaction(delegate, fileForStoringChanges, reconstructSavePoints); } /** * Ensures that the given diagram has correctly been modified : * <ul> * <li>it should contains 2 Nodes</li> * <li>the Second Node should have a "type" Type and its associated element should be the diagram's container's * container</li> * </ul> */ @SuppressWarnings("rawtypes") private void checkDiagramAsCorrectlyBeenModified(CDOView view) { Diagram diagram = getDiagram(view); EList children = diagram.getPersistedChildren(); assertEquals("Failure when loading changes: New elements have not been created.", 2, children.size()); Node newElement = (Node)children.get(1); assertEquals("Attribute not correctly set.", "type", newElement.getType()); assertEquals("Cross reference not correctly set.", diagram.eContainer().eContainer(), newElement.getElement()); } /** * Returns the diagram model to use for this test. */ private Diagram getDiagram(CDOView view) { CDOResource resource = view.getResource(getResourcePath(MODEL_LOCATION_PATH)); F f = (F)resource.getContents().get(0); E e = f.getOwnedEs().get(0); A a = e.getOwnedAs().get(0); D d = a.getOwnedDs().get(0); return (Diagram)d.getData(); } /** * Creates the test model. */ @SuppressWarnings("unchecked") private EObject createModel() { F f = getModel6Factory().createF(); E e = getModel6Factory().createE(); A a = getModel6Factory().createA(); D d = getModel6Factory().createD(); Node child1 = NotationFactory.eINSTANCE.createNode(); child1.setElement(a); Diagram diagram = NotationFactory.eINSTANCE.createDiagram(); diagram.setMeasurementUnit(MeasurementUnit.PIXEL_LITERAL); diagram.getPersistedChildren().add(child1); d.setData(diagram); a.getOwnedDs().add(d); e.getOwnedAs().add(a); f.getOwnedEs().add(e); return f; } /** * Modifies the model by adding a new children of type Node to the Diagram. */ @SuppressWarnings("unchecked") private void addNewChildren(CDOTransaction transaction) { Diagram diagram = getDiagram(transaction); A a = (A)diagram.eContainer().eContainer(); Node child2 = NotationFactory.eINSTANCE.createNode(); child2.setElement(a); child2.setType("type"); diagram.getPersistedChildren().add(child2); } }