blob: 3c3321ae6bc1376dc9f726d72bcbe8ca10deff48 [file] [log] [blame]
/*
-----------------------------------------------------------------------
-- CHESS M2M plugin --
-- --
-- Copyright (C) 2011-2012 --
-- University of Padova, ITALY --
-- --
-- Author: Alessandro Zovi azovi@math.unipd.it --
-- --
-- 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-v20.html --
-----------------------------------------------------------------------
*/
modeltype UML uses "http://www.eclipse.org/uml2/2.0.0/UML";
modeltype MARTEP uses "http://www.eclipse.org/papyrus/MARTE/1";
modeltype ECORE uses "http://www.eclipse.org/emf/2002/Ecore";
transformation AlePIM2PSM(in source:UML, in marte:MARTEP);
property model : Model = null;
property MARTEProfile : Profile = null;
property s1 = "HwComputingResource";
property s2 = "SaExecHost";
main() {
log("*** CHESS PIM->PSM transformation ***");
model := source.rootObjects()![Model];
var p := model.getView("ComponentView");
MARTEProfile := p.getAppliedProfiles()->selectOne(name="GCM").owner.owner.oclAsType(Profile);
this.printMARTEStereotypeInfo(s1);
this.printMARTEStereotypeInfo(s2);
log("-----------------------------");
var l1 := this.getMARTEStereotype(s1).member[Property]->asSequence()->sortedBy(name).name;
var l2 := this.getMARTEStereotype(s2).member[Property]->asSequence()->sortedBy(name).name;
log(s1+"|"+s2);
l1->union(l2)->forEach(a){
var s : String ="";
if (l1->includes(a)) then
s:=s+a
else
s:=s+"-----------"
endif;
s:=s+"|";
if (l2->includes(a)) then
s:=s+a
else
s:=s+"-----------"
endif;
log(s);
};
log("-----------------------------");
--this.getMARTEStereotype("HwComputingResource").member[Property].name->intersection(
--this.getMARTEStereotype("SaExecHost").member[Property].name)->asSequence()->print();
}
helper Stereotype::getGens() : Set(Stereotype) {
var ss := self->generalization.target[Stereotype];
var s : Set(Stereotype) := Set{};
if (ss<>null) then
s += ss->getGens()->flatten()->asSet()
endif;
s += self;
return s;
}
query Stereotype::printGens(in n : Integer) : Set(Stereotype) {
var s : String :="";
while (i:=0; i<n){
s := s+" ";
i:=i+1;
};
log(s + self.name);
self->generalization.target[Stereotype]->printGens(n+1);
return null;
}
query OrderedSet(String)::print(indent : String){
self->forEach(i){log(indent + i)};
}
query Bag(String)::print(indent : String){
self->forEach(i){log(indent + i)};
}
query Sequence(String)::print(indent : String){
self->forEach(i){log(indent + i)};
}
query PackageableElement::getView(viewName : String) : Package {
var seq : Bag(Package) := model.packagedElement[Package]-> union(model.packagedElement[Package].packagedElement[Package]);
return seq-> selectOne (p | p.getAppliedStereotype("CHESS::Core::CHESSViews::"+viewName) != null);
--seq->forEach(p){
-- log(p.name);
-- p.getAppliedStereotypes()->collect(qualifiedName)->forEach(s){log(s)};
--};
}
query Element::listStereotypes() : OclVoid {
log("********************************************************************************");
log("* Element: " + if(self.oclIsKindOf(NamedElement)) then self.oclAsType(NamedElement).name else "noName" endif);
self.getAppliedStereotypes()->collect(qualifiedName)->forEach(s){log("* " + s)};
log("********************************************************************************");
return null;
}
query Element::toMetaclass(stereoName : String) : EObject {
var s = self.getAppliedStereotype(stereoName);
return self.getStereotypeApplication(s);
}
query OclAny::getMARTEStereotype(stereoName : String) : Stereotype {
return MARTEProfile.allOwnedElements()[Stereotype]->selectOne(name=stereoName);
}
query OclAny::getMARTEProfile(profileName : String) : Profile {
return MARTEProfile.allOwnedElements()[Profile]->selectOne(name=profileName);
}
query OclAny::printMARTEStereotypeInfo(stereoName : String) : OclVoid {
var s := marte.rootObjects().allSubobjects()[EClass]->selectOne(name=stereoName).instanceTypeName;
var t := s.substring(1, s.rfind('.')-1);
t:=t.substring(1, t.rfind('.'));
s:=s.substringAfter(t);
log("Qualified name:\n" + self.getMARTEStereotype(stereoName).qualifiedName);
log("Metaclass:\nMARTE::" + s.replace('.',"::"));
}