|
Re: [ATL] Multiple Input Models Issue [message #23911 is a reply to message #23664] |
Fri, 16 March 2007 17:26 |
Eclipse User |
|
|
|
Originally posted by: marcos.didonet-del-fabro.univ-nantes.fr
Hello,
We have implemented a couple of helpers that may answer your first question. We used it to
generate a single primitive type (e.g., String or Integer) to merge two KM3 metamodels.
I adapted them to your example. You can try it to verify if it works. :)
rule ProcessToRoot{
from
r: XML!Root (r.isUnique)
--merge the two input models
-- the rule
}
---- the helpers ------------------------------------------------------------ --
helper context XML!Root def: isUnique : Boolean =
self.uniqueValue = self;
helper context XML!Root def: key : OclAny =
self.name;
helper def: rootByKey : Map(OclAny, XML!Root) =
XML!Root.allInstances()->iterate(e; acc : Map(OclAny, XML!Root) = Map {} |
acc.including(e.key, e)
);
helper context XML!Root def: uniqueValue : XML!Root =
thisModule.rootByKey.get(self.key);
------------------------------------------------------------ ------
Regards,
Marcos.
Ronan wrote:
> Hi,
> My ATL transform takes in a number of input models (WSDL interfaces) and
> produces one output model (UML Class Diagram). The problem is that each
> time the root transformation(ProcessToRoot) runs (once for every input
> model) it creates a new model in the output UML Class diagram. I want
> there to be only one output model with a number of classes in it
> representing each input interface. My attempt so far is below..
>
> module XMLtoUML; -- Module Template
> create OUT : UML from IN : XML, IN2 : XML;
>
> rule ProcessToRoot{
> from r: XML!Root
> --merge the two input models
> using{
> a:Set(XML!Root) =
> XML!Root.allInstancesFrom('IN')->union(XML!Root.allInstancesFrom('IN2'));
> }
> to
> rt : UML!Model(
> packagedElement <-
> a->collect(e|e.children->select(e|e.name='wsdl:portType')- >collect(e|thisModule.PortTypeToInterface(e)))
>
> )
> }
>
> lazy rule PortTypeToInterface{
> from pt: XML!Element(
> pt.name = 'wsdl:portType'
> )
> to
> inf : UML!Interface(
> name <- pt.children->select(e|e.name='name')->first().value,
> ownedOperation <-
> pt.children->select(e|e.name='wsdl:operation')->collect(e|thisModule.OperationToOperation(e))
>
> )
> }
>
> lazy rule OperationToOperation{
> from opx: XML!Element
> to
> opu : UML!Operation(
> name <- opx.children->select(e|e.name='name')->first().value
> )
> }
>
> I have successfully got the 2nd and 3rd rules merging correctly but need
> the first rule to only fire once in order to create only one output
> model. Any ideas?
>
> Also is there any way to merge all input models without having to
> explicitly enumerate them as I have done with the allInstancesFrom
> method in a using block?
>
> Cheers,
> Ronan
>
|
|
|
|
Powered by
FUDForum. Page generated in 0.03923 seconds