| /* |
| * Copyright (c) 2008, 2010 Borland Software Corporation and others |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Dmitry Stadnik (Borland) - initial API and implementation |
| * Artem Tikhomirov (independent) - [138179] expressions-based labels |
| */ |
| package org.eclipse.gmf.tests.gef; |
| |
| import java.io.ByteArrayInputStream; |
| import java.lang.reflect.Method; |
| |
| import junit.framework.TestCase; |
| |
| import org.eclipse.core.resources.IFolder; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.emf.codegen.ecore.genmodel.GenModel; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.EAttribute; |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.EFactory; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EPackage; |
| import org.eclipse.emf.ecore.EReference; |
| import org.eclipse.emf.ecore.EcoreFactory; |
| import org.eclipse.emf.ecore.EcorePackage; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.emf.ecore.resource.impl.ResourceImpl; |
| import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; |
| import org.eclipse.emf.transaction.TransactionalEditingDomain; |
| import org.eclipse.gmf.codegen.gmfgen.*; |
| import org.eclipse.gmf.internal.bridge.genmodel.GenModelMatcher; |
| import org.eclipse.gmf.internal.bridge.genmodel.RuntimeGenModelAccess; |
| import org.eclipse.gmf.runtime.common.core.command.ICommand; |
| import org.eclipse.gmf.runtime.common.ui.services.parser.IParser; |
| import org.eclipse.gmf.runtime.common.ui.services.parser.IParserProvider; |
| import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter; |
| import org.eclipse.gmf.runtime.emf.ui.services.parser.ParserHintAdapter; |
| import org.eclipse.gmf.runtime.notation.Node; |
| import org.eclipse.gmf.runtime.notation.NotationFactory; |
| import org.eclipse.gmf.runtime.notation.NotationPackage; |
| import org.eclipse.gmf.runtime.notation.View; |
| import org.eclipse.gmf.tests.NeedsSetup; |
| import org.eclipse.gmf.tests.TestConfiguration; |
| import org.eclipse.gmf.tests.Utils; |
| import org.eclipse.gmf.tests.setup.GenProjectSetup; |
| import org.eclipse.gmf.tests.setup.RuntimeBasedGeneratorConfiguration; |
| import org.osgi.framework.Bundle; |
| |
| /** |
| * TODO: |
| * - test GenParsers reconciler |
| * XXX Perhaps, makes sense to change getParser method to access IParsers not through IParserProvider class |
| * but through EditPart#getParser method - as we anyway do that for ExternalParser cases |
| * @author dstadnik |
| */ |
| public class ParsersTest extends TestCase { |
| |
| protected ParsersSetup setup; |
| |
| public ParsersTest(String name) { |
| super(name); |
| } |
| |
| @NeedsSetup |
| public final void configure(ParsersSetup ps) throws Exception { |
| setup = ps; |
| setup.init(); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| setup.dispose(); |
| setup = null; |
| } |
| |
| /** |
| * Test for the primary usecase: single attribute of string type is exposed as a label on diagram. |
| */ |
| public void testDefaultLabel() throws Exception { |
| ResourceSet rs = new ResourceSetImpl(); |
| Resource r = rs.createResource(URI.createURI("uri://org.eclipse.gmf/tests/parkins")); |
| EObject nodkin = createNodkin(); |
| r.getContents().add(nodkin); |
| setAttribute(nodkin, "a1", "aaa"); |
| TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(rs); |
| |
| IParser p = getParser(setup.genModel.a1); |
| String s = p.getPrintString(new EObjectAdapter(nodkin), 0); |
| assertEquals("aaa", s); |
| s = p.getEditString(new EObjectAdapter(nodkin), 0); |
| assertEquals("aaa", s); |
| ICommand c = p.getParseCommand(new EObjectAdapter(nodkin), "bbb", 0); |
| assertTrue(c.canExecute()); |
| c.execute(new NullProgressMonitor(), new EObjectAdapter(nodkin)); |
| s = (String) getAttribute(nodkin, "a1"); |
| assertEquals("bbb", s); |
| } |
| |
| /** |
| * Test label that is based on more than one attribute. |
| */ |
| public void testMultipleAttributes() throws Exception { |
| ResourceSet rs = new ResourceSetImpl(); |
| Resource r = rs.createResource(URI.createURI("uri://org.eclipse.gmf/tests/parkins")); |
| EObject nodkin = createNodkin(); |
| r.getContents().add(nodkin); |
| setAttribute(nodkin, "a1", "aaa"); |
| setAttribute(nodkin, "a2", "xxx"); |
| setAttribute(nodkin, "a3", new Integer(555)); |
| TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(rs); |
| |
| IParser p = getParser(setup.genModel.a123); |
| String s = p.getPrintString(new EObjectAdapter(nodkin), 0); |
| assertEquals("aaa xxx 555", s); |
| s = p.getEditString(new EObjectAdapter(nodkin), 0); |
| assertEquals("aaa xxx 555", s); |
| ICommand c = p.getParseCommand(new EObjectAdapter(nodkin), "bbb yyy 888", 0); |
| assertTrue(c.canExecute()); |
| c.execute(new NullProgressMonitor(), new EObjectAdapter(nodkin)); |
| s = (String) getAttribute(nodkin, "a1"); |
| assertEquals("bbb", s); |
| s = (String) getAttribute(nodkin, "a2"); |
| assertEquals("yyy", s); |
| Integer i = (Integer) getAttribute(nodkin, "a3"); |
| assertEquals(888, i.intValue()); |
| } |
| |
| /** |
| * Test custom message format pattern. |
| */ |
| public void testCustomMessageFormatPatterns() throws Exception { |
| ResourceSet rs = new ResourceSetImpl(); |
| Resource r = rs.createResource(URI.createURI("uri://org.eclipse.gmf/tests/parkins")); |
| EObject nodkin = createNodkin(); |
| r.getContents().add(nodkin); |
| setAttribute(nodkin, "a1", "gold"); |
| setAttribute(nodkin, "a2", "silver"); |
| setAttribute(nodkin, "a3", new Integer(100)); |
| TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(rs); |
| |
| // mf.setViewPattern("{2} x {1} ({0})"); |
| // mf.setEditPattern("[{1}] - {0}, {2}"); |
| // mf.setEditorPattern("{2}/{1}/{0}"); |
| |
| IParser p = getParser(setup.genModel.ac132); |
| String s = p.getPrintString(new EObjectAdapter(nodkin), 0); |
| assertEquals("silver x 100 (gold)", s); |
| s = p.getEditString(new EObjectAdapter(nodkin), 0); |
| assertEquals("silver/100/gold", s); |
| ICommand c = p.getParseCommand(new EObjectAdapter(nodkin), "[50] - ping, pong", 0); |
| assertTrue(c.canExecute()); |
| c.execute(new NullProgressMonitor(), new EObjectAdapter(nodkin)); |
| s = (String) getAttribute(nodkin, "a1"); |
| assertEquals("ping", s); |
| s = (String) getAttribute(nodkin, "a2"); |
| assertEquals("pong", s); |
| Integer i = (Integer) getAttribute(nodkin, "a3"); |
| assertEquals(50, i.intValue()); |
| } |
| |
| /** |
| * Test different set of editable attributes. |
| */ |
| public void testDifferentEditableAttributes() throws Exception { |
| ResourceSet rs = new ResourceSetImpl(); |
| Resource r = rs.createResource(URI.createURI("uri://org.eclipse.gmf/tests/parkins")); |
| EObject nodkin = createNodkin(); |
| r.getContents().add(nodkin); |
| setAttribute(nodkin, "a1", "gold"); |
| setAttribute(nodkin, "a2", "silver"); |
| setAttribute(nodkin, "a3", new Integer(100)); |
| TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(rs); |
| |
| // mf.setViewPattern("{0}*{1}"); |
| // mf.setEditPattern("{0}:{1}"); |
| // mf.setEditorPattern("<{1}>{0}"); |
| |
| IParser p = getParser(setup.genModel.a12e31); |
| String s = p.getPrintString(new EObjectAdapter(nodkin), 0); |
| assertEquals("gold*silver", s); |
| s = p.getEditString(new EObjectAdapter(nodkin), 0); |
| assertEquals("<gold>100", s); |
| ICommand c = p.getParseCommand(new EObjectAdapter(nodkin), "23:ping", 0); |
| assertTrue(c.canExecute()); |
| c.execute(new NullProgressMonitor(), new EObjectAdapter(nodkin)); |
| s = (String) getAttribute(nodkin, "a1"); |
| assertEquals("ping", s); |
| s = (String) getAttribute(nodkin, "a2"); |
| assertEquals("silver", s); |
| Integer i = (Integer) getAttribute(nodkin, "a3"); |
| assertEquals(23, i.intValue()); |
| } |
| |
| /** |
| * Native parsing method test. |
| */ |
| public void testNativeParsing() throws Exception { |
| ResourceSet rs = new ResourceSetImpl(); |
| Resource r = rs.createResource(URI.createURI("uri://org.eclipse.gmf/tests/parkins")); |
| EObject nodkin = createNodkin(); |
| r.getContents().add(nodkin); |
| setAttribute(nodkin, "a2", "aaa"); |
| TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(rs); |
| |
| IParser p = getParser(setup.genModel.an2); |
| String s = p.getPrintString(new EObjectAdapter(nodkin), 0); |
| assertEquals("aaa", s); |
| s = p.getEditString(new EObjectAdapter(nodkin), 0); |
| assertEquals("aaa", s); |
| ICommand c = p.getParseCommand(new EObjectAdapter(nodkin), "bbb", 0); |
| assertTrue(c.canExecute()); |
| c.execute(new NullProgressMonitor(), new EObjectAdapter(nodkin)); |
| s = (String) getAttribute(nodkin, "a2"); |
| assertEquals("bbb", s); |
| } |
| |
| /** |
| * Test printf and regexp parsing methods. |
| */ |
| public void testPrintfAndRegexpParsing() throws Exception { |
| ResourceSet rs = new ResourceSetImpl(); |
| Resource r = rs.createResource(URI.createURI("uri://org.eclipse.gmf/tests/parkins")); |
| EObject nodkin = createNodkin(); |
| r.getContents().add(nodkin); |
| setAttribute(nodkin, "a2", "aaa"); |
| setAttribute(nodkin, "a3", new Integer(6)); |
| TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(rs); |
| |
| IParser p = getParser(setup.genModel.apr23); |
| String s = p.getPrintString(new EObjectAdapter(nodkin), 0); |
| assertEquals("aaa 6", s); |
| s = p.getEditString(new EObjectAdapter(nodkin), 0); |
| assertEquals("aaa 6", s); |
| ICommand c = p.getParseCommand(new EObjectAdapter(nodkin), "bbb 7", 0); |
| assertTrue(c.canExecute()); |
| c.execute(new NullProgressMonitor(), new EObjectAdapter(nodkin)); |
| s = (String) getAttribute(nodkin, "a2"); |
| assertEquals("bbb", s); |
| Integer i = (Integer) getAttribute(nodkin, "a3"); |
| assertEquals(7, i.intValue()); |
| } |
| |
| public void testCustomParserPlainLabelModelFacet() throws Exception { |
| ResourceSet rs = new ResourceSetImpl(); |
| Resource r = rs.createResource(URI.createURI("uri://org.eclipse.gmf/tests/parkins")); |
| EObject nodkin = createNodkin(); |
| r.getContents().add(nodkin); |
| TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(rs); |
| |
| assertTrue("sanity", setup.genModel.a_cp_pmf.getModelFacet().eClass() == GMFGenPackage.eINSTANCE.getLabelModelFacet()); |
| IParser p = getParser(setup.genModel.a_cp_pmf); |
| assertNotNull(p); |
| assertEquals("MyCustomParser", p.getClass().getSimpleName()); |
| String s = p.getPrintString(new EObjectAdapter(nodkin), 0); |
| assertNotNull(s); |
| assertEquals(p.getClass().getName(), s); |
| } |
| |
| // the only difference between this and previous test is use of another label with another model facet |
| public void testCustomParserFeatureLabelModelFacet() throws Exception { |
| ResourceSet rs = new ResourceSetImpl(); |
| Resource r = rs.createResource(URI.createURI("uri://org.eclipse.gmf/tests/parkins")); |
| EObject nodkin = createNodkin(); |
| setAttribute(nodkin, "a1", "aaa"); // not necessary, though |
| r.getContents().add(nodkin); |
| TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(rs); |
| |
| assertTrue("sanity", setup.genModel.a_cp_flmf.getModelFacet().eClass() == GMFGenPackage.eINSTANCE.getFeatureLabelModelFacet()); |
| IParser p = getParser(setup.genModel.a_cp_flmf); |
| assertNotNull(p); |
| assertEquals("MyCustomParser", p.getClass().getSimpleName()); |
| String s = p.getPrintString(new EObjectAdapter(nodkin), 0); |
| assertNotNull(s); |
| assertEquals(p.getClass().getName(), s); |
| } |
| |
| /** |
| * ExternalParser is invoked via ParserService, not through our generated |
| * parser provider class, hence can't use {@link #getParser(GenNodeLabel)} |
| */ |
| @SuppressWarnings("unchecked") |
| public void testExternalParserWithHint() throws Exception { |
| ResourceSet rs = new ResourceSetImpl(); |
| Resource r = rs.createResource(URI.createURI("uri://org.eclipse.gmf/tests/parkins")); |
| EObject nodkin = createNodkin(); |
| r.getContents().add(nodkin); |
| TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(rs); |
| |
| Class<?> epc = setup.project.getBundle().loadClass(setup.genModel.a_extp.getEditPartQualifiedClassName()); |
| final Node notationElement = NotationFactory.eINSTANCE.createNode(); |
| notationElement.getStyles().add(NotationFactory.eINSTANCE.createDescriptionStyle()); |
| notationElement.setElement(notationElement); // since LabelModelFacer is not DesignLabelModelFacet, |
| // getParserElement() would try to resolveSemanticElement, but DiagramParserProvider needs an View with |
| // DescStyle |
| Object epInstance = epc.getConstructor(View.class).newInstance(notationElement); |
| IParser p = (IParser) epc.getMethod("getParser").invoke(epInstance); |
| assertNotNull(p); |
| assertEquals("org.eclipse.gmf.runtime.diagram.ui.providers.parsers.DescriptionParser", p.getClass().getName()); |
| } |
| |
| public void testExpressionLabelParser() throws Exception { |
| ResourceSet rs = new ResourceSetImpl(); |
| Resource r = rs.createResource(URI.createURI("uri://org.eclipse.gmf/tests/parkins")); |
| EObject nodkin = createNodkin(); |
| setAttribute(nodkin, "a1", "aaa"); |
| setAttribute(nodkin, "a2", ""); // if not set, 'if' statement should be rewritten to respect Invalid case (null a2 in a2.size()) |
| r.getContents().add(nodkin); |
| TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(rs); |
| |
| assertTrue("sanity", setup.genModel.a_expr.getModelFacet().eClass() == GMFGenPackage.eINSTANCE.getExpressionLabelModelFacet()); |
| IParser p = getParser(setup.genModel.a_expr); |
| assertNotNull(p); |
| assertEquals("MyExpressionParser", p.getClass().getSimpleName()); |
| String s = p.getPrintString(new EObjectAdapter(nodkin), 0); |
| assertNotNull(s); |
| assertEquals("aaa ==> <none>", s); |
| } |
| |
| |
| protected IParser getParser(final GenNodeLabel label) throws Exception { |
| final GenEditorGenerator editorGen = setup.genModel.diagramkin.getEditorGen(); |
| String ppfqn = editorGen.getLabelParsers().getQualifiedClassName(); |
| Class<?> ppc = setup.project.getBundle().loadClass(ppfqn); |
| Node notationElement = NotationFactory.eINSTANCE.createNode(); // just not to pass null to ParserHintAdapter |
| if (editorGen.getLabelParsers().isExtensibleViaService()) { |
| IParserProvider pp = (IParserProvider) ppc.newInstance(); |
| ParserHintAdapter param = new ParserHintAdapter(notationElement, String.valueOf(label.getVisualID())); |
| return pp.getParser(param); |
| } else { |
| Object ppInstance = ppc.newInstance(); |
| assertFalse(ppInstance instanceof IParserProvider); |
| // ParserUtils.parserAccessorName: "get" + element.getUniqueIdentifier().toFirstUpper() + "Parser" |
| Method parserAccess = ppc.getMethod("get" + label.getUniqueIdentifier() + "Parser"); |
| assertNotNull(parserAccess); |
| return (IParser) parserAccess.invoke(ppInstance); |
| } |
| } |
| |
| protected EObject createNodkin() throws Exception { |
| GenEditorGenerator g = setup.genModel.diagramkin.getEditorGen(); |
| String id = g.getDomainGenModel().getModelPluginID(); |
| Bundle b = Platform.getBundle(id); |
| String mfqn = g.getDomainGenModel().getGenPackages().get(0).getQualifiedFactoryClassName(); |
| Class<?> modelFactoryClass = b.loadClass(mfqn); |
| EFactory f = (EFactory) modelFactoryClass.newInstance(); |
| return f.create(setup.domainModel.nodkin); |
| } |
| |
| protected Object getAttribute(EObject obj, String name) { |
| for (EAttribute a : obj.eClass().getEAllAttributes()) { |
| if (a.getName().equals(name)) { |
| return obj.eGet(a); |
| } |
| } |
| throw new IllegalArgumentException(name); |
| } |
| |
| protected void setAttribute(EObject obj, String name, Object value) { |
| for (EAttribute a : obj.eClass().getEAllAttributes()) { |
| if (a.getName().equals(name)) { |
| obj.eSet(a, value); |
| return; |
| } |
| } |
| throw new IllegalArgumentException(name); |
| } |
| |
| public static class ParsersSetup implements TestConfiguration { |
| |
| public ParsersDomainModel domainModel; |
| public ParsersGenModel genModel; |
| public GenProjectSetup project; |
| private int uses = 0; |
| |
| public ParsersSetup(boolean parsersAsProvider) { |
| domainModel = new ParsersDomainModel(); |
| genModel = new ParsersGenModel(domainModel); |
| final GenEditorGenerator editorGen = genModel.diagramkin.getEditorGen(); |
| editorGen.getLabelParsers().setExtensibleViaService(parsersAsProvider); |
| String pid = editorGen.getPlugin().getID(); |
| editorGen.getPlugin().setID(pid + (parsersAsProvider ? ".provider" : ".direct")); |
| } |
| |
| public void init() throws Exception { |
| uses++; |
| if (project == null) { |
| project = new GenProjectSetup(new RuntimeBasedGeneratorConfiguration()) { |
| @Override |
| protected void hookExtraCodeGeneration(GenEditorGenerator genEditor, IProject project) throws Exception { |
| // need an extra class for custom parser |
| // intentionally using a package different from the rest of the parsers |
| String pkgName = genEditor.getDiagram().getEditPartsPackageName(); |
| String className = "MyCustomParser"; |
| IFolder f = (IFolder) project.findMember(new Path("src").append(pkgName.replace('.', '/'))); |
| assertNotNull(f); |
| String x = "package " + pkgName + ";\n" + |
| "import org.eclipse.core.runtime.IAdaptable;\n" + |
| "import org.eclipse.gmf.runtime.common.core.command.ICommand;\n" + |
| "import org.eclipse.gmf.runtime.common.ui.services.parser.IParser;\n" + |
| "import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus;\n" + |
| "import org.eclipse.jface.text.contentassist.IContentAssistProcessor;\n" + |
| "\n" + |
| "public class " + className + " implements IParser {\n" + |
| "public IContentAssistProcessor getCompletionProcessor(IAdaptable element) { return null; }\n" + |
| "public String getEditString(IAdaptable element, int flags) { return null; }\n" + |
| "public ICommand getParseCommand(IAdaptable element, String newString, int flags) { return null; }\n" + |
| "public String getPrintString(IAdaptable element, int flags) { return MyCustomParser.class.getName(); }\n" + |
| "public boolean isAffectingEvent(Object event, int flags) { return false; }\n" + |
| "public IParserEditStatus isValidEditString(IAdaptable element, String editString) { return null; }}"; |
| |
| f.getFile(className + ".java").create(new ByteArrayInputStream(x.getBytes()), true, new NullProgressMonitor()); |
| } |
| }.init(genModel.diagramkin.getEditorGen()); |
| } |
| } |
| |
| public void dispose() throws Exception { |
| assert uses > 0; |
| uses--; |
| if (uses == 0 && project != null) { |
| project.uninstall(); |
| } |
| } |
| } |
| |
| public static class ParsersDomainModel { |
| |
| public EPackage p; |
| public EClass kanvaskin, nodkin; |
| public EReference refkin; |
| public EAttribute a1, a2, a3; |
| |
| public ParsersDomainModel() { |
| p = EcoreFactory.eINSTANCE.createEPackage(); |
| p.setName("parkin"); |
| p.setNsPrefix("parkin"); |
| p.setNsURI("uri://eclipse/gmf/tests/parkin/" + System.currentTimeMillis() + '/'); |
| new ResourceImpl(URI.createURI("uri://org.eclipse.gmf/tests/parkind")).getContents().add(p); |
| |
| kanvaskin = EcoreFactory.eINSTANCE.createEClass(); |
| kanvaskin.setName("Kanvaskin"); |
| p.getEClassifiers().add(kanvaskin); |
| nodkin = EcoreFactory.eINSTANCE.createEClass(); |
| nodkin.setName("Nodkin"); |
| p.getEClassifiers().add(nodkin); |
| refkin = EcoreFactory.eINSTANCE.createEReference(); |
| refkin.setContainment(true); |
| refkin.setName("refkin"); |
| refkin.setEType(nodkin); |
| kanvaskin.getEStructuralFeatures().add(refkin); |
| |
| a1 = EcoreFactory.eINSTANCE.createEAttribute(); |
| a1.setName("a1"); |
| a1.setEType(EcorePackage.eINSTANCE.getEString()); |
| nodkin.getEStructuralFeatures().add(a1); |
| a2 = EcoreFactory.eINSTANCE.createEAttribute(); |
| a2.setName("a2"); |
| a2.setEType(EcorePackage.eINSTANCE.getEString()); |
| nodkin.getEStructuralFeatures().add(a2); |
| a3 = EcoreFactory.eINSTANCE.createEAttribute(); |
| a3.setName("a3"); |
| a3.setEType(EcorePackage.eINSTANCE.getEInt()); |
| nodkin.getEStructuralFeatures().add(a3); |
| } |
| } |
| |
| public static class ParsersGenModel { |
| |
| private int vid = 100; |
| public GenDiagram diagramkin; |
| public GenTopLevelNode nodkin; |
| public GenNodeLabel a1, a123, ac132, a12e31, an2, apr23; |
| public GenNodeLabel a_cp_pmf, a_cp_flmf, a_extp; // Custom and External Parsers |
| public GenNodeLabel a_expr; // ExpressionLabelParser |
| |
| public ParsersGenModel(ParsersDomainModel domainModel) { |
| GenModel runtimeModel = getRuntimeGenModel(); |
| assert runtimeModel != null; |
| GenModelMatcher gmm = new GenModelMatcher(Utils.createGenModel(domainModel.p)); |
| diagramkin = GMFGenFactory.eINSTANCE.createGenDiagram(); |
| GenEditorGenerator genBurden = GMFGenFactory.eINSTANCE.createGenEditorGenerator(); |
| diagramkin.setDomainDiagramElement(gmm.findGenClass(domainModel.kanvaskin)); |
| genBurden.setDomainGenModel(diagramkin.getDomainDiagramElement().getGenModel()); |
| genBurden.setEditor(GMFGenFactory.eINSTANCE.createGenEditorView()); |
| diagramkin.setDiagramRunTimeClass(Utils.findGenClass(runtimeModel, NotationPackage.eINSTANCE.getDiagram())); |
| diagramkin.setViewmap(createDiagramViewmap()); |
| diagramkin.setVisualID(nextVID()); |
| MetamodelType dgmmType = GMFGenFactory.eINSTANCE.createMetamodelType(); |
| diagramkin.setElementType(dgmmType); |
| genBurden.setDiagram(diagramkin); |
| genBurden.setPlugin(GMFGenFactory.eINSTANCE.createGenPlugin()); |
| genBurden.setDiagramUpdater(GMFGenFactory.eINSTANCE.createGenDiagramUpdater()); |
| genBurden.setLabelParsers(GMFGenFactory.eINSTANCE.createGenParsers()); |
| genBurden.setExpressionProviders(GMFGenFactory.eINSTANCE.createGenExpressionProviderContainer()); |
| new ResourceImpl(URI.createURI("uri://org.eclipse.gmf/tests/parking")).getContents().add(genBurden); |
| |
| nodkin = GMFGenFactory.eINSTANCE.createGenTopLevelNode(); |
| nodkin.setDiagramRunTimeClass(Utils.findGenClass(runtimeModel, NotationPackage.eINSTANCE.getNode())); |
| { |
| TypeModelFacet mf = GMFGenFactory.eINSTANCE.createTypeModelFacet(); |
| mf.setMetaClass(gmm.findGenClass(domainModel.nodkin)); |
| mf.setContainmentMetaFeature(gmm.findGenFeature(domainModel.refkin)); |
| mf.setChildMetaFeature(mf.getContainmentMetaFeature()); |
| nodkin.setModelFacet(mf); |
| } |
| nodkin.setElementType(GMFGenFactory.eINSTANCE.createMetamodelType()); |
| nodkin.setViewmap(createNodeViewmap()); |
| nodkin.setVisualID(nextVID()); |
| diagramkin.getTopLevelNodes().add(nodkin); |
| |
| final PredefinedParser messageFormatParser = GMFGenFactory.eINSTANCE.createPredefinedParser(); |
| final PredefinedParser nativeParser = GMFGenFactory.eINSTANCE.createPredefinedParser(); |
| nativeParser.setViewMethod(LabelTextAccessMethod.NATIVE); |
| nativeParser.setEditMethod(LabelTextAccessMethod.NATIVE); |
| final PredefinedParser printfRegexParser = GMFGenFactory.eINSTANCE.createPredefinedParser(); |
| printfRegexParser.setViewMethod(LabelTextAccessMethod.PRINTF); |
| printfRegexParser.setEditMethod(LabelTextAccessMethod.REGEXP); |
| |
| final CustomParser customParser = GMFGenFactory.eINSTANCE.createCustomParser(); |
| customParser.setQualifiedName(diagramkin.getEditPartsPackageName() + ".MyCustomParser"); |
| customParser.setGenerateBoilerplate(false); // because we will generate this class externally, see ParsersSetup#GenProjectSetup#hookExtraCodeGeneration |
| |
| final ExternalParser externalParser = GMFGenFactory.eINSTANCE.createExternalParser(); |
| externalParser.setHint("\"Description\""); // value of CommonParserHint.DESCIPTION constant, |
| // not the constant itself to manually (visually) assure (in the generated class) the hint is being used. |
| final ExpressionLabelParser expressionParser = GMFGenFactory.eINSTANCE.createExpressionLabelParser(); |
| expressionParser.setExpressionContext(nodkin.getDomainMetaClass()); |
| GenJavaExpressionProvider javaProvider = GMFGenFactory.eINSTANCE.createGenJavaExpressionProvider(); |
| GenExpressionInterpreter oclProvider = GMFGenFactory.eINSTANCE.createGenExpressionInterpreter(); |
| oclProvider.setLanguage(GenLanguage.OCL_LITERAL); |
| GenLiteralExpressionProvider asisProvider = GMFGenFactory.eINSTANCE.createGenLiteralExpressionProvider(); |
| genBurden.getExpressionProviders().getProviders().add(javaProvider); |
| genBurden.getExpressionProviders().getProviders().add(oclProvider); |
| genBurden.getExpressionProviders().getProviders().add(asisProvider); |
| ValueExpression v1 = GMFGenFactory.eINSTANCE.createValueExpression(); |
| v1.setBody("self.a1.concat(' ==> ').concat(if self.a2.size() > 0 then self.a2 else '<none>' endif)"); |
| oclProvider.getExpressions().add(v1); |
| expressionParser.setViewExpression(v1); |
| ValueExpression v2 = GMFGenFactory.eINSTANCE.createValueExpression(); |
| v2.setBody("\"[enter new value here]\""); |
| asisProvider.getExpressions().add(v2); |
| expressionParser.setEditExpression(v2); |
| GenConstraint v3 = GMFGenFactory.eINSTANCE.createGenConstraint(); |
| v3.setBody("return Boolean.valueOf(self.length() > 2);"); |
| javaProvider.getExpressions().add(v3); |
| javaProvider.setInjectExpressionBody(true); |
| expressionParser.setValidateExpression(v3); |
| expressionParser.setClassName("MyExpressionParser"); |
| // |
| genBurden.getLabelParsers().getImplementations().add(messageFormatParser); |
| genBurden.getLabelParsers().getImplementations().add(nativeParser); |
| genBurden.getLabelParsers().getImplementations().add(printfRegexParser); |
| genBurden.getLabelParsers().getImplementations().add(customParser); |
| genBurden.getLabelParsers().getImplementations().add(externalParser); |
| genBurden.getLabelParsers().getImplementations().add(expressionParser); |
| a1 = addAttr(gmm, domainModel.a1); |
| { |
| FeatureLabelModelFacet mf = (FeatureLabelModelFacet) a1.getModelFacet(); |
| mf.setParser(messageFormatParser); |
| } |
| a123 = addAttr(gmm, domainModel.a1, domainModel.a2, domainModel.a3); |
| { |
| FeatureLabelModelFacet mf = (FeatureLabelModelFacet) a123.getModelFacet(); |
| mf.setParser(messageFormatParser); |
| } |
| ac132 = addAttr(gmm, domainModel.a1, domainModel.a3, domainModel.a2); |
| { |
| FeatureLabelModelFacet mf = (FeatureLabelModelFacet) ac132.getModelFacet(); |
| mf.setViewPattern("{2} x {1} ({0})"); |
| mf.setEditPattern("[{1}] - {0}, {2}"); |
| mf.setEditorPattern("{2}/{1}/{0}"); |
| mf.setParser(messageFormatParser); |
| } |
| a12e31 = addAttr(gmm, domainModel.a1, domainModel.a2); |
| { |
| FeatureLabelModelFacet mf = (FeatureLabelModelFacet) a12e31.getModelFacet(); |
| mf.setViewPattern("{0}*{1}"); |
| mf.getEditableMetaFeatures().add(gmm.findGenFeature(domainModel.a3)); |
| mf.getEditableMetaFeatures().add(gmm.findGenFeature(domainModel.a1)); |
| mf.setEditPattern("{0}:{1}"); |
| mf.setEditorPattern("<{1}>{0}"); |
| mf.setParser(messageFormatParser); |
| } |
| an2 = addAttr(gmm, domainModel.a2); |
| an2.getModelFacet().setParser(nativeParser); |
| // |
| apr23 = addAttr(gmm, domainModel.a2, domainModel.a3); |
| apr23.getModelFacet().setParser(printfRegexParser); |
| // |
| a_cp_pmf = addAttr(gmm); |
| a_cp_pmf.setModelFacet(GMFGenFactory.eINSTANCE.createLabelModelFacet()); |
| a_cp_pmf.getModelFacet().setParser(customParser); |
| // |
| a_cp_flmf = addAttr(gmm, domainModel.a1); |
| { |
| // need to get different name than default |
| // which conflicts with a1's name |
| a_cp_flmf.setEditPartClassName("AttrWithCustomParserEditPart"); |
| a_cp_flmf.getModelFacet().setParser(customParser); |
| } |
| a_extp = addAttr(gmm); |
| a_extp.setEditPartClassName("LabelWithExternalParserEditPart"); |
| a_extp.setModelFacet(GMFGenFactory.eINSTANCE.createLabelModelFacet()); |
| a_extp.getModelFacet().setParser(externalParser); |
| // |
| a_expr = addAttr(gmm); |
| a_expr.setEditPartClassName("LabelWithExpressionParserEditPart"); |
| a_expr.setModelFacet(GMFGenFactory.eINSTANCE.createExpressionLabelModelFacet()); |
| a_expr.getModelFacet().setParser(expressionParser); |
| |
| } |
| |
| private int nextVID() { |
| return vid++; |
| } |
| |
| protected GenNodeLabel addAttr(GenModelMatcher gmm, EAttribute... aa) { |
| FeatureLabelModelFacet modelFacet = GMFGenFactory.eINSTANCE.createFeatureLabelModelFacet(); |
| for (EAttribute a : aa) { |
| modelFacet.getMetaFeatures().add(gmm.findGenFeature(a)); |
| } |
| GenNodeLabel label = GMFGenFactory.eINSTANCE.createGenNodeLabel(); |
| label.setModelFacet(modelFacet); |
| label.setVisualID(nextVID()); |
| label.setViewmap(createLabelViewmap()); |
| label.setDiagramRunTimeClass(nodkin.getDiagramRunTimeClass()); |
| nodkin.getLabels().add(label); |
| return label; |
| } |
| |
| private GenModel getRuntimeGenModel() { |
| RuntimeGenModelAccess runtimeAccess = new RuntimeGenModelAccess(); |
| runtimeAccess.ensure(); |
| return runtimeAccess.model(); |
| } |
| |
| private static Viewmap createDiagramViewmap() { |
| FigureViewmap v = GMFGenFactory.eINSTANCE.createFigureViewmap(); |
| v.setFigureQualifiedClassName("org.eclipse.draw2d.FreeformLayer"); |
| return v; |
| } |
| |
| private static Viewmap createNodeViewmap() { |
| FigureViewmap v = GMFGenFactory.eINSTANCE.createFigureViewmap(); |
| v.setFigureQualifiedClassName("org.eclipse.draw2d.RoundedRectangle"); |
| return v; |
| } |
| |
| private static Viewmap createLabelViewmap() { |
| FigureViewmap v = GMFGenFactory.eINSTANCE.createFigureViewmap(); |
| v.setFigureQualifiedClassName("org.eclipse.draw2d.Label"); |
| return v; |
| } |
| } |
| } |