Cài đặt ATL của bộ luật chuyển đổi UML-PP sang BPEL

Một phần của tài liệu Khảo sát khả năng sử dụng ngôn ngữ bpel để cài đặt các mô hình tiến trình phần mềm (Trang 82 - 84)

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()) }

Một phần của tài liệu Khảo sát khả năng sử dụng ngôn ngữ bpel để cài đặt các mô hình tiến trình phần mềm (Trang 82 - 84)

Tải bản đầy đủ (PDF)

(118 trang)