blob: 3eedfcc28385a1462d9d9ebd2f94fbbc2b564677 [file] [log] [blame]
modeltype ECORE uses 'http://www.eclipse.org/emf/2002/Ecore';
transformation mapDisjuncts(in inModel : ECORE, out outModel : ECORE);
main() {
var root := object EPackage { name := 'root' };
var a := object EAttribute { name := 'aSrc'; };
var aResult := a.map disjunctMapping('aSrc_disjunctMapping');
-- trace records for disjuncting mappings explicitly enabled for bug 377882
assert fatal (null <> a.resolveoneIn(ENamedElement::disjunctMapping, ETypedElement));
assert fatal (null <> a.resolveoneIn(EAttribute::disjunctedMapping1, ETypedElement));
var p := object EParameter { name := 'pSrc'; };
var pResult := p.map disjunctMapping('pSrc_disjunctMapping');
-- trace records for disjuncting mappings explicitly enabled for bug 377882
assert fatal (null <> p.resolveoneIn(ENamedElement::disjunctMapping, ETypedElement));
assert fatal (null <> p.resolveoneIn(EParameter::disjunctedMapping2, ETypedElement));
var container := object EAnnotation {
source := 'testResult';
contents += a.oclAsType(EObject);
contents += aResult.oclAsType(EObject);
contents += p.oclAsType(EObject);
contents += pResult.oclAsType(EObject);
};
root.eAnnotations += container;
var a1 := a.map chainedDisjunctMapping('a1_chained');
assert fatal (a1.oclIsKindOf(EAttribute));
container.contents += a1.oclAsType(EObject);
var p1 := p.map chainedDisjunctMapping('p1_chained');
assert fatal (p1.oclIsKindOf(EParameter));
container.contents += p1.oclAsType(EObject);
var c1Src := object EClass { name := 'c1Src'; };
container.contents += c1Src.oclAsType(EObject);
var c1 := c1Src.map chainedDisjunctMapping('c1_chained');
assert fatal (c1.oclIsKindOf(EReference));
container.contents += c1.oclAsType(EObject);
-- trace fetch should work too
assert fatal (c1 = c1Src.map chainedDisjunctMapping('c1_chained'));
-- check failed pre-condition (when clause)
var wrongSrc := object EClass {
name := null; -- causing precondition to fail
};
container.contents += wrongSrc.oclAsType(EObject);
var redirectedMappingResult := wrongSrc.map chainedDisjunctMapping('c1_chained');
assert fatal (redirectedMappingResult.oclIsKindOf(EAnnotation));
container.contents += redirectedMappingResult.oclAsType(EObject);
-- just correcting the precondition should make it work
-- check succeeded pre-condition (when clause)
wrongSrc := object EClass {
name := 'x'; -- causing precondition to succeed
};
container.contents += wrongSrc.oclAsType(EObject);
var wrongSrcCorrectedResult := wrongSrc.map chainedDisjunctMapping('c1_chained');
assert fatal (wrongSrcCorrectedResult <> null);
wrongSrc.eStructuralFeatures += wrongSrcCorrectedResult.oclAsType(EReference);
-- hides toEClass as the first mapping is type conformant, but
-- when called the no disjunct is applicable and returns null
var annotResult := c1Src.map chainedDisjunctMappingHideToEReference('$');
assert fatal(annotResult.oclIsKindOf(EAnnotation));
container.contents += annotResult.oclAsType(EObject);
var pp := p1.invresolveone(EParameter).map chainedDisjunctMappingHideToEReference('$');
assert fatal(pp.oclIsKindOf(EParameter));
container.contents += pp.oclAsType(EObject);
-- test self with inout
c1Src._abstract := false;
var inoutResult := c1Src.map inoutSimpleDisjunct();
assert fatal (null = inoutResult and not c1Src.containsAnnotation('EClass::inoutWithConditionDisjuncted'));
c1Src._abstract := true;
inoutResult := c1Src.map inoutSimpleDisjunct();
assert fatal (inoutResult = null and c1Src.containsAnnotation('EClass::inoutWithConditionDisjuncted'));
assert fatal (null = root.map fooDisjuncting(null));
assert fatal (root.map fooDisjuncting(root).oclIsTypeOf(EPackage));
}
mapping inout EModelElement::fooDisjuncting(inout p : EPackage) : EPackage
disjuncts EPackage::fooDisjuncted when { p <> null }
{
name := 'EObject::fooDisjuncting'; -- not executed
}
mapping inout EPackage::fooDisjuncted(inout p_Renamed : EPackage) : EPackage {
init {
assert fatal (p_Renamed <> null) with log('never execute here for p=', p_Renamed);
}
population {
object result: {
name := 'EObject::fooDisjuncting'; -- not executed
};
object p_Renamed: {
eSubpackages += result;
}
}
}
abstract mapping EModelElement::chainedDisjunctMapping(in strPar1 : String) : EModelElement
disjuncts EClass::toEReference, EClass::toEAnnotation, ENamedElement::disjunctMapping
{}
-- can't call toEClass(), the first mapping allways satisfies the call
abstract mapping EModelElement::chainedDisjunctMappingHideToEReference(in strPar1 : String) : EModelElement
disjuncts EClass::toEAnnotation, EClass::toEReference, ENamedElement::disjunctMapping
{}
mapping EClass::toEAnnotation(in sourceSuffix : String) : EAnnotation
when { true } {
source := self.name + '_EClass::toEAnnotation_' + sourceSuffix;
}
mapping EClass::toEReference(in xx : String) : EReference
when { self.name <> null } {
name := self.name + '_' + xx;
}
abstract mapping ENamedElement::disjunctMapping(in strPar1 : String) : ETypedElement
disjuncts EAttribute::disjunctedMapping1, EParameter::disjunctedMapping2
{
}
mapping EAttribute::disjunctedMappingDummy(in par1 : EClass) : EAttribute {
name := self.name + '_' + par1.name;
}
mapping EAttribute::disjunctedMapping1(in strPar1 : String) : EAttribute {
name := self.name + '_' + strPar1;
}
mapping EParameter::disjunctedMapping2(in strPar1 : String) : EParameter {
name := self.name + '_' + strPar1;
}
mapping inout EClass::inoutSimpleDisjunct()
disjuncts EClass::inoutWithConditionDisjuncted
{}
mapping inout EClass::inoutWithConditionDisjuncted() when { self._abstract } {
eAnnotations += object EAnnotation {
source := 'EClass::inoutWithConditionDisjuncted';
};
}
query EModelElement::containsAnnotation(in sourceStr : String) : Boolean {
return self.eAnnotations->one(source = sourceStr);
}