View | Details | Raw Unified | Return to bug 226149
Collapse All | Expand All

(-)src/org/eclipse/gmf/tests/migration/MigrationPatchesTest.java (+46 lines)
Lines 32-37 Link Here
32
import org.eclipse.emf.ecore.xmi.XMLResource;
32
import org.eclipse.emf.ecore.xmi.XMLResource;
33
import org.eclipse.gmf.codegen.gmfgen.FeatureLabelModelFacet;
33
import org.eclipse.gmf.codegen.gmfgen.FeatureLabelModelFacet;
34
import org.eclipse.gmf.codegen.gmfgen.GenAuditContainer;
34
import org.eclipse.gmf.codegen.gmfgen.GenAuditContainer;
35
import org.eclipse.gmf.codegen.gmfgen.GenAuditContext;
35
import org.eclipse.gmf.codegen.gmfgen.GenAuditRoot;
36
import org.eclipse.gmf.codegen.gmfgen.GenAuditRoot;
36
import org.eclipse.gmf.codegen.gmfgen.GenAuditRule;
37
import org.eclipse.gmf.codegen.gmfgen.GenAuditRule;
37
import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator;
38
import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator;
Lines 856-859 Link Here
856
		assertNotNull(canvas.getLabels().get(0).getFigure());
857
		assertNotNull(canvas.getLabels().get(0).getFigure());
857
		
858
		
858
	}
859
	}
860
861
	public void testAuditContexts() throws Exception {
862
		URI gmfgenFileName = createURI("test226149.gmfgen"); //$NON-NLS-1$
863
		
864
		Exception caughtGenException = assertOrdinaryLoadModelProblems(gmfgenFileName);
865
		assertTrue("expected diagnostic exception", caughtGenException != null); //$NON-NLS-1$				
866
867
		assertOnLoadModelMigrationSuccess(gmfgenFileName);
868
		checkAuditContexts(gmfgenFileName);
869
870
		URI newUri = temporarySaveMigratedModel(gmfgenFileName, "test226149", "gmfgen");
871
		
872
		assertOnLoadModelMigrationDidNothing(newUri);
873
		checkAuditContexts(newUri);
874
	}
875
876
	private void checkAuditContexts(URI modelUri) {
877
		ModelLoadHelper loadHelper = new ModelLoadHelper(new ResourceSetImpl(), modelUri);
878
		Resource resource = loadHelper.getLoadedResource();
879
		
880
		assertEquals(1, resource.getContents().size());
881
		Object first = resource.getContents().get(0);
882
		assertTrue(first instanceof GenEditorGenerator);
883
		GenEditorGenerator editor = (GenEditorGenerator) first;
884
		assertEquals(1, editor.eContents().size());
885
		first = editor.eContents().get(0);
886
		assertTrue(first instanceof GenAuditRoot);
887
		GenAuditRoot root = (GenAuditRoot) first;
888
		assertEquals(6, root.eContents().size());
889
		
890
		assertNotNull(root.getClientContexts());
891
		assertFalse(root.getClientContexts().isEmpty());
892
		assertEquals(2, root.getClientContexts().size());
893
		
894
		GenAuditContext saveMe1 = root.getClientContexts().get(0);
895
		assertEquals("SaveMe1", saveMe1.getId());
896
		assertFalse(saveMe1.getRuleTargets().isEmpty());
897
		assertEquals(2, saveMe1.getRuleTargets().size());
898
899
		GenAuditContext saveMe2 = root.getClientContexts().get(1);
900
		assertEquals("SaveMe2", saveMe2.getId());
901
		assertFalse(saveMe2.getRuleTargets().isEmpty());
902
		assertEquals(1, saveMe2.getRuleTargets().size());
903
	}
904
859
}
905
}
(-)models/migration/test226149.gmfgen (+58 lines)
Added Link Here
1
<?xml version="1.0" encoding="UTF-8"?>
2
<gmfgen:GenEditorGenerator xmi:version="2.0"
3
    xmlns:xmi="http://www.omg.org/XMI"
4
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
    xmlns:gmfgen="http://www.eclipse.org/gmf/2006/GenModel">
6
  <audits>
7
    <categories
8
        id="container1"
9
        name="Container 1"
10
        path="//@audits/@categories.0"
11
        audits="//@audits/@rules.0 //@audits/@rules.1 //@audits/@rules.2"/>
12
    <rules
13
        name="Rule 1"
14
        description=""
15
        contextSelectorLocalClassName="SaveMe1"
16
        id="rule1"
17
        category="//@audits/@categories.0">
18
      <rule
19
          body="a.*"
20
          language="regexp"/>
21
      <target
22
          xsi:type="gmfgen:GenDomainAttributeTarget">
23
        <attribute
24
            href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/ENamedElement/name"/>
25
      </target>
26
    </rules>
27
    <rules
28
        name="Rule 2"
29
        contextSelectorLocalClassName="SaveMe2"
30
        id="rule2"
31
        category="//@audits/@categories.0">
32
      <rule
33
          body="b.*"
34
          language="regexp"/>
35
      <target
36
          xsi:type="gmfgen:GenDomainAttributeTarget">
37
        <attribute
38
            href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/ENamedElement/name"/>
39
      </target>
40
    </rules>
41
    <rules
42
        name="Rule 3"
43
        contextSelectorLocalClassName="SaveMe1"
44
        id="rule3"
45
        category="//@audits/@categories.0">
46
      <rule
47
          body="c.*"
48
          language="regexp"/>
49
      <target
50
          xsi:type="gmfgen:GenDomainAttributeTarget">
51
        <attribute
52
            href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore/ENamedElement/name"/>
53
      </target>
54
    </rules>
55
  </audits>
56
  <domainGenModel
57
      href="../../../plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#/"/>
58
</gmfgen:GenEditorGenerator>
(-)src/org/eclipse/gmf/internal/codegen/util/MigrationDelegate.java (-30 / +116 lines)
Lines 1-5 Link Here
1
/*
1
/*
2
 * Copyright (c) 2007 Borland Software Corporation
2
 * Copyright (c) 2007, 2008 Borland Software Corporation
3
 * 
3
 * 
4
 * All rights reserved. This program and the accompanying materials are made
4
 * All rights reserved. This program and the accompanying materials are made
5
 * available under the terms of the Eclipse Public License v1.0 which
5
 * available under the terms of the Eclipse Public License v1.0 which
Lines 20-31 Link Here
20
import org.eclipse.emf.ecore.EObject;
20
import org.eclipse.emf.ecore.EObject;
21
import org.eclipse.emf.ecore.EReference;
21
import org.eclipse.emf.ecore.EReference;
22
import org.eclipse.emf.ecore.EStructuralFeature;
22
import org.eclipse.emf.ecore.EStructuralFeature;
23
import org.eclipse.emf.ecore.EcorePackage;
23
import org.eclipse.emf.ecore.util.EcoreUtil;
24
import org.eclipse.emf.ecore.util.EcoreUtil;
24
import org.eclipse.gmf.codegen.gmfgen.GMFGenFactory;
25
import org.eclipse.gmf.codegen.gmfgen.GMFGenFactory;
25
import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage;
26
import org.eclipse.gmf.codegen.gmfgen.GMFGenPackage;
26
import org.eclipse.gmf.codegen.gmfgen.GenAuditContainer;
27
import org.eclipse.gmf.codegen.gmfgen.GenAuditContainer;
28
import org.eclipse.gmf.codegen.gmfgen.GenAuditContext;
27
import org.eclipse.gmf.codegen.gmfgen.GenAuditRoot;
29
import org.eclipse.gmf.codegen.gmfgen.GenAuditRoot;
28
import org.eclipse.gmf.codegen.gmfgen.GenAuditRule;
30
import org.eclipse.gmf.codegen.gmfgen.GenAuditRule;
31
import org.eclipse.gmf.codegen.gmfgen.GenAuditable;
29
import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator;
32
import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator;
30
import org.eclipse.gmf.codegen.gmfgen.GenExpressionInterpreter;
33
import org.eclipse.gmf.codegen.gmfgen.GenExpressionInterpreter;
31
import org.eclipse.gmf.codegen.gmfgen.GenExpressionProviderContainer;
34
import org.eclipse.gmf.codegen.gmfgen.GenExpressionProviderContainer;
Lines 41-46 Link Here
41
	private GenAuditContainer myRootContainer;
44
	private GenAuditContainer myRootContainer;
42
	private Map<GenExpressionInterpreter, Collection<String>> myRequiredPlugins;
45
	private Map<GenExpressionInterpreter, Collection<String>> myRequiredPlugins;
43
	private GenExpressionProviderContainer myProvidersContainer;
46
	private GenExpressionProviderContainer myProvidersContainer;
47
	private EAttribute myGenAuditRule_ContextSelectorLocalClassName;
48
	private Map<GenAuditRule, String> myAuditContexts;
44
	
49
	
45
	MigrationDelegate() {
50
	MigrationDelegate() {
46
	}
51
	}
Lines 95-107 Link Here
95
			registerRenamedAttributes(GMFGenPackage.eINSTANCE.getGenAuditRoot(), renamings);
100
			registerRenamedAttributes(GMFGenPackage.eINSTANCE.getGenAuditRoot(), renamings);
96
		}
101
		}
97
102
98
		//registerNarrowReferenceType(GMFGenPackage.eINSTANCE.getGenFeatureSeqInitializer_Initializers(), GMFGenPackage.eINSTANCE.getGenFeatureValueSpec());
103
		myGenAuditRule_ContextSelectorLocalClassName = createNewAttribute("contextSelectorLocalClassName", EcorePackage.eINSTANCE.getEString(), false);
104
		registerRenamedAttribute(GMFGenPackage.eINSTANCE.getGenAuditRule(), myGenAuditRule_ContextSelectorLocalClassName.getName(), myGenAuditRule_ContextSelectorLocalClassName);
99
		// --->
105
		// --->
100
		registerNarrowedAbstractType("GenFeatureInitializer", GMFGenPackage.eINSTANCE.getGenFeatureValueSpec()); //$NON-NLS-1$
106
		registerNarrowedAbstractType("GenFeatureInitializer", GMFGenPackage.eINSTANCE.getGenFeatureValueSpec()); //$NON-NLS-1$
101
107
102
		myRootContainer = null;
108
		myRootContainer = null;
103
		myProvidersContainer = null;
109
		myProvidersContainer = null;
104
		myRequiredPlugins = null;
110
		myRequiredPlugins = null;
111
		myAuditContexts = null;
105
	}
112
	}
106
	
113
	
107
	@Override
114
	@Override
Lines 110-116 Link Here
110
			GenExpressionInterpreter expressionInterpreter = (GenExpressionInterpreter) object;
117
			GenExpressionInterpreter expressionInterpreter = (GenExpressionInterpreter) object;
111
			String requiredPlugin = (String) value;
118
			String requiredPlugin = (String) value;
112
			saveRequiredPlugin(expressionInterpreter, requiredPlugin);
119
			saveRequiredPlugin(expressionInterpreter, requiredPlugin);
113
	    } else if (myGenAuditRoot_Id.equals(feature)) {
120
		} else if (myGenAuditRoot_Id.equals(feature)) {
114
			GenAuditRoot root = (GenAuditRoot) object;
121
			GenAuditRoot root = (GenAuditRoot) object;
115
			String id = (String) value;
122
			String id = (String) value;
116
			GenAuditContainer rootContainer = getOrCreateRootContainerOnce(root);
123
			GenAuditContainer rootContainer = getOrCreateRootContainerOnce(root);
Lines 156-168 Link Here
156
			GenAuditRule rule = (GenAuditRule)value;
163
			GenAuditRule rule = (GenAuditRule)value;
157
			rule.setCategory(container);
164
			rule.setCategory(container);
158
			getOrCreateRoot(container).getRules().add(rule);
165
			getOrCreateRoot(container).getRules().add(rule);
159
	    } else {
166
		} else if (myGenAuditRule_ContextSelectorLocalClassName.equals(feature)) {
167
			GenAuditRule rule = (GenAuditRule) object;
168
			String className = (String) value;
169
			saveAuditContext(rule, className);
170
		} else {
160
			// other cases are would be processed as defaults
171
			// other cases are would be processed as defaults
161
			return super.setValue(object, feature, value, position);
172
			return super.setValue(object, feature, value, position);
162
		}
173
		}
163
		return true;
174
		return true;
164
	}
175
	}
165
176
177
	private void saveAuditContext(GenAuditRule rule, String className) {
178
		if (myAuditContexts == null) {
179
			myAuditContexts = new LinkedHashMap<GenAuditRule, String>();
180
		}
181
		myAuditContexts.put(rule, className);
182
	}
183
	
184
	private Map<GenAuditRule, String> getSavedAuditContexts() {
185
		return myAuditContexts;
186
	}
187
166
	private void saveRequiredPlugin(GenExpressionInterpreter expressionProvider, String requiredPlugin) {
188
	private void saveRequiredPlugin(GenExpressionInterpreter expressionProvider, String requiredPlugin) {
167
		if (myRequiredPlugins == null) {
189
		if (myRequiredPlugins == null) {
168
			myRequiredPlugins = new LinkedHashMap<GenExpressionInterpreter, Collection<String>>();
190
			myRequiredPlugins = new LinkedHashMap<GenExpressionInterpreter, Collection<String>>();
Lines 181-210 Link Here
181
203
182
	@Override
204
	@Override
183
	public void preResolve() {
205
	public void preResolve() {
184
		if (getSavedRequiredPlugins() == null) {
206
		if (getSavedRequiredPlugins() != null) {
185
			return;
207
			for (GenExpressionInterpreter expressionProvider : getSavedRequiredPlugins().keySet()) {
208
				GenExpressionProviderContainer container = expressionProvider.getContainer();
209
				if (container == null) {
210
					container = getOrCreateParenlessProvidersContainerOnce(expressionProvider);
211
					container.getProviders().add(expressionProvider);
212
				}
213
				GenEditorGenerator editor = container.getEditorGen();
214
				if (editor == null) {
215
					editor = GMFGenFactory.eINSTANCE.createGenEditorGenerator();
216
					container.eResource().getContents().add(editor);
217
					editor.setExpressionProviders(container);
218
				}
219
				GenPlugin plugin = editor.getPlugin();
220
				if (plugin == null) {
221
					plugin = GMFGenFactory.eINSTANCE.createGenPlugin();
222
					editor.setPlugin(plugin);
223
				}
224
				plugin.getRequiredPlugins().addAll(getSavedRequiredPlugins().get(expressionProvider));
225
				fireMigrationApplied(true);
226
			}
227
			getSavedRequiredPlugins().clear();
186
		}
228
		}
187
		for (GenExpressionInterpreter expressionProvider : getSavedRequiredPlugins().keySet()) {
229
		if (getSavedAuditContexts() != null) {
188
			GenExpressionProviderContainer container = expressionProvider.getContainer();
230
			for (GenAuditRule rule : getSavedAuditContexts().keySet()) {
189
			if (container == null) {
231
				GenAuditRoot root = getOrCreateRoot(rule);
190
				container = getOrCreateParenlessProvidersContainerOnce(expressionProvider);
232
				String className = getSavedAuditContexts().get(rule);
191
				container.getProviders().add(expressionProvider);
233
				GenAuditContext context = getOrCreateContext(root, className);
192
			}
234
				GenAuditable target = rule.getTarget();
193
			GenEditorGenerator editor = container.getEditorGen();
235
				if (target != null) {
194
			if (editor == null) {
236
					target.setContextSelector(context);
195
				editor = GMFGenFactory.eINSTANCE.createGenEditorGenerator();
237
					fireMigrationApplied(true);
196
				container.eResource().getContents().add(editor);
238
				}
197
				editor.setExpressionProviders(container);
198
			}
199
			GenPlugin plugin = editor.getPlugin();
200
			if (plugin == null) {
201
				plugin = GMFGenFactory.eINSTANCE.createGenPlugin();
202
				editor.setPlugin(plugin);
203
			}
239
			}
204
			plugin.getRequiredPlugins().addAll(getSavedRequiredPlugins().get(expressionProvider));
240
			getSavedAuditContexts().clear();
205
			fireMigrationApplied(true);
206
		}
241
		}
207
		getSavedRequiredPlugins().clear();
242
	}
243
	
244
	private GenAuditContext getOrCreateContext(GenAuditRoot root, String className) {
245
		GenAuditContext context = null;
246
		for (GenAuditContext next : root.getClientContexts()) {
247
			String explicit = next.getClassName();
248
			if (className.equals(explicit) || (explicit == null && className.equals(next.getId()))) {
249
				context = next;
250
				break;
251
			}
252
		}
253
		if (context == null) {
254
			context = GMFGenFactory.eINSTANCE.createGenAuditContext();
255
			String id = generateUnique(root, className);
256
			context.setId(id);
257
			if (!id.equals(className)) {
258
				context.setClassName(className);
259
			}
260
			root.getClientContexts().add(context);
261
		}
262
		return context;
263
	}
264
265
	private String generateUnique(GenAuditRoot root, String defaultId) {
266
		String id = defaultId;
267
		int i = 0;
268
		boolean haveSuchId = false;
269
		do {
270
			haveSuchId = false;
271
			for (GenAuditContext next : root.getClientContexts()) {
272
				if (id.equals(next.getId())) {
273
					haveSuchId = true;
274
					id = defaultId + (++i);
275
					break;
276
				}
277
			}
278
		} while (haveSuchId);
279
		return id;
208
	}
280
	}
209
281
210
	private GenExpressionProviderContainer getOrCreateParenlessProvidersContainerOnce(GenExpressionInterpreter expressionProvider) {
282
	private GenExpressionProviderContainer getOrCreateParenlessProvidersContainerOnce(GenExpressionInterpreter expressionProvider) {
Lines 226-238 Link Here
226
	private GenAuditRoot getOrCreateRoot(GenAuditContainer auditContainer) {
298
	private GenAuditRoot getOrCreateRoot(GenAuditContainer auditContainer) {
227
		GenAuditRoot result = auditContainer.getRoot();
299
		GenAuditRoot result = auditContainer.getRoot();
228
		if (result == null) {
300
		if (result == null) {
229
			result = GMFGenFactory.eINSTANCE.createGenAuditRoot();
301
			result = createRoot(auditContainer);
230
			if (auditContainer.eContainer() == null) {
231
				auditContainer.eResource().getContents().add(result);
232
				fireMigrationApplied(true);
233
			}
234
			result.getCategories().add(auditContainer);
302
			result.getCategories().add(auditContainer);
235
		}
303
		}
236
		return result;
304
		return result;
237
	}
305
	}
306
307
	private GenAuditRoot getOrCreateRoot(GenAuditRule auditRule) {
308
		GenAuditRoot result = auditRule.getRoot();
309
		if (result == null) {
310
			result = createRoot(auditRule);
311
			result.getRules().add(auditRule);
312
		}
313
		return result;
314
	}
315
316
	private GenAuditRoot createRoot(EObject child) {
317
		GenAuditRoot result = GMFGenFactory.eINSTANCE.createGenAuditRoot();
318
		if (child.eContainer() == null) {
319
			child.eResource().getContents().add(result);
320
			fireMigrationApplied(true);
321
		}
322
		return result;
323
	}
238
}
324
}

Return to bug 226149