View | Details | Raw Unified | Return to bug 187811 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/gmf/tests/migration/GenericMigrationTest.java (-356 / +400 lines)
Lines 13-20 Link Here
13
13
14
import java.io.File;
14
import java.io.File;
15
import java.io.IOException;
15
import java.io.IOException;
16
import java.util.ArrayList;
17
import java.util.Arrays;
16
import java.util.Collection;
18
import java.util.Collection;
17
import java.util.Collections;
19
import java.util.Collections;
20
import java.util.Iterator;
21
import java.util.List;
18
22
19
import junit.framework.TestCase;
23
import junit.framework.TestCase;
20
24
Lines 26-41 Link Here
26
import org.eclipse.emf.ecore.EObject;
30
import org.eclipse.emf.ecore.EObject;
27
import org.eclipse.emf.ecore.EPackage;
31
import org.eclipse.emf.ecore.EPackage;
28
import org.eclipse.emf.ecore.EReference;
32
import org.eclipse.emf.ecore.EReference;
33
import org.eclipse.emf.ecore.EStructuralFeature;
29
import org.eclipse.emf.ecore.EcoreFactory;
34
import org.eclipse.emf.ecore.EcoreFactory;
30
import org.eclipse.emf.ecore.EcorePackage;
35
import org.eclipse.emf.ecore.EcorePackage;
31
import org.eclipse.emf.ecore.resource.Resource;
36
import org.eclipse.emf.ecore.resource.Resource;
32
import org.eclipse.emf.ecore.resource.impl.ResourceFactoryRegistryImpl;
33
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
37
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
34
import org.eclipse.gmf.internal.common.ToolingResourceFactory;
38
import org.eclipse.emf.ecore.util.EcoreValidator;
35
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegate;
39
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegate;
36
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegateImpl;
40
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegateImpl;
37
import org.eclipse.gmf.internal.common.migrate.MigrationResource;
41
import org.eclipse.gmf.internal.common.migrate.MigrationResource;
38
import org.eclipse.gmf.internal.common.migrate.ModelLoadHelper;
39
42
40
/**
43
/**
41
 * @author artem
44
 * @author artem
Lines 43-49 Link Here
43
public class GenericMigrationTest extends TestCase {
46
public class GenericMigrationTest extends TestCase {
44
	private EAttribute myAttrToRemove;
47
	private EAttribute myAttrToRemove;
45
	private EAttribute myAttrToRename;
48
	private EAttribute myAttrToRename;
46
	private EReference myWidenedRef;
49
	private EReference myWidenedRef1;
50
	private EReference myWidenedRef2;
47
	private EAttribute myAttrNarrow;
51
	private EAttribute myAttrNarrow;
48
	private EAttribute myAttrNarrowChild;
52
	private EAttribute myAttrNarrowChild;
49
53
Lines 57-68 Link Here
57
		createMetaModel();
61
		createMetaModel();
58
	}
62
	}
59
63
60
	private void createMetaModel() {
64
	private EPackage createMetaModel() {
61
		EPackage mmPackage = EcoreFactory.eINSTANCE.createEPackage();
65
		EPackage mmPackage = EcoreFactory.eINSTANCE.createEPackage();
62
		EClass mClass = EcoreFactory.eINSTANCE.createEClass();
66
		EClass mClass = EcoreFactory.eINSTANCE.createEClass();
63
		myAttrToRemove = EcoreFactory.eINSTANCE.createEAttribute();
67
		myAttrToRemove = EcoreFactory.eINSTANCE.createEAttribute();
64
		myAttrToRename = EcoreFactory.eINSTANCE.createEAttribute();
68
		myAttrToRename = EcoreFactory.eINSTANCE.createEAttribute();
65
		myWidenedRef = EcoreFactory.eINSTANCE.createEReference();
69
		myWidenedRef1 = EcoreFactory.eINSTANCE.createEReference();
70
		myWidenedRef2 = EcoreFactory.eINSTANCE.createEReference();
66
		myAttrNarrow = EcoreFactory.eINSTANCE.createEAttribute();
71
		myAttrNarrow = EcoreFactory.eINSTANCE.createEAttribute();
67
		myAttrNarrowChild = EcoreFactory.eINSTANCE.createEAttribute();
72
		myAttrNarrowChild = EcoreFactory.eINSTANCE.createEAttribute();
68
		EClass mNarrowClass = EcoreFactory.eINSTANCE.createEClass();
73
		EClass mNarrowClass = EcoreFactory.eINSTANCE.createEClass();
Lines 73-79 Link Here
73
		mmPackage.getEClassifiers().add(mNarrowClassChild);
78
		mmPackage.getEClassifiers().add(mNarrowClassChild);
74
		mClass.getEStructuralFeatures().add(myAttrToRemove);
79
		mClass.getEStructuralFeatures().add(myAttrToRemove);
75
		mClass.getEStructuralFeatures().add(myAttrToRename);
80
		mClass.getEStructuralFeatures().add(myAttrToRename);
76
		mClass.getEStructuralFeatures().add(myWidenedRef);
81
		mClass.getEStructuralFeatures().add(myWidenedRef1);
82
		mClass.getEStructuralFeatures().add(myWidenedRef2);
77
		mNarrowClass.getEStructuralFeatures().add(myAttrNarrow);
83
		mNarrowClass.getEStructuralFeatures().add(myAttrNarrow);
78
		mNarrowClassChild.getEStructuralFeatures().add(myAttrNarrowChild);
84
		mNarrowClassChild.getEStructuralFeatures().add(myAttrNarrowChild);
79
		mmPackage.setName("MM1");
85
		mmPackage.setName("MM1");
Lines 86-99 Link Here
86
		myAttrToRemove.setEType(EcorePackage.eINSTANCE.getEString());
92
		myAttrToRemove.setEType(EcorePackage.eINSTANCE.getEString());
87
		myAttrToRename.setName("myRenamedAttr");
93
		myAttrToRename.setName("myRenamedAttr");
88
		myAttrToRename.setEType(EcorePackage.eINSTANCE.getEString());
94
		myAttrToRename.setEType(EcorePackage.eINSTANCE.getEString());
89
		myWidenedRef.setName("myWidenedRef");
95
		myWidenedRef1.setName("myWidenedRef1");
90
		myWidenedRef.setUpperBound(-1);
96
		myWidenedRef1.setUpperBound(-1);
91
		myWidenedRef.setContainment(true);
97
		myWidenedRef1.setContainment(true);
92
		myWidenedRef.setEType(mNarrowClass);
98
		myWidenedRef1.setEType(mNarrowClass);
99
		myWidenedRef2.setName("myWidenedRef2");
100
		myWidenedRef2.setUpperBound(-1);
101
		myWidenedRef2.setContainment(true);
102
		myWidenedRef2.setEType(mNarrowClass);
93
		myAttrNarrow.setName("myNarrowAttr");
103
		myAttrNarrow.setName("myNarrowAttr");
94
		myAttrNarrow.setEType(EcorePackage.eINSTANCE.getEString());
104
		myAttrNarrow.setEType(EcorePackage.eINSTANCE.getEString());
95
		myAttrNarrowChild.setName("myNarrowChildAttr");
105
		myAttrNarrowChild.setName("myNarrowChildAttr");
106
		myAttrNarrowChild.setLowerBound(1);
96
		myAttrNarrowChild.setEType(EcorePackage.eINSTANCE.getEString());
107
		myAttrNarrowChild.setEType(EcorePackage.eINSTANCE.getEString());
108
		return mmPackage;
97
	}
109
	}
98
110
99
	private EObject newInstance() {
111
	private EObject newInstance() {
Lines 101-107 Link Here
101
	}
113
	}
102
114
103
	private EObject newNarrowInstance() {
115
	private EObject newNarrowInstance() {
104
		return getMetaModel().getEFactoryInstance().create(myWidenedRef.getEReferenceType());
116
		return getMetaModel().getEFactoryInstance().create(myAttrNarrow.getEContainingClass());
105
	}
117
	}
106
118
107
	private EObject newNarrowChildInstance() {
119
	private EObject newNarrowChildInstance() {
Lines 109-506 Link Here
109
	}
121
	}
110
122
111
	private EPackage getMetaModel() {
123
	private EPackage getMetaModel() {
112
		return myAttrToRemove.getEContainingClass().getEPackage();
124
		return myWidenedRef1.getEContainingClass().getEPackage();
113
	}
125
	}
114
126
115
	public void oldTestRemovedAttribute() {
127
	private boolean checkResourceHasNoProblems(Resource migratedResource) {
116
		final EObject testObject = newInstance();
128
		assertNotNull(migratedResource);
117
		testObject.eSet(myAttrToRemove, "value");
129
		assertTrue(migratedResource.getErrors().isEmpty());
130
		if (migratedResource instanceof MigrationResource) {
131
			assertFalse(migratedResource.getWarnings().isEmpty());
132
			assertEquals(1, migratedResource.getWarnings().size());
133
			assertTrue(migratedResource.getWarnings().get(0) instanceof MigrationResource.Diagnostic);
134
		} else {
135
			assertTrue(migratedResource.getWarnings().isEmpty());
136
		}
137
		boolean validate = true;
138
		for (Iterator<EObject> it=migratedResource.getAllContents(); it.hasNext() && validate;) {
139
			validate = EcoreValidator.INSTANCE.validate(it.next(), null, null);
140
		}
141
		return validate;
142
	}
143
	
144
	private String assertLoadingProblemsAfterMetamodelChanges(EPackage metamodel, URI modelResource) {
145
		String errorMessage = null;
146
		// try to load mm
147
		try {
148
			ResourceSetImpl rset = new ResourceSetImpl();
149
			rset.getPackageRegistry().put(metamodel.getNsURI(), metamodel);
150
			Resource resource = rset.createResource(modelResource);
151
			resource.load(null);
152
			fail("Load should fail because of metamodel changes");
153
		} catch (RuntimeException ex) {
154
			// expected
155
			assertNotNull(ex.getMessage());
156
			errorMessage = ex.getMessage();
157
		} catch (IOException ex) {
158
			// expected
159
			assertNotNull(ex.getMessage());
160
			errorMessage = ex.getMessage();
161
		}
118
162
119
		final String oldNsURI = getMetaModel().getNsURI();
163
		return errorMessage;
120
		EPackage.Registry.INSTANCE.put(oldNsURI, getMetaModel());
164
	}
121
		final String newNsURI = oldNsURI + "/2";
122
		EPackage.Registry.INSTANCE.put(newNsURI, getMetaModel());
123
165
166
	private URI saveToResource(EPackage metamodel, String filenameStart, String fileextension, EObject... rootObjects) {
167
		URI uri = null;
168
		Collection<EObject> roots = Arrays.asList(rootObjects);
124
		try {
169
		try {
125
			URI uri = null;
170
			uri = URI.createFileURI(File.createTempFile(filenameStart, fileextension.startsWith(".") ? fileextension : "."+fileextension).getAbsolutePath());
126
			try {
171
			ResourceSetImpl resourceSetImpl = new ResourceSetImpl();
127
				uri = URI.createFileURI(File.createTempFile("removed", ".tests").getAbsolutePath());
172
			resourceSetImpl.getPackageRegistry().put(metamodel.getNsURI(), metamodel);
128
				final ResourceSetImpl resourceSetImpl = new ResourceSetImpl();
173
			Resource res = resourceSetImpl.createResource(uri);
129
				final Resource res = resourceSetImpl.createResource(uri);
174
			res.getContents().addAll(roots);
130
				res.getContents().add(testObject);
175
			res.save(null);
131
				res.save(null);
176
			resourceSetImpl.getResources().removeAll(roots);
132
				resourceSetImpl.getResources().remove(testObject);
177
		} catch (IOException ex) {
133
			} catch (IOException ex) {
178
			fail(ex.toString());
134
				fail(ex.toString());
179
		}
135
			}
180
		return uri;
136
			// remove attr from metamodel
181
	}
137
			myAttrToRemove.getEContainingClass().getEStructuralFeatures().remove(myAttrToRemove);
138
182
139
			// try to load mm
183
	protected void checkNarrowedInstanceAttribute(EObject narrowInstance, EAttribute attribute, String attrValue) {
140
			try {
184
		assertEquals(narrowInstance.eClass(), attribute.getEContainingClass());
141
				new ResourceSetImpl().createResource(uri).load(null);
185
		assertTrue(narrowInstance.eIsSet(attribute));
142
				fail("Load should fail because of missing meta-model attribute");
186
		Object haveValue = narrowInstance.eGet(attribute, true);
143
			} catch (IOException ex) {
187
		assertEquals(attrValue, haveValue);
144
				// expected
188
	}
145
				assertNotNull(ex.getMessage());
189
146
				assertTrue(ex.getMessage().contains(myAttrToRemove.getName()));
190
	protected List<EObject> checkReferenceIsNarrowed(EObject migratedObj, EReference widenedRef) {
191
		List<EObject> result = null;
192
		assertTrue(migratedObj.eIsSet(widenedRef));
193
		Object narrowRef = migratedObj.eGet(widenedRef, true);
194
		if (widenedRef.isMany()) {
195
			result = new ArrayList<EObject>();
196
			assertTrue(narrowRef instanceof EList);
197
			EList narrowRefs = (EList) narrowRef;
198
			assertFalse(narrowRefs.isEmpty());
199
			for (int i=0; i<narrowRefs.size(); i++) {
200
				Object migratedNarrowRefs = narrowRefs.get(i);
201
				assertTrue(migratedNarrowRefs instanceof EObject);
202
				EObject narrowInstance = (EObject) migratedNarrowRefs;
203
				result.add(narrowInstance);
147
			}
204
			}
205
		} else {
206
			assertTrue(narrowRef instanceof EObject);
207
			EObject narrowInstance = (EObject) narrowRef;
208
			result = Collections.singletonList(narrowInstance);
209
		}
210
		return result;
211
	}
212
213
	private void checkInstanceClassChanged(EObject narrowInstance, EReference widenedReference) {
214
		assertFalse(narrowInstance.eClass().isAbstract());
215
		assertFalse(narrowInstance.eClass().equals(widenedReference.getEType()));
216
	}
217
218
	private void widenReferenceTypeFrom(EReference refToBeWiden, EClass containingClass, EPackage metamodel) {
219
		EClass mWideClass = EcoreFactory.eINSTANCE.createEClass();
220
		refToBeWiden.getEContainingClass().getEPackage().getEClassifiers().add(mWideClass);
221
		mWideClass.setName("WideClass");
222
		mWideClass.setAbstract(true);
223
		refToBeWiden.setEType(mWideClass);
224
		EList<EClass> supertypes = containingClass.getESuperTypes();
225
		if (!supertypes.contains(mWideClass)) {
226
			supertypes.add(mWideClass);
227
		}
228
	}
148
229
149
			EPackage.Registry.INSTANCE.put(oldNsURI, null);
230
	private EList<EObject> create2DifferentReferences(String attrValue, String attrChildValue) {
231
		final EList<EObject> narrowInstances = new BasicEList<EObject>();
232
		if (attrValue != null) {
233
			EObject narrowInstance = newNarrowInstance();
234
			narrowInstance.eSet(myAttrNarrow, attrValue);
235
			narrowInstances.add(narrowInstance);
236
		}
237
		if (attrChildValue != null) {
238
			EObject narrowChildInstance = newNarrowChildInstance();
239
			narrowChildInstance.eSet(myAttrNarrowChild, attrChildValue);
240
			narrowInstances.add(narrowChildInstance);
241
		}
242
		return narrowInstances;
243
	}
150
244
151
//			MigrationConfig.Registry.INSTANCE.register(new MigrationConfig.Descriptor() {
245
	private EList<EObject> createNarrowReferences(String attrValue) {
152
//				private final MigrationConfig cfg = new MigrationConfig(newNsURI, new String[] { oldNsURI });
246
		final EList<EObject> narrowInstances = new BasicEList<EObject>();
153
//				{
247
		if (attrValue != null) {
154
//					cfg.registerDeletedAttribute(testObject.eClass(), myAttrToRemove.getName());
248
			EObject narrowInstance = newNarrowInstance();
155
//				}
249
			narrowInstance.eSet(myAttrNarrow, attrValue);
156
//
250
			narrowInstances.add(narrowInstance);
157
//				public MigrationConfig getConfig() {
158
//					return cfg;
159
//				}
160
//
161
//				public String getExtension() {
162
//					return "tests";
163
//				}
164
//
165
//			});
166
//			Resource migrated = MigrationUtil.migrateModel(uri).getLoadedResource();
167
//			assertNotNull(migrated);
168
//			assertTrue(migrated.getErrors().isEmpty() && migrated.getWarnings().isEmpty());
169
//			assertEquals(1, migrated.getContents().size());
170
//			EObject migratedObj = migrated.getContents().get(0);
171
//			assertEquals(testObject.eClass(), migratedObj.eClass());
172
		} finally {
173
			// clean-up, avoid any chances to affect other tests
174
			// XXX MigrationConfig should be cleaned as well.
175
			EPackage.Registry.INSTANCE.put(oldNsURI, null);
176
			EPackage.Registry.INSTANCE.put(newNsURI, null);
177
		}
251
		}
252
		return narrowInstances;
253
	}
254
255
	private EObject createRootWithReferences(EReference reference, EList<EObject> referenceValues) {
256
		final EObject testObject1 = newInstance();
257
		testObject1.eSet(reference, referenceValues);
258
		return testObject1;
178
	}
259
	}
179
260
180
	public void testRemovedAttribute() {
261
	public void testRemovedAttribute() {
181
		final EObject testObject = newInstance();
262
		final EObject testObject = newInstance();
182
		testObject.eSet(myAttrToRemove, "value");
263
		testObject.eSet(myAttrToRemove, "value");
183
264
184
		final String oldNsURI = getMetaModel().getNsURI();
265
		EPackage metamodel = getMetaModel();
185
		EPackage.Registry.INSTANCE.put(oldNsURI, getMetaModel());
266
		URI uri = saveToResource(metamodel, "removed", "tests", testObject);
186
		final String newNsURI = oldNsURI + "/2";
267
		
187
		EPackage.Registry.INSTANCE.put(newNsURI, getMetaModel());
268
		// remove attr from metamodel
188
269
		myAttrToRemove.getEContainingClass().getEStructuralFeatures().remove(myAttrToRemove);
189
		try {
190
			URI uri = null;
191
			try {
192
				uri = URI.createFileURI(File.createTempFile("removed", ".tests").getAbsolutePath());
193
				final ResourceSetImpl resourceSetImpl = new ResourceSetImpl();
194
				final Resource res = resourceSetImpl.createResource(uri);
195
				res.getContents().add(testObject);
196
				res.save(null);
197
				resourceSetImpl.getResources().remove(testObject);
198
			} catch (IOException ex) {
199
				fail(ex.toString());
200
			}
201
			// remove attr from metamodel
202
			myAttrToRemove.getEContainingClass().getEStructuralFeatures().remove(myAttrToRemove);
203
204
			// try to load mm
205
			try {
206
				new ResourceSetImpl().createResource(uri).load(null);
207
				fail("Load should fail because of missing meta-model attribute");
208
			} catch (IOException ex) {
209
				// expected
210
				assertNotNull(ex.getMessage());
211
				assertTrue(ex.getMessage().contains(myAttrToRemove.getName()));
212
			}
213
214
			EPackage.Registry.INSTANCE.put(oldNsURI, null);
215
216
			Resource.Factory factory = new ToolingResourceFactory() {
217
270
218
				@Override
271
		String errorMessage = assertLoadingProblemsAfterMetamodelChanges(metamodel, uri);
219
				public Resource createResource(URI uri) {
272
		assertTrue(errorMessage.contains(myAttrToRemove.getName()));
220
					return new MigrationResource(uri) {
221
						protected MigrationHelperDelegate createDelegate() {
222
							MigrationHelperDelegate delegate = new MigrationHelperDelegateImpl() {
223
								{
224
									registerDeletedAttributes(testObject.eClass(), myAttrToRemove.getName());
225
								}
226
							};
227
							return delegate;
228
						}
229
273
230
						protected Collection<String> getBackwardSupportedURIs() {
274
		final MigrationHelperDelegate delegate = new MigrationHelperDelegateImpl() {{
231
							return Collections.singleton(oldNsURI);
275
				registerDeletedAttributes(testObject.eClass(), myAttrToRemove.getName());
232
						}
276
		}};
277
		Resource migrated = loadMigrationResource(metamodel, delegate, uri);
278
		checkResourceHasNoProblems(migrated);
279
		
280
		assertEquals(1, migrated.getContents().size());
281
		EObject migratedObj = migrated.getContents().get(0);
282
		assertEquals(testObject.eClass(), migratedObj.eClass());
233
283
234
						protected String getMetamodelNsURI() {
235
							return newNsURI;
236
						}
237
					};
238
				}
239
				
240
			};
241
			Resource migrated = createLoadHelper(factory, uri).getLoadedResource();
242
			assertNotNull(migrated);
243
			assertTrue(migrated.getErrors().isEmpty());
244
			assertFalse(migrated.getWarnings().isEmpty());
245
			assertEquals(1, migrated.getContents().size());
246
			EObject migratedObj = migrated.getContents().get(0);
247
			assertEquals(testObject.eClass(), migratedObj.eClass());
248
		} finally {
249
			// clean-up, avoid any chances to affect other tests
250
			// XXX MigrationConfig should be cleaned as well.
251
			EPackage.Registry.INSTANCE.put(oldNsURI, null);
252
			EPackage.Registry.INSTANCE.put(newNsURI, null);
253
		}
254
	}
284
	}
255
285
256
	public void testWidenedReference() {
286
	public void testWidenedReference() {
257
		final EObject testObject = newInstance();
287
		final String attrValue = "narrow value";
258
		EObject narrowValue = newNarrowInstance();
288
		final EList<EObject> narrowValues = createNarrowReferences(attrValue);
259
		String attrValue = "narrow value";
289
		final EObject testObject = createRootWithReferences(myWidenedRef1, narrowValues);
260
		
261
		narrowValue.eSet(myAttrNarrow, attrValue);
262
		EList narrowValues = new BasicEList();
263
		narrowValues.add(narrowValue);
264
		testObject.eSet(myWidenedRef, narrowValues);
265
290
266
		EPackage metamodel = getMetaModel();
291
		EPackage metamodel = getMetaModel();
292
		URI uri = saveToResource(metamodel, "widened", "tests", testObject);
293
		
294
		// widen reference in metamodel
295
		widenReferenceTypeFrom(myWidenedRef1, myAttrNarrow.getEContainingClass(), metamodel);
296
		
297
		// try to load mm
298
		String errorMessage = assertLoadingProblemsAfterMetamodelChanges(getMetaModel(), uri);
299
		//assertTrue(errorMessage.contains(myWidenedRef1.getEType().getName())); //XXX check
267
		
300
		
268
		final String oldNsURI = metamodel.getNsURI();
301
		MigrationHelperDelegate delegate = new MigrationHelperDelegateImpl() {{
269
		EPackage.Registry.INSTANCE.put(oldNsURI, metamodel);
302
				registerNarrowReferenceType(myWidenedRef1, myAttrNarrow.getEContainingClass());
270
		final String newNsURI = oldNsURI + "/2";
303
		}};
271
		EPackage.Registry.INSTANCE.put(newNsURI, metamodel);
304
		
305
		// try to load mm
306
		Resource migrated = loadMigrationResource(metamodel, delegate, uri);
307
		checkResourceHasNoProblems(migrated);
308
		
309
		assertEquals(1, migrated.getContents().size());
310
		EObject migratedObj = migrated.getContents().get(0);
311
		assertEquals(testObject.eClass(), migratedObj.eClass());
312
		
313
		List<EObject> narrowed = checkReferenceIsNarrowed(migratedObj, myWidenedRef1);
314
		assertEquals(1, narrowed.size());
315
		
316
		EObject narrowInstance = narrowed.get(0);
317
		checkInstanceClassChanged(narrowInstance, myWidenedRef1);
318
		checkNarrowedInstanceAttribute(narrowInstance, myAttrNarrow, attrValue);
319
	}
272
320
273
		try {
321
	public void testWidenedReferenceWith2Types() {
274
			URI uri = null;
322
		final String attrValue = "narrow value";
275
			try {
323
		final String attrChildValue = "narrow child value";
276
				uri = URI.createFileURI(File.createTempFile("widened", ".tests").getAbsolutePath());
324
		final EList<EObject> narrowValues = create2DifferentReferences(attrValue, attrChildValue);
277
				final ResourceSetImpl resourceSetImpl = new ResourceSetImpl();
325
		final EObject testObject = createRootWithReferences(myWidenedRef1, narrowValues);
278
				final Resource res = resourceSetImpl.createResource(uri);
279
				res.getContents().add(testObject);
280
				res.save(null);
281
				resourceSetImpl.getResources().remove(testObject);
282
			} catch (IOException ex) {
283
				fail(ex.toString());
284
			}
285
			
286
			// widen reference in metamodel
287
			
288
			EClass mWideClass = EcoreFactory.eINSTANCE.createEClass();
289
			myWidenedRef.getEContainingClass().getEPackage().getEClassifiers().add(mWideClass);
290
			mWideClass.setName("WideClass");
291
			mWideClass.setAbstract(true);
292
			myWidenedRef.setEType(mWideClass);
293
			myAttrNarrow.getEContainingClass().getESuperTypes().add(mWideClass);
294
			
295
			// try to load mm
296
			try {
297
				new ResourceSetImpl().createResource(uri).load(null);
298
				fail("Load should fail because of unknown meta-model attribute");
299
			} catch (RuntimeException ex) {
300
				// expected
301
				assertNotNull(ex.getMessage());
302
			} catch (IOException ex) {
303
				// expected
304
				assertNotNull(ex.getMessage());
305
			}
306
326
307
			EPackage.Registry.INSTANCE.put(oldNsURI, null);
327
		EPackage metamodel = getMetaModel();
328
		URI uri = saveToResource(metamodel, "widened2Types", "tests", testObject);
308
329
309
			Resource.Factory factory = new ToolingResourceFactory() {
330
		// widen reference in metamodel
331
		widenReferenceTypeFrom(myWidenedRef1, myAttrNarrow.getEContainingClass(), metamodel);
310
332
311
				@Override
333
		// try to load mm
312
				public Resource createResource(URI uri) {
334
		String errorMessage = assertLoadingProblemsAfterMetamodelChanges(metamodel, uri);
313
					return new MigrationResource(uri) {
335
		// assertTrue(errorMessage.contains(myWidenedRef1.getEType().getName())); //XXX
314
						protected MigrationHelperDelegate createDelegate() {
336
315
							MigrationHelperDelegate delegate = new MigrationHelperDelegateImpl() {
337
		MigrationHelperDelegate delegate = new MigrationHelperDelegateImpl() {{
316
								{
338
				registerNarrowReferenceType(myWidenedRef1, myAttrNarrow.getEContainingClass());
317
									registerNarrowReferenceType(myWidenedRef, myAttrNarrow.getEContainingClass());
339
		}};
318
								}
340
319
							};
341
		// try to load mm
320
							return delegate;
342
		Resource migrated = loadMigrationResource(metamodel, delegate, uri);
321
						}
343
		checkResourceHasNoProblems(migrated);
344
345
		assertEquals(1, migrated.getContents().size());
346
		EObject migratedObj = migrated.getContents().get(0);
347
		assertEquals(testObject.eClass(), migratedObj.eClass());
348
		
349
		List<EObject> narrowed = checkReferenceIsNarrowed(migratedObj, myWidenedRef1);
350
		assertEquals(2, narrowed.size());
351
		
352
		EObject narrowInstance1 = narrowed.get(0);
353
		checkInstanceClassChanged(narrowInstance1, myWidenedRef1);
354
		checkNarrowedInstanceAttribute(narrowInstance1, myAttrNarrow, attrValue);
355
		
356
		EObject narrowInstance2 = narrowed.get(1);
357
		checkInstanceClassChanged(narrowInstance2, myWidenedRef1);
358
		checkNarrowedInstanceAttribute(narrowInstance2, myAttrNarrowChild, attrChildValue);
359
	}
360
361
	public void test2WidenedReferences() {
362
		final String attrValue1 = "narrow value 1";
363
		final EList<EObject> narrowValues1 = createNarrowReferences(attrValue1);
364
		final EObject testObject1 = createRootWithReferences(myWidenedRef1, narrowValues1);
365
		final String attrValue2 = "narrow value 2";
366
		final String attrChildValue2 = "narrow child value 2";
367
		final EList<EObject> narrowValues2 = create2DifferentReferences(attrValue2, attrChildValue2);
368
		final EObject testObject2 = createRootWithReferences(myWidenedRef2, narrowValues2);
369
		final String attrValue3 = "narrow value 3";
370
		final EList<EObject> narrowValues3 = createNarrowReferences(attrValue3);
371
		final EObject testObject3 = createRootWithReferences(myWidenedRef1, narrowValues3);
372
		final String attrValue4 = "narrow value 4";
373
		final EList<EObject> narrowValues4 = createNarrowReferences(attrValue4);
374
		final EObject testObject4 = createRootWithReferences(myWidenedRef2, narrowValues4);
322
375
323
						protected Collection<String> getBackwardSupportedURIs() {
376
		EPackage metamodel = getMetaModel();
324
							return Collections.<String>singleton(oldNsURI);
377
		URI uri = saveToResource(metamodel, "widened2Refs", "tests", testObject1, testObject2, testObject3, testObject4);
325
						}
326
378
327
						@Override
379
		// widen reference in metamodel
328
						protected String getMetamodelNsURI() {
380
		widenReferenceTypeFrom(myWidenedRef1, myAttrNarrow.getEContainingClass(), metamodel);
329
							return newNsURI;
381
		widenReferenceTypeFrom(myWidenedRef2, myAttrNarrow.getEContainingClass(), metamodel);
330
						}
382
331
					};
383
		// try to load mm
332
				}
384
		String errorMessage = assertLoadingProblemsAfterMetamodelChanges(metamodel, uri);
333
				
385
		// assertTrue(errorMessage.contains(myAttrNarrow.getName())); //XXX
334
			};
386
335
			
387
		MigrationHelperDelegate delegate = new MigrationHelperDelegateImpl() {{
336
			// try to load mm
388
				registerNarrowReferenceType(myWidenedRef1, myAttrNarrow.getEContainingClass());
337
			Resource migrated = createLoadHelper(factory, uri).getLoadedResource();
389
				registerNarrowReferenceType(myWidenedRef2, myAttrNarrow.getEContainingClass());
338
			assertNotNull(migrated);
390
		}};
339
			assertTrue(migrated.getErrors().isEmpty());
391
340
			assertFalse(migrated.getWarnings().isEmpty());
392
		// try to load mm
341
			assertEquals(1, migrated.getContents().size());
393
		Resource migrated = loadMigrationResource(metamodel, delegate, uri);
342
			EObject migratedObj = migrated.getContents().get(0);
394
		checkResourceHasNoProblems(migrated);
343
			assertEquals(testObject.eClass(), migratedObj.eClass());
395
344
			
396
		assertEquals(4, migrated.getContents().size());
345
			assertTrue(migratedObj.eIsSet(myWidenedRef));
397
		
346
			Object narrowRef = migratedObj.eGet(myWidenedRef, true);
398
		EObject migratedObj1 = migrated.getContents().get(0);
347
			assertTrue(narrowRef instanceof EList);
399
		assertEquals(testObject1.eClass(), migratedObj1.eClass());
348
			EList narrowRefs = (EList) narrowRef;
400
		
349
			assertFalse(narrowRefs.isEmpty());
401
		List<EObject> narrowed1 = checkReferenceIsNarrowed(migratedObj1, myWidenedRef1);
350
			assertEquals(1, narrowRefs.size());
402
		assertEquals(1, narrowed1.size());
351
			Object narrowRefsFirst = narrowRefs.get(0);
403
		checkReferenceIsNarrowed(migratedObj1, myWidenedRef1);
352
			assertTrue(narrowRefsFirst instanceof EObject);
404
		
353
			EObject narrowInstance = (EObject) narrowRefsFirst;
405
		EObject narrowed1first = narrowed1.get(0);
354
			assertFalse(narrowInstance.eClass().isAbstract());
406
		checkNarrowedInstanceAttribute(narrowed1first, myAttrNarrow, attrValue1);
355
			assertFalse(narrowInstance.eClass().equals(myWidenedRef.getEType()));
407
		
356
			assertEquals(narrowInstance.eClass(), myAttrNarrow.getEContainingClass());
408
		EObject migratedObj2 = migrated.getContents().get(1);
357
			assertTrue(narrowInstance.eIsSet(myAttrNarrow));
409
		assertEquals(testObject2.eClass(), migratedObj2.eClass());
358
			Object haveValue = narrowInstance.eGet(myAttrNarrow, true);
410
		
359
			assertEquals(attrValue, haveValue);
411
		List<EObject> narrowed2 = checkReferenceIsNarrowed(migratedObj2, myWidenedRef2);
360
		} finally {
412
		assertEquals(2, narrowed2.size());
361
			// clean-up, avoid any chances to affect other tests
413
		checkReferenceIsNarrowed(migratedObj2, myWidenedRef2);
362
			EPackage.Registry.INSTANCE.put(oldNsURI, null);
414
		
363
			EPackage.Registry.INSTANCE.put(newNsURI, null);
415
		EObject narrowed2first = narrowed2.get(0);
364
		}
416
		checkNarrowedInstanceAttribute(narrowed2first, myAttrNarrow, attrValue2);
417
		
418
		EObject narrowed2second = narrowed2.get(1);
419
		checkNarrowedInstanceAttribute(narrowed2second, myAttrNarrowChild, attrChildValue2);
420
		
421
		EObject migratedObj3 = migrated.getContents().get(2);
422
		assertEquals(testObject3.eClass(), migratedObj3.eClass());
423
		
424
		List<EObject> narrowed3 = checkReferenceIsNarrowed(migratedObj3, myWidenedRef1);
425
		assertEquals(1, narrowed3.size());
426
		checkReferenceIsNarrowed(migratedObj3, myWidenedRef1);
427
		
428
		EObject narrowed3first = narrowed3.get(0);
429
		checkNarrowedInstanceAttribute(narrowed3first, myAttrNarrow, attrValue3);
430
		
431
		EObject migratedObj4 = migrated.getContents().get(3);
432
		assertEquals(testObject4.eClass(), migratedObj4.eClass());
433
		
434
		List<EObject> narrowed4 = checkReferenceIsNarrowed(migratedObj4, myWidenedRef2);
435
		assertEquals(1, narrowed3.size());
436
		checkReferenceIsNarrowed(migratedObj4, myWidenedRef2);
437
		
438
		EObject narrowed4first = narrowed4.get(0);
439
		checkNarrowedInstanceAttribute(narrowed4first, myAttrNarrow, attrValue4);
365
	}
440
	}
366
441
367
	public void testWidenedReferenceWith2Types() {
442
	public void testWidenedReferenceWithDifferentDefaults() {
368
		final EObject testObject = newInstance();
443
		// create model based on current metamodel
369
		EObject narrowValue = newNarrowInstance();
370
		String attrValue = "narrow value";
444
		String attrValue = "narrow value";
371
		EObject narrowChildValue = newNarrowChildInstance();
372
		String attrChildValue = "narrow child value";
445
		String attrChildValue = "narrow child value";
373
		
446
		final EList<EObject> narrowValues = create2DifferentReferences(attrValue, attrChildValue);
374
		narrowValue.eSet(myAttrNarrow, attrValue);
447
		final EObject testObject = createRootWithReferences(myWidenedRef1, narrowValues);
375
		narrowChildValue.eSet(myAttrNarrowChild, attrChildValue);
376
		EList narrowValues = new BasicEList();
377
		narrowValues.add(narrowValue);
378
		narrowValues.add(narrowChildValue);
379
		testObject.eSet(myWidenedRef, narrowValues);
380
448
381
		EPackage metamodel = getMetaModel();
449
		EPackage metamodel = getMetaModel();
382
		
450
		URI uri = saveToResource(metamodel, "widened2Defaults", "tests", testObject);
383
		final String oldNsURI = metamodel.getNsURI();
384
		EPackage.Registry.INSTANCE.put(oldNsURI, metamodel);
385
		final String newNsURI = oldNsURI + "/2";
386
		EPackage.Registry.INSTANCE.put(newNsURI, metamodel);
387
451
452
		// try to load mm
388
		try {
453
		try {
389
			URI uri = null;
454
			ResourceSetImpl resourceSetImpl = new ResourceSetImpl();
390
			try {
455
			resourceSetImpl.getPackageRegistry().put(metamodel.getNsURI(), metamodel);
391
				uri = URI.createFileURI(File.createTempFile("widened2Types", ".tests").getAbsolutePath());
456
			Resource ordinaryResource = resourceSetImpl.createResource(uri);
392
				final ResourceSetImpl resourceSetImpl = new ResourceSetImpl();
457
			ordinaryResource.load(null);
393
				final Resource res = resourceSetImpl.createResource(uri);
458
			boolean validate = checkResourceHasNoProblems(ordinaryResource);
394
				res.getContents().add(testObject);
459
			assertTrue("Should not fail with obligatory metamodel attribute not set", validate);
395
				res.save(null);
460
		} catch (RuntimeException ex) {
396
				resourceSetImpl.getResources().remove(testObject);
461
			fail();
397
			} catch (IOException ex) {
462
		} catch (IOException ex) {
398
				fail(ex.toString());
463
			fail();
399
			}
464
		}
400
			
465
		MigrationHelperDelegate badDelegate = new MigrationHelperDelegateImpl() {{
401
			// widen reference in metamodel
466
			registerNarrowReferenceType(myWidenedRef1, myAttrNarrowChild.getEContainingClass());
402
			
467
		}};
403
			EClass mWideClass = EcoreFactory.eINSTANCE.createEClass();
468
	
404
			myWidenedRef.getEContainingClass().getEPackage().getEClassifiers().add(mWideClass);
469
		// try to load mm
405
			mWideClass.setName("WideClass");
470
		Resource badMigrated = loadMigrationResource(getMetaModel(), badDelegate, uri);
406
			mWideClass.setAbstract(true);
471
		checkResourceHasNoProblems(badMigrated);
407
			myWidenedRef.setEType(mWideClass);
472
		boolean validateBad = checkResourceHasNoProblems(badMigrated);
408
			myAttrNarrow.getEContainingClass().getESuperTypes().add(mWideClass);
473
		assertFalse("Should fail with obligatory metamodel attribute not set", validateBad);
409
			
474
410
			// try to load mm
475
		MigrationHelperDelegate delegate = new MigrationHelperDelegateImpl() {
411
			try {
476
			{
412
				new ResourceSetImpl().createResource(uri).load(null);
477
				registerNarrowReferenceType(myWidenedRef1, myAttrNarrowChild.getEContainingClass());
413
				fail("Load should fail because of unknown meta-model attribute");
414
			} catch (RuntimeException ex) {
415
				// expected
416
				assertNotNull(ex.getMessage());
417
			} catch (IOException ex) {
418
				// expected
419
				assertNotNull(ex.getMessage());
420
			}
478
			}
479
			private Collection<EObject> myToBeChecked = new ArrayList<EObject>();
421
480
422
			EPackage.Registry.INSTANCE.put(oldNsURI, null);
481
			@Override
423
482
			public void processObject(EObject result) {
424
			Resource.Factory factory = new ToolingResourceFactory() {
483
				super.processObject(result);
425
484
				if (myAttrNarrowChild.getEContainingClass().equals(result.eClass())) {
426
				@Override
485
					myToBeChecked.add(result);
427
				public Resource createResource(URI uri) {
486
				}
428
					return new MigrationResource(uri) {
487
			}
429
						protected MigrationHelperDelegate createDelegate() {
430
							MigrationHelperDelegate delegate = new MigrationHelperDelegateImpl() {
431
								{
432
									registerNarrowReferenceType(myWidenedRef, myAttrNarrow.getEContainingClass());
433
								}
434
							};
435
							return delegate;
436
						}
437
438
						protected Collection<String> getBackwardSupportedURIs() {
439
							return Collections.<String>singleton(oldNsURI);
440
						}
441
488
442
						@Override
489
			@Override
443
						protected String getMetamodelNsURI() {
490
			public void postProcess() {
444
							return newNsURI;
491
				super.postProcess();
492
				for (EObject narrowed : myToBeChecked) {
493
					if (!narrowed.eIsSet(myAttrNarrowChild)) {
494
						EObject defaultTyped = narrowed.eClass().getEPackage().getEFactoryInstance().create((EClass) myWidenedRef1.getEType());
495
						for (EStructuralFeature feature : narrowed.eClass().getEAllStructuralFeatures()) {
496
							if (narrowed.eIsSet(feature)) {
497
								defaultTyped.eSet(feature, narrowed.eGet(feature));
498
							}
445
						}
499
						}
446
					};
500
						EObject parent = narrowed.eContainer();
501
						EList children = (EList) parent.eGet(myWidenedRef1);
502
						int index = children.indexOf(narrowed);
503
						children.remove(narrowed);
504
						children.add(index, defaultTyped);
505
					}
447
				}
506
				}
448
				
507
			}
449
			};
508
		};
450
			
451
			// try to load mm
452
			Resource migrated = createLoadHelper(factory, uri).getLoadedResource();
453
			assertNotNull(migrated);
454
			assertTrue(migrated.getErrors().isEmpty());
455
			assertFalse(migrated.getWarnings().isEmpty());
456
			assertEquals(1, migrated.getContents().size());
457
			EObject migratedObj = migrated.getContents().get(0);
458
			assertEquals(testObject.eClass(), migratedObj.eClass());
459
			
460
			assertTrue(migratedObj.eIsSet(myWidenedRef));
461
			Object narrowRefList = migratedObj.eGet(myWidenedRef, true);
462
			assertTrue(narrowRefList instanceof EList);
463
			EList narrowInstancesList = (EList) narrowRefList;
464
			assertFalse(narrowInstancesList.isEmpty());
465
			assertEquals(2, narrowInstancesList.size());
466
			
467
			Object narrowRefsFirst = narrowInstancesList.get(0);
468
			assertTrue(narrowRefsFirst instanceof EObject);
469
			EObject narrowInstance1 = (EObject) narrowRefsFirst;
470
			assertFalse(narrowInstance1.eClass().isAbstract());
471
			assertFalse(narrowInstance1.eClass().equals(myWidenedRef.getEType()));
472
			assertEquals(narrowInstance1.eClass(), myAttrNarrow.getEContainingClass());
473
			assertTrue(narrowInstance1.eIsSet(myAttrNarrow));
474
			Object haveValue = narrowInstance1.eGet(myAttrNarrow, true);
475
			assertEquals(attrValue, haveValue);
476
477
			Object narrowRefsSecond = narrowInstancesList.get(1);
478
			assertTrue(narrowRefsSecond instanceof EObject);
479
			EObject narrowInstance2 = (EObject) narrowRefsSecond;
480
			assertFalse(narrowInstance2.eClass().isAbstract());
481
			assertFalse(narrowInstance2.eClass().equals(myWidenedRef.getEType()));
482
			assertEquals(narrowInstance2.eClass(), myAttrNarrowChild.getEContainingClass());
483
			assertTrue(narrowInstance2.eIsSet(myAttrNarrowChild));
484
			Object haveChildValue = narrowInstance2.eGet(myAttrNarrowChild, true);
485
			assertEquals(attrChildValue, haveChildValue);
486
		} finally {
487
			// clean-up, avoid any chances to affect other tests
488
			EPackage.Registry.INSTANCE.put(oldNsURI, null);
489
			EPackage.Registry.INSTANCE.put(newNsURI, null);
490
		}
491
	}
492
509
493
	private static ModelLoadHelper createLoadHelper(final Resource.Factory factory, URI modelResourceURI) {
510
		// try to load mm
511
		Resource migrated = loadMigrationResource(getMetaModel(), delegate, uri);
512
		checkResourceHasNoProblems(migrated);
513
		boolean validate = checkResourceHasNoProblems(migrated);
514
		assertTrue("Should not fail with obligatory metamodel attribute not set", validate);
515
516
		assertEquals(1, migrated.getContents().size());
517
		EObject migratedObj = migrated.getContents().get(0);
518
		assertEquals(testObject.eClass(), migratedObj.eClass());
519
520
		List<EObject> narrowed = checkReferenceIsNarrowed(migratedObj, myWidenedRef1);
521
		assertEquals(2, narrowed.size());
522
523
		EObject narrowInstance1 = narrowed.get(0);
524
		assertFalse(narrowInstance1.eClass().isAbstract());
525
		assertTrue(narrowInstance1.eClass().equals(myWidenedRef1.getEType()));
526
		checkNarrowedInstanceAttribute(narrowInstance1, myAttrNarrow, attrValue);
527
528
		EObject narrowInstance2 = narrowed.get(1);
529
		checkInstanceClassChanged(narrowInstance2, myWidenedRef1);
530
		checkNarrowedInstanceAttribute(narrowInstance2, myAttrNarrowChild, attrChildValue);
531
	}
532
	
533
	private Resource loadMigrationResource(EPackage metamodel, MigrationHelperDelegate delegate, URI modelResourceURI) {
494
		if(modelResourceURI == null) {
534
		if(modelResourceURI == null) {
495
			throw new IllegalArgumentException("null resource uri"); //$NON-NLS-1$
535
			throw new IllegalArgumentException("null resource uri"); //$NON-NLS-1$
496
		}
536
		}
497
		ResourceSetImpl rset = new ResourceSetImpl();
537
		ResourceSetImpl rset = new ResourceSetImpl();
498
		rset.setResourceFactoryRegistry(new ResourceFactoryRegistryImpl() {			
538
		rset.getResources().add(createMigrationResource(delegate, modelResourceURI));
499
			public Resource.Factory getFactory(URI uri) {
539
		rset.getPackageRegistry().put(metamodel.getNsURI(), metamodel);
500
				return factory;
540
		return rset.getResource(modelResourceURI, true);
541
	}
542
	
543
	private Resource createMigrationResource(final MigrationHelperDelegate delegate, URI modelResourceURI) {
544
		return new MigrationResource(modelResourceURI) {
545
			protected MigrationHelperDelegate createDelegate() {
546
				return delegate;
501
			}
547
			}
502
		});
548
		};
503
549
	}
504
		return new ModelLoadHelper(rset, modelResourceURI);
505
	}	
506
}
550
}
(-)src/org/eclipse/gmf/tests/migration/MigrationPatchesTest.java (+61 lines)
Lines 26-31 Link Here
26
import org.eclipse.emf.ecore.resource.Resource;
26
import org.eclipse.emf.ecore.resource.Resource;
27
import org.eclipse.emf.ecore.resource.ResourceSet;
27
import org.eclipse.emf.ecore.resource.ResourceSet;
28
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
28
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
29
import org.eclipse.gmf.codegen.gmfgen.FeatureLabelModelFacet;
29
import org.eclipse.gmf.codegen.gmfgen.GenAuditContainer;
30
import org.eclipse.gmf.codegen.gmfgen.GenAuditContainer;
30
import org.eclipse.gmf.codegen.gmfgen.GenAuditRoot;
31
import org.eclipse.gmf.codegen.gmfgen.GenAuditRoot;
31
import org.eclipse.gmf.codegen.gmfgen.GenAuditRule;
32
import org.eclipse.gmf.codegen.gmfgen.GenAuditRule;
Lines 33-38 Link Here
33
import org.eclipse.gmf.internal.common.ToolingResourceFactory;
34
import org.eclipse.gmf.internal.common.ToolingResourceFactory;
34
import org.eclipse.gmf.internal.common.migrate.MigrationResource;
35
import org.eclipse.gmf.internal.common.migrate.MigrationResource;
35
import org.eclipse.gmf.internal.common.migrate.ModelLoadHelper;
36
import org.eclipse.gmf.internal.common.migrate.ModelLoadHelper;
37
import org.eclipse.gmf.mappings.FeatureLabelMapping;
38
import org.eclipse.gmf.mappings.LabelMapping;
39
import org.eclipse.gmf.mappings.MappingEntry;
36
import org.eclipse.gmf.tests.Plugin;
40
import org.eclipse.gmf.tests.Plugin;
37
41
38
public class MigrationPatchesTest extends TestCase {
42
public class MigrationPatchesTest extends TestCase {
Lines 171-181 Link Here
171
		assertTrue("expected diagnostic exception", caughtGenException != null); //$NON-NLS-1$				
175
		assertTrue("expected diagnostic exception", caughtGenException != null); //$NON-NLS-1$				
172
176
173
		assertOnLoadModelMigrationSuccess(genmodelFileName);
177
		assertOnLoadModelMigrationSuccess(genmodelFileName);
178
		checkFeatureLabelModelFacetsMigrated(genmodelFileName);
174
179
175
		URI newUri = temporarySaveMigratedModel(genmodelFileName, "testFeatureLabelModelFacet", "gmfgen");
180
		URI newUri = temporarySaveMigratedModel(genmodelFileName, "testFeatureLabelModelFacet", "gmfgen");
176
		changeNsUriToOldOne(newUri, "gmfgen", "http://www.eclipse.org/gmf/2005/GenModel/2.0");
181
		changeNsUriToOldOne(newUri, "gmfgen", "http://www.eclipse.org/gmf/2005/GenModel/2.0");
177
		
182
		
178
		assertOnLoadModelMigrationSuccess(newUri);
183
		assertOnLoadModelMigrationSuccess(newUri);
184
		checkFeatureLabelModelFacetsMigrated(newUri);
179
	}
185
	}
180
186
181
//	/*
187
//	/*
Lines 317-320 Link Here
317
		assertEquals(8, allContentsSize);
323
		assertEquals(8, allContentsSize);
318
	}
324
	}
319
325
326
	public void testNotChangingOrderOfLabelMappings() throws Exception {
327
		URI gmfmapmodelFileName = createURI("testNotChangingOrderOfLabelMappings.gmfmap"); //$NON-NLS-1$
328
		Exception caughtMapException = assertOrdinaryLoadModelProblems(gmfmapmodelFileName);
329
		assertTrue("expected diagnostic exception", caughtMapException != null); //$NON-NLS-1$
330
331
		assertOnLoadModelMigrationSuccess(gmfmapmodelFileName);
332
		checkOrderOfLabelMappings(gmfmapmodelFileName);
333
334
		URI newMapUri = temporarySaveMigratedModel(gmfmapmodelFileName, "testNotChangingOrderOfLabelMappings", "gmfmap"); //$NON-NLS-1$ //$NON-NLS-2$
335
		changeNsUriToOldOne(newMapUri, "gmfmap", "http://www.eclipse.org/gmf/2005/mappings/2.0"); //$NON-NLS-1$ //$NON-NLS-2$
336
		
337
		assertOnLoadModelMigrationSuccess(newMapUri);
338
		checkOrderOfLabelMappings(newMapUri);
339
	}
340
341
	private void checkOrderOfLabelMappings(URI modelURI) {
342
		ModelLoadHelper loadHelper = new ModelLoadHelper(new ResourceSetImpl(), modelURI);
343
		Resource res = loadHelper.getLoadedResource();
344
		for (Iterator<EObject> it = res.getAllContents(); it.hasNext();) {
345
			EObject next = it.next();
346
			if (next instanceof MappingEntry) {
347
				MappingEntry nextEntry = (MappingEntry) next;
348
				EList<LabelMapping> labelMappings = nextEntry.getLabelMappings();
349
				assertFalse(labelMappings.isEmpty());
350
				assertEquals(5, labelMappings.size());
351
				checkMapping(labelMappings.get(0), false);
352
				checkMapping(labelMappings.get(1), true);
353
				checkMapping(labelMappings.get(2), false);
354
				checkMapping(labelMappings.get(3), true);
355
				checkMapping(labelMappings.get(4), false);
356
			}
357
		}
358
	}
359
360
	private void checkMapping(LabelMapping mapping, boolean shouldBeNarrowed) {
361
		assertEquals(shouldBeNarrowed, mapping instanceof FeatureLabelMapping);
362
		assertNotNull(mapping.getDiagramLabel());
363
		if (shouldBeNarrowed) {
364
			assertFalse(((FeatureLabelMapping)mapping).getFeatures().isEmpty());
365
		}
366
	}
367
368
	private void checkFeatureLabelModelFacetsMigrated(URI uri) {
369
		ModelLoadHelper loadHelper = new ModelLoadHelper(new ResourceSetImpl(), uri);
370
		Resource resource = loadHelper.getLoadedResource();
371
		assertEquals(2, resource.getContents().size());
372
		Object first = resource.getContents().get(0);
373
		assertTrue(first instanceof FeatureLabelModelFacet);
374
		FeatureLabelModelFacet firstFeatureLabelModelFacet = (FeatureLabelModelFacet) first;
375
		assertEquals(1, firstFeatureLabelModelFacet.getMetaFeatures().size());
376
		Object second = resource.getContents().get(1);
377
		assertTrue(second instanceof FeatureLabelModelFacet);
378
		FeatureLabelModelFacet secondFeatureLabelModelFacet = (FeatureLabelModelFacet) second;
379
		assertEquals(2, secondFeatureLabelModelFacet.getMetaFeatures().size());
380
	}
320
}
381
}
(-)models/migration/testFeatureLabelModelFacet.gmfgen (-5 / +17 lines)
Lines 1-7 Link Here
1
<?xml version="1.0" encoding="UTF-8"?>
1
<?xml version="1.0" encoding="UTF-8"?>
2
<gmfgen:FeatureLabelModelFacet xmi:version="2.0"
2
<xmi:XMI xmi:version="2.0"
3
    xmlns:xmi="http://www.omg.org/XMI"
3
    xmlns:xmi="http://www.omg.org/XMI"
4
    xmlns:gmfgen="http://www.eclipse.org/gmf/2005/GenModel"> 
4
    xmlns:gmfgen="http://www.eclipse.org/gmf/2005/GenModel">
5
    <metaFeature name="DeletedFeature">
5
  <gmfgen:FeatureLabelModelFacet
6
    </metaFeature>
6
      viewPattern="{0}:{1}"
7
</gmfgen:FeatureLabelModelFacet>
7
      editPattern="{0}:{1}">
8
    <metaFeature
9
        href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/ENamedElement/name"/>
10
  </gmfgen:FeatureLabelModelFacet>
11
  <gmfgen:CompositeFeatureLabelModelFacet
12
      viewPattern="{0}:{1}"
13
      editPattern="{0}:{1}">
14
    <metaFeatures
15
        href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/ENamedElement/name"/>
16
    <metaFeatures
17
        href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/EClassifier/defaultValue"/>
18
  </gmfgen:CompositeFeatureLabelModelFacet>
19
</xmi:XMI>
(-)models/migration/testNotChangingOrderOfLabelMappings.gmfmap (+43 lines)
Added Link Here
1
<?xml version="1.0" encoding="UTF-8"?>
2
<gmfmap:Mapping xmi:version="2.0"
3
    xmlns:xmi="http://www.omg.org/XMI"
4
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
    xmlns:gmfmap="http://www.eclipse.org/gmf/2005/mappings"
6
    xmlns:gmftool="http://www.eclipse.org/gmf/2005/ToolDefinition">
7
  <nodes>
8
    <containmentFeature
9
        href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EPackage/eClassifiers"/>
10
    <ownedChild>
11
      <domainMetaElement
12
          href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EClass"/>
13
      <labelMappings>
14
        <diagramLabel
15
            href="../../../plugin/org.eclipse.gmf.graphdef/models/basic.gmfgraph#Label"/>
16
      </labelMappings>
17
      <labelMappings>
18
        <diagramLabel
19
            href="../../../plugin/org.eclipse.gmf.graphdef/models/basic.gmfgraph#Label"/>
20
        <features
21
            href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//ENamedElement/name"/>
22
      </labelMappings>
23
      <labelMappings>
24
        <diagramLabel
25
            href="../../../plugin/org.eclipse.gmf.graphdef/models/basic.gmfgraph#Label"/>
26
      </labelMappings>
27
      <labelMappings
28
          viewPattern="{0}:{1}"
29
          editPattern="{0}:{1}">
30
        <diagramLabel
31
            href="../../../plugin/org.eclipse.gmf.graphdef/models/basic.gmfgraph#Label"/>
32
        <features
33
            href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//ENamedElement/name"/>
34
        <features
35
            href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EClassifier/defaultValue"/>
36
      </labelMappings>
37
      <labelMappings>
38
        <diagramLabel
39
            href="../../../plugin/org.eclipse.gmf.graphdef/models/basic.gmfgraph#Label"/>
40
      </labelMappings>
41
    </ownedChild>
42
  </nodes>
43
</gmfmap:Mapping>
(-)plugin.xml (+4 lines)
Lines 8-13 Link Here
8
       class = "org.eclipse.gmf.codegen.gmfgen.GMFGenPackage"
8
       class = "org.eclipse.gmf.codegen.gmfgen.GMFGenPackage"
9
       genModel = "models/gmfgen.genmodel" /> 
9
       genModel = "models/gmfgen.genmodel" /> 
10
    <package 
10
    <package 
11
       uri = "http://www.eclipse.org/gmf/2005/GenModel/2.0" 
12
       class = "org.eclipse.gmf.codegen.gmfgen.GMFGenPackage"
13
       genModel = "models/gmfgen.genmodel" /> 
14
    <package 
11
       uri = "http://www.eclipse.org/gmf/2006/GenModel"
15
       uri = "http://www.eclipse.org/gmf/2006/GenModel"
12
       class = "org.eclipse.gmf.codegen.gmfgen.GMFGenPackage"
16
       class = "org.eclipse.gmf.codegen.gmfgen.GMFGenPackage"
13
       genModel = "models/gmfgen.genmodel" />       
17
       genModel = "models/gmfgen.genmodel" />       
(-)src/org/eclipse/gmf/internal/codegen/util/GMFGenResource.java (-22 lines)
Lines 10-27 Link Here
10
 */
10
 */
11
package org.eclipse.gmf.internal.codegen.util;
11
package org.eclipse.gmf.internal.codegen.util;
12
12
13
import java.util.Arrays;
14
import java.util.Collection;
15
16
import org.eclipse.emf.common.util.URI;
13
import org.eclipse.emf.common.util.URI;
17
import org.eclipse.emf.ecore.resource.Resource;
14
import org.eclipse.emf.ecore.resource.Resource;
18
import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage;
19
import org.eclipse.gmf.internal.common.ToolingResourceFactory;
15
import org.eclipse.gmf.internal.common.ToolingResourceFactory;
20
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegate;
16
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegate;
21
import org.eclipse.gmf.internal.common.migrate.MigrationResource;
17
import org.eclipse.gmf.internal.common.migrate.MigrationResource;
22
18
23
public class GMFGenResource extends MigrationResource {
19
public class GMFGenResource extends MigrationResource {
24
	private Collection<String> myBackwardSupportedURIs;
25
20
26
	public static class Factory extends ToolingResourceFactory {
21
	public static class Factory extends ToolingResourceFactory {
27
		@Override
22
		@Override
Lines 40-60 Link Here
40
		migrationHelper.init();
35
		migrationHelper.init();
41
		return migrationHelper;
36
		return migrationHelper;
42
	}
37
	}
43
44
	@Override
45
	protected Collection<String> getBackwardSupportedURIs() {
46
		if (myBackwardSupportedURIs == null) {
47
			myBackwardSupportedURIs = Arrays.asList(new String[] {
48
					"http://www.eclipse.org/gmf/2005/GenModel", //$NON-NLS-1$
49
					"http://www.eclipse.org/gmf/2005/GenModel/2.0" //$NON-NLS-1$
50
			});
51
		}
52
		return myBackwardSupportedURIs;
53
	}
54
55
	@Override
56
	protected String getMetamodelNsURI() {
57
		return GMFGenPackage.eNS_URI;
58
	}
59
60
}
38
}
(-)src/org/eclipse/gmf/internal/codegen/util/MigrationDelegate.java (-33 / +42 lines)
Lines 10-23 Link Here
10
 */
10
 */
11
package org.eclipse.gmf.internal.codegen.util;
11
package org.eclipse.gmf.internal.codegen.util;
12
12
13
import java.util.Arrays;
14
import java.util.Collection;
13
import java.util.HashMap;
15
import java.util.HashMap;
14
import java.util.Map;
16
import java.util.Map;
15
17
18
import org.eclipse.emf.ecore.EAttribute;
16
import org.eclipse.emf.ecore.EObject;
19
import org.eclipse.emf.ecore.EObject;
17
import org.eclipse.emf.ecore.EReference;
20
import org.eclipse.emf.ecore.EReference;
18
import org.eclipse.emf.ecore.EStructuralFeature;
21
import org.eclipse.emf.ecore.EStructuralFeature;
19
import org.eclipse.emf.ecore.impl.EAttributeImpl;
20
import org.eclipse.emf.ecore.impl.EReferenceImpl;
21
import org.eclipse.emf.ecore.util.EcoreUtil;
22
import org.eclipse.emf.ecore.util.EcoreUtil;
22
import org.eclipse.gmf.codegen.gmfgen.GMFGenFactory;
23
import org.eclipse.gmf.codegen.gmfgen.GMFGenFactory;
23
import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage;
24
import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage;
Lines 27-38 Link Here
27
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegateImpl;
28
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegateImpl;
28
29
29
class MigrationDelegate extends MigrationHelperDelegateImpl {
30
class MigrationDelegate extends MigrationHelperDelegateImpl {
30
	private EReference ourGenAuditContainer_ChildContainers;
31
	private EReference myGenAuditContainer_ChildContainers;
31
	private EReference ourGenAuditContainer_Audits;
32
	private EReference myGenAuditContainer_Audits;
32
	private EAttributeImpl myGenAuditRoot_Id;
33
	private EAttribute myGenAuditRoot_Id;
33
	private EAttributeImpl myGenAuditRoot_Name;
34
	private EAttribute myGenAuditRoot_Name;
34
	private EAttributeImpl myGenAuditRoot_Description;
35
	private EAttribute myGenAuditRoot_Description;
35
	private GenAuditContainer myRootContainer;
36
	private GenAuditContainer myRootContainer;
37
	private Collection<String> myBackwardSupportedURIs;
36
	
38
	
37
	MigrationDelegate() {
39
	MigrationDelegate() {
38
	}
40
	}
Lines 42-48 Link Here
42
						"diagramFileCreatorClassName", //$NON-NLS-1$
44
						"diagramFileCreatorClassName", //$NON-NLS-1$
43
						"preferenceInitializerClassName" //$NON-NLS-1$
45
						"preferenceInitializerClassName" //$NON-NLS-1$
44
		);
46
		);
45
		registerDeletedAttributes(GMFGenPackage.eINSTANCE.getFeatureLabelModelFacet(), "metaFeature"); //$NON-NLS-1$
46
		registerDeletedAttributes(GMFGenPackage.eINSTANCE.getProviderClassNames(), 
47
		registerDeletedAttributes(GMFGenPackage.eINSTANCE.getProviderClassNames(), 
47
						"abstractParserClassName", //$NON-NLS-1$
48
						"abstractParserClassName", //$NON-NLS-1$
48
						"structuralFeatureParserClassName", //$NON-NLS-1$
49
						"structuralFeatureParserClassName", //$NON-NLS-1$
Lines 64-103 Link Here
64
			renamings.put("metaFeature", GMFGenPackage.eINSTANCE.getFeatureLabelModelFacet_MetaFeatures()); //$NON-NLS-1$
65
			renamings.put("metaFeature", GMFGenPackage.eINSTANCE.getFeatureLabelModelFacet_MetaFeatures()); //$NON-NLS-1$
65
			registerRenamedAttributes(GMFGenPackage.eINSTANCE.getFeatureLabelModelFacet(), renamings);
66
			registerRenamedAttributes(GMFGenPackage.eINSTANCE.getFeatureLabelModelFacet(), renamings);
66
		}
67
		}
67
		ourGenAuditContainer_ChildContainers = new EReferenceImpl() {};
68
		registerRenamedType("CompositeFeatureLabelModelFacet", GMFGenPackage.eINSTANCE.getFeatureLabelModelFacet()); //$NON-NLS-1$
68
		ourGenAuditContainer_ChildContainers.setName("childContainers"); //$NON-NLS-1$
69
		myGenAuditContainer_ChildContainers = createNewReference("childContainers", GMFGenPackage.eINSTANCE.getGenAuditContainer(), true); //$NON-NLS-1$
69
		ourGenAuditContainer_ChildContainers.setEType(GMFGenPackage.eINSTANCE.getGenAuditContainer());
70
		myGenAuditContainer_Audits = createNewReference("audits", GMFGenPackage.eINSTANCE.getGenAuditRule(), true); //$NON-NLS-1$
70
		ourGenAuditContainer_ChildContainers.setContainment(true);
71
		myGenAuditRoot_Id = (EAttribute) EcoreUtil.copy(GMFGenPackage.eINSTANCE.getGenAuditContainer_Id());
71
		ourGenAuditContainer_ChildContainers.setLowerBound(0);
72
		myGenAuditRoot_Name = (EAttribute) EcoreUtil.copy(GMFGenPackage.eINSTANCE.getGenAuditContainer_Name());
72
		ourGenAuditContainer_ChildContainers.setUpperBound(-1);
73
		myGenAuditRoot_Description = (EAttribute) EcoreUtil.copy(GMFGenPackage.eINSTANCE.getGenAuditContainer_Description());
73
		ourGenAuditContainer_Audits = new EReferenceImpl() {};
74
		ourGenAuditContainer_Audits.setName("audits"); //$NON-NLS-1$
75
		ourGenAuditContainer_Audits.setEType(GMFGenPackage.eINSTANCE.getGenAuditRule());
76
		ourGenAuditContainer_Audits.setContainment(true);
77
		ourGenAuditContainer_Audits.setLowerBound(0);
78
		ourGenAuditContainer_Audits.setUpperBound(-1);
79
		myGenAuditRoot_Id = (EAttributeImpl) EcoreUtil.copy(GMFGenPackage.eINSTANCE.getGenAuditContainer_Id());
80
		myGenAuditRoot_Name = (EAttributeImpl) EcoreUtil.copy(GMFGenPackage.eINSTANCE.getGenAuditContainer_Name());
81
		myGenAuditRoot_Description = (EAttributeImpl) EcoreUtil.copy(GMFGenPackage.eINSTANCE.getGenAuditContainer_Description());
82
		{
74
		{
83
			Map<String, EStructuralFeature> renamings = new HashMap<String, EStructuralFeature>();
75
			Map<String, EStructuralFeature> renamings = new HashMap<String, EStructuralFeature>();
84
			renamings.put(ourGenAuditContainer_Audits.getName(), ourGenAuditContainer_Audits);
76
			renamings.put(myGenAuditContainer_Audits.getName(), myGenAuditContainer_Audits);
85
			renamings.put(ourGenAuditContainer_ChildContainers.getName(), ourGenAuditContainer_ChildContainers);
77
			renamings.put(myGenAuditContainer_ChildContainers.getName(), myGenAuditContainer_ChildContainers);
86
			registerRenamedAttributes(GMFGenPackage.eINSTANCE.getGenAuditContainer(), renamings);
78
			registerRenamedAttributes(GMFGenPackage.eINSTANCE.getGenAuditContainer(), renamings);
87
		}
79
		}
88
		{
80
		{
89
			Map<String, EStructuralFeature> renamings = new HashMap<String, EStructuralFeature>();
81
			Map<String, EStructuralFeature> renamings = new HashMap<String, EStructuralFeature>();
90
			renamings.put(ourGenAuditContainer_Audits.getName(), ourGenAuditContainer_Audits);
82
			renamings.put(myGenAuditContainer_Audits.getName(), myGenAuditContainer_Audits);
91
			renamings.put(ourGenAuditContainer_ChildContainers.getName(), ourGenAuditContainer_ChildContainers);
83
			renamings.put(myGenAuditContainer_ChildContainers.getName(), myGenAuditContainer_ChildContainers);
92
			renamings.put(myGenAuditRoot_Id.getName(), myGenAuditRoot_Id);
84
			renamings.put(myGenAuditRoot_Id.getName(), myGenAuditRoot_Id);
93
			renamings.put(myGenAuditRoot_Name.getName(), myGenAuditRoot_Name);
85
			renamings.put(myGenAuditRoot_Name.getName(), myGenAuditRoot_Name);
94
			renamings.put(myGenAuditRoot_Description.getName(), myGenAuditRoot_Description);
86
			renamings.put(myGenAuditRoot_Description.getName(), myGenAuditRoot_Description);
95
			registerRenamedAttributes(GMFGenPackage.eINSTANCE.getGenAuditRoot(), renamings);
87
			registerRenamedAttributes(GMFGenPackage.eINSTANCE.getGenAuditRoot(), renamings);
96
		}
88
		}
97
		registerRenamedType("CompositeFeatureLabelModelFacet", GMFGenPackage.eINSTANCE.getFeatureLabelModelFacet()); //$NON-NLS-1$
98
		myRootContainer = null;
89
		myRootContainer = null;
99
	}
90
	}
100
	
91
92
	@Override
93
	public boolean isOldVersionDetected(String uriString) {
94
		return !getMetamodelNsURI().equals(uriString) && getBackwardSupportedURIs().contains(uriString);
95
	}
96
101
	@Override
97
	@Override
102
	public boolean setValue(EObject object, EStructuralFeature feature, Object value, int position) {
98
	public boolean setValue(EObject object, EStructuralFeature feature, Object value, int position) {
103
		if (myGenAuditRoot_Id.equals(feature)) {
99
		if (myGenAuditRoot_Id.equals(feature)) {
Lines 115-141 Link Here
115
			String description = (String) value;
111
			String description = (String) value;
116
			GenAuditContainer rootContainer = getOrCreateRootContainerOnce(root);
112
			GenAuditContainer rootContainer = getOrCreateRootContainerOnce(root);
117
			rootContainer.setDescription(description);
113
			rootContainer.setDescription(description);
118
		} else if (ourGenAuditContainer_ChildContainers.equals(feature) && object instanceof GenAuditRoot) {
114
		} else if (myGenAuditContainer_ChildContainers.equals(feature) && object instanceof GenAuditRoot) {
119
			GenAuditRoot root = (GenAuditRoot)object;
115
			GenAuditRoot root = (GenAuditRoot)object;
120
			GenAuditContainer container = (GenAuditContainer)value;
116
			GenAuditContainer container = (GenAuditContainer)value;
121
			if (myRootContainer != null) {
117
			if (myRootContainer != null) {
122
				container.getPath().add(myRootContainer);
118
				container.getPath().add(myRootContainer);
123
			}
119
			}
124
			root.getCategories().add(container);
120
			root.getCategories().add(container);
125
		} else if (ourGenAuditContainer_Audits.equals(feature) && object instanceof GenAuditRoot) {
121
		} else if (myGenAuditContainer_Audits.equals(feature) && object instanceof GenAuditRoot) {
126
			GenAuditRoot root = (GenAuditRoot)object;
122
			GenAuditRoot root = (GenAuditRoot)object;
127
			GenAuditRule rule = (GenAuditRule)value;
123
			GenAuditRule rule = (GenAuditRule)value;
128
			if (myRootContainer != null) {
124
			if (myRootContainer != null) {
129
				rule.setCategory(myRootContainer);
125
				rule.setCategory(myRootContainer);
130
			}
126
			}
131
			root.getRules().add(rule);
127
			root.getRules().add(rule);
132
		} else if (ourGenAuditContainer_ChildContainers.equals(feature) && object instanceof GenAuditContainer) {
128
		} else if (myGenAuditContainer_ChildContainers.equals(feature) && object instanceof GenAuditContainer) {
133
			GenAuditContainer parent = (GenAuditContainer)object;
129
			GenAuditContainer parent = (GenAuditContainer)object;
134
			GenAuditContainer container = (GenAuditContainer)value;
130
			GenAuditContainer container = (GenAuditContainer)value;
135
			container.getPath().addAll(parent.getPath());
131
			container.getPath().addAll(parent.getPath());
136
			container.getPath().add(parent);
132
			container.getPath().add(parent);
137
			getOrCreateRoot(parent).getCategories().add(container);
133
			getOrCreateRoot(parent).getCategories().add(container);
138
		} else if (ourGenAuditContainer_Audits.equals(feature) && object instanceof GenAuditContainer) {
134
		} else if (myGenAuditContainer_Audits.equals(feature) && object instanceof GenAuditContainer) {
139
			GenAuditContainer container = (GenAuditContainer)object;
135
			GenAuditContainer container = (GenAuditContainer)object;
140
			GenAuditRule rule = (GenAuditRule)value;
136
			GenAuditRule rule = (GenAuditRule)value;
141
			rule.setCategory(container);
137
			rule.setCategory(container);
Lines 164-167 Link Here
164
		return result;
160
		return result;
165
	}
161
	}
166
162
163
	protected Collection<String> getBackwardSupportedURIs() {
164
		if (myBackwardSupportedURIs == null) {
165
			myBackwardSupportedURIs = Arrays.asList(new String[] {
166
					"http://www.eclipse.org/gmf/2005/GenModel", //$NON-NLS-1$
167
					"http://www.eclipse.org/gmf/2005/GenModel/2.0" //$NON-NLS-1$
168
			});
169
		}
170
		return myBackwardSupportedURIs;
171
	}
172
173
	protected String getMetamodelNsURI() {
174
		return GMFGenPackage.eNS_URI;
175
	}
167
}
176
}
(-)plugin.xml (+4 lines)
Lines 8-13 Link Here
8
       class = "org.eclipse.gmf.mappings.GMFMapPackage"
8
       class = "org.eclipse.gmf.mappings.GMFMapPackage"
9
       genModel = "models/gmfmap.genmodel" /> 
9
       genModel = "models/gmfmap.genmodel" /> 
10
    <package 
10
    <package 
11
       uri = "http://www.eclipse.org/gmf/2005/mappings/2.0" 
12
       class = "org.eclipse.gmf.mappings.GMFMapPackage"
13
       genModel = "models/gmfmap.genmodel" /> 
14
    <package 
11
       uri = "http://www.eclipse.org/gmf/2006/mappings"
15
       uri = "http://www.eclipse.org/gmf/2006/mappings"
12
       class = "org.eclipse.gmf.mappings.GMFMapPackage"
16
       class = "org.eclipse.gmf.mappings.GMFMapPackage"
13
       genModel = "models/gmfmap.genmodel" />
17
       genModel = "models/gmfmap.genmodel" />
(-)src/org/eclipse/gmf/internal/map/util/GMFMapResource.java (-23 lines)
Lines 10-28 Link Here
10
 */
10
 */
11
package org.eclipse.gmf.internal.map.util;
11
package org.eclipse.gmf.internal.map.util;
12
12
13
import java.util.Arrays;
14
import java.util.Collection;
15
16
import org.eclipse.emf.common.util.URI;
13
import org.eclipse.emf.common.util.URI;
17
import org.eclipse.emf.ecore.resource.Resource;
14
import org.eclipse.emf.ecore.resource.Resource;
18
import org.eclipse.gmf.internal.common.ToolingResourceFactory;
15
import org.eclipse.gmf.internal.common.ToolingResourceFactory;
19
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegate;
16
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegate;
20
import org.eclipse.gmf.internal.common.migrate.MigrationResource;
17
import org.eclipse.gmf.internal.common.migrate.MigrationResource;
21
import org.eclipse.gmf.mappings.GMFMapPackage;
22
18
23
public class GMFMapResource extends MigrationResource {
19
public class GMFMapResource extends MigrationResource {
24
	private Collection<String> myBackwardSupportedURIs;
25
	
26
	public static class Factory extends ToolingResourceFactory {
20
	public static class Factory extends ToolingResourceFactory {
27
		@Override
21
		@Override
28
		public Resource createResource(URI uri) {
22
		public Resource createResource(URI uri) {
Lines 40-60 Link Here
40
		migrationHelper.init();
34
		migrationHelper.init();
41
		return migrationHelper;
35
		return migrationHelper;
42
	}
36
	}
43
44
	@Override
45
	protected Collection<String> getBackwardSupportedURIs() {
46
		if (myBackwardSupportedURIs == null) {
47
			myBackwardSupportedURIs = Arrays.asList(new String[] {
48
					"http://www.eclipse.org/gmf/2005/mappings", //$NON-NLS-1$
49
					"http://www.eclipse.org/gmf/2005/mappings/2.0" //$NON-NLS-1$
50
			});
51
		}
52
		return myBackwardSupportedURIs;
53
	}
54
55
	@Override
56
	protected String getMetamodelNsURI() {
57
		return GMFMapPackage.eNS_URI;
58
	}
59
60
}
37
}
(-)src/org/eclipse/gmf/internal/map/util/MigrationDelegate.java (-6 / +35 lines)
Lines 11-18 Link Here
11
package org.eclipse.gmf.internal.map.util;
11
package org.eclipse.gmf.internal.map.util;
12
12
13
import java.util.ArrayList;
13
import java.util.ArrayList;
14
import java.util.Arrays;
14
import java.util.Collection;
15
import java.util.Collection;
15
16
17
import org.eclipse.emf.common.util.EList;
16
import org.eclipse.emf.ecore.EObject;
18
import org.eclipse.emf.ecore.EObject;
17
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegateImpl;
19
import org.eclipse.gmf.internal.common.migrate.MigrationHelperDelegateImpl;
18
import org.eclipse.gmf.mappings.FeatureLabelMapping;
20
import org.eclipse.gmf.mappings.FeatureLabelMapping;
Lines 22-27 Link Here
22
24
23
class MigrationDelegate extends MigrationHelperDelegateImpl {
25
class MigrationDelegate extends MigrationHelperDelegateImpl {
24
	private Collection<FeatureLabelMapping> myFeatureLabelMappings;
26
	private Collection<FeatureLabelMapping> myFeatureLabelMappings;
27
	private Collection<String> myBackwardSupportedURIs;
25
	
28
	
26
	MigrationDelegate() {
29
	MigrationDelegate() {
27
	}
30
	}
Lines 29-48 Link Here
29
	void init() {
32
	void init() {
30
		registerNarrowReferenceType(GMFMapPackage.eINSTANCE.getFeatureSeqInitializer_Initializers(), GMFMapPackage.eINSTANCE.getFeatureValueSpec());
33
		registerNarrowReferenceType(GMFMapPackage.eINSTANCE.getFeatureSeqInitializer_Initializers(), GMFMapPackage.eINSTANCE.getFeatureValueSpec());
31
		registerNarrowReferenceType(GMFMapPackage.eINSTANCE.getMappingEntry_LabelMappings(), GMFMapPackage.eINSTANCE.getFeatureLabelMapping());
34
		registerNarrowReferenceType(GMFMapPackage.eINSTANCE.getMappingEntry_LabelMappings(), GMFMapPackage.eINSTANCE.getFeatureLabelMapping());
35
		myFeatureLabelMappings = null;
36
	}
37
38
	@Override
39
	public boolean isOldVersionDetected(String uriString) {
40
		return !getMetamodelNsURI().equals(uriString) && getBackwardSupportedURIs().contains(uriString);
32
	}
41
	}
33
42
34
	@Override
43
	@Override
35
	public void postProcess() {
44
	public void postProcess() {
45
		if (myFeatureLabelMappings == null) {
46
			return;
47
		}
36
		for (FeatureLabelMapping mapping : getSavedFeatureLabelMappings()) {
48
		for (FeatureLabelMapping mapping : getSavedFeatureLabelMappings()) {
37
			if (mapping.getFeatures().isEmpty()) {
49
			if (mapping.getFeatures().isEmpty()) {
38
				MappingEntry entry = mapping.getMapEntry();
50
				MappingEntry entry = mapping.getMapEntry();
39
				entry.getLabelMappings().remove(mapping);
51
				EList<LabelMapping> labelMappings = entry.getLabelMappings();
40
				LabelMapping newMapping = GMFMapPackage.eINSTANCE.getGMFMapFactory().createLabelMapping();
52
				int originalIndex = labelMappings.indexOf(mapping);
41
				newMapping.setDiagramLabel(mapping.getDiagramLabel());
53
				if (originalIndex != -1) {
42
				if (mapping.isReadOnly()) {
54
					LabelMapping newMapping = GMFMapPackage.eINSTANCE.getGMFMapFactory().createLabelMapping();
43
					newMapping.setReadOnly(true);
55
					newMapping.setDiagramLabel(mapping.getDiagramLabel());
56
					if (mapping.isReadOnly()) {
57
						newMapping.setReadOnly(true);
58
					}
59
					labelMappings.set(originalIndex, newMapping);
44
				}
60
				}
45
				entry.getLabelMappings().add(newMapping);
46
			}
61
			}
47
		}
62
		}
48
	}
63
	}
Lines 60-63 Link Here
60
		}
75
		}
61
		return myFeatureLabelMappings;
76
		return myFeatureLabelMappings;
62
	}
77
	}
78
79
	protected Collection<String> getBackwardSupportedURIs() {
80
		if (myBackwardSupportedURIs == null) {
81
			myBackwardSupportedURIs = Arrays.asList(new String[] {
82
					"http://www.eclipse.org/gmf/2005/mappings", //$NON-NLS-1$
83
					"http://www.eclipse.org/gmf/2005/mappings/2.0" //$NON-NLS-1$
84
			});
85
		}
86
		return myBackwardSupportedURIs;
87
	}
88
89
	protected String getMetamodelNsURI() {
90
		return GMFMapPackage.eNS_URI;
91
	}
63
}
92
}
(-)src/org/eclipse/gmf/internal/common/migrate/MigrationHelper.java (-4 / +13 lines)
Lines 37-42 Link Here
37
		myIsDelegateDisabled = !enabled;
37
		myIsDelegateDisabled = !enabled;
38
	}
38
	}
39
39
40
	boolean isEnabled() {
41
		return !myIsDelegateDisabled;
42
	}
43
	
40
	@Override
44
	@Override
41
	public EObject createObject(EFactory factory, EClassifier type) {
45
	public EObject createObject(EFactory factory, EClassifier type) {
42
		if (myIsDelegateDisabled) {
46
		if (myIsDelegateDisabled) {
Lines 104-114 Link Here
104
		myDelegate.postProcess();
108
		myDelegate.postProcess();
105
	}
109
	}
106
	
110
	
107
	protected EStructuralFeature getOriginalFeature(EStructuralFeature feature) {
111
	@Override
108
		if (myNarrowedFeatureTypes == null) {
112
	public void addPrefix(String prefix, String uri) {
109
			myNarrowedFeatureTypes = new HashMap<EStructuralFeature, EStructuralFeature>();
113
		super.addPrefix(prefix, uri);
114
		if (myDelegate.isOldVersionDetected(uri)) {
115
			enableDelegate(true);
110
		}
116
		}
111
		return myNarrowedFeatureTypes.get(feature);
117
	}
118
119
	protected EStructuralFeature getOriginalFeature(EStructuralFeature feature) {
120
		return myNarrowedFeatureTypes == null ? null : myNarrowedFeatureTypes.get(feature);
112
	}
121
	}
113
	
122
	
114
	protected EStructuralFeature addNarrowedFeature(EStructuralFeature originalFeature) {
123
	protected EStructuralFeature addNarrowedFeature(EStructuralFeature originalFeature) {
(-)src/org/eclipse/gmf/internal/common/migrate/MigrationHelperDelegateImpl.java (-10 / +21 lines)
Lines 27-41 Link Here
27
import org.eclipse.emf.ecore.EcorePackage;
27
import org.eclipse.emf.ecore.EcorePackage;
28
28
29
public class MigrationHelperDelegateImpl implements MigrationHelperDelegate {
29
public class MigrationHelperDelegateImpl implements MigrationHelperDelegate {
30
	private final EStructuralFeature myDeletedAttribute = EcoreFactory.eINSTANCE.createEAttribute();
30
31
31
	public MigrationHelperDelegateImpl() {
32
	public MigrationHelperDelegateImpl() {
32
		super();
33
		super();
33
	}
34
		myDeletedAttribute.setName("attributeIsDeleted"); //$NON-NLS-1$
34
35
		myDeletedAttribute.setEType(EcorePackage.eINSTANCE.getEString());
35
	private static EStructuralFeature ourDeletedAttribute = EcoreFactory.eINSTANCE.createEAttribute();
36
	static {
37
		ourDeletedAttribute.setName("attributeIsDeleted"); //$NON-NLS-1$
38
		ourDeletedAttribute.setEType(EcorePackage.eINSTANCE.getEString());
39
	}
36
	}
40
37
41
	private Map<EClassifier, Collection<String>> myDeletedAttributes = new HashMap<EClassifier, Collection<String>>();
38
	private Map<EClassifier, Collection<String>> myDeletedAttributes = new HashMap<EClassifier, Collection<String>>();
Lines 102-117 Link Here
102
	}
99
	}
103
100
104
	public boolean setValue(EObject object, EStructuralFeature feature, Object value, int position) {
101
	public boolean setValue(EObject object, EStructuralFeature feature, Object value, int position) {
105
		return ourDeletedAttribute.equals(feature);
102
		return myDeletedAttribute.equals(feature);
106
	}
103
	}
107
104
108
	public EStructuralFeature getFeature(EClass eClass, String namespaceURI, String name, boolean isElement) {
105
	public EStructuralFeature getFeature(EClass eClass, String namespaceURI, String name, boolean isElement) {
109
		EStructuralFeature result = null;
106
		EStructuralFeature result = null;
110
		EStructuralFeature rename = null;
107
		EStructuralFeature rename = null;
111
		if (isAttributeDeleted(eClass, name)) {
108
		if ((rename = getRenamedFeatureFor(eClass, name)) != null) {
112
			result = ourDeletedAttribute;
113
		} else if ((rename = getRenamedFeatureFor(eClass, name)) != null) {
114
			result = rename;
109
			result = rename;
110
		} else if (isAttributeDeleted(eClass, name)) {
111
			result = myDeletedAttribute;
115
		}
112
		}
116
		return result;
113
		return result;
117
	}
114
	}
Lines 134-137 Link Here
134
131
135
	public void processObject(EObject result) {
132
	public void processObject(EObject result) {
136
	}
133
	}
134
135
	public boolean isOldVersionDetected(String uriString) {
136
		return true;
137
	}
138
	
139
	protected static EReference createNewReference(String name, EClass eType, boolean isContainment) {
140
		EReference ref = EcoreFactory.eINSTANCE.createEReference();
141
		ref.setName(name);
142
		ref.setEType(eType);
143
		ref.setContainment(isContainment);
144
		ref.setLowerBound(0);
145
		ref.setUpperBound(-1);
146
		return ref;
147
	}
137
}
148
}
(-)src/org/eclipse/gmf/internal/common/migrate/MigrationHelperDelegate.java (+2 lines)
Lines 31-34 Link Here
31
	public void postProcess();
31
	public void postProcess();
32
32
33
	public void processObject(EObject result);
33
	public void processObject(EObject result);
34
35
	public boolean isOldVersionDetected(String uriString);
34
}
36
}
(-)src/org/eclipse/gmf/internal/common/migrate/MigrationResource.java (-40 / +1 lines)
Lines 13-34 Link Here
13
13
14
import java.io.IOException;
14
import java.io.IOException;
15
import java.io.InputStream;
15
import java.io.InputStream;
16
import java.util.Collection;
17
import java.util.Map;
16
import java.util.Map;
18
17
19
import org.eclipse.emf.common.util.URI;
18
import org.eclipse.emf.common.util.URI;
20
import org.eclipse.emf.ecore.EPackage;
21
import org.eclipse.emf.ecore.resource.Resource;
19
import org.eclipse.emf.ecore.resource.Resource;
22
import org.eclipse.emf.ecore.xmi.XMLHelper;
20
import org.eclipse.emf.ecore.xmi.XMLHelper;
23
import org.eclipse.emf.ecore.xmi.XMLLoad;
24
import org.eclipse.emf.ecore.xmi.impl.SAXXMIHandler;
25
import org.eclipse.emf.ecore.xmi.impl.XMILoadImpl;
26
import org.eclipse.gmf.internal.common.ToolingResourceFactory.ToolResource;
21
import org.eclipse.gmf.internal.common.ToolingResourceFactory.ToolResource;
27
import org.xml.sax.helpers.DefaultHandler;
28
22
29
public abstract class MigrationResource extends ToolResource {
23
public abstract class MigrationResource extends ToolResource {
30
24
31
	private boolean isOldVersionDetected;
32
	private MigrationHelper myMigrationHelper;
25
	private MigrationHelper myMigrationHelper;
33
26
34
	protected MigrationResource(URI uri) {
27
	protected MigrationResource(URI uri) {
Lines 38-44 Link Here
38
	@Override
31
	@Override
39
	public final void doLoad(InputStream inputStream, Map<?,?> options) throws IOException {
32
	public final void doLoad(InputStream inputStream, Map<?,?> options) throws IOException {
40
		try {
33
		try {
41
			isOldVersionDetected = false;
42
			super.doLoad(inputStream, options);
34
			super.doLoad(inputStream, options);
43
			handlePostLoadSuccess();
35
			handlePostLoadSuccess();
44
		} catch (IOException e) {
36
		} catch (IOException e) {
Lines 50-85 Link Here
50
		}
42
		}
51
	}
43
	}
52
44
53
	@Override
54
	protected XMLLoad createXMLLoad() {
55
		return new XMILoadImpl(createXMLHelper()) {
56
57
			@Override
58
			protected DefaultHandler makeDefaultHandler() {
59
				return new SAXXMIHandler(resource, helper, options) {
60
					@Override
61
					protected EPackage getPackageForURI(String uriString) {
62
						// FIXME move the check to delegate
63
						if (!getMetamodelNsURI().equals(uriString) && getBackwardSupportedURIs().contains(uriString)) {
64
							handleOldVersionDetected();
65
							return super.getPackageForURI(getMetamodelNsURI());
66
						}
67
						return super.getPackageForURI(uriString);
68
					}
69
				};
70
			}
71
		};
72
	}
73
74
	private void handleOldVersionDetected() {
75
		if (myMigrationHelper != null) {
76
			myMigrationHelper.enableDelegate(true);
77
		}
78
		isOldVersionDetected = true;
79
	}
80
81
	protected void handlePostLoadSuccess() {
45
	protected void handlePostLoadSuccess() {
82
		if (isOldVersionDetected) {
46
		if (myMigrationHelper != null && myMigrationHelper.isEnabled()) {
83
			Diagnostic diagnostic = MigrationResource.createMessageDiagnostic(this, Messages.oldModelVersionLoadedMigrationRequired);
47
			Diagnostic diagnostic = MigrationResource.createMessageDiagnostic(this, Messages.oldModelVersionLoadedMigrationRequired);
84
			getWarnings().add(0, diagnostic);
48
			getWarnings().add(0, diagnostic);
85
		}
49
		}
Lines 98-108 Link Here
98
		return myMigrationHelper;
62
		return myMigrationHelper;
99
	}
63
	}
100
64
101
	protected abstract Collection<String> getBackwardSupportedURIs();
102
	protected abstract MigrationHelperDelegate createDelegate();
65
	protected abstract MigrationHelperDelegate createDelegate();
103
	protected abstract String getMetamodelNsURI();
104
66
105
	
106
	/**
67
	/**
107
	 * Creates resource diagnostic wrapping the given message.
68
	 * Creates resource diagnostic wrapping the given message.
108
	 * @param resource the resource associated with the created diagnostic
69
	 * @param resource the resource associated with the created diagnostic

Return to bug 187811