Hƣớng phát triển

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 101 - 118)

Nhƣ đã trình bày, luận văn đã thực hiện kết hợp sử dụng các bộ máy thực thi BPEL để thực thi các tiến trình phần mềm UML-PP. Tuy nhiên luận văn chỉ dừng lại ở mức khảo sát và tiến hành chuyển đổi thử nghiệm trên bốn qui trình phần mềm, cần phải thử nghiệm trên nhiều qui trình phần mềm hơn nữa mới có thể đánh giá đầy đủ đƣợc hƣớng tiếp cận này. Một hƣớng phát triển là thử nghiệm việc chuyển đổi thực thi trên tất cả các mô hình ISPW-6. Hơn nữa, cần phải định nghĩa đầy đủ và hình thức tất cả các luật chuyển đổi từ mô hình UML-PP sang mô hình BPEL phục vụ cho việc cài đặt chuyển đổi tự động một mô hình UML-PP bất kỳ sang BPEL. Chuyển đổi tự động sẽ thực hiện cả hai bƣớc unfold tiến trình UML-PP và tạo file BPEL dạng

XML. Một hƣớng phát triển khác là hoàn thiện metamodel của UML-PP với đầy đủ các ràng buộc đƣợc tác giả mô tả trong [6] để tiến tới xây dựng công cụ hỗ trợ đầy đủ bộ ký hiệu và các thành tố trong UML-PP trên nền eclipse. Trong luận văn, chúng tôi đã tiến hành kiểm tra cú pháp file BPEL XML tạo ra trên NetBeans 6.7.1 nhƣng chƣa kiểm tra tự động đƣợc việc ánh xạ các thành phần từ UML-PP. Một hƣớng phát triển khác là xây dựng công cụ kiểm tra và đánh giá việc chuyển đổi.

B. PHỤ LỤC - MÃ NGUỒN ATL

File Umlpp2Bpel – chuyển đổi mô hình UML-PP sang mô hình BPEL

-- @path MMUmlpp=/vn.edu.tdt.atl.umlpp2bpel/metamodel/umlppcomplete.ecore -- @path MMBpel=/vn.edu.tdt.atl.umlpp2bpel/metamodel/bpelcomplete.ecore

module Umlpp2Bpel;

create OUT : MMBpel from IN : MMUmlpp;

-- Helper

-- Get all general tasks

helper context MMUmlpp!BehaviorModel def : getAllGeneralTasks() :

OrderedSet(MMUmlpp!GeneralTask) =

self.behaviorNodes->select( e | e.oclIsTypeOf(MMUmlpp!GeneralTask))

;

-- Get all tasks in process with order

helper context MMUmlpp!BehaviorModel def : getSequenceTasks() :

OrderedSet(MMUmlpp!GeneralTask) = self.behaviorNodes->select( e | e.oclIsTypeOf(MMUmlpp!InitialNode))->first() .outgoing->first().target- >getNextTasks() ;

-- Get all tasks after a task

helper context MMUmlpp!GeneralTask def : getNextTasks() : OrderedSet

(MMUmlpp!GeneralTask) = self.outgoing->select( e | e.oclIsTypeOf(MMUmlpp!ControlFlow)) ->collect( c | c.target) ->select (n | n.oclIsTypeOf(MMUmlpp!GeneralTask)) ->iterate(c ; tasks :

OrderedSet(MMUmlpp!GeneralTask) = OrderedSet{self} |

tasks->union(c- >getNextTasks())

) ;

-- Remove all space

helper context String def : wtrim() : String = self.replace(' ',''); -- Get task parameters

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 ) ;

helper context MMUmlpp!BehaviorModel def : getForkNodes() :

OrderedSet(MMUmlpp!ForkNode) =

self.behaviorNodes->select( e | e.oclIsTypeOf(MMUmlpp!ForkNode))

;

helper context MMUmlpp!ForkNode def : getBranchTasks() :

OrderedSet(MMUmlpp!GeneralTask) =

MMUmlpp!ControlFlow->allInstances()->select(c | c.source =

self)->collect(c | c.target) ;

helper context MMUmlpp!ActivityNode def : isNextJoinNode() : Boolean =

self.outgoing->select(c |

c.oclIsTypeOf(MMUmlpp!ControlFlow))->exists( c | c.target.oclIsTypeOf(MMUmlpp!JoinNode))

;

helper context MMUmlpp!ActivityNode def : isPreviousForkNode() : Boolean

=

self.incoming->select(c |

c.oclIsTypeOf(MMUmlpp!ControlFlow))->exists( c | c.source.oclIsTypeOf(MMUmlpp!ForkNode))

;

helper context MMUmlpp!ActivityNode def : nextNode() :

MMUmlpp!ActivityNode =

self.outgoing->select(c |

c.oclIsTypeOf(MMUmlpp!ControlFlow))->first().target ;

helper context MMUmlpp!ActivityNode def : isFinalNode() : Boolean =

self.oclIsTypeOf(MMUmlpp!FinalNode) ;

helper context MMUmlpp!ActivityNode def : isForkNode() : Boolean =

self.oclIsTypeOf(MMUmlpp!ForkNode) ;

helper context MMUmlpp!ActivityNode def : isJoinNode() : Boolean =

self.oclIsTypeOf(MMUmlpp!JoinNode) ;

helper context MMUmlpp!ActivityNode def : isGeneralTask() : Boolean =

self.oclIsTypeOf(MMUmlpp!GeneralTask) ;

helper context MMUmlpp!BehaviorModel def : getSequenceNodes() :

OrderedSet(MMUmlpp!ActivityNode) =

self.behaviorNodes->select(c |

c.oclIsTypeOf(MMUmlpp!GeneralTask) or c.oclIsTypeOf(MMUmlpp!ForkNode)) ->select(c | not c.isNextJoinNode()

or not c.isPreviousForkNode() or c.oclIsTypeOf(MMUmlpp!ForkNode))

;

rule Behavior2Process {

from b : MMUmlpp!BehaviorModel to p : MMBpel!Process(

name <- b.name

,suppressJoinFailure <- true

,partnerLinks <- thisModule.Model2PartnerLinks(b) ,variables <- thisModule.Model2Variables(b)

,activity <- thisModule.Model2MainSequence(b) )

}

-- Create partner links

unique lazy rule Model2PartnerLinks{ from b : MMUmlpp!BehaviorModel to ps : MMBpel!PartnerLinks(

children <-

OrderedSet{thisModule.Model2PartnerLink(b),b.getAllGeneralTasks()- >collect(t | thisModule.Task2PartnerLink(t) )}

) }

-- Create partner link to call BPEL process

unique lazy rule Model2PartnerLink{ from b : MMUmlpp!BehaviorModel to ps : MMBpel!PartnerLink(

name <- b.name.wtrim().toLower() + '_client'

,partnerLinkType <- thisModule.Model2PartnerLinkType(b) ,myRole <- thisModule.Model2MyRole(b)

) }

unique lazy rule Model2PartnerLinkType{ from b : MMUmlpp!BehaviorModel to t : MMBpel!PartnerLinkType(

name <- b.name.wtrim() + 'PL' )

}

unique lazy rule Model2MyRole{

from b : MMUmlpp!BehaviorModel to r : MMBpel!Role(

name <- b.name.wtrim() + 'Provider'

) }

-- Create partner link for each task

unique lazy rule Task2PartnerLink{ from t : MMUmlpp!GeneralTask to p : MMBpel!PartnerLink(

name <- t.name.wtrim().toLower() + '_service'

,partnerRole <- thisModule.Task2PartnerRole(t)

,partnerLinkType <- thisModule.Task2PartnerLinkType(t) )

}

unique lazy rule Task2PartnerLinkType{ from t : MMUmlpp!GeneralTask to l : MMBpel!PartnerLinkType(

name <- t.name.wtrim() + 'PL' )

}

unique lazy rule Task2PartnerRole{ from t : MMUmlpp!GeneralTask

to r : MMBpel!Role(

name <- t.name.wtrim() + 'Provider' )

}

-- Create variables

unique lazy rule Model2Variables{ from b : MMUmlpp!BehaviorModel to v : MMBpel!Variables(

children <- OrderedSet{thisModule.Model2InVariable(b) ,thisModule.Model2OutVariable(b)

,b.getAllGeneralTasks()- >collect(task | thisModule.Task2InVariable(task))

,b.getAllGeneralTasks()- >collect(task | thisModule.Task2OutVariable(task))

} )

}

unique lazy rule Model2InVariable{ from b : MMUmlpp!BehaviorModel to v : MMBpel!Variable(

name <- b.name.wtrim() + 'InputVariable'

,messageType <- thisModule.Model2RequestMessageType(b) )

}

unique lazy rule Model2OutVariable{ from b : MMUmlpp!BehaviorModel to v : MMBpel!Variable(

name <- b.name.wtrim() + 'OutputVariable'

,messageType <- thisModule.Model2ResponseMessageType(b) )

}

unique lazy rule Model2RequestMessageType{ from b : MMUmlpp!BehaviorModel

to t : MMBpel!Message(

qName <- b.name.wtrim()+'RequestMessage' )

}

unique lazy rule Model2ResponseMessageType{ from b : MMUmlpp!BehaviorModel

to t : MMBpel!Message(

qName <- b.name.wtrim()+'ResponseMessage' )

}

unique lazy rule Task2InVariable{ from t : MMUmlpp!GeneralTask to v : MMBpel!Variable(

name <- t.name.wtrim() + 'In'

,messageType <- thisModule.Task2RequestMessageType(t) )

}

unique lazy rule Task2RequestMessageType{ from t : MMUmlpp!GeneralTask

to m : MMBpel!Message(

qName <- t.name.wtrim() + 'RequestMessage'

) }

unique lazy rule Task2OutVariable{ from t : MMUmlpp!GeneralTask to v : MMBpel!Variable(

name <- t.name.wtrim() + 'Out'

,messageType <- thisModule.Task2ResponseMessageType(t) )

}

unique lazy rule Task2ResponseMessageType{ from t : MMUmlpp!GeneralTask

to m : MMBpel!Message(

qName <- t.name.wtrim() + 'ResponseMessage'

) }

-- Create sequence

unique lazy rule Model2MainSequence{ from b : MMUmlpp!BehaviorModel to s : MMBpel!"Sequence"(

name <- 'main'

,activities <- Sequence{thisModule.Model2Receive(b)

,b.getSequenceNodes()- >iterate(n ; activities : Sequence(MMBpel!Activity) = Sequence{} |

if

(n.oclIsTypeOf(MMUmlpp!GeneralTask)) then

activities- >append(Sequence{thisModule.Task2Assign(n),thisModule.Task2Invoke(n)})

else if

(n.oclIsTypeOf(MMUmlpp!ForkNode)) then

activities- >append(thisModule.Fork2Flow(n))

else activities endif endif ) ,thisModule.Model2ReplyAssign(b) ,thisModule.Model2Reply(b) } ) }

unique lazy rule Fork2Flow{ from f : MMUmlpp!ForkNode to l : MMBpel!Flow( activities <- f->getBranchTasks()->collect(t | thisModule.Task2FlowSeq(t)) ) }

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

}

unique lazy rule Task2Assign{ from t : MMUmlpp!GeneralTask

to a : MMBpel!Assign(

name <- 'Assign_' + t.name.wtrim() ,copy <- thisModule.Task2Copy(t) )

}

unique lazy rule Task2Invoke{ from t : MMUmlpp!GeneralTask to i : MMBpel!Invoke(

name <- 'Invoke_' + t.name.wtrim()

,partnerLink <- thisModule.Task2PartnerLink(t) ,operation <- thisModule.Task2Operation(t) ,inputVariable <- thisModule.Task2InVariable(t) ,outputVariable <- thisModule.Task2OutVariable(t) ,portType <- thisModule.Task2PortType(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.Task2FromExpression(t) )

}

unique lazy rule Task2FromExpression{ 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)

) }

unique lazy rule Task2Part{

from t : MMUmlpp!GeneralTask to p : MMBpel!Part(

name <- 'input'

) }

unique lazy rule Task2PortType{ from t : Umlpp!GeneralTask to p : MMBpel!PortType(

qName <- t.name.wtrim() + 'PT' )

}

unique lazy rule Task2Operation{ from t : Umlpp!GeneralTask to o : MMBpel!Operation(

name <- t.name.wtrim() )

}

unique lazy rule Model2Receive{ from b : MMUmlpp!BehaviorModel to r : MMBpel!Receive(

name <- 'Start' + b.name.wtrim()

,operation <- thisModule.Model2ReceiveOp(b) ,createInstance <- true

,partnerLink <- thisModule.Model2PartnerLink(b) ,portType <- thisModule.Model2ReceivePortType(b) ,variable <- thisModule.Model2InVariable(b) )

}

unique lazy rule Model2ReceiveOp{ from b : MMUmlpp!BehaviorModel to o : MMBpel!Operation(

name <- b.name.wtrim() )

}

unique lazy rule Model2ReceivePortType{ from b : MMUmlpp!BehaviorModel to r : MMBpel!PortType(

qName <- b.name.wtrim() + 'PT'

) }

unique lazy rule Model2ReplyAssign{ from b : MMUmlpp!BehaviorModel to a: MMBpel!Assign(

name <- 'Assign_Exit '

,copy <- thisModule.Model2ReplyCopy(b) )

}

unique lazy rule Model2Reply{

from b : MMUmlpp!BehaviorModel to r : MMBpel!Reply(

name <- 'Exit' + b.name.wtrim()

,operation <- thisModule.Model2ReceiveOp(b) ,partnerLink <- thisModule.Model2PartnerLink(b) ,portType <- thisModule.Model2ReceivePortType(b) ,variable <- thisModule.Model2OutVariable(b) )

}

unique lazy rule Model2ReplyCopy{ from b : MMUmlpp!BehaviorModel to c : MMBpel!Copy(

"from" <- thisModule.Model2From(b) ,"to" <- thisModule.Model2To(b) )

}

unique lazy rule Model2From{

from b : MMUmlpp!BehaviorModel to f : MMBpel!From(

expression <- thisModule.Model2FromExpression(b) )

unique lazy rule Model2FromExpression{ from b : MMUmlpp!BehaviorModel to e : MMBpel!Expression(

body <- 'Exit ' + b.name + ' successfully'

) }

unique lazy rule Model2To{

from b : MMUmlpp!BehaviorModel to t : MMBpel!To(

variable <- thisModule.Model2OutVariable(b) ,part <- thisModule.Model2ToPart(b)

) }

unique lazy rule Model2ToPart{

from b : MMUmlpp!BehaviorModel to p : MMBpel!Part(

name <- 'output' )

C. PHỤ LỤC - MÃ NGUỒN ACCELEO

File Bpel2Xml – chuyển đổi mô hình BPEL sang file BPEL XML

[comment encoding = UTF-8 /]

[module Bpel2Xml('http://itam.tdt.edu.vn/bpel/complete')/]

[template public Bpel2Xml(p : Process)]

[comment @main /]

[file

('vn.edu.tdt.'.concat(p.name.removeWs()).concat('.bpel').toLower(),

false, 'UTF-8')]

<?xml version="1.0" encoding="UTF-8"?> <process

name="vn.edu.tdt.[p.name.removeWs().concat('.bpel').toLower()/]"

targetNamespace="http://enterprise.netbeans.org/bpel/vn.edu.tdt.bpel.[p.n ame.removeWs().concat('.bpel').toLower()/]/vn.edu.tdt.bpel.[p.name.remove Ws().concat('.bpel').toLower()/]"

xmlns:tns="http://enterprise.netbeans.org/bpel/vn.edu.tdt.bpel.[p.name.re moveWs().toLower()/]/vn.edu.tdt.bpel.[p.name.removeWs().toLower()/]"

xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable" xmlns:sxt="http://www.sun.com/wsbpel/2.0/process/executable/SUNExtension/ Trace" xmlns:sxed="http://www.sun.com/wsbpel/2.0/process/executable/SUNExtension /Editor" xmlns:sxeh="http://www.sun.com/wsbpel/2.0/process/executable/SUNExtension /ErrorHandling" xmlns:sxed2="http://www.sun.com/wsbpel/2.0/process/executable/SUNExtensio n/Editor2"> <import namespace="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/[p.name.removeWs ()/]" location="[p.name.removeWs()/].wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <import namespace="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/HumanTask.wsdl" location="vn_edu_tdt_bpel_humantask/HumanTask.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> <partnerLinks>

[for (pl : PartnerLink | p.partnerLinks.children)

separator('\n')]

<partnerLink name="[pl.name.toLower()/]"

[if

(pl.name.toLower().contains(p.name.removeWs().toLower().concat('_client') ))]

xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/[p.name.re moveWs()/]" [else] xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/HumanTask. wsdl" [/if] [if (pl.partnerLinkType->notEmpty())] partnerLinkType="tns:[pl.partnerLinkType.name/]" [/if] [if (pl.partnerRole->notEmpty())] partnerRole="[pl.partnerRole.name/]" [/if] [if (pl.myRole->notEmpty())] myRole="[pl.myRole.name/]" [/if] /> [/for] </partnerLinks> <variables>

[for (v : Variable | p.variables.children) separator('\n')]

<variable name="[v.name/]"

[if (v.name.toLower().contains(p.name.removeWs().toLower().concat('inputvaria ble')) or v.name.toLower().contains(p.name.removeWs().toLower().concat('outpu tvariable')) )] xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/[p.name.re moveWs()/]" [else] xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/HumanTask. wsdl" [/if] [if (v.messageType->notEmpty())] messageType="tns:[v.messageType.qName/]" [/if] /> [/for] </variables>

<[p.activity.className()/] name="[p.activity.name/]">

[if (p.activity.className() = 'sequence')]

[for (a : Activity | p.activity.getSeqActivities())

separator('\n') ]

[if (a.className() = 'receive')]

<[a.className()/] name="[a.name/]"

partnerLink="[a.oclAsType(Receive).partnerLink.name.toLower()/]"

portType="tns:[a.oclAsType(Receive).portType.qName/]"

variable="[a.oclAsType(Receive).variable.name/]" [if (a.oclAsType(Receive).createInstance- >notEmpty())] createInstance="[a.oclAsType(Receive).createInstance.yesNo()/]" [/if] [if

(a.name.toLower().contains('start'.concat(p.name.removeWs().toLower())))]

xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/[p.name.re moveWs()/]" [else] xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/HumanTask. wsdl" [/if] /> [/if]

[if (a.className() = 'assign')]

<[a.className()/] name="[a.name/]">

[for (c : Copy | a.getCopies()) separator('\n')]

<copy>

<from>'[c.from.expression._body/]'</from>

<to variable="[c.to.variable.name/]"

part="[c.to.part.name/]" /> </copy> [/for] </assign> [/if]

[if (a.className() = 'invoke')]

<[a.className()/] name="[a.name/]"

inputVariable = "[a.oclAsType(Invoke).inputVariable.name/]" [if (a.oclAsType(Invoke).outputVariable- >notEmpty())] outputVariable = "[a.oclAsType(Invoke).outputVariable.name/]" [/if] partnerLink = "[a.oclAsType(Invoke).partnerLink.name.toLower()/]" portType = "tns:[a.oclAsType(Invoke).portType.qName/]" operation = "[a.oclAsType(Invoke).operation.name/]" [if

(a.name.toLower().contains('start'.concat(p.name.removeWs().toLower())))]

xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/[p.name.re moveWs()/]" [else] xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/HumanTask. wsdl" [/if] /> [/if]

[if (a.className() = 'reply')]

<[a.className()/] name="[a.name/]"

variable = "[a.oclAsType(Reply).variable.name/]" partnerLink = "[a.oclAsType(Reply).partnerLink.name.toLower()/]" portType = "tns:[a.oclAsType(Reply).portType.qName/]" operation = "[a.oclAsType(Reply).operation.name/]" [if

(a.name.toLower().contains('exit'.concat(p.name.removeWs().toLower())))]

xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/[p.name.re moveWs()/]" [else] xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/HumanTask. wsdl" [/if] /> [/if]

[if (a.className() = 'flow')]

<flow>

[for(s : Activity | a.oclAsType(Flow).activities)

separator('\n')]

[if (s.className() = 'sequence')]

<sequence>

[for(b : Activity |

s.oclAsType("Sequence").activities) separator('\n')]

[if (b.className() = 'assign')]

<[b.className()/] name="[b.name/]">

[for (c : Copy | b.getCopies())

separator('\n')]

<copy> <from>'[c.from.expression._body/]'</from>

<to variable="[c.to.variable.name/]" part="[c.to.part.name/]" /> </copy> [/for] </assign> [/if]

[if (b.className() = 'invoke')]

<[b.className()/] name="[b.name/]"

inputVariable = "[b.oclAsType(Invoke).inputVariable.name/]" [if (b.oclAsType(Invoke).outputVariable->notEmpty())] outputVariable = "[b.oclAsType(Invoke).outputVariable.name/]" [/if]

partnerLink = "[b.oclAsType(Invoke).partnerLink.name.toLower()/]" portType = "tns:[b.oclAsType(Invoke).portType.qName/]" operation = "[b.oclAsType(Invoke).operation.name/]" [if

(b.name.toLower().contains('start'.concat(p.name.removeWs().toLower())))]

xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/[p.name.re moveWs()/]" [else] xmlns:tns="http://j2ee.netbeans.org/wsdl/vn.edu.tdt.bpel/HumanTask. wsdl" [/if] /> [/if] [/for] </sequence> [/if] [/for] </flow> [/if] [/for] [/if] </[p.activity.className()/]> </process> [/file] [/template]

[query public className(e : Activity) : String =

e.eClass().name.toLower() /]

[query public getSeqActivities(e : Activity) : Sequence(Activity) = self.oclAsType(bpelcomplete::Sequence).activities/]

[query public getCopies(e : Activity) : Sequence(Copy) = self.oclAsType(Assign).copy /]

[query public yesNo(b : Boolean) : String = if (self = true) then 'yes'

else 'no' endif/]

TÀI LIỆU THAM KHẢO



[1] Miniwatts Marketing Group, "World Internet Users and Population Stats," http://www.internetworldstats.com/stats.htm, Statistics Report 2010. [2] Matthias Book, Volker Gruhn Sami Beydeda, Model-Driven Software

Development.: Spinger, 2005.

[3] J. Lonchamp, "A structured conceptual and terminological framework for software process engineering," in International Conference on the Software, 1993.

[4] Jr., S.M., Heimbigner D., and Osterweil L. J Sutton, "APPL/A: A language for software-process programming," ACM Transaction on Software Engineering and Methodology, vol. 4, no. 3, pp. 221–286, 1995.

[5] Bendraou.R, "UML4SPM: Un Langage De Modélisation De Procédés De Développement Logiciel Exécutable Et Orienté Modèle," L’Université Pierre & Marie Curie, PhD Thesis 2007.

[6] Tran.HN, "Modélíation de procédes logiciels de patrons Réutilisables," L'Université Toulouse II, PhD Thesis 2007.

[7] OASIS, "Web Services Business Process Execution Language Version 2.0," http://docs.oasis-open.org/wsbpel/2.0/OS/wsbpel-v2.0-OS.html, Technical Report 2007.

[8] OMG, "Specification, Meta Object Facility (MOF)," http://www.omg.org/mof/, Technical Report 2002.

[9] OMG, "Software & Systems Process Engineering Metamodel specification (SPEM) Version 2.0," http://www.omg.org/spec/ SPEM/2.0, Technical Report 2008.

Organization for Standardization, Technical Report, 1998. [11] OMG, "Workflow Management Facility (WfMF),"

http://www.omg.org/spec/WfMF/, Technical Report 2000.

[12] M.I., Feiler, P.H., Finklestein, A., Katayama, T., Osterweil, L.J., Penedo, M.H., Rombach, H.D. Kellner, "ISPW-6 software process example," in Conference on the Software Process. IEEE Computer Society, Washington DC, 1991, pp. 176-186.

[13] W.M.P., ter Hofstede, A.H.M., et al. Van der Aalst, "Workflow Patterns,"

Distributed and Parallel Databases, vol. 14, no. 5, p. 51, 2003.

[14] OMG, "MDA Guide Version 1.0.1," http://www.omg.org/mda/, Technical Report 2003.

[15] Krzysztof Czarnecki and Simon Helsen, "Classification of Model

Transformation Approaches," in Workshop on Generative Techniques in the Context of Model-Driven Architecture , 2003.

[16] F. and Kurtev, I Jouault, "Transforming models with ATL," in Satellite Events at the MoDELS Conference, Montego Bay, Jamaica, 2006.

[17] Pham.MT, "Xây dựng công cụ mô hình hóa tiến trình hỗ trợ mẫu tiến trình," Đại học Khoa học Tự nhiên, Hồ Chí Minh, Luận văn Thạc sỹ 2010.

[18] Volker Gruhn, "Process-Centered Software Engineering Environments : A Brief History and Future Challenges," Annals of Software Engineering, 2002. [19] OMG, "Business Process Model and Notation (BPMN),"

http://www.omg.org/spec/BPMN/1.2, Technical Report 2009.

[20] Stephen A. White, "Using BPMN to Model a BPEL Process," IBM, Technical Report 2005.

[21] Marlon Dumas, Stephan Breutel, and Arthur H.M. ter Hofstede Chun Ouyang, "Translating Standard Process Models to BPEL," in International Conference on Advanced Information Systems Engineering, 2006.

[22] Frédéric Jouault, Jean Bézivin Guillaume Doux, "Transforming BPMN process models to BPEL process definitions with ATL," in International Workshop on Graph-Based Tools, 2009.

[23] K. Mantell, "From UML to BPEL,"

IBM(http://www.ibm.com/developerworks/webservices/library/ws-uml2bpel), Technical Report 2005.

[24] Korherr B. and List B., "Extending the UML 2 Activity Diagram with Business Process Goals and Performance Measures and the Mapping to BPEL," in 2nd International Workshop on Best Practices of UML, 2006.

[25] Staikopoulos A. Bordbar B., "On Behavioural Model Transformation in Web Services," in Proc. of the ER 2004 Workshops CoMoGIS, COMWIM, ECDM, CoMoA, DGOV, and ECOMO, Shanghai, 2004.

[26] R. Sadovykh, A. Gervais, M.-P. Blanc, X. Bendraou, "Software Process Modeling and Execution: The UML4SPM to WS-BPEL Approach," in

EUROMICRO Conference on Software Engineering and Advanced Applications, 2007.

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 101 - 118)