/* * Copyright (c) 2005 Borland Software Corporation * * 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: * Artem Tikhomirov (Borland) - initial API and implementation */ package org.eclipse.gmf.tests.setup; import java.util.Arrays; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.gmf.gmfgraph.AbstractNode; import org.eclipse.gmf.gmfgraph.Canvas; import org.eclipse.gmf.gmfgraph.Compartment; import org.eclipse.gmf.gmfgraph.Connection; import org.eclipse.gmf.gmfgraph.DiagramLabel; import org.eclipse.gmf.gmfgraph.Node; import org.eclipse.gmf.mappings.AuditContainer; import org.eclipse.gmf.mappings.AuditRule; import org.eclipse.gmf.mappings.Auditable; import org.eclipse.gmf.mappings.CanvasMapping; import org.eclipse.gmf.mappings.ChildReference; import org.eclipse.gmf.mappings.CompartmentMapping; import org.eclipse.gmf.mappings.Constraint; import org.eclipse.gmf.mappings.FeatureLabelMapping; import org.eclipse.gmf.mappings.GMFMapFactory; import org.eclipse.gmf.mappings.LinkConstraints; import org.eclipse.gmf.mappings.LinkMapping; import org.eclipse.gmf.mappings.Mapping; import org.eclipse.gmf.mappings.NodeMapping; import org.eclipse.gmf.mappings.Severity; import org.eclipse.gmf.mappings.TopNodeReference; import org.eclipse.gmf.tests.setup.DomainModelSource.LinkData; import org.eclipse.gmf.tests.setup.DomainModelSource.NodeData; public class MapSetup implements MapDefSource { private Mapping myMap; // Node A contains only leaf child nodes private NodeMapping myNodeA; private NodeMapping myNodeAChild; private CompartmentMapping myNodeACompartment; /* * Has label with font * NodeB contains recursive child nodes */ private NodeMapping myNodeB; private NodeMapping myNodeBChild; private CompartmentMapping myNodeBCompartment; private LinkMapping myClassLink; /* * Has link figure with color */ private LinkMapping myRefLink; private LinkMapping myClassLink_Cardinality2; private LinkMapping myClassLink_Cardinality1; private LinkMapping myRefLink_Cardinality2; private LinkMapping myRefLink_Cardinality1; private LinkMapping mySelfClassLink; private LinkMapping mySelfRefLink; private LinkMapping myClassLink2Link; private LinkMapping myClassLinkFromLink; private LinkMapping myClassLinkCrossLink; private LinkMapping myRefLink2Link; private LinkMapping myRefLinkFromLink; private LinkMapping myRefLinkCrossLink; public MapSetup() { } /** * @return <code>this</code> for convenience */ public MapSetup init(DiaDefSource ddSource, DomainModelSource domainSource, ToolDefSource toolDef) { initCanvasMapping(domainSource.getModel(), ddSource.getCanvasDef(), domainSource.getDiagramElement()); if (toolDef.getMainMenu() != null) { myMap.getDiagram().getMenuContributions().add(toolDef.getMainMenu()); } myMap.getDiagram().setPalette(toolDef.getPalette()); initCommonMapping(ddSource, domainSource, toolDef); if (domainSource instanceof DomainModelSetup && ddSource instanceof DiaDefSetup) { initSpecificMapping((DiaDefSetup) ddSource, (DomainModelSetup) domainSource, toolDef); } return this; } private void initSpecificMapping(DiaDefSetup ddSetup, DomainModelSetup dmSetup, ToolDefSource toolDef) { myClassLink_Cardinality2 = createLinkMapping(ddSetup.getLinkDef(), dmSetup.getLinkAsClass_Cardinality2()); myClassLink_Cardinality2.setTool(toolDef.getLinkCreationTool()); myClassLink_Cardinality1 = createLinkMapping(ddSetup.getLinkDef(), dmSetup.getLinkAsClass_Cardinality1()); myClassLink_Cardinality1.setTool(toolDef.getLinkCreationTool()); mySelfClassLink = createLinkMapping(ddSetup.getLinkDef(), dmSetup.getSelfLinkAsClass()); mySelfClassLink.setTool(toolDef.getLinkCreationTool()); myRefLink_Cardinality2 = createLinkMapping(ddSetup.getLinkDef(), null, dmSetup.getLinkAsRef_Cardinality2(), null); myRefLink_Cardinality1 = createLinkMapping(ddSetup.getLinkDef(), null, dmSetup.getLinkAsRef_Cardinality1(), null); mySelfRefLink = createLinkMapping(ddSetup.getLinkDef(), null, dmSetup.getSelfLinkAsRef(), null); myClassLink2Link = createLinkMapping(ddSetup.getLinkDef(), dmSetup.getLink2Link()); myClassLink2Link.setTool(toolDef.getLinkCreationTool()); myClassLinkFromLink = createLinkMapping(ddSetup.getLinkDef(), dmSetup.getLinkFromLink()); myClassLinkFromLink.setTool(toolDef.getLinkCreationTool()); myClassLinkCrossLink = createLinkMapping(ddSetup.getLinkDef(), dmSetup.getLinkCrossLink()); myClassLinkCrossLink.setTool(toolDef.getLinkCreationTool()); myRefLink2Link = createLinkMapping(ddSetup.getLinkDef(), null, dmSetup.getLink2LinkRef(), null); myRefLinkFromLink = createLinkMapping(ddSetup.getLinkDef(), null, dmSetup.getLinkFromLinkRef(), null); myRefLinkCrossLink = createLinkMapping(ddSetup.getLinkDef(), null, dmSetup.getLinkCrossLinkRef(), null); ChildReference childReference = createChildNode(ddSetup.getNodeDef(), ddSetup.getLabelDef(), dmSetup.getChildOfA(), myNodeA); myNodeAChild = childReference.getOwnedChild(); myNodeAChild.setTool(toolDef.getNodeCreationTool()); ChildReference labelOnlyChildReference = createChildNode(ddSetup.getLabelDef(), ddSetup.getLabelDef(), dmSetup.getSecondChildOfA(), myNodeA); myNodeACompartment = createCompartment(ddSetup.getCompartmentA(), myNodeA, new ChildReference[] { childReference, labelOnlyChildReference}); if (myNodeB != null) { childReference = createChildNode(ddSetup.getColoredNodeDef(), ddSetup.getDecoratedLabelDef(), dmSetup.getChildOfB(), myNodeB); myNodeBChild = childReference.getOwnedChild(); myNodeBCompartment = createCompartment(ddSetup.getCompartmentB(), myNodeB, new ChildReference[] { childReference }); ChildReference recursiveChildReference = GMFMapFactory.eINSTANCE.createChildReference(); recursiveChildReference.setReferencedChild(myNodeBChild); recursiveChildReference.setChildrenFeature(dmSetup.getChildOfChildOfB().getContainment()); recursiveChildReference.setContainmentFeature(dmSetup.getChildOfChildOfB().getContainment()); myNodeBChild.getChildren().add(recursiveChildReference); createCompartment(ddSetup.getCompartmentB(), myNodeBChild, new ChildReference[] {recursiveChildReference}); } NodeMapping nodeC = createNodeMapping(ddSetup.getNodeDef(), ddSetup.getLabelDef(), dmSetup.getNodeD()); createChildNode(ddSetup.getNodeDef(), ddSetup.getLabelDef(), dmSetup.getChildOfB(), nodeC); } private void initCommonMapping(DiaDefSource ddSource, DomainModelSource domainSource, ToolDefSource toolDef) { myNodeA = createNodeMapping(ddSource.getNodeDef(), ddSource.getLabelDef(), domainSource.getNodeA()); myNodeA.setContextMenu(toolDef.getNodeContextMenu()); myNodeA.setTool(toolDef.getNodeCreationTool()); DiaDefSetup ddSetup = ddSource instanceof DiaDefSetup ? (DiaDefSetup) ddSource : null; if (domainSource.getNodeB() != null) { Node graphNode = ddSetup != null ? ddSetup.getColoredNodeDef() : ddSource.getNodeDef(); DiagramLabel graphLabel = ddSetup != null ? ddSetup.getDecoratedLabelDef() : ddSource.getLabelDef(); myNodeB = createNodeMapping(graphNode, graphLabel, domainSource.getNodeB()); } myClassLink = createLinkMapping(ddSource.getLinkDef(), domainSource.getLinkAsClass()); myClassLink.setTool(toolDef.getLinkCreationTool()); if (domainSource.getLinkAsRef() != null) { myRefLink = createLinkMapping(ddSetup != null ? ddSetup.getColoredLinkDef() : ddSource.getLinkDef(), null, domainSource.getLinkAsRef(), null); } } private CompartmentMapping createCompartment(Compartment diagramCompartment, NodeMapping parent, ChildReference[] childReferences) { CompartmentMapping compartmentMapping = GMFMapFactory.eINSTANCE.createCompartmentMapping(); compartmentMapping.setCompartment(diagramCompartment); compartmentMapping.getChildren().addAll(Arrays.asList(childReferences)); parent.getCompartments().add(compartmentMapping); return compartmentMapping; } private ChildReference createChildNode(Node diagramNode, DiagramLabel diagramLabel, NodeData domainNode, NodeMapping parent) { NodeMapping nodeMapping = createNodeMapping(diagramNode, domainNode.getEClass(), diagramLabel, domainNode.getNameAttr(), domainNode.getContainment(), false); ChildReference childReference = GMFMapFactory.eINSTANCE.createChildReference(); childReference.setOwnedChild(nodeMapping); childReference.setChildrenFeature(domainNode.getContainment()); childReference.setContainmentFeature(domainNode.getContainment()); parent.getChildren().add(childReference); return childReference; } private void initCanvasMapping(EPackage domainModel, Canvas canvas, EClass diagramElement) { Mapping m = GMFMapFactory.eINSTANCE.createMapping(); CanvasMapping cme = GMFMapFactory.eINSTANCE.createCanvasMapping(); cme.setDiagramCanvas(canvas); cme.setDomainMetaElement(diagramElement); cme.setDomainModel(domainModel); setupCanvasMapping(cme); m.setDiagram(cme); myMap = m; } protected final AuditRule createAudit(String id, String ruleBody, Auditable target, Severity severity, boolean isLiveMode) { AuditRule audit = GMFMapFactory.eINSTANCE.createAuditRule(); audit.setId(id); // add quotation marks to test XML escapes in plugin.xml audit.setName("Name of \"" + id + "\""); //$NON-NLS-1$ //$NON-NLS-2$ audit.setMessage("Violation of \"" + id + "\""); //$NON-NLS-1$ //$NON-NLS-2$ audit.setDescription("Description of \"" + id + "\""); //$NON-NLS-1$ //$NON-NLS-2$ audit.setTarget(target); Constraint rule = GMFMapFactory.eINSTANCE.createConstraint(); rule.setBody(ruleBody); audit.setRule(rule); audit.setSeverity(severity); audit.setUseInLiveMode(isLiveMode); return audit; } protected final AuditContainer createAuditContainer(String id) { AuditContainer container = GMFMapFactory.eINSTANCE.createAuditContainer(); container.setId(id); container.setName("Name of \"" + id + "\""); //$NON-NLS-1$ //$NON-NLS-2$ container.setDescription("Description of \"" + id + "\""); //$NON-NLS-1$ //$NON-NLS-2$ return container; } private LinkMapping createLinkMapping(Connection link, LinkData data) { return createLinkMapping(link, data.getEClass(), data.getTargetFeature(), data.getContainment()); } private LinkMapping createLinkMapping(Connection link, EClass domainMetaElement, EStructuralFeature linkMetafeature, EReference containmentFeature) { LinkMapping lme = GMFMapFactory.eINSTANCE.createLinkMapping(); lme.setDiagramLink(link); lme.setDomainMetaElement(domainMetaElement); lme.setLinkMetaFeature(linkMetafeature); lme.setContainmentFeature(containmentFeature); // FIXME lme.setTool(GMFMapFactory.eINSTANCE.createCreationTool()); if (domainMetaElement == null) { setupReferenceLinkMapping(lme); } else { setupClassLinkMapping(lme); } myMap.getLinks().add(lme); return lme; } private NodeMapping createNodeMapping(Node nodeDef, DiagramLabel labelDef, NodeData nodeData) { return createNodeMapping(nodeDef, nodeData.getEClass(), labelDef, nodeData.getNameAttr(), nodeData.getContainment()); } private NodeMapping createNodeMapping(Node nodeDef, EClass domainMetaElement, DiagramLabel labelDef, EAttribute editFeature, EReference containmentFeature) { return createNodeMapping(nodeDef, domainMetaElement, labelDef, editFeature, containmentFeature, true); } protected final NodeMapping createNodeMapping(Node nodeDef, EClass domainMetaElement, DiagramLabel labelDef, EAttribute editFeature, EReference containmentFeature, boolean addTopNodeReference) { NodeMapping nme = GMFMapFactory.eINSTANCE.createNodeMapping(); nme.setDiagramNode(nodeDef); nme.setDomainMetaElement(domainMetaElement); if (editFeature != null) { final FeatureLabelMapping lm = GMFMapFactory.eINSTANCE.createFeatureLabelMapping(); lm.getFeatures().add(editFeature); lm.setDiagramLabel(labelDef); nme.getLabelMappings().add(lm); } // FIXME nme.setTool(GMFMapFactory.eINSTANCE.createCreationTool()); setupNodeMapping(nme); if (addTopNodeReference){ TopNodeReference tnr = GMFMapFactory.eINSTANCE.createTopNodeReference(); tnr.setOwnedChild(nme); tnr.setContainmentFeature(containmentFeature); myMap.getNodes().add(tnr); } return nme; } protected void addCreationConstraints(LinkMapping linkMapping, String sourceConstraint, String endConstraint) { LinkConstraints constraints = GMFMapFactory.eINSTANCE.createLinkConstraints(); if(sourceConstraint != null) { Constraint source = GMFMapFactory.eINSTANCE.createConstraint(); source.setBody(sourceConstraint); constraints.setSourceEnd(source); } if(endConstraint != null) { Constraint target = GMFMapFactory.eINSTANCE.createConstraint(); target.setBody(endConstraint); constraints.setTargetEnd(target); } linkMapping.setCreationConstraints(constraints); } /** * Allows for extra initialization code. Does nothing by default */ protected void setupCanvasMapping(CanvasMapping cme) { } /** * Allows for extra initialization code. Does nothing by default */ protected void setupNodeMapping(NodeMapping nme) { } /** * Allows for extra initialization code. Does nothing by default */ protected void setupClassLinkMapping(LinkMapping lme) { } /** * Allows for extra initialization code. Does nothing by default */ protected void setupReferenceLinkMapping(LinkMapping lme) { } public final Mapping getMapping() { return myMap; } public NodeMapping getNodeA() { return myNodeA; } public NodeMapping getNodeB() { return myNodeB; } public LinkMapping getClassLink() { return myClassLink; } public LinkMapping getClassLink_Cardinality2() { return myClassLink_Cardinality2; } public LinkMapping getClassLink_Cardinality1() { return myClassLink_Cardinality1; } public LinkMapping getSelfClassLink() { return mySelfClassLink; } public LinkMapping getReferenceLink() { return myRefLink; } public LinkMapping getReferenceLink_Cardinality2() { return myRefLink_Cardinality2; } public LinkMapping getReferenceLink_Cardinality1() { return myRefLink_Cardinality1; } public LinkMapping getSelfReferenceLink() { return mySelfRefLink; } public NodeMapping getNodeAChild() { return myNodeAChild; } public CompartmentMapping getNodeACompartment() { return myNodeACompartment; } public NodeMapping getNodeBChild() { return myNodeBChild; } public CompartmentMapping getNodeBCompartment() { return myNodeBCompartment; } public LinkMapping getClassLink2Link() { return myClassLink2Link; } public LinkMapping getClassLinkFromLink() { return myClassLinkFromLink; } public LinkMapping getClassLinkCrossLink() { return myClassLinkCrossLink; } public LinkMapping getReferenceLink2Link() { return myRefLink2Link; } public LinkMapping getReferenceLinkFromLink() { return myRefLinkFromLink; } public LinkMapping getReferenceLinkCrossLink() { return myRefLinkCrossLink; } }