blob: af716e1d539887f7b311838f4883f3ca1b010d2b [file] [log] [blame]
/**
* Copyright (c) 2004 - 2011 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;
/**
* Ensures that :
* <ul>
* <li>Specific legacy models (as described in <a href="http://www.eclipse.org/forums/index.php/t/244583">Issues when
* trying to import changes from PushTransaction in legacy mode</a>) can be correctly committed. See Bug 352204:
* [Legacy] Failing event PREPARE in state CLEAN: state machine issue with legacy mode</li>
* <li>When importing changes through a Push Transaction, features of non committed new elements are correctly set. See
* Bug 359966: [Legacy] Issues when trying to import changes from PushTransaction in legacy mode</li>
* </ul>
*
* @author Alex Lagarde
*/
public class Bugzilla_359966_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);
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);
}
}