BPEL
Trong phần này, chúng tôi xin trình bày sơ lƣợc cài đặt ATL cho một số luật chuyển đổi chính đƣợc liệt kê ở mục 4.4. Mã nguồn đầy đủ có thể tìm thấy ở phần phụ lục B.
1. Chuyển đổi BehaviorModel sang Process:
-- Create Bpel process from Behavior
rule Behavior2Process { from b : MMUmlpp!BehaviorModel to p : MMBpel!Process( name <- b.name ,suppressJoinFailure <- true ,targetNamespace <- 'http://' + b.name.replace(' ','_') ,import <-
Set{thisModule.FaganCodeInspectionWSDL(b),thisModule.HumanT askWSDL(b)}
,partnerLinks <- thisModule.PartnerLinks(b) ,variables <- thisModule.Model2Variables(b) ,activity <- thisModule.Model2MainSequence(b) )
}
2. Chuyển đổi Task sang Invoke và Variable:
unique lazy rule Task2Invoke{ from t : MMUmlpp!GeneralTask to i : MMBpel!Invoke(
name <- 'Invoke_' + t.name.wtrim()
,partnerLink <- thisModule.Task2PartnerLink(t) ,operation <- thisModule.Task2Op(t)
,inputVariable <- thisModule.Task2InVariable(t) ,outputVariable <- thisModule.Task2OutVariable(t) ,portType <- thisModule.Task2PT(t)
) }
unique lazy rule Task2InVariable{ from t : MMUmlpp!GeneralTask to v : MMBpel!Variable(
name <- 'Invoke_' + t.name.wtrim() + '_' + t.name.wtrim() + '_InputVariable'
,messageType <-
thisModule.Task2RequestMessageType(t) )
}
unique lazy rule Task2OutVariable{ from t : MMUmlpp!GeneralTask to v : MMBpel!Variable(
name <- 'Invoke_' + t.name.wtrim() + '_' + t.name.wtrim() + '_OutputVariable'
,messageType <-
thisModule.Task2ResponseMessageType(t) )
}
3. Chuyển đổi Product thành Variable:
helper context MMUmlpp!GeneralTask def :
getTaskParameters() : String =
MMUmlpp!ObjectFlow->allInstances()->iterate (f;res : String = '' |
if f.target = self and
f.source.oclIsTypeOf(MMUmlpp!GeneralProduct)
then res + 'IN:' + f.source.name + '|'
else if f.source = self and
f.target.oclIsTypeOf(MMUmlpp!GeneralProduct) then res + 'OUT:' + f.target.name + '|'
else res endif endif
);
unique lazy rule Task2Assign{ from t : MMUmlpp!GeneralTask to a : MMBpel!Assign(
name <- 'Assign_' + t.name.wtrim() ,copy <- thisModule.Task2Copy(t) )
}
unique lazy rule Task2Copy{ from t : MMUmlpp!GeneralTask to c : MMBpel!Copy(
"from" <- thisModule.Task2From(t) ,"to" <- thisModule.Task2To(t) )
}
unique lazy rule Task2From{ from t : MMUmlpp!GeneralTask to f : MMBpel!From(
expression <- thisModule.Task2FromExp(t) )
}
unique lazy rule Task2FromExp{ from t : MMUmlpp!GeneralTask to f : MMBpel!Expression(
body <- t.getTaskParameters() )
}
unique lazy rule Task2To{
from t : MMUmlpp!GeneralTask to f : MMBpel!To(
variable <- thisModule.Task2InVariable(t) ,part <- thisModule.Task2Part(t)
,query <- thisModule.Task2Query(t) )}
4. Chuyển đổi ControlFlow thành Link:
unique lazy rule ControlFlow2Link{ from c : MMUmlpp!ControlFlow to l : MMBpel!Link(
name <- c.source.name + '_' + c.target.name )
}
5. Chuyển đổi ForkNode sang Flow:
unique lazy rule Fork2Flow{ from f : MMUmlpp!ForkNode to l : MMBpel!Flow( activities <- f->getBrachTasks()->collect(t | thisModule.Task2FlowSeq(t)) ) }
helper context MMUmlpp!ForkNode def : getBrachTasks() :
OrderedSet(MMUmlpp!GeneralTask) =
MMUmlpp!ControlFlow->allInstances()->select (c | c.source = self)->collect(c | c.target) ;
unique lazy rule Task2FlowSeq{ from t : MMUmlpp!GeneralTask to s : MMBpel!"Sequence"(
activities <- t->getNextTasks()->collect ( g | Sequence{thisModule.Task2Assign(g),
thisModule.Task2Invoke(g)})->flatten()) }