/*
* Copyright (c) 2005, 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:
* Radek Dvorak (Borland) - initial API and implementation
* Artem Tikhomirov (Borland) - tests for enhanced/refactored java implementations
* (method injection, exceptions, method names)
*/
package org.eclipse.gmf.tests.setup;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.junit.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.codegen.ecore.genmodel.GenBase;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
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.util.Diagnostician;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.gmf.codegen.gmfgen.GenJavaExpressionProvider;
import org.eclipse.gmf.mappings.*;
import org.eclipse.gmf.tests.EPath;
import org.eclipse.gmf.tests.Plugin;
import org.eclipse.gmf.tests.TestConfiguration;
import org.osgi.framework.BundleException;
public class LinksSessionSetup extends SessionSetup {
public static String modelURI = "/models/links/links.ecore"; //$NON-NLS-1$
protected LinksSessionSetup(GeneratorConfiguration genConfig) {
super(genConfig);
}
@TestConfiguration.FactoryMethod
public static LinksSessionSetup newInstance() {
if (factoryClosed) {
return null;
}
return new LinksSessionSetup(new RuntimeBasedGeneratorConfiguration());
}
@Override
protected GenProjectSetup createGenProject(GeneratorConfiguration generatorConfiguration) throws BundleException {
GenProjectSetup genProjectSetup = super.createGenProject(generatorConfiguration);
assertValid("Test gmfmap model must be valid", EcoreUtil.getRootContainer(getMapModel().getMapping())); //$NON-NLS-1$
// assertValid("Test gmfgen model must be valid", EcoreUtil.getRootContainer(getGenModel().getGenDiagram())); //$NON-NLS-1$
return genProjectSetup;
}
static void assertValid(String message, EObject target) {
Diagnostic validationDiagnostic = Diagnostician.INSTANCE.validate(target);
IStatus validationStatus = BasicDiagnostic.toIStatus(validationDiagnostic);
if(!validationStatus.isOK()) {
Plugin.getInstance().getLog().log(validationStatus);
}
Assert.assertTrue(MessageFormat.format("{0}. {1}. See error log for details.", message, validationStatus.getMessage()), validationStatus.isOK()); //$NON-NLS-1$
}
protected DomainModelSource createDomainModel() {
DomainModelFileSetup modelSetup = new DomainModelFileSetup() {
private EPath modelAccess;
@Override
public DomainModelSource init(URI sourceURI) {
DomainModelSource r = super.init(sourceURI);
modelAccess = new EPath(getModel().eResource());
return r;
}
public EClass getDiagramElement() {
return modelAccess.findClass("//Root"); //$NON-NLS-1$
}
public NodeData getNodeA() {
EClass n = modelAccess.findClass("//LinkContainer"); //$NON-NLS-1$
EReference c = modelAccess.findReference("//Root/elements"); //$NON-NLS-1$
return new NodeData(n, null, c);
}
public NodeData getNodeB() {
EClass n = modelAccess.findClass("//Node"); //$NON-NLS-1$
EReference c = modelAccess.findReference("//Root/elements"); //$NON-NLS-1$
return new NodeData(n, null, c);
}
public LinkData getLinkAsClass() {
EClass l = modelAccess.findClass("//Link"); //$NON-NLS-1$
EReference t = modelAccess.findReference("//Link/target"); //$NON-NLS-1$
EReference c = modelAccess.findReference("//LinkContainer/childNodes"); //$NON-NLS-1$
return new LinkData(l, t, c);
}
public EReference getLinkAsRef() {
return modelAccess.findReference("//LinkContainer/referenceOnlyLink"); //$NON-NLS-1$
}
};
try {
modelSetup.init(Plugin.createURI(modelURI));
} catch (IOException e) {
e.printStackTrace();
Assert.fail("Failed to setup the domain model. " + e.getLocalizedMessage()); //$NON-NLS-1$
}
return modelSetup;
}
protected DiaGenSource createGenModel() {
DiaGenSetup diaGenSetup = new DiaGenSetup().init(getMapModel());
// force generation of validation support
diaGenSetup.getGenDiagram().setValidationEnabled(true);
diaGenSetup.getGenDiagram().setLiveValidationUIFeedback(true);
diaGenSetup.getGenDiagram().setValidationDecorators(true);
// fix Prefixes for nested packages
GenModel genModel = diaGenSetup.getGenDiagram().getDiagram().getDomainDiagramElement().getGenModel();
for (GenPackage nextGenPackage : genModel.getAllGenPackagesWithClassifiers()) {
if(nextGenPackage.getPrefix() == null || nextGenPackage.getPrefix().length() == 0) {
StringBuffer buf = new StringBuffer(nextGenPackage.getPackageName());
buf.setCharAt(0, Character.toUpperCase(buf.charAt(0)));
nextGenPackage.setPrefix(buf.toString());
}
}
for (Object o : diaGenSetup.getGenDiagram().getEditorGen().getExpressionProviders().getProviders()) {
if (o instanceof GenJavaExpressionProvider) {
((GenJavaExpressionProvider) o).setThrowException(false);
// otherwise, validation listener won't report audit which failed with exception
// as completed, and AuditRulesTest would fail.
break; // expect no more than a single java provider - there should be at most 1
}
}
ResourceSet rset = getMapModel().getMapping().eResource().getResourceSet();
bindGMFGenModelToResourceSet(diaGenSetup, rset);
return diaGenSetup;
}
@SuppressWarnings("synthetic-access")
protected MapDefSource createMapModel() {
MapSetup mapDefSource = new LinksMapSetup();
return mapDefSource.init(getGraphDefModel(), getDomainModel(), new ToolDefSetup());
}
private void bindGMFGenModelToResourceSet(DiaGenSetup diaGenSetup, ResourceSet rset) {
rset.createResource(URI.createURI("uri:/myTestModel/gmfgen")).getContents().add(EcoreUtil.getRootContainer(diaGenSetup.getGenDiagram())); //$NON-NLS-1$
Set<GenModel> genModels = new HashSet<GenModel>();
GenModel domainGenModel = diaGenSetup.getGenDiagram().getDomainDiagramElement().getGenModel();
genModels.add(domainGenModel);
Map<EObject, ?> crossRefs = EcoreUtil.ExternalCrossReferencer.find(EcoreUtil.getRootContainer(diaGenSetup.getGenDiagram()));
for (EObject crossReferenced : crossRefs.keySet()) {
if(crossReferenced.eResource() == null && crossReferenced instanceof GenBase) {
genModels.add(((GenBase)crossReferenced).getGenModel());
}
}
int modelID = 0;
for (GenModel nextGenModel : genModels) {
rset.createResource(URI.createURI("uri:/myTestModel/genmodel/" + modelID++)).getContents().add(nextGenModel); //$NON-NLS-1$
}
}
/*
* Custom map-setup
*/
private static final class LinksMapSetup extends MapSetup {
private EPath modelAccess;
public MapSetup init(DiaDefSource ddSource, DomainModelSource domainSource, ToolDefSource toolDef) {
this.modelAccess = new EPath(domainSource.getModel().eResource());
super.init(ddSource, domainSource, toolDef);
// add mapping for InvalidNode, this node will be never created in tests
// but used for generation purposes of java expression support
EClass invalidNodeMetaClass = modelAccess.findClass("//InvalidNode"); //$NON-NLS-1$
createNodeMapping(ddSource.getNodeDef(),
invalidNodeMetaClass, null, null,
modelAccess.findReference("//Root/elements"), //$NON-NLS-1$
true);
// Note: needs metrics to be initialized before audits as audits may reference metric
initMetricContainer(domainSource);
initAudits();
// eliminate dangling HREFs diagnostics
bindToResourceSet(ddSource, toolDef, domainSource.getModel().eResource().getResourceSet());
return this;
}
private void bindToResourceSet(DiaDefSource ddSource, ToolDefSource toolDef, ResourceSet rs) {
Resource mapRsrc = rs.createResource(URI.createURI("uri:/myTestModel/gmfmap")); //$NON-NLS-1$
mapRsrc.getContents().add(getMapping());
Resource graphRsrc = rs.createResource(URI.createURI("uri:/myTestModel/gmfgraph")); //$NON-NLS-1$
graphRsrc.getContents().add(ddSource.getCanvasDef());
Resource toolRsrc = rs.createResource(URI.createURI("uri:/myTestModel/gmftool")); //$NON-NLS-1$
toolRsrc.getContents().add(toolDef.getRegistry());
}
/* Setup element initializers */
protected void setupNodeMapping(NodeMapping nme) {
final EClass nodeEClass = modelAccess.findClass("//Node");
final EStructuralFeature node_nestedNodes1 = modelAccess.findFeature("//Node/nestedNodes1");
if("LinkContainer".equals(nme.getDomainContext().getName())) { //$NON-NLS-1$
EPath ecoreModelAccess = new EPath(EcorePackage.eINSTANCE.eResource());
nme.setDomainInitializer(createFSeqInit(null,
featureValOCL("//LinkContainer/enumAttr_Init", "TestEnum::LIT1"), //$NON-NLS-1$ //$NON-NLS-2$
featureValOCL("//LinkContainer/manyEnumAttr_Init", "Sequence { TestEnum::LIT0, TestEnum::LIT1 }"), //$NON-NLS-1$ //$NON-NLS-2$
featureValOCL("//LinkContainer/reference_Init", "Bag { self }" ), //$NON-NLS-1$ //$NON-NLS-2$
featureValOCL("//LinkContainer/manyRealAttr_Init", "Sequence { 1, 1.5 }" ), //$NON-NLS-1$ //$NON-NLS-2$
// test complex structure creation
refNewElement(modelAccess.findFeature("//LinkContainer/refNewElement"), //$NON-NLS-1$
createFSeqInit(null,
featureValOCL(ecoreModelAccess.findFeature("//ENamedElement/name"), "'EClass'"), //$NON-NLS-1$ //$NON-NLS-2$
refNewElement(ecoreModelAccess.findFeature("//EClass/eStructuralFeatures"), //$NON-NLS-1$
createFSeqInit(ecoreModelAccess.findClass("//EAttribute"), //$NON-NLS-1$
featureValOCL(ecoreModelAccess.findFeature("//ENamedElement/name"), "'EAttribute'"), //$NON-NLS-1$ //$NON-NLS-2$
featureValOCL(ecoreModelAccess.findFeature("//ETypedElement/eType"), "ecore::EString") //$NON-NLS-1$ //$NON-NLS-2$
)
),
refNewElement(ecoreModelAccess.findFeature("//EClass/eOperations"), //$NON-NLS-1$
createFSeqInit(null,
featureValOCL(ecoreModelAccess.findFeature("//ENamedElement/name"), "'EOperation'"), //$NON-NLS-1$ //$NON-NLS-2$
featureValOCL(ecoreModelAccess.findFeature("//ETypedElement/eType"), "links::LinkContainer") //$NON-NLS-1$ //$NON-NLS-2$
)
)
)
),
refNewElement(node_nestedNodes1, createFSeqInit(nodeEClass,
featureValOCL("//Node/name", "'Node_0'"),
refNewElement(node_nestedNodes1, createFSeqInit(nodeEClass,
featureValOCL("//Node/name", "'Node_0_0'"),
refNewElement(node_nestedNodes1, createFSeqInit(nodeEClass,
featureValOCL("//Node/name", "'Node_0_0_0'"),
refNewElement(node_nestedNodes1, createFSeqInit(nodeEClass,
featureValOCL("//Node/name", "'Node_0_0_0_0'"),
refNewElement(node_nestedNodes1, createFSeqInit(nodeEClass,
featureValOCL("//Node/name", "'Node_0_0_0_0_0'")
))
))
))
))
),
createFSeqInit(nodeEClass, featureValOCL("//Node/name", "'Node_1'"))
)
));
// test domain element selector
Constraint selector = GMFMapFactory.eINSTANCE.createConstraint();
selector.setBody("true"); //$NON-NLS-1$
nme.setDomainSpecialization(selector);
} else if("Node".equals(nme.getDomainContext().getName())) { //$NON-NLS-1$
nme.setDomainInitializer(createFSeqInit(null,
featureValOCL("//Node/integers_Init", "Sequence { 10, 20 }" ), //$NON-NLS-1$ //$NON-NLS-2$
featureValJava("//Node/name", "setNodeName") //$NON-NLS-1$ //$NON-NLS-2$
));
createReusedChildNodes(nme, new String[] { "//Node/nestedNodes1", "//Node/nestedNodes2" }); //$NON-NLS-1$ //$NON-NLS-2$
} else if("InvalidNode".equals(nme.getDomainContext().getName())) { //$NON-NLS-1$
// test specializer with multiple java expressions coming from reused node mapping
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=144305
nme.setDomainInitializer(createFSeqInit(null,
featureValOCL("//Node/name", "'\"Quated-name tests literal escaping\"'"), //$NON-NLS-1$ //$NON-NLS-2$
featureValJava("//Node/multiValPrimitive", "multiValPrimitive"), //$NON-NLS-1$ //$NON-NLS-2$
featureValJava("//Node/multiValObj", "multiValObj"), //$NON-NLS-1$ //$NON-NLS-2$
featureValJava("//Node/multiRef", "multiRef"), //$NON-NLS-1$ //$NON-NLS-2$
featureValJava("//Node/singleValPrimitive", "singleValPrimitive"), //$NON-NLS-1$ //$NON-NLS-2$
featureValJava("//Node/singleValObj", "singleValObj"), //$NON-NLS-1$ //$NON-NLS-2$
featureValJava("//Node/singleRef", "singleRef"), //$NON-NLS-1$ //$NON-NLS-2$
//
// next two RefNewElementSpec are to check unique method names of java initializers for
// few nested Objects of the same kind that get created in different features (see bug 276142)
refNewElement(modelAccess.findFeature("//InvalidNode/ref1"), //$NON-NLS-1$
createFSeqInit(nodeEClass, featureValJava("//Node/name", "aaa")) //$NON-NLS-1$ //$NON-NLS-2$
),
refNewElement(modelAccess.findFeature("//InvalidNode/ref2"), //$NON-NLS-1$
createFSeqInit(nodeEClass, featureValJava("//Node/name", "bbb")) //$NON-NLS-1$ //$NON-NLS-2$
)
));
Constraint selector = GMFMapFactory.eINSTANCE.createConstraint();
selector.setLanguage(Language.JAVA_LITERAL);
selector.setBody("myNodeSelector"); //$NON-NLS-1$
nme.setDomainSpecialization(selector);
createReusedChildNodes(nme, new String[] { "//Node/nestedNodes1" }); //$NON-NLS-1$
}
}
// @param elementClass may be null
static FeatureSeqInitializer createFSeqInit(EClass elementClass, FeatureInitializer... featureInits) {
FeatureSeqInitializer elementInitializer = GMFMapFactory.eINSTANCE.createFeatureSeqInitializer();
for (int i = 0; i < featureInits.length; i++) {
elementInitializer.getInitializers().add(featureInits[i]);
}
if(elementClass != null) {
elementInitializer.setElementClass(elementClass);
}
return elementInitializer;
}
FeatureValueSpec featureValOCL(String featureQName, final String expressionBody) {
return featureValOCL(modelAccess.findFeature(featureQName), expressionBody);
}
static FeatureValueSpec featureValOCL(EStructuralFeature sf, final String expressionBody) {
return featureVal(sf, expressionBody, Language.OCL_LITERAL);
}
FeatureValueSpec featureValJava(String featureQName, final String expressionBody) {
return featureVal(modelAccess.findFeature(featureQName), expressionBody, Language.JAVA_LITERAL);
}
FeatureValueSpec featureValLiteral(String featureQName, String expression) {
return featureVal(modelAccess.findFeature(featureQName), expression, Language.LITERAL_LITERAL);
}
private static FeatureValueSpec featureVal(EStructuralFeature sf, final String expressionBody, final Language expressionLang) {
FeatureValueSpec featureValueSpec = GMFMapFactory.eINSTANCE.createFeatureValueSpec();
featureValueSpec.setFeature(sf);
ValueExpression value = GMFMapFactory.eINSTANCE.createValueExpression();
value.setBody(expressionBody);
value.setLanguage(expressionLang);
featureValueSpec.setValue(value);
return featureValueSpec;
}
static ReferenceNewElementSpec refNewElement(EStructuralFeature sf, final FeatureSeqInitializer... elementInitializers) {
ReferenceNewElementSpec newElementSpec = GMFMapFactory.eINSTANCE.createReferenceNewElementSpec();
newElementSpec.setFeature(sf);
for (int i = 0; i < elementInitializers.length; i++) {
newElementSpec.getNewElementInitializers().add(elementInitializers[i]);
}
return newElementSpec;
}
private void createReusedChildNodes(NodeMapping topNode, String[] containmentFeatures) {
for (int i = 0; i < containmentFeatures.length; i++) {
ChildReference childRef = GMFMapFactory.eINSTANCE.createChildReference();
childRef.setContainmentFeature(modelAccess.findReference(containmentFeatures[i]));
childRef.setReferencedChild(topNode);
topNode.getChildren().add(childRef);
}
}
protected void initAudits() {
AuditContainer auditContainer = createAuditContainer(Plugin.getPluginID() + ".<category1>" + System.currentTimeMillis()); //$NON-NLS-1$
getMapping().setAudits(auditContainer);
DomainElementTarget classA = GMFMapFactory.eINSTANCE.createDomainElementTarget();
classA.setElement(getNodeA().getDomainMetaElement());
DomainElementTarget classB = GMFMapFactory.eINSTANCE.createDomainElementTarget();
classB.setElement(modelAccess.findClass("//nestedPckg/ClassA")); //$NON-NLS-1$
// Note; constraints must always be false in order to be collected in the asserted validation result
// create ID with xml markup chars to test xml escaping in plugin.xml
String constraintId1 = "<constraint.id1>"; //$NON-NLS-1$
auditContainer.getAudits().add(createAudit(constraintId1, "false", classA, Severity.WARNING_LITERAL, false)); //$NON-NLS-1$
auditContainer.getAudits().add(createAudit("constraint.id2", "false and nestedPckg::ClassA.allInstances()->size() > 0", classB, Severity.ERROR_LITERAL, true)); //$NON-NLS-1$ //$NON-NLS-2$
AuditContainer subCat = createAuditContainer("category2"); //$NON-NLS-1$
DiagramElementTarget nodeTarget = GMFMapFactory.eINSTANCE.createDiagramElementTarget();
nodeTarget.setElement(getNodeB());
auditContainer.getChildContainers().add(subCat);
subCat.getAudits().add(createAudit("constraint.id3", "''='Foo'", nodeTarget, Severity.INFO_LITERAL, false)); //$NON-NLS-1$ //$NON-NLS-2$
AuditContainer attrAuditContainer = createAuditContainer("audit_container.attributeTarget"); //$NON-NLS-1$
auditContainer.getChildContainers().add(attrAuditContainer);
DomainAttributeTarget attrTarget1 = GMFMapFactory.eINSTANCE.createDomainAttributeTarget();
attrTarget1.setAttribute(modelAccess.findAttribute("//Node/name")); //$NON-NLS-1$
attrTarget1.setNullAsError(true);
attrAuditContainer.getAudits().add(createAudit("audit.attributeTarget.id1", "self = ''", attrTarget1, Severity.ERROR_LITERAL, false)); //$NON-NLS-1$ //$NON-NLS-2$
DomainAttributeTarget attrTarget2 = GMFMapFactory.eINSTANCE.createDomainAttributeTarget();
attrTarget2.setAttribute(modelAccess.findAttribute("//Node/acceptLinkKind")); //$NON-NLS-1$
attrTarget2.setNullAsError(false);
AuditRule regexpRule = createAudit("audit.attributeTarget.id2", "a*b", attrTarget2, Severity.ERROR_LITERAL, false); //$NON-NLS-1$ //$NON-NLS-2$
regexpRule.getRule().setLanguage(Language.REGEXP_LITERAL);
attrAuditContainer.getAudits().add(regexpRule);
DomainAttributeTarget attrTarget3 = GMFMapFactory.eINSTANCE.createDomainAttributeTarget();
attrTarget3.setAttribute(modelAccess.findAttribute("//Node/acceptLinkKind")); //$NON-NLS-1$
AuditRule javaRule1 = createAudit("audit.attributeTarget.id3", "myJavaAudit1", attrTarget3, Severity.ERROR_LITERAL, false); //$NON-NLS-1$ //$NON-NLS-2$
javaRule1.getRule().setLanguage(Language.JAVA_LITERAL);
attrAuditContainer.getAudits().add(javaRule1);
DomainAttributeTarget attrTarget4 = GMFMapFactory.eINSTANCE.createDomainAttributeTarget();
attrTarget4.setAttribute(modelAccess.findAttribute("//LinkContainer/enumAttr_Init")); //$NON-NLS-1$
AuditRule javaRule2 = createAudit("audit.attributeTarget.id4", "myJavaAudit2", attrTarget4, Severity.ERROR_LITERAL, false); //$NON-NLS-1$ //$NON-NLS-2$
javaRule2.getRule().setLanguage(Language.JAVA_LITERAL);
attrAuditContainer.getAudits().add(javaRule2);
DomainAttributeTarget attrTarget5 = GMFMapFactory.eINSTANCE.createDomainAttributeTarget();
attrTarget5.setAttribute(modelAccess.findAttribute("//Node/multiValObj")); //$NON-NLS-1$
attrTarget5.setNullAsError(false);
AuditRule nregexpRule = createAudit("audit.attributeTarget.nregexp.id", "a*b", attrTarget5, Severity.ERROR_LITERAL, false); //$NON-NLS-1$ //$NON-NLS-2$
nregexpRule.getRule().setLanguage(Language.NREGEXP_LITERAL);
attrAuditContainer.getAudits().add(nregexpRule);
AuditedMetricTarget metricTarget = GMFMapFactory.eINSTANCE.createAuditedMetricTarget();
Assert.assertTrue("Requires at least one metric definition", //$NON-NLS-1$
getMapping().getMetrics() != null && getMapping().getMetrics().getMetrics().size() > 0);
metricTarget.setMetric(getMapping().getMetrics().getMetrics().get(0));
AuditRule metricAuditRule = createAudit("audit.metricTarget.id", "self > 0 and false", metricTarget, Severity.INFO_LITERAL, false); //$NON-NLS-1$ //$NON-NLS-2$
auditContainer.getAudits().add(metricAuditRule);
}
protected void setupClassLinkMapping(LinkMapping lme) {
addCreationConstraints(lme, null, "self.acceptLinkKind = oppositeEnd.acceptLinkKind"); //$NON-NLS-1$
assert lme.getDomainInitializer() == null; // sanity, don't want to break anything
// we use element initializers of the link with class just
// to check LITERAL kind of value expressions
ElementInitializer ei = createFSeqInit(null,
featureValLiteral("//Link/boolToInit", "true"),
featureValLiteral("//Link/stringToInit", "\"init-string\"")
);
lme.setDomainInitializer(ei);
}
protected void setupReferenceLinkMapping(LinkMapping lme) {
addCreationConstraints(lme,
"not self.acceptLinkKind.oclIsUndefined()", //$NON-NLS-1$
"self.acceptLinkKind = oppositeEnd.acceptLinkKind"); //$NON-NLS-1$
}
private void initMetricContainer(DomainModelSource domainModel) {
MetricContainer container = GMFMapFactory.eINSTANCE.createMetricContainer();
MetricRule domainElementRule = createMetric("\"dom1\"", "1.2", null, null); //$NON-NLS-1$ //$NON-NLS-2$
DomainElementTarget domainElementTarget = GMFMapFactory.eINSTANCE.createDomainElementTarget();
// test name and description optionality
domainElementRule.setName(null);
domainElementRule.setDescription(null);
domainElementTarget.setElement(domainModel.getNodeA().getEClass());
domainElementRule.setTarget(domainElementTarget);
container.getMetrics().add(domainElementRule);
MetricRule reusedDiagramElementRule = createMetric("reused.node.mapping.diagramElement", "150", new Double(100), new Double(200)); //$NON-NLS-1$ //$NON-NLS-2$
// set optional desc
reusedDiagramElementRule.setDescription("A diagram metric with reused diagram element mapping"); //$NON-NLS-1$
DiagramElementTarget reusedDiagramElementTarget = GMFMapFactory.eINSTANCE.createDiagramElementTarget();
reusedDiagramElementTarget.setElement(getNodeB());
reusedDiagramElementRule.setTarget(reusedDiagramElementTarget);
container.getMetrics().add(reusedDiagramElementRule);
MetricRule diagramElementRule = createMetric("node.mapping.diagramElement", "15", new Double(10), new Double(20)); //$NON-NLS-1$ //$NON-NLS-2$
DiagramElementTarget diagramElementTarget = GMFMapFactory.eINSTANCE.createDiagramElementTarget();
diagramElementTarget.setElement(getNodeA());
diagramElementRule.setTarget(diagramElementTarget);
container.getMetrics().add(diagramElementRule);
getMapping().setMetrics(container);
}
private static MetricRule createMetric(String key, String oclBody, Double low, Double high) {
MetricRule rule = GMFMapFactory.eINSTANCE.createMetricRule();
rule.setKey(key);
// Note: use characters that need to be escaped in java source string literals
rule.setName("Name of \"" + key + "\""); //$NON-NLS-1$ //$NON-NLS-2$
rule.setDescription("Description of \"" + key + "\""); //$NON-NLS-1$ //$NON-NLS-2$
rule.setRule(GMFMapFactory.eINSTANCE.createValueExpression());
rule.getRule().setBody(oclBody);
rule.setLowLimit(low);
rule.setHighLimit(high);
return rule;
}
}
}