blob: af1a3d01106246132c94f2b9b29e140aa5103b1b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007,2008 Tata Consultancy Services and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* TCS - initial implementation for ModelMorf
* E.D.Willink - alignment with evolved specification
*******************************************************************************/
import ecoreMM : 'http://www.eclipse.org/emf/2002/Ecore';
import umlmmmi : 'umlMM.emof'::umlmmmi;
import javammsi : 'javaMM.emof'::javammsi;
/*
* This rewrite of ModelMorf's MiToSi example avoids complexities by doing one thing per relation.
*/
transformation MiToSiSimple(uml:{umlmmmi,ecoreMM}, java:javammsi)
{
-- key umlmmmi::Class {name};
-- key javammsi::Class {name};
-- key javammsi::Interface {name};
/**
* Return true if this class or a transitive super-class is marked as DomainRoot.
*/
query isClass(c : umlmmmi::Class) : Boolean {
c->closure(supers)->exists(type = 'DomainRoot')
}
/**
* Create a Package for each Package.
*/
top relation PackageToPackage
{
n : String;
domain uml p1:Package {
name = n
};
enforce domain java p2:Package {
name = n
};
}
/**
* Create a Class for each isClass() class.
*/
top relation ClassToClass
{
n : String;
domain uml c1:Class {
containingPackage = p1:Package{},
name = n
}
{isClass(c1)};
enforce domain java c2:Class {
containingPackage = p2:Package{},
name = n
};
when {
PackageToPackage(p1, p2);
}
}
/**
* Create an Interface for each non-isClass() class.
*/
top relation ClassToInterface
{
n : String;
domain uml c1:Class {
containingPackage = p1:Package{},
name = n
}
{not isClass(c1)};
enforce domain java c2:Interface {
containingPackage = p2:Package{},
name = n
};
when {
PackageToPackage(p1, p2);
}
}
/**
* Define a Class::extends relationship for each class with a super-class
*/
top relation ClassExtends
{
c1sup: umlmmmi::Class;
c2sup: javammsi::Class;
domain uml c1:Class {
supers = s1:Set(Class){c1sup ++ _}
};
enforce domain java c2:Class {
extends = s2:Set(Class){c2sup ++ _}
};
when {
ClassToClass(c1, c2);
ClassToClass(c1sup, c2sup);
}
}
/**
* Define a Class::implements relationship for each class with a super-interface
*/
top relation ClassImplements
{
c1sup: umlmmmi::Class;
c2sup: javammsi::Interface;
domain uml c1:Class {
supers = s1:Set(Class){c1sup ++ _}
};
enforce domain java c2:Class {
implements = s2:Set(Interface){c2sup ++ _}
};
when {
ClassToClass(c1, c2);
ClassToInterface(c1sup, c2sup);
}
}
/**
* Define a Interface::extends relationship for each interface with a super-interface
*/
top relation InterfaceExtends
{
c1sup: umlmmmi::Class;
c2sup: javammsi::Interface;
domain uml c1:Class {
supers = s1:Set(Class){c1sup ++ _}
};
enforce domain java c2:Interface {
extends = s2:Set(Interface){c2sup ++ _}
};
when {
ClassToInterface(c1, c2);
ClassToInterface(c1sup, c2sup);
}
}
}