/** * Copyright (c) 2010-2011 Ed Merks 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: * Ed Merks - Initial API and implementation */ package org.eclipse.emf.test.core.change; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EAnnotation; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EDataType; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EcoreFactory; import org.eclipse.emf.ecore.change.ChangeDescription; import org.eclipse.emf.ecore.change.util.ChangeRecorder; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.EcoreUtil; import org.junit.Assert; import org.junit.Test; public class ChangeDescriptionReverseTest { public static abstract class TestHelper { void doit() throws Exception { ResourceSet originalResourceSet = new ResourceSetImpl(); loadResources(originalResourceSet); Map<EObject, URI> eObjectToProxyURIMap = new HashMap<EObject, URI>(); ChangeRecorder changeRecorder = new ChangeRecorder(); changeRecorder.setRecordingTransientFeatures(false); changeRecorder.setEObjectToProxyURIMap(eObjectToProxyURIMap); changeRecorder.beginRecording(Collections.singleton(originalResourceSet)); makeChanges(); ChangeDescription changeDescription = changeRecorder.endRecording(); changeDescription.copyAndReverse(eObjectToProxyURIMap); ResourceSet finalResourceSet = new ResourceSetImpl(); Resource changeDescriptionResource = finalResourceSet.createResource(URI.createURI("changes.change")); changeDescriptionResource.getContents().add(changeDescription); ByteArrayOutputStream out = new ByteArrayOutputStream(); changeDescriptionResource.save(out, null); changeDescriptionResource.getContents().clear(); changeDescriptionResource.unload(); changeDescriptionResource.load(new ByteArrayInputStream(out.toByteArray()), null); ChangeDescription finalChangeDescription = (ChangeDescription)changeDescriptionResource.getContents().get(0); finalChangeDescription.apply(); finalResourceSet.getResources().remove(0); assertEquals(originalResourceSet, finalResourceSet); } abstract void loadResources(ResourceSet resourceSet); abstract void makeChanges(); } @Test public void testOne() throws Exception { new TestHelper() { Resource ecoreResource; @Override void loadResources(ResourceSet resourceSet) { ecoreResource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore"), true); } @Override void makeChanges() { EPackage ePackage = (EPackage)ecoreResource.getContents().get(0); ePackage.getEClassifiers().remove(1); } }.doit(); } @Test public void testTwo() throws Exception { new TestHelper() { Resource ecoreResource; @Override void loadResources(ResourceSet resourceSet) { ecoreResource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore"), true); } @Override void makeChanges() { EPackage ePackage = (EPackage)ecoreResource.getContents().get(0); EClass eClass = EcoreFactory.eINSTANCE.createEClass(); ePackage.getEClassifiers().add(5, eClass); eClass.setName("NewClass"); EAnnotation eAnnotation = EcoreFactory.eINSTANCE.createEAnnotation(); eClass.getEAnnotations().add(eAnnotation); eAnnotation.getContents().add(0, ePackage.getEClassifiers().get(2)); } }.doit(); } @Test public void testThree() throws Exception { new TestHelper() { Resource ecoreResource; @Override void loadResources(ResourceSet resourceSet) { ecoreResource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore"), true); } @Override void makeChanges() { EPackage ePackage = (EPackage)ecoreResource.getContents().get(0); ePackage.getEClassifiers().move(10, 5); } }.doit(); } @Test public void testFour() throws Exception { new TestHelper() { Resource ecoreResource; Resource xmlTypeResource; @Override void loadResources(ResourceSet resourceSet) { ecoreResource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore"), true); xmlTypeResource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/XMLType.ecore"), true); } @Override void makeChanges() { EPackage ecorePackage = (EPackage)ecoreResource.getContents().get(0); EPackage xmlTypePackage = (EPackage)xmlTypeResource.getContents().get(0); xmlTypePackage.getEClassifiers().add(2, ecorePackage.getEClassifiers().get(2)); } }.doit(); } @Test public void testFive() throws Exception { new TestHelper() { Resource ecoreResource; Resource xmlTypeResource; @Override void loadResources(ResourceSet resourceSet) { ecoreResource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore"), true); xmlTypeResource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/XMLType.ecore"), true); } @Override void makeChanges() { EPackage ecorePackage = (EPackage)ecoreResource.getContents().get(0); EPackage xmlTypePackage = (EPackage)xmlTypeResource.getContents().get(0); xmlTypeResource.getContents().add(ecorePackage.getEClassifiers().get(0)); ecoreResource.getContents().add(xmlTypePackage.getEClassifiers().get(0)); } }.doit(); } @Test public void testSix() throws Exception { new TestHelper() { Resource ecoreResource; Resource xmlTypeResource; @Override void loadResources(ResourceSet resourceSet) { ecoreResource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore"), true); xmlTypeResource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/XMLType.ecore"), true); } @Override void makeChanges() { EPackage ecorePackage = (EPackage)ecoreResource.getContents().get(0); EPackage xmlTypePackage = (EPackage)xmlTypeResource.getContents().get(0); EClassifier eClassifier = ecorePackage.getEClassifiers().get(10); eClassifier.setName(eClassifier.getName() + "Suffix"); xmlTypePackage.getEClassifiers().get(0).getEAnnotations().get(0).getContents().add(eClassifier); eClassifier.setName(eClassifier.getName() + "Suffix"); xmlTypePackage.getEClassifiers().get(0).setName("BadName"); xmlTypePackage.getEClassifiers().remove(12); xmlTypePackage.getEClassifiers().move(10, 20); } }.doit(); } @Test public void testSeven() throws Exception { new TestHelper() { Resource ecoreResource; Resource xmlTypeResource; @Override void loadResources(ResourceSet resourceSet) { ecoreResource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore"), true); xmlTypeResource = resourceSet.getResource(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/XMLType.ecore"), true); } @Override void makeChanges() { EPackage ecorePackage = (EPackage)ecoreResource.getContents().get(0); EPackage xmlTypePackage = (EPackage)xmlTypeResource.getContents().get(0); EClassifier eClassifier = ecorePackage.getEClassifiers().get(10); eClassifier.setName(eClassifier.getName() + "Suffix"); xmlTypePackage.getEClassifiers().get(0).getEAnnotations().get(0).getContents().add(eClassifier); eClassifier.setName(eClassifier.getName() + "Suffix"); xmlTypePackage.getEClassifiers().get(0).setName("BadName"); xmlTypePackage.getEClassifiers().remove(12); EDataType myEDataType = EcoreFactory.eINSTANCE.createEDataType(); myEDataType.setName("My"); xmlTypePackage.getEClassifiers().add(myEDataType); myEDataType.setInstanceTypeName("java.util.List<?>"); xmlTypePackage.getEClassifiers().move(10, 20); xmlTypePackage.getEClassifiers().get(12).setName(xmlTypePackage.getEClassifiers().get(10).getName() + "Extension"); xmlTypePackage.getEClassifiers().remove(12); } }.doit(); } public static void assertEquals(ResourceSet resourceSet1, ResourceSet resourceSet2) { EcoreUtil.resolveAll(resourceSet1); EcoreUtil.resolveAll(resourceSet2); EList<Resource> resources2 = resourceSet2.getResources(); for (Resource resource2 : resources2) { assertEquals(resourceSet1.getResource(resource2.getURI(), false), resource2); } } public static void assertEquals(Resource resource1, Resource resource2) { EList<EObject> eObjects1 = resource1.getContents(); EList<EObject> eObjects2 = resource2.getContents(); Assert.assertEquals(eObjects1.size(), eObjects2.size()); for (int i = 0, size = eObjects1.size(); i < size; ++i) { assertTrue(EcoreUtil.equals(eObjects1.get(i), eObjects2.get(i))); } } }