LetvægtsPHPengineforBPEL baseretpåxml omskrivning Afsluttendediplomprojektaf Skovhøjen1 7100Vejle E Mail:dkt@itu.dk Vejleder:Prof.ThomasHildebrandt Projektperiode Opgavestart:1.Februar2008 Afleveringafopgave:1.August2008
Indholdsfortegnelse Licens...i Indledning...1 Problemformuleringogmål...1 Metode...1 Struktur...1 Anerkendelseogtak...2 Kapitel1...3 Problemdomænet...3 1.1Workflow...3 1.2Systemtilworkflowhåndtering...4 Arkitektur...6 1.3Procesdefinition...9 1.4Sammenfatning...11 Kapitel2...12 Teknologierogstandarder...12 2.1BPEL...12 Variabler...14 2.2BPEL4PeopleogWS HumanTask...15 2.2.1BPEL4People...15 2.2.2WS HumanTask...18 2.3PHP...20 2.4XForms...21 2.5Sammenfatning...24 Kapitel3...26 Workflowmønstre...26 3.1WorkflowmønstreiBPEL...26 3.1.1Grundlæggendemønstre...27 Sekvens...27 Parallelopdeling(AND split)...28 Synkronisering(AND join)...28 Deadpathelimination...29 Eksklusivtvalg(XOR split)...30 Simpelfletning(XOR join)...31 3.1.2Avanceretforgrenings ogsynkroniseringsmønstre...31 Multivalg(OR split)...32 Synkronfletning(InklusivOR join)...32 3.1.3Strukturmønstre...32 Implicitafslutning...32 3.1.4Multipelinstansmønstre...32 Multipelinstanserudensynkronisering...33 3.1.5Tilstandsbaseretmønstre...33 Udskudtvalg(udskudtXOR split)...34 3.1.6Annulleringsmønstre...35 Annulleraktivitet...35 Annullercase...36 3.2Humanworkflowmønstre...37 3.3Sammenfatning...37
Kapitel4...39 Krav...39 4.1Tilstandsmaskinen...39 4.1.1Funktionellekrav...39 4.1.2Ikke funktionellekrav...39 4.1.3Aktører...40 4.1.4Usecase...40 Evalueredokument...40 4.2Sammenfatning...43 Kapitel5...44 Workflowmodel...44 5.1AktiviteterogDOM...44 5.2Strategiforafviklingen...45 5.3Flowkontrol...46 5.4Tilstandogvariabler...46 Afventesvar...47 5.5Manuelleaktiviteter...47 5.6Sammenfatning...47 Kapitel6...49 Designogimplementering...49 6.1Arkitektur...49 6.2Implementering...51 6.2.1Workflowvariabler...51 Synlighed...52 6.2.2Afviklingafetworkflow...53 6.2.3XML omskrivning...55 6.2.3.1BPELaktiviteter...56 sequence...56 if...57 While...60 wait...64 assign...66 6.2.3.2SM BPELaktiviteter...67 onchange...67 humanform...68 6.3Betingelser...69 Boolean...70 Duration...70 DateTime...71 6.4Sammenfatning...72 Kapitel7...74 Konklusionogfremtidigtarbejde...74 7.1Konklusion...74 7.2Fremtidigtarbejde...75 7.2.1Workflowmodel...75 7.2.2Udvidelseafdelt lager...75 7.2.3Arbejdsliste...76 AppendiksA...77 Tutorial...77 A.1Forudsætninger...77
A.2Konfiguration...78 A.3Struktur...78 A.4Definereetworkflow...79 A.4.1Procesdefinitionen...79 A.4.2Humanforms...80 A.5Starteetworkflow...86 AppendiksB...88 API'er...88 B.1BPELProcess&instancemodelAPI...88 BpelVariable.php...88 B.1.1activities...91 Activity.php...91 B.1.1.1bpel...92 BpelEmptyActivity.php...93 BpelAssignActivity.php...94 BpelExitActivity.php...97 BpelIfActivity.php...98 BpelSequenceActivity.php...103 BpelThrowActivity.php...105 BpelWaitActivity.php...106 BpelWhileActivity.php...109 BpelInvokeActivity.php...112 B.1.1.2sm bpel...115 OnChangeActivity.php...115 HumanFormActivity.php...118 B.1.2expressions...120 BpelWfExpression.php...120 BpelWfBooleanExpression.php...122 BpelWfDurationExpression.php...124 BpelWfDateTimeExpression.php...125 B.2WorkflowExecutionAPI...127 B.2.1executions...127 BpelDOMNodeListIterator.php...128 BpelWfExecution.php...131 B.2.2exceptions...136 BpelWfException.php...137 BpelWfDefinitionStorageException.php...137 BpelWfActivityNodeNotRemoveFromDOM.php...137 BpelWfExplicitTerminationException.php...138 BpelWfInternalFaultException.php...138 BpelWfInvalidXPathExpressionException.php...138 BpelWfNodeNotAppendedToDOM.php...139 BpelWfNodeNotReplacedInDOM.php...139 BpelWfVariableNotFoundException.php...140 BpelWfUrlNotFoundException.php...140 B.3ParsingAPI...141 BpelWfUtils.php...141 IDOMExporter.php...143 B.4validationAPI...145 XpathValidator.php...145
B.5PersistenceAPI...146 BpelWfDefinitionStorage.php...146 AppendiksC...152 Bibliografi...152
Licens DetteafsluttendediplomprojekterpubliceretunderCreativeCommons Navngivelse Delpåsamme vilkår2.5danmark licensen. Duharfrihedtil: atfremstilleeksemplareroggøreværkettilgængeligtforalmenheden atfremstillebearbejdedeværker Påfølgendevilkår: Navngivelse:Duskalkreditereværketpådenmåde,dererangivetafrettighedshaverenog licensgiveren. Delpåsammevilkår.Hvisduændrer,bearbejderellerbyggerviderepådetteværk,mådu kunvideresprededetresulterendeværkunderenlicens,dereridentiskmeddenne. Iforbindelsemedalviderebrugogspredningskaldugørelicensvilkårenefordetteværk klartforandre. Alledissevilkårkanfrafaldes,hvisdufårtilladelseafrettighedshaveren. Nothinginthislicenseimpairsorrestrictstheauthor'smoralrights.
Indledning Problemformuleringogmål Detteprojektharsommålatdesigneogimplementereentilstandsmaskine(TM)implementereti PHPforudførselafBPELprocesserbaseretpåXML omskrivning. Dettemålharsinmotivationfradenvirkeligeverden,hvorjegtildagligt,iudviklingenafsoftware, igenogigenstøderpåworkflowogbusinessprocesser(bp),sommedfordelkunneunderstøttesaf ensådantm. Metode FremgangsmådenvilværeatimplementereenTM,derkanudføreetworkflowvedatfortolkeog omskrivetilstandefordeigangværendeprocesserrepræsenteretoggemtixmlformat. FormatetforXMLprocessernevilværeinspireretafBPEL,meniprojektetviljegundersøgehvilke ekstraelementerderernødvendigeforatrepræsenterekøretidsinformation. Dettevilværebaseretpårelevantlitteraturomkringworkflow,businessprocesmodellering,BPEL [BPEL4WS],herunderspecieltCosmoBiz forskningsprojektet[cosmobiz],relevantexml teknologierogdesignmønstrerelevantfordesignetaftm'en. TM'envilbliveevalueretvedtestpåenellerflereselvvalgteBPtagetfradenvirkeligverden.Det kanværebp,derudspringerframitarbejde. Struktur Kapitel1giverenintroduktiontilproblemdomænetomkringworkflowogworkflowhåndtering. Indledning 1
Kapitel2giverenintroduktiontildenstakafteknologier(BPEL,BPEL4People,WS HumanTask, PHPogXForms),dererrelevantforogerblevetanvendtafsoftwarekomponentenudvikletidette projekt.kapitel3præsentereretudplukafworkflowmønstre,derpånuværendetidspunkt understøttesdirekteibpel,samtenganskekortpræsentationafhumanworkflowmønstre. Kapitel4diskutererdefunktionelleogikke funktionellekrav,derertiltilstandsmaskinenog opstillerenusecase,somdenskalkunneudføre. Kapitel5præsenterersemantikkenforworkflowmodellen,somerfundamentetfor tilstandsmaskinen,derudviklessomendelafprojektet. Kapitel6diskutererdesignetogimplementeringenafsoftwarekomponenten,dererblevetudviklet somendelafdetteprojekt. Kapitel7konkludererpåopgaven,samtgiverenudsigttilfremtidigtarbejdeomkringden implementeredetilstandsmaskine. Anerkendelseogtak JegvilgerneretteenheltspecieltaktilProf.ThomasHildebrandtforatvilleværeminvejleder. Udenhansvejledningvilledetteprojektformentligaldrigværeblevettilnoget,dajegfleregange harovervejetatstoppeprojektet,dadethelesåhåbløstudimineøjne. JegvilgernehavelovattakkeIT universitetikøbenhavnogminnuværendearbejdsgiverpharma NordApSforatgivemigmulighedenforatskrivemitafsluttendediplomprojekt. EnstortaktilminforlovedeLisbethfordenekstraordinæreindsats,hunhargjort,påområderder egentligburdeværeetfællesprojekt,underheleudarbejdelsenafdetteprojekt. MineforældreTrineogKarlskalogsåhavetakforderesøkonomiskestøtteoginteressefor,hvad jegegentligtharknokletmeddetsidstehalveår,selvomdetofteikkesigerdemnoget. Afslutningsvisviljegudtrykkeminpåskønnelsetilalledemennesker,somerellerharværet involveretiudviklingenaffrisoftware(php,pear,firefox2,xformsudvidelsentilff2,eclipse PDT,Xdebug,PHPUnit),anvendtidetteprojekt,samtdeværktøjer(Dia,BOUML,GIMP, OpenOffice)anvendttiludarbejdelsenafdettedokument. Indledning 2
Kapitel1 Problemdomænet Dettekapitelgiverenintroduktiontilproblemdomænetomkringworkflowogworkflowhåndtering. Afsnit1.1giveretsvarpåhvadworkflower,afsnit1.2fortællerhvadetsystemtil workflowhåndteringerogafsnit1.3beskriverkorthvadenprocesdefinitioner. 1.1Workflow Derermereogmerebrugforatreducereomkostningernevedatlaveforretningogkontinuerligtat udviklenyeservicerogsoftwaretilathåndterenyeforretningsprocesserellerændringeri eksisterende.håndteringenafforretningsprocesserogsystemertilworkflowhåndteringleverer metodologierogsoftware,somhjælpermedatorganisereprocesser,deroperererpådetteområde indenforenorganisation. Tilbagei1996publicerede TheWorkflowManagementCoalition(WfMC) etglosarog terminologier,somindeholdervigtigebetingelser,derrelaterersigtilworkflow.idenseneste versionfrafebruar1999,defineresetworkflowsåledes: Theautomationofabusinessprocess,inwholeorpart,duringwhichdocuments, informationortasksarepassedfromoneparticipanttoanotherforaction,according Kapitel1 3
toasetofproceduralrules. 1[WfMC99]. Ordetworkflowstødermanpådagligt,måskeudenegentligattænkeoverdet.Føritidenbetød workflowatgiveetstykkepapirfraenpersontilanden.detklassiskeworkflowparadigmesigerat workflowerflowetafarbejde,deromfatterudvekslingenogberigelsenafinformationerog beskrivesafclient/serversurvivalguidesåledes. Theclassicalworkflowparadigmisariverthatcarriestheflowofworkfromportto portandalongthewayvaluegetsadded.workflowdefinestheoperationsthatmustbe visitedalongthewayandthatneedstobedonewhenexceptionsoccur. 2[CSSG99] Etworkflowinvolverernormaltetantalskridt,derskaltagesogsomhverisærerkendtsomen aktivitet.enaktivitetvilentenværeautomatisk,hvilketbetyderatdenudføresafetsystemtil workflowhåndtering,ellerdenkanværemanuel,hvordenunderudførelsenkanvælgeatinteragere medmenneskeligressourcer. 1.2Systemtilworkflowhåndtering Af TheWorkflowManagementCoalition(WfMC) defineresetsystemtilworkflowhåndtering således. Asystemthatdefines,createsandmanagestheexecutionofworkflowsthroughtheuse ofsoftware,runningononeormoreworkflowengines,whichisabletointerpretthe processdefinition,interactwithworkflowparticipantsand,whererequired,invokethe useofittoolsandapplications. 3[WfMC99]. 1 Oversat: Automatiseringenafenforretningsproces,ihelheldellerdele,hvordokumenter,informationelleropgaverafleveresfraendeltagertil andenforatfåforetagethandlingiht.regleromkringproceduren. 2 Oversat: Detklassiskeworkflowparadigmeerenflod,derbærerflowetafarbejdefrahavntilhavnogpåvejentilføjesderværdi.Workflow definererdeoperationer,derskalbesøgespådennevejogsomskaludføres,hvisundtagelseropstår. 3 Oversat: Etsystemderdefinerer,opretteroghåndtererudførelsenafworkflowsgennembrugenafsoftware,derkørerpåéntilflereworkflow engines,someristandtilatfortolkeprocesdefinitionen,interageremedworkflowdeltagereog,hvordeterpåkrævet,påkaldebrugenafit værktøjerogapplikationer.. Kapitel1 4
Systemertilworkflowhåndteringersoftware,dermuliggørogaktivererstyringenoghåndteringen afworkflow. Dereksisterertotyperafsystemertilworkflowhåndtering:demdererbaseretpåaktiviteterogdem dererbaseretpåentiteter4.førstnævnteharfokuspåetsætafaktiviteter,derskaludføresigennem heleworkflowet,sidstnævnteerderimodcentreretomkringenentitet,såsometdokument,som tilgåsfraetworkflow[fg02].detteprojektvilhavefokuspåworkflowbaseretpåaktiviteter. DokumentationenforOpenFlowworkflowhåndteringssystem[OPENFLOW]referererformåletmed etworkflowhåndteringssystembaseretpåaktivitetersomatsvarepåspørgsmålet Hvemskalgøre hvad,hvornåroghvordan? : Processenhvormandefinerersekvensenafaktiviteter,derskaludføresudspecificererhvad derskalgøres.definitionenafaktiviteter(repræsentererknuderienorienteretgraf)og transitioner(repræsentererkanterienorienteretgraf)fortællerhvornårdetskaludføres. Enaktivitet(hvaddelenafformålet)repræsenterernoget,derskaludføres:sendeenemail, udfyldeenform,placereenordre,aktivererenkontoetc. Transitioner(hvornårdelenafformålet)repræsenterersekvensenafaktiviteterienproces. Enhveraktivitetvilhaveenapplikationtilatudførejobbet,derafhvordandelen. Hvemdelenergenereltbrugerenellersystemet,derharfåettildeltrollentilafudføre aktivitetengennemdetsapplikation. Figur1.1visereteksempel,hvordetteerforsøgtillustreret:Degrønneknuderrepræsenterer aktiviteter,derskaludføresigennemheleworkflowet.derødekantermellemknuderneogselvede rødeknuderkontrollererflowet.nårbrugernemedderetterettigheder(blå)hargivetinddataene, foretagerknuden(parallelsplit)enopsplittelse,dersørgerforattreaktiviteterkankøreparallelt.to afdisseaktiviteterertildeltenapplikationforatfåjobbetudført(automatiskaktivitet),hvorimod deneneaktivitetertildeltenbrugermedrollen A tildelt(manuelaktivitet).nåralletreaktiviteter erudført,foretagerknuden(synkronisering)ensynkronisering,hvorefterworkfloweterudført. 4 Activity basedogentity based. Kapitel1 5
Figur1.1: Hvemskalgørehvad,hvornåroghvordan? Interaktionmedbrugeren,eksempelvisforatmodtageinddata,skergennemetinterfacetilen arbejdsliste.softwaresystemethvorisystemettilworkflowhåndteringerintegreretforespørger workflowsystemet,omenworkflowinstansafventerinddata,somkanforetagesafdenaktuelle bruger.erdettilfældetpræsenteresbrugerenforinterfacet,hvorigennemvedkommendekanoprette ogvideregiveinddata. Arkitektur Identid,hvorworkflowhareksisteret,erderfremsatforskelligemeningerom,hvadder kendetegnerengodworkflow/bpm(businessprocessmodelling)arkitektur. WfMCfremsætter,ideresworkflowreferencemodel[WfMC95],enworkflowarkitektursåledes: Kapitel1 6
Allworkflowsystemscontainanumberofgenericcomponentswhichinteractina definedsetofways;differentproductswilltypicallyexhibitdifferentlevelsofcapability withineachofthesegenericcomponents.toachieveinteroperabilitybetweenworkflow productsastandardisedsetofinterfacesanddatainterchangeformatsbetweensuch componentsisnecessary 5. WfMCbeskriverdissegeneriskekomponenteroginterfacesforenworkflowarkitekturtilat inkludereværktøjertilprocesdefinition,applikationertilarbejdslister,applikationertil administrationogovervågning,påkaldtapplikationer(somwebservices)ogworkflowmaskiner. MichaelHarveybeskriverisinbog EssentialBusinessProcessModelling [EBPM05],hvadhan mener,derkendetegnerengodworkflow/bpmarkitekturbaseretpåbpeltildefinitionog eksekveringafforretningsprocesser.dennearkitekturbyggerpåwfmcreferencemodellenoger vistifigur1.2. Figur1.2:Engodworkflow/BPMarkitekturafM.Harvey 5 Oversat: Alleworkflowsystemerbestårafetantalafgeneriskekomponenter,sominteragererudfradefineredemåderatgøredettepå; forskelligeprodukterviltypiskudstilleforskelligegraderafevnerindenforhverafdissegeneriskekomponenter.foratindfriinteroperabilitet mellemworkflowprodukter,skaletstandardiseretsætafgrænseflade ogdataudvekslingsformattermellemdissekomponenterværetilstede.. Kapitel1 7
Efterathavefåetetglimtaf,hvadderudgørengodworkflow /BPMarkitektur,erdeenkelte komponenter,derblevskitseretifigur1.2,kortbeskrevetitabel1.1. Komponent Beskrivelse Run timemaskine Ansvarligforatindlæseprocesdefinitionerogeksekvereinstanseraf dem.undereksekveringenerdenansvarligforatopfangehændelser (aktiviteter)ogbehandledem,samtsendeudgåendebeskeder(eks. eksternapplikation). Menneskeliginteraktion Ermanuellearbejdsopgaver,derudføresafbestemtebrugeremed bestemterollerisystemet. Nårenprocesinstanstiererensådanarbejdsopgave,gårdeni ventepositionindtil,dergivesbeskedom,atopgavenerudførteller annulleret.brugerneserogudførerderesarbejdsopgavergennemen grafiskkonsol.tilstandenfordenenkeltearbejdsopgaveskalgemmes (evt.idatabaseellerxml),dadisseofteleverlænge. Systeminteraktioner Erforbindelsertilinterne(andreapplikationerpådetfællesnetværk) ogeksterneapplikationer(typiskwebservicebaseretpartner processer). Administrationog overvågning Enadministrativkonsol,derhjælperadministratorermedatsporeog ændreobjekterstyretafrun timemaskinen,detteinkluderer procesdefinitioner,processer,aktiviteter,manuelleopgaver,brugereog brugerroller.anvenderenpassendedatamodeltilstyredette. Databasetil lagringafprocesser. Lagrerdeenkelteprocessersnuværendetilstand,såentilstandkan gendannesitilfældeafeventuellesystemnedbrud.datamodelerbedst modelleretsomennormaliseretrelationeldatabase.hvismanvælger atanvendeendatabase. Grafiskeditor Etværktøjtilgrafiskatmodellereenproces(eksempelvisBPEL) gennemennotationforgrafikmodellering(eksempelvisbpmneller UML). Exporter Anvendestilmapning(eksempelvisBPMNtilBPEL). WS CDLværktøj Beståraftoværktøjer: 1. Generator(generererenprocesmodeludfraetpåkrævetflow afhændelserogallekaldtilendeltagerimultideltager Kapitel1 8
koreografi). 2. Validering(validererenlokalprocesmodelopmoden multideltagerkoreografi). Tabel1.1:komponenteriengodWF/BPMarkitektur. 1.3Procesdefinition Enforretningsproces,derskaligennemetworkflowkræverenmådeatbliverepræsenteretpå,så denkanforståsogbearbejdesafworkflow håndteringssystemet.procesdefinitionenerkerneniat beskriveenforretningsproces,dergør,atetworkflow håndteringssystemkanlæseogforståden. TheWorkflowManagementCoalition(WfMC)definererenprocesdefinitionsåledes: Therepresentationofabusinessprocessinaformwhichsupportsautomated manipulation,suchasmodelling,orenactmentbyaworkflowmanagementsystem.the processdefinitionconsistsofanetworkofactivitiesandtheirrelationships,criteriato indicatethestartandterminationoftheprocess,andinformationabouttheindividual activities,suchasparticipants,associateditapplicationsanddata,etc. 6[WfMC99]. WfMChardefineretenreferencemodeltilworkflowtilbagei1995,sombestårafkomponenterog interfaces.idettedokumentetdefineresprocesdefinitionsåledes: Thecomputerisedrepresentationofaprocessthatincludesthemanualdefinitionand workflowdefinition. 7[WfMC95]. Procesdefinitionenerresultatafenproces,dereksempelviserblevetdefineretieteksterntværktøj, dervideregivesiinterface1.selvomwfmcikkeharspecificeretnogenstandardforengrafisk notationtilatdefinereprocesser,stillerdedogetsprogbaseretpåxml formattilrådighed,kaldet XMLProcessDefinitionLanguage(XPDL). 6 Oversat: Repræsentationenafforretningsproces. 7 Oversat: Endatamatiseretrepræsentationafenproces,derinkluderermanueldefinitionogworkflowdefinition. Kapitel1 9
Derfindesogsåandresprogtildefinitionafprocesser,somkananvendes.Etudpluktagetfrabogen omkringessentielmodelleringafforretningsprocesserafm.harvey[ebpm06]sesitabellen nedenfor: Standard Organisation Beskrivelse BusinessProcessExecution OASIS Detmestpopulæresprogtilmodelleringaf Language(BPEL) forretningsprocesser.enprocesrepræsenteressom XMLmedWebservicebindinger. BusinessProcessModelling BPMI EtsprogbaseretpåXMLsomBPEL. Language(BPML) XMLProcessDefinitionLanguage WfMC EtsprogbaseretpåXMLsomBPEL. (XPDL) XLANG Microsoft EttidligeresprogbaseretpåXML,somharhaft indflydelsepåbpel. WebServiceFlowLanguage (WSFL) IBM EttidligeresprogbaseretpåXML,somharhaft indflydelsepåbpel. BPELervalgtsomsprogettilprocesdefinitionfordenletvægtstilstandsmaskine,derskaludvikles somendelafdetteprojekt(læsmereombpelikapitel2).begrundelsenfor,atvalgeterfaldetpå BPELer,atsprogetbevægersigiretningenafblivetilende factostandardforforretningsprocesser. BPELunderstøtterikkemanuelleaktiviteter,somdogforsøgesløstgennemenudvidelsekaldet BPEL4People(B4PP).B4PPhardogenmangel,hvilketdeselvpåpeger: BPEL4Peopledoesnotstipulatehowthedataisrendered,butonlyprovidesadefault methodthatshowsthetopleveldataofthemessage,forexample,usinghtmlformsor XForms 8[BPEL4P]. Detteprojekthar,påbaggrundafdennemangeliB4P,valgtikkeatbenyttesigafB4Ptilatdefinere 8 Oversat: BPEL4Peoplefastsætterikke,hvordandatabliverrenderet,mengiverkunenstandardmetode,derviserdatafor beskedenpåtopniveau,f.eks.gennembrugenafhtml formsellerxforms. Kapitel1 10
manuelleaktiviteter.istedetvilderblivedefineretnyelementer(tilmanuelleaktiviteter),somvil kunneintegreresibpel. 1.4Sammenfatning Dettekapitelintroduceredelæserenforproblemdomænet,somdetteprojektbevægersigrundti.Vi harkiggetpåworkflow,deranvendestilatautomatisereforretningsprocesser.etsystemtil workflowhåndtering,derentenbaserespåetsætafaktiviteterellerentiteter,detteprojektvilhave fokuspåworkflowbaseretpåaktiviteter.desudensikreretsådansystem,atvifårsvarpådet essentiellespørgsmåletomkringworkflowhåndtering Hvemskalgørehvad,hvornårog hvordan?. Procesdefinitionenerkerneniatbeskriveenforretningsproces,dergør,atetworkflow håndteringssystemkanlæseogforståden.derfindesherforskelligesprogtilatdefinereenproces,i detteprojektblevbpeldetforetruknevalg,fordideterbevægersigiretningenafatbliveende factostandardforforretningsprocesser. ManuelleaktiviteterunderstøttesikkeafBPEL,menerdogforsøgtløstmedenudvidelsekaldet BPEL4People(B4PP).B4PPerfravalgtsomløsningtilmanuelleaktiviteteridetteprojekt,dervili stedetblivedefineretnyelementer(tilmanuelleaktiviteter),somvilkunneintegreresibpel. Kapitel1 11
Kapitel2 Teknologierogstandarder Dettekapitelgiverenkortintroduktiontildenstakafteknologier(BPEL,BPEL4People,WS HumanTask,PHPogXForms),dererrelevantforogerblevetanvendtafsoftwarekomponenten udvikletidetteprojekt. 2.1BPEL BPELerensammensmeltningafMicrosoft sxlangogibm swsfl. SomdefineretiabstraktetfraWebServicesBusinessProcessExecutionLanguageOASISStandard WS BPEL2.0[BPEL4WS],erBPELetsprogtilatbeskriveforretningsprocesser,derbaserersig påwebservices. BPELanvenderWSDLfilertilatspecificereinterfacestilwebservices(partnerlinktyper, egenskaber(properties),porttyperogoperationerogbeskeder),dererafinteresseforprocessen (webservicedererimplementeretafellerkaldtfraprocessen).wsdlerenvelkendtteknologi,der stillerenxml baseretmodeltilrådighedtilatbeskriveenwebservice[wsdl]. BPELlevereretsprog,derbådekanspecificereabstrakteogeksekverebareforretningsprocesser. Abstrakteprocesserspecificererudvekslingenafbeskedermellemforskelligeparter,udenatafsløre deninterneopførelseafnogleafdem.deeksekverbareprocesserderimod,modellererdenegentlige opførselafendeltagerienforretningsinteraktion.jegviludelukkendefokuserepådeeksekverebare processer,damitmålerenreelimplementeringafdisse. Kapitel2 12
EksekvarbareforretningsprocesseriBPELerbyggettilatkøreienprocesmaskine,som tilstandsmaskinenimplementeretsomendelafdetteprojekt.eneksekvarbarprocesibpel specificererpartnereinvolveretiprocessen,beskeder(messages),derudvekslesogetantal aktiviteter(aktivities),derudføresiprocessenslevetid.enaktivitetkanentenværeenprimitiveller enstrukturelaktivitet. Itabel2.1harjeglistetBPELsnuværende21aktiviteter[BPEL4WS]medenkortforklaringaf deresansvar. Navn Beskrivelse Type Assign Opdatererværdierivariabler. Primitiv Empty No op.udføreingenhandling. Primitiv Receive Afventersvarfraenbestemtbesked,ogudføresnårbeskeden modtages. Primitiv Reply Returnereretsynkronsvarpåetindgåendewebservicekald, dererudløstafenreceive. Primitiv Invoke Kalderenpartnerswebserviceentensynkronellerasynkron. Primitiv Throw Generererenfejlindefraforretningsprocessen. Primitiv Rethrow Kasterenfejligen,deroprindeligtvarblevetfangetafden omgivetfaulthandler. Primitiv Validate ValidererværdierivariableropmodderesassocieredeXMLog Primitiv WSDLdatadefinition. Wait Pauserprocessenforengivenvarighedellerindtiletbestemt tidspunkt. Primitiv Exit Afslutterenforretningsprocesomgående. Primitiv Compensate Starterkompensationforalleindrescopes,deralleredeer udførtkorrekt. Primitiv CompensateScope Starterkompensationforenspecificeretindrescope,der alleredeerudførtkorrekt. Primitiv ExtensionActivity UdviderBPELvedatintroducereennyaktivitetstype. Primitiv Sequence Udføreretsætafaktivitetersekventielt. Strukturel Kapitel2 13
If Vælgerénaktivitetfraetsætafmuligetiludførelse. Strukturel While Udførerdetsaktivitetsålængedenspecificeretbetingelseer sand. Strukturel RepeatUntil Udførerdetsaktivitetindtildenspecificeretbetingelsebliver Strukturel sand.tilforskelfrawhiletestesbetingelsen,nåraktivitetener blevetudført,detresultereri,ataktivitetenudføresmindstén gang. Pick Afventerétsvarudafadskillebeskederelleratderskeren time out. Strukturel Flow Udførerénellerflereaktivitetersideløbende.Aktivitetener udført,nåralledenssideløbendeaktivitetererudført(bpels supportforetgraforienteretflow). Strukturel ForEach GennemløberdensbarnscopeaktivitetpræcisN+1gange,hvor Strukturel Nerslutværdi startværdi.foreachkankøreparallelt,hvis detbliverangivet. Scope EnaktivitetmedegnepartnerLinks,handlers,variabler, correlationsetsogaktivitet. Strukturel Tabel2.1:BPELsaktivitetsmodel. SomtidligerenævnterBPELudtryktiXML.Alleprocesserstartermedet<process>element. Proceselementetindeholderaktiviteter,deklarationerafvariabler,partnerdeklarationer,partner linksdeklarationer,samtdeklarationeraffaulthandlerstilathåndterefejl. Variabler BPELunderstøtterbrugenafvariablertilatopbevareværdier.Tildelingafværdiertilvariablerkan skevedhjælpafaktiviterne<assign>,<invoke>og<receive>.variablerermedtilatbeskrive tilstandenforenprocesgennemdenslevetid.variablerkanerklæresglobaleellerlokaleiet specifiktscope.allevariablerertilgængeligeindenforenenkeltprocesinstans.globalevariabler erklæresindenielementetvariables.oversigt2.1visersemantikkenforhhv.<variables>og <variable>. Kapitel2 14
<variables> <variablename="bpelvariablename" messagetype="qname"? type="qname"? element="qname"?>+ from spec? </variable> </variables> Oversigt2.1:SemantikkenforBPELvariable EnBPELvariabelharattributterdernavngiverden,samtspecificererdenstype.Envariabelstype kanværeénafflg.tredeklarationer:wsdlbesked,xmlschematypeelleretxmlschema element.tilstandsmaskinen,implementeretsomendelafdetteprojekt,understøtterikkewsdl beskederellernogenformforskemavalideringpånuværendetidspunkt. Variablererikkeinstanstieret,nårenprocesinstanstieresogbliverdetførst,nårprocessenstartes. 2.2BPEL4PeopleogWS HumanTask DetteafsnitintroducererkortspecifikationerneBPEL4People[BPEL4P]ogWS HumanTask[WS HT].Dissespecifikationerharrelevans,daBPELspecifikationen[BPEL4WS]kunfokusererpå forretningsprocesser,derkommunikererviawebserviceudenyderligereforudsætninger.spektret forforretningsprocessererstørreenddet,damenneskeroftedeltageriudførelsenaf forretningsprocessen.dettemedføreretkravomatkunnehåndteremenneskeliginteraktionmellem enprocesogenbrugergrænseflade. 2.2.1BPEL4People BPEL4People(B4P)erenudvidelsetilBPEL,dermuliggørmodelleringenafmenneskelige interaktioner,somkanstrækkesigfrasimplegodkendelsertilmerekomplekseadskillelseaf arbejdsopgaverbaseretpåroller. DennespecifikationintroducererenmenneskeligaktivitetpeopleActivity,somennybasisaktivitet, Kapitel2 15
dermuliggøratspecificereenmeredirektemådeatspecificeremenneskeliginteraktionpåien proces. Implementeringenafenmenneskeligaktivitetvilværeiformafeninlineopgaveellerenstandalone opgavedefineretiws HTspecifikationen. B4Perdefineretpåensådanmåde,atdetliggersometlagovenpåBPEL,sådetsegenskaberkan udgøresafbpelegenskaber.figur2.1viserhierarkietafwebservicestandarder,derindgåri BPEL,B4PogWS HT,somenlagdeltarkitektur. Figur2.1:Hierarkiafwebservicestandarder. Alleelementerintroduceretidenneudvidelseergjorttilgængeligeforbådeeksekverbareog abstrakteprocesseribpel. B4PudviderBPELsmekanisme,tilatimplementereudvidelserisproget,tilnuogsåatkunne indeholdeb4pelementerne.bpelkanudvidesgennemaktiviteten<extensionactivity>,hvilket medføreratattributterogelementerfraandrenamespaceskananvendesib4pelementerne. Oversigt2.2viserenuformelsyntaksforenBPELprocesogscope,derindeholderlogiske brugergrupper,menneskeligeinlineopgaverfraws HTogBP4aktiviteten<peopleActivity>. <bpel:process...... xmlns:b4p="http://www.example.org/bpel4people" xmlns:htd="http://www.example.org/ws HT">... <bpel:extensions> <bpel:extensionnamespace="http://www.example.org/bpel4people" mustunderstand="yes"/> <bpel:extensionnamespace="http://www.example.org/ws HT" mustunderstand="yes"/> Kapitel2 16
</bpel:extensions> <bpel:importimporttype="http://www.example.org/ws HT" />... <b4p:humaninteractions>? <htd:logicalpeoplegroups/>? <htd:logicalpeoplegroupname="ncname">+... </htd:logicalpeoplegroup> </htd:logicalpeoplegroups> <htd:tasks>? <htd:taskname="ncname">+... </htd:task> </htd:tasks> <htd:notifications>? <htd:notificationname="ncname">+... </htd:notification> </htd:notifications> </b4p:humaninteractions> <b4p:peopleassignments>... </b4p:peopleassignments>... <bpel:extensionactivity> <b4p:peopleactivityname="ncname"...>... </b4p:peopleactivity> </bpel:extensionactivity>... </bpel:process> Oversigt2.2:UformelsyntaksforenBPELproces. EnB4PprocesskalanvendeB4PudvidelsenselementerogelementernefraWS HT specifikationen.derforskalelementerfrahhv.b4pogws HTnamespacesværekendtogforstås. Detvalgfrieelement<b4p:humanInteractions>indeholderdeklarationenafelementerne <htd:logicalpeoplegroups/>,<htd:tasks>og<htd:notifications>fraws HTnamespacet. Elementet<b4p:peopleAssignments>brugestilattildelepersonertilprocesrelaterederoller kaldet generichumanroles,somliggerudenfordetteprojekt.dennyeaktivitet <b4p:peopleactivity>brugestilatdefineremenneskeligeinteraktionerindenforbpelprocesser. DenneaktiviteterinkluderetiBPELaktiviteten<bpel:extensionActivity>,derudelukkende fungerersomen wrapper. BPEL<scope>kanogsåindeholderelementerfrahhv.B4PogWS HT,menkandogikke indeholdeelementet<b4p:peopleassignments>. Kapitel2 17
2.2.2WS HumanTask Menneskeligopgaverer services implementeretafpersoner.detilladerintegrationenaf menneskerienserviceorienteretarkitektur(soa).ws HTkanopdelesitodele,menneskelige opgaver(humantasks)ognotifikationer(notifications).førstnævntebeståraftointerfaces,etder eksponererservicentilbudtafopgavenogettilatadministreredisseopgaver(eks.tilat godkende/afviseenopgave). Menneskeligeopgaverkantildelespersoner,dersåanvenderinterfaceto,tilatadministreredisse. Menneskeligeopgaverkanendviderereagerepåtimeoutsogeksempelvistriggeren eskaleringshandling.notifikationersenderinformationeromkringrelevantehændelsertilenperson, denbenyttersigat fire and forgetmanner,hvilketbetyder,atafsenderenskubbernotifikationerud tilmodtagerenudenatventepåenkvitteringformodtagelsenframodtageren. WS HTanvenderandrespecifikationer,somdetfremgåraffigur2.1.Denoverordnetstrukturfor WS HTervistioversigt2.3 <?xmlversion="1.0"encoding="utf 8"?> <htd:humaninteractions xmlns:htd="http://www.example.org/ws HT" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:tns="anyuri" targetnamespace="anyuri" expressionlanguage="anyuri"? querylanguage="anyuri"?> <htd:extensions>? <htd:extensionnamespace="anyuri"mustunderstand="yes no"/>+ </htd:extensions> <htd:importnamespace="anyuri"? location="anyuri"? importtype="anyuri"/>* <htd:logicalpeoplegroups>? Kapitel2 18
<htd:logicalpeoplegroupname="ncname"reference="qname"?>+ <htd:parametername="ncname"type="qname"/>* </htd:logicalpeoplegroup> </htd:logicalpeoplegroups> <htd:tasks>? <htd:taskname="ncname">+... </htd:task> </htd:tasks> <htd:notifications>? <htd:notificationname="ncname">+... </htd:notification> </htd:notifications> </htd:humaninteractions> Oversigt2.3:overordnetstrukturforWS HumanTask. Elementet<htd:humanInteractions>harflg.egenskaber: AttributtenexpressionLanguageangiverhvilketsproget,deranvendestilatevaluere udtrykideomgivetelementer,somstandardanvendesxpath1.0[xpath]. AttributtenqueryLanguageangiverhvilketsprog,deranvendestilatdefinereforespørgseli deomgivetelementer,hererstandardenogsåxpath1.0. Elementet<htd:extensions>ervalgfrit,menhvisdeterdefineret,skaldetindeholde mindstet<htd:extension>element.heltkonkretangiverdet,hvilkenamespacews HT benyttersig.deresattributterogelementerkananvendesiws HT. Elementet<htd:import>erklærerenafhængighedtileneksternWS HTellerWSDL [WSDL].Derkanværeerklæret0 n<htd:import>elementerunder <htd:humaninteractions>. Elementer<htd:logicalPeopleGroups>angiverlogiskepersongrupper,deranvendesi menneskeligeopgaverognotifikationer.elementetervalgfrit,menhvisangivetskalden indeholdemindstet<htd:logicalpeoplegroup>element. Kapitel2 19
Elementet<htd:tasks>specificereretsætafmenneskeligeopgaver.Elementetervalgfrit, menhvisdeterspecificeret,skaldermindstværespecificeretet<htd:task>element. Elementet<htd:notifications>specificereretsætafnotifikationer.Elementetervalgfrit, menhvisdeterspecificeret,skaldermindstværespecificeretet<htd:notification> element. Yderligeredetajleringerafdeenkelteattributterogelementerliggerudenfordetprojektsrammer. 2.3PHP PHP(HypertextPreprocessor)9dukkedeførstegangoptilbagei1995.Nu13åreftererdetblevetet særdelesudbredtscriptsprog,derhovedsageligterfokuseretpåserver sidescripting.oprindeligtvar PHPdesignettilatlavedynamiskewebsider,menharmedtidenudvikletsigtiletmodent programmeringssprog,derbådesupportererproceduremæssig ogobjektorienteretprogrammering (OOP)10.Medudgivelsenafversion5,13.Juli2004,kunnePHPsprogetbydeenobjektmodel lignededenmankenderfrajavaogc#.phpergennemtidenblevetpåvirketafmangeandresprog (C,Perl,C++ogPython)ogregnesfortiden(Juli2008)fordetfemtemestpopulære programmeringssprog,kunovergåetaf(visual)basic,cogjava[tiobe]. Vigtigtfordetteprojekter,atPHPharmegetbrugbarefunktionertiltekstbehandling.Deterisær funktionernetilatparseogfåadgangtilxml dokumenter,somervigtigirelationtiludviklingen afworkflowmaskinen(sekapitel6). FraPHP4blevSAXogDOMstandarderneunderstøttet,mankanendvidereanvendeXSLT udvidelsernetilattransformerexmldokumenter.php5standardisererallexmludvidelserpå densolidebaseilibxml2ogudviderdettesætaffunktionervedattilføjesimplexmlog XMLReaderunderstøttelse. PHPernemtatlære,ogmestrermanførstsproget,erdenvigtigstefaktor enkeltheden,derefter minmeningkanoversættestilkorteudviklingscyklusser(dadenfortolkesdirekteafweb serveren ogikkekræverkompilering,hvilketgøratdukantesteon the fly),mindreudgiftertiloplæring, 9 Denofficiellehjemmeside:http://php.net/ 10 Paradigmer:Imperativogobjektorienteret Kapitel2 20
nemtatvedligeholde,størrefleksibilitetognemtatudvide.enandenyderstvigtigmedspillererdet enormeogsærdelesaktivefællesskabomkringphp,derikkekungør,atphpheletidenudvikler sig,menogsåattusindeafopen sourceapplikationergørdet.applikationerdererligetilattage nedfrahyldenogbrugeellerkananvendessomreferencertilnyeapplikationer(såsomdineegne). [SB05]og[LWLT04]giverbeggeenrigtiggodtintroduktiontilPHP5,sombådeegnersigtil nybegyndereogøvedeindenforoop.[gs04]erfordemereøvede,dabogenprimærtkoncentrerer sigommereavanceredeemnerindenforphpprogrammering. 2.4XForms XFormsdukkedeførstegangoptilbageiapril2000,iformafenkladdemedtitlen Datamodelling ProposalforXForms11[XFORMSDM].KladdenblevudarbejdetafWorldWideWebConsortium (W3C)ogharfaktiskingenlighedermeddennuværendeXFormsanbefaling. XForms1.0erW3C'sforslagtildennæstegenerationafwebforms,derbetragtessomafløserenfor webformsbaseretpåhtml[xforms].xformserikkeenselvstændigdokumenttype,mener tiltænktatskulleintegreresiandremarkup sprog(somxhtml,wml,svgetc.)[xforms]. XFormskananvendeforskelligesprogtilatudformelayoutet,hvoriXFormsskalintegreres,typisk vildetværexhtml,wmlellersvg.oversigt2.4visereteksempelpåenxform. <?xmlversion="1.0"encoding="utf 8"?> <htmlxmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml events"> <head> <title>updatedraft</title> <metaname="author"content="danielk.theemann"/> <scripttype="text/javascript"> functionbuildactionurl(){ varparam_array=window.location.href.split("?"); varlocation="upddraftformsubmit.php"; 11 DatamodelleringsforslagtilXForms Kapitel2 21
if(param_array.length>1){ location="upddraftformsubmit.php?"+param_array[1]; document.getelementbyid('updatedraftform').setattribute('action',location); </script> <! thexforminstancemodel > <xf:model> <! thesubmittedresultwillbestoredinaxmldocumentwiththisstructure. > <xf:instanceid="result"xmlns=""> <draft> <title/> </draft> </xf:instance> <xf:instanceid="js"> <dataurl="javascript:buildactionurl()"/> </xf:instance> <! theinputfieldsareallrequired > <xf:bindnodeset="/draft/title"id="title"required="true()"/> <! submission > <xf:submissionid="updatedraftform"method="post"includenamespaceprefixes="" action=""/> <! messagesonsubmit > <xf:messageev:event="xforms submit error"level="modal"> Can'tsubmit! </xf:message> </xf:model> </head> <body> <h3>pleaseupdatethedraft.</h3> <! thexforminterfacemodel > <xf:inputref="title"> <xf:label>writeyourdraft'stitlehere:<br/></xf:label> Kapitel2 22
</xf:input> <br/><br/> <xf:trigger> <xf:label>submit</xf:label> <xf:loadref="instance('js')/@url"ev:event="domactivate"/> <xf:actionev:event="domactivate"id="dynamicsubmission"> <xf:sendsubmission="updatedraftform"/> </xf:action> </xf:trigger> </body> </html> Oversigt2.4:Xformseksempel. SomenW3CstandardharXFormsogsådenintentionatskulleudviderepertoiretforteknologier baseretpååbnestandarder.detbetyder,atapplikationerbaseretpåxformsøgergenbrugligheden, reducereromkostningernetiloplæringoglettervedligeholdelsenaføvrigeteknologer. Figur2.2illustrererXFormsdokumentmodellenogdefundamentalestandarder,somdenbygger på.allestandarder,idetoøversteblokke,byggerpåxmlstandarden.xformsanvenderxpathtil atudtrykke,hvorledesinstansdataogformkontrolelementererbundetsammen,xml Schematil typevalidering(reducererantalserverbesøg),namespacestilatdefinerereferencertilandre standarderogxmleventssomafløserfordentættekoblingmellemhtmlformelementerog JavaScript(nårenhandlingernødvendig). Figur2.2:XFormsdokumentmodellenogfundamentalestandarder. Forbegynderegiver[XFE03]enrigtiggodintroduktiontilXForms.Delidtmereøvedefårmereud afatlæsedennuværendew3canbefaling[xforms],menkanfintanvendeførstnævntesom Kapitel2 23
opslagsværk. 2.5Sammenfatning Iudviklingenaftilstandsmaskinen(sekapitel6),dererendelafdetteprojekt,anvendesPHPs understøttelseafdomtilatparseogtilgåprocesdefinitionernedefineretibpel. JegvilidetteprojektsebortfrafølgendeBPELegenskaberogaktiviteter: Deleaffejlhåndtering.DetteindbefatteraktivitetenRethrowogbrugenaffaultHandlersog dertilhørendeelementer. Kompensation.DetteindbefatteraktiviteternecompensateogcompensateScope,samt brugenafcompensatehandlers. BrugenafWSDLporteogWSDLbeskeder.Detteindbefatterelementernemessage, partnerlink,samtbrugenafwsdlporttypes. GraforienteringenfraWSFL.Herunderhørerbrugenafaktivitetenflowtilatoprettelinks mellemaktiviteterne.detteindbefatterbrugenafelementernelinks,link,source,samt target. Beskedudvekslingviawebservices.Detteindbefatteraktiviteternereceive,invokeog reply,samtbrugenafpropertiesogcorrelationsets. Desudenaktiviteternescope,repeatUntil,forEach,pick,extensionActivityogvalidate. Ijuni2007publiceredeActiveEndpoints,Adobe,BEA,IBM,OracleogSAPspecifikationerne BPEL4People[BPEL4P]ogWS HumanTask[WS HT]somenopfølgningpåhvidbogen[WS BPEL1].Debeskriver,hvordanmenneskeliginteraktionkanudføresiBPELprocesser.Disse specifikationerblevganskekortintroduceretidettekapitel. Pådettidspunkthvordetteprojekterudarbejdet,erderingenafdeudbredteogmestanvendte browsere(ie,firefox,operaellersafari),somdirekteunderstøtterxforms.derfindesudvidelser tildeenkeltebrowsere,somskalinstalleres.idetteprojekterfirefoxvalgtsomdenforetrukne Kapitel2 24
browser,derforatkunnesupporterexforms,krævermozillaxformsudvidelsen[xformsff] installeret. Detteprojekteropensource,hvilketstøtterbrugenafetsprog(PHP),dersomomtaltharetstort opensourcesamfund. Kapitel2 25
Kapitel3 Workflowmønstre Dettekapitelerdeltopitoafsnit.Etderpræsentereretudplukafworkflowmønstre,derpå nuværendetidspunktunderstøttesdirekteibpel,samtetderganskekortpræsentererhuman workflowmønstre. 3.1WorkflowmønstreiBPEL Workflowmønstre(WM)beskriver,ligesomsoftwaredesignmønstre[GOF94],enløsningfor tilbagevendenogalmenkendteproblemstillinger.deerbåderelevantfordem,derimplementerer WM'eneogbrugerneafworkflowhåndteringssystemet.FørstnævnteanvenderWM'enesometfælles vokabular,menssidstnævnteanvenderdemibeskrivelsenafforretningprocesser. Ikapitel3afsinPhDafhandling[BK03],beskriverBartoszKiepuszewskikravenefor workflowsproggennemwm,somerdenpragmatiskemåde,atbeskrivedetpå. BaseretpåWM'enebeskrevetikapitel3,beskriverBartoszKiepuszewskiikapitel4enmådeat mappedissetilenformelmådeatbeskrivemodelleringenafworkflowprocesdefinitioner.han anvenderherpetri nets[petri],someretformeltmodelleringssprog,dergrafiskkangengive opførslenfor,eksempelvisdistribueredesystemerogworkflow,iformafenorienteretgraf. Petrinetsgraferbeståraftotyperafknuder,nemligpladser(places)ogovergange(transitions),hvor pladserkunmåværeforbundettilovergangeogovergangetilpladser.tilstandenisystemerer Kapitel3 26
beskrevetmedsåkaldtetokenspåpladser.figur3.1viserbasiselementerne,derudgøreretpetrinet. Figur3.1:BasiselementerneietPetrinet. Opførslenerbeskrevetveddenenkleregelatenovergangkan"fyre"(ellerudføres)hvisderer mindsténtokenpåalledepladser,hvorfradererpiletilovergangen ogfyringenbevirkeratder fjernesentokenfrahverafdissepladserogdertilføjesentokenpåallepladser,hvortildererenpil fraovergangen. IdetteafsnitbeskrivesdetudplukafkendteWM,sompånuværendetidspunktunderstøttesdirektei BPEL.BeskrivelsenafdeWM,somharderesoprindeligedefinitioni[WA03],afvigerikkefraden. ØvrigeWM'ertagerudgangspunktideWM'er,somBartoszKiepuszewskiforklarerikapitel3 [BK03]. 3.1.1Grundlæggendemønstre Degrundlæggendemønstredækkeroverfundamentaleprocesaktiviteter,somatudføreaktiviteter sekventielt,opdeleogseneresamleaktiviteter,ogvælgeenaffleregrenebaseretpåetbetingetvalg. Defemgrundlæggendemønstreer:sekvens,parallelopdeling,synkronisering,eksklusivtvalgog simplefletning. Sekvens Sekvensworkflowmønstretrepræsentererensekventieludførselafaktiviteter:enhandlingiet workflowaktiveres(eksempelviscifigur3.2)efteratenanden(eksempelvisbifigur3.2)er udført. Kapitel3 27
Figur3.2:Sekvens BPELunderstøtterdettemønstergennemaktivitetensequence.Enimplementeringaffigur3.2i BPELkunnesesåledesud: <sequence> <invokename= A.../> <invokename= B.../> <invokename= C.../> </sequence> Oversigt3.1:SekvensiBPEL. Parallelopdeling(AND split) Workflowmønstretparallelopdelingforgrenerenenkeltrådunderudførelseifleretråde,somskal udføresparallelt(somnåraaktiveresifigur3.3).dettilladerataktiviteterudføressimultanelleri vilkårligrækkefølge. Figur3.3:Parallelopdeling Figur3.4:Synkronisering Synkronisering(AND join) Workflowmønstretsynkroniseringkonvergererfleretrådeunderudførelse(eksempelvisdemsom enderihhv.bogcifigur3.4)tiléntrådunderudførelse(eksempelvisdifigur3.4),derventerpå atallepåkrævedetrådeerudført.detkanforekomme,atikkeallepåkrævedetrådesforudsætninger opfyldt,hvilketrejserproblematikkenomkring deadpaths. Kapitel3 28
BPELunderstøtterparallelopdelinggennemaktivitetenflow.Synkroniseringerunderstøttet implicit,daparalleludførelseermodelleretsomenkontrolstrukturibpel,hvilketgør,atdenselv håndtererdenefterfølgendefletning,nåralleunderaktivitetererudført. Enimplementeringaffigur3.3og3.4iBPELkunnesesåledesud: <invokename= A.../> <flow> <invokename= B.../> <invokename= C.../> </flow> <invokename= D.../> Oversigt3.2:ParallelopdelingogsynkroniseringiBPEL. Deadpathelimination Deadpathelimination erenteknik,anvendtisprogsomnetopbpeltilatomledeaktiviteter,hvis forudsætningikkeeropfyldt.figur3.5aviseretscenario,hvoren deadpath kanoptræde. AktivitetenRejstilUSAventerpådeparallelleaktiviteterBookflyogFornypaserudført,ogvil kunbliveudført,hvisbeggeaktiviteterersande.erbareenafdemfalskbliverrejsentilusaikke tilnogetogkuffertenskalikkepakkes. Figur3.5a:Eksempelpåetdeadpatheliminationscenario. Figur3.5bviserenPetrinetrepræsentationafdeadpatheliminationforscenariofrafigur3.5a.De grønnepileindikereretsandtresultatogderødeetfalsk. Kapitel3 29
Figur3.5b:EksempelpåetdeadpatheliminationiPetrinet. Transitionerne(aktiviteterne)BookflyogFornypasforgreneriénudaftomuligegreneefterderes udførelse:etsandtresultatførertilstedett,etfalskresultatførertilf.defireanonyme(lambda) transitionerventerpåogsamlerresultatetafdetoaktiviteter:tteraktiveret,hvisbeggeaktiviteter levereretsandtresultat,ffhvisdebeggelevereretfalskresultat,tfhvisbookflyersandogforny paserfalskogendeligftsomerdetmodsatteaftf. TTtransitionensenderentokenvideretilstedetT,dersenderdenvidereaddenrigtigestimod aktiviteternerejstilusaogpakkufferten.tf,ftogffsenderdenvideretilstedetf.fsender tokenvidereadensti,derintetudfører. Eksklusivtvalg(XOR split) WorkflowmønstretEksklusivtvalgforgrenerenaktivitet(eksempelvisAifigur3.6)iflere aktiviteter(eksempelvisbogcifigur3.6),hvorkunéngren,idenneforgrening,udføresbaseret påevalueringenafenbetingelse(eksempelviscifigur3.6). Figur3.6:Eksklusivtvalg Kapitel3 Figur3.7:Simpelfletning 30
Simpelfletning(XOR join) Workflowmønstretsimpelfletninganvendestilatfletteforgreningerfraeteksklusivtvalg (eksempelvisbogcifigur3.7)tilénaktivitet(eksempelvisdifigur3.7).detantages,atkunén grenudafalleforgreningervælgesogatingensynkroniseringfindersted.ingenafforgreningerne udføresnogensindeparallelt. BPELunderstøttereksklusivtvalggennemaktivitetenif.Simpelfletningunderstøttesimplicit,da betingetbearbejdning(someteksklusivtvalg)ermodelleretsomenkontrolstrukturibpel,hvilket gør,atdenselvhåndtererdenefterfølgendefletning,nårdenif betingelsenerudført. Enimplementeringaffigur3.6og3.7iBPELkunnesesåledesud: <invokename= A.../> <ifname= evalvariabeli > <condition>$i=50</condition> <empty.../> <elseif> <condition>$i>50</condition> <sequencename=....../> </elseif> </if> <invokename= D... Oversigt3.3:EksklusivtvalgogsimpelfletningiBPEL. 3.1.2Avanceretforgrenings ogsynkroniseringsmønstre Idetteafsnitvilfokusværepåmereavanceretmønstreforforgreningogsynkronisering.Disse mønstreharikke,somdeforrige,direktesupportideflesteworkflowmaskiner.derforerde stadigvækgængsei real life forretningsscenarier.deintroduceredemønstreer:multivalgog synkronfletning. Kapitel3 31
Multivalg(OR split) Multivalgdefinererfleremuligestier(eksempelvisBogCifigur3.8)foretworkflow,hvorensti ellerflerestiervælges(eksempelvisbellercellerbeggeifigur3.8).deterirealitetener generaliseringafparallelopdelingogeksklusivtvalg. Figur3.8:MultivalgogSynkronfletning Synkronfletning(InklusivOR join) Synkronfletninganvendestilatsynkronisereflereparallelleeksekveringstråde,somerblevet aktiveretafdetforegåendemultivalg(eksempelvisdem,derenderibogcifigur3.8). BPELunderstøtterbådemultivalgogsynkronfletninggennembrugenaflinksiaktivitetenflow. 3.1.3Strukturmønstre Strukturelleworkflowmønstrebeskæftigersigmedforskelligerestriktioner,somworkflowmodeller kanpålægges. Implicitafslutning Implicitafslutningener,nåreksekveringenafetworkflowerafsluttetkorrekt,hvisderikkeerflere aktivitetertilbageellerkunaktiviteter,derikkekanaktiveres.detteworkflowmønsterunderstøttes gennemflow. 3.1.4Multipelinstansmønstre Dissemønstreomhandlerflereeksekveringstrådesamtidigt.Hvilketbetyder,atenaktivitetiet workflowkanhaveflereaktiveinstanserkørendesamtidigt. Kapitel3 32
Multipelinstanserudensynkronisering Detteworkflowmønsteranvendestilatopretteflereaktiviteter(eksempelvisBogCifigur3.9), indenforsammeprocesinstans(eksempelvisaifigur3.9),derudføressamtidigt.dissetråde (aktiviteter)erfuldstændiguafhængigafhinandenogkørerparallelt.deterikkeetkrav,atdisse aktiviteterisidsteendebehøveratsynkroniseres. Figur3.9:Multipelinstanseru.synkronisering. DetteworkflowunderstøttesgennembrugenafaktiviteteninvokeindeienforEachaktivitet.En implementeringaffigur3.9ibpelkunnesesåledesud:... <foreach> <startcountervalue>1</startcountervalue> <finalcountervalue>5</startcountervalue> <invokename= A.../> </foreach>... Oversigt3.4:Multipelinstanseru.synk.iBPEL. 3.1.5Tilstandsbaseretmønstre Detilstandsbaseretworkflowmønstrepræsentereretidennesektionharalletilfælles,atenaktivitets tilstand(typiskomhvorvidtdeneraktiveretellerdeaktiveret)dynamiskkanblivepåvirketafen andenaktivitetstilstandienworkflowproces. Kapitel3 33
Udskudtvalg(udskudtXOR split) Ietworkflowanvendesdettemønsterpåettidspunkthvorenaffleremuligegrene(eksempelvisB, CogDifigur3.10)skalvælges.Tilforskelfraeksklusivtvalg,blivervalgetikkeforetageteksplicit (dvs.baseretpådataellerenbeslutning),menderforkommerderimodetracemellemdeforskellige grene(eksempelvisb,cogdifigur3.10).efteratbeslutningenertagetvilaludførelseide alternativegrene(eksempelvisbogdifigur3.10)meldesigudafdetstartederace. Figur3.10:Udskudtvalg. Detteworkflowunderstøttesgennembrugenafaktivitetenpick.Enimplementeringaffigur3.10i BPELkunnesesåledesud:... Kapitel3 34
<pick> <onmessagepartnerlink="pl1">... </onmessage> <onmessagepartnerlink="pl2">... </onmessage> <! eksempelvissættealarmentilatstarte 3dageog10timerefterdensidsteordrelinie > <onalarm> <for>'p3dt10h'</for> <! eksempelvishåndteretimeoutforordreafslutning > </onalarm> </pick>... Oversigt3.5:UdskudtvalgiBPEL. 3.1.6Annulleringsmønstre DensidstegruppeafBPELworkflowmønstre,somdervilblivepræsenteret,ermønstredergørdet muligtatannullereenprocespåethvilketsomhelsttidspunktundersinudførelse.havdemanikke dissemønstrevillemanskulletjekkepåomenprocesskulleannulleres,hvergang,detkunne forekomme.determerehensigtsmæssigtmedetenkelttjek.dervilherblivepræsenterettotyperaf annulleringsmønstreannulleraktivitetogannullercase. Annulleraktivitet Formåletmeddenneaktiviteterstoppeudførelsenafenprocesaktivitetmedentrigger,derforetager annulleringen.dettemønstereroftebrugbarttilatafbrydelangtidskørendeellersuspenderede processer,ellertilatomdirigereenprocesadeneskaleringssti.figur3.11viseretpetrinetfor annulleringenafenlangtidskørendeproces. Kapitel3 35
Figur3.11:Annulleraktivitetmønster(eksempel) MellemtransitionerneAogBerderenlangtidskørendeproces.Foratmuliggøreannulleringenaf netopdenneproces,erderblevetplaceretetudskudtvalgmellemdenlangtidskørendeprocesoget annulleringsevent.såsnartdetudskudtevalgfuldføres,startestransitionb. DetteworkflowunderstøttesgennembrugenaffaultHandlersogcompensateHandlers. Annullercase Formåletmeddettemønstereratstoppeenhelprocesvedhjælpafenannulleringstrigger.Nåren processtarteropdelesdenitoseparatestier,enmedprocessensprimæreforløbogenmedet annulleringsevent.hvissidstnævnteindtræder,imensprocessenprimæreforløberigangafsluttes heleprocessen.figur3.12visereteksempelpådettemønster. Figur3.12:Annullercasemønster(eksempel) Ioversigt3.6ervistenBPELimplementationafdettemønster. <process> <eventhandlers> <eventhandlername= cancelevent...> Kapitel3 36
<exit/> </eventhandler> </eventhandlers> <! primaerforløb. > <sequence>... </sequence>... </process> Oversigt3.6:AnnullercaseiBPEL(eksempel) Iprocesområdet,erderdefinereteneventHandler,derlytterpåhændelsen cancelevent,nårdet indtræder,afslutterhandlerenheleprocessengennembrugenafbpelaktivitetenexit. DettemønstererligAnnulleraktivitet,dogmedundtagelseafatannulleringshandlingenherkører paralleltmedprocessensprimæreforløb,istedetforienenkeltaktivitet. 3.2Humanworkflowmønstre NårmansnakkeromHumanworkflowmønstredukkerderoftetomønstreop,nemligeskaleringog prioritering. IPrioriteringsmønstrettildelesenmanuelaktivitetenstartprioritet.Denomprioriteresefterhånden somdenbliver ældre ellerafandrebetingelser.ieskaleringbliverenmanuelaktivitetoverdraget tilandenpersonellerrolle,nårdetbliverdikteret. 3.3Sammenfatning Dettekapitelpræsenteredeworkflow routing konstruktioneriformafworkflowmønstre.de introduceredemønstreerbaseretpåde,afbartoszkiepuszewski[bk03],beskrevetmønstremed henblikpåatdanneetoverblikoverdendirekteunderstøttelsefordisseibpel.udoverde introduceredeworkflowmønstre,understøttesflg.ogsåibpel: Struktureretløkker(whileerenstruktureretløkke) Kapitel3 37
Persistenttrigger(enpickderafventerenspecifikbeskedtype) Acyklisksynkronfletning(linksindeiflow ligesommultivalgogsynkrontvalg) Kritisksektionogindflettetruteplanlægning(serialiseredescopes) Desudenblevhumanworkflowmønstreneeskaleringogprioriteringganskekortintroduceret. Tilstandsmaskinen(kapitel6)understøtterpånuværendetidspunktetlilleudplukafde introduceredeworkflowmønstre,nemligsekvens,eksklusivtvalg,simpelfletning,multipleinstanser udensynkroniseringogannullercase. Kapitel3 38
Kapitel4 Krav Dettekapiteldiskutererdefunktionelleogikke funktionellekrav,somletvægtsphp tilstandsmaskinenskalopfylde,samtmuligeaktører,derkunneanvendetilstandsmaskinen.det sidsteafsnitbeskriverenusecase,somdenimplementeredetilstandsmaskineskalkunneudføre. 4.1Tilstandsmaskinen IsidsteinstansviltilstandsmaskinenbliveforsøgtintegreretoganvendtiPharmaNordApS,tilat udføreworkflows,derunderstøttesaftilstandsmaskinen. 4.1.1Funktionellekrav Kravenederrelaterersigtildenfaktiskeimplementeringaftilstandsmaskinener: Skalkunneudføreetworkflow,hvorforretningsprocessendefineressomenBPELprocess. Tilladeenmanuelprocesatkoordinere(instantiereogsåafventefuldførelsen)med menneskeligeopgaver,deradministreresgennemenarbejdsliste(webapplikation). 4.1.2Ikke funktionellekrav Deikke funktionellekravinkluderer: Softwarekomponentenvilbliveimplementeretgennembrugenafversion5afPHP programmeringssproget,daminnuværendearbejdsgiverkræverdette,foratkunneintegrere denmeddeeksisterendesystemer. Kapitel4 39
Levereengodunderstøttelseafudvalgteworkflowmønstrenebeskrevetiafsnit3.1. Softwarekomponentenskalnemtkunneudvides. Simulationafworkflowudførelsentilatdebuggeogtesteskalværemuligt. 4.1.3Aktører Dervilværeforskelligeaktører,derinteragerermedsystemet.Følgendeaktørererblevet identificeretiht.tilkravenebeskrevetiafsnit4.1.1og4.1.2: Procesadministratorer Brugere,deranvenderarbejdslisten 4.1.4Usecase Herbeskrivesusecasen.somskalsupporteresafdenimplementeredetilstandsmaskinen. Evalueredokument Somendelafetudviklingsteamerman,somudvikler,ofteidensituationatskulleskrive dokumentation,somskalkunneforståsafdeøvrigeiteamet.derforvilledetværehensigtsmæssigt, atenkladdeskalevalueresførdenbliverpubliseret,sometdokument,foratsikreenhøjkvalitetog ensartethedforalledokumenter.énmådeatkunneløsedetpå,erillustreretgennempetrinetteti figur4.1.processener: Enkladdeoprettes Kladdenevalueres,somenderudmedengodkendelseellerenafvisning. Godkendeskladden,vildenblivepubliseretsometdokument. Enafvisningenresultereri,atkladdenskaligennemendnuenevaluering,nårdenerblevet opdateret. Kapitel4 40
Figur4.1:Petrinetforusecase Evalueredokument. EnBPELimplementeringafovenståendefigurergivetioversigt4.1. <?xmlversion="1.0"?> <processname="reviewdocument" xmlns="http://docs.oasis open.org/wsbpel/2.0/process/executable"> <variables> <variablename="draft"shared="yes"/> <variablename="reviewresult"shared="yes"/> <variablename="comment"/> <variablename="approved">n</variable> <variablename="publisheddocument"/> </variables> <onchangename="draftcreated"variable="draft"/> <sequence> <while> <condition>$approved="n"</condition> <sequence> <humanformname="reviewform"> <sequence> <invoke url="http://localhost/wfexamples/reviewdoc/reviewform.xhtml"/> <onchangename="updatereviewresult" variable="reviewresult"/> Kapitel4 41
<assign> <copy> <fromvariable="reviewresult"> <query>/review/comment</query> </from> <tovariable="comment"/> </copy> </assign> <assign> <copy> <fromvariable="reviewresult"> <query>/review/approved</query> </from> <tovariable="approved"/> </copy> </assign> </sequence> </humanform> <if> <condition>$approved="n"</condition> <humanformname="updatedraft"> <sequence> <invoke url="http://localhost/wfexamples/reviewdoc/updatedraftform.xhtml"/> <onchangename="draftupdated"variable="draft"/> </sequence> </humanform> </if> </sequence> </while> <assign> <copy> <fromvariable="draft"/> Kapitel4 42
<tovariable="publisheddocument"/> </copy> </assign> </sequence> </process> Oversigt4.1:BPELimplementeringafpetrinetfrafigur5.1. 4.2Sammenfatning Dettekapitelintroduceredelæserenfordefunktionelleogikke funktionellekrav,derertil tilstandsmaskinen(tm).måleternaturligvisatkunneopfyldedeopstilledekrav,samtpræsentere dette,vedatevaluereusecasen Evalueredokument meddenimplementeredetm. Usecasen Evalueredokument udspringerafmitdagligearbejde,hvordetkunnevære hensigtsmæssigtatindføreenevalueringaftekniskedokumenter,indendeblevfrigiveti organisationen.dervedsikresethøjereniveauogenensartethedfordokumenterne. FornærmeredetaljeromkringworkflowmodellenforogselveimplementeringenafTM'en,setil kapitel5og6. Kapitel4 43
Kapitel5 Workflowmodel Dettekapitelpræsenterersemantikkenforworkflowmodellen,somerfundamentetfor workflowmaskinen,somerudvikletsomendelafdetteprojekt. 5.1AktiviteterogDOM Workflowmodelleneraktivitetbaseretogunderstøtter,pånuværendetidspunkt,bådeetudplukaf BPELsaktivitetmodel(setabel2.1)ogprojektspecifikkeaktiviteter,kaldetSM BPEL(seafsnit 6.2.3.2).WorkflowmodellenerrepræsenteretgennemetDOM træ,hvoraktiviteter,derudføres underworkflowetvilblivefortolket,sådekanhåndteresafworkflowmaskinen.oversigt5.1viser ensimpelprocesdefineretgennembrugenafbpelogprojektspecifikkeaktiviteter. <processxmlns="http://docs.oasis open.org/wsbpel/2.0/process/executable" name="sequencetestfile" suppressjoinfailure="yes"> <variables> <variablename="input"/> <variablename="output"/> </variables> <sequencename="main"> <onchangename="receiveinput"variable="input"/> </sequence> </process> Oversigt5.1:Simpelforretningsproces. Figur5.1illustrererDOMrepræsentationafprocessendefineretioversigt5.1.Repræsentationeni figur5.1repræsentererenruntimedatamodel,somerenmodel,derbådeindeholder Kapitel5 44
procesinstansenogdenspersistensering. Figur5.1:DOMrepræsentationafprocessenfraoversigt6.1 5.2Strategiforafviklingen Afviklingenafetworkflowstarter,nårdenførsteaktivitetifloweterudført.Alleaktiviteterkan fungeresomstartaktivitet. Efterhveraktiviteterblevetudført,fjernesdenfraDOM træetogdertraverserestilnæsteaktivitet. HverBPELaktivitetfortolkes,foratworkflowmaskinenkanforstådenogudføresdernæstgennem XML omskrivning(seafsnit6.2.3). IdéenoginspirationenomkringatanvendeXML omskrivningsommemorymodelforatgemme processenstilstandkommerfraforskningsprojektetcosmobiz[cosmobiz].efterhåndensomet workfloweksekveres,ændresdetstilstanditaktmedataktiviteterudføres.tilstandenændresvedat aktiviteteromskrivesløbendeellernåropdateringerafworkflowvariablergemmesumiddelbart Kapitel5 45
efteropdateringen. Sammenholdesmemorymodellen[COSMOBIZ]medruntimedatamodel,somMichaelHavey fremsætter[ebpm05],såerruntimedatamodellenenrepræsentationafinstansen,somegentliger detsammesommemorymodellensrepræsentationafprocessen.pointenerher,atmemory og persistensformatetnæstenerens. EnBPELproceskanhaveoptilflereslutaktiviteter,dereksplicit(<exit>)afslutterafviklingenaf workflowet.afviklingenafworkflowetbliverimplicitafsluttet,hvisderikkeerflereaktiviteterat udføre(seimplicitafslutningfraafsnit3.1.3). 5.3Flowkontrol Semantikkenforflowkontroliworkflowmodellenbyggerpådeunderstøttedeworkflowmønstre, somblevdiskuteretikapitel3,øvrigebpelaktiviteterogsm BPELaktiviteterne. 5.4Tilstandogvariabler Workflowmodellenunderstøttertilstandsformergennembrugenafworkflowvariabler<variable> (sekapitel2).workflowvariableropbevarerbeskederellerdata,derudvekslesmedpartnere(ikke endelafdetteprojekt)ellerkuninterntiforretningsprocessen. Internevariablerienforretningsproceskanværesynligeforandreforretningsprocesser,hvilket betyder,atworkflowmodelleneretsåkaldtdelt lager.etdeltlagerbetyderidennekontekst,atde kananvendedeltevariablerfraandreworkflows,dererstartetindenforsammebrowsersession.det angivespådenenkeltevariabel,omdenerdelt(seevt.afsnit6.2.1). Variablergemmertilstandeafdata,workflowmodellenunderstøtterogsåatkunnegemmetilstanden afselveafviklingenafetworkflow.detbetyder,atafviklingenafetworkflowaltid,eksempelvisi tilfældeafsystemnedbrud,kanforsættefradensidstgemtetilstand. Workflowvariablerkanbådeændresautomatisk(automatiskeaktiviteter)ogmanueltafbrugere Kapitel5 46
(manuelleaktiviteter). Afventesvar Sålængeaktiviteten<onChange>afventersvarpå,omenpågældendevariabelharændretværdi, sættesworkflowafviklingeniventepositionogforsættesførst,nårværdienerblevetændret. 5.5Manuelleaktiviteter Workflowmodellenunderstøtterogsåenaktivitet,derkaninterageremedmennesker(deraf manuelleaktiviteter).aktivitetsmodellenibpelunderstøtterikkemanuelleaktiviteter,derforer deriworkflowmodelleninkluderetennyaktivitet<humanform>(seafsnit6.2.3.2),somanvender etparafbpelsaktiviteterog<onchange>aktivitetenidetsstruktur. 5.6Sammenfatning Dettekapitelpræsenteredeworkflowmodellen,derliggertilgrundfordenimplementerede workflowmaskine.modellenhenterbpelogsm BPELelementernefraprocesdefinitionen,indi etdomtræ,somworkflowmaskinenparserogudfører.nårdenførsteaktiviteterblevetudført, ansesworkflowetsomstartet. Workflowmodellensupportererbådeautomatiskeogmanuelleaktiviteter.Deautomatiskeeret udplukafbpelsaktiviteter,samtsm BPELaktiviteten<onChange>.ISM BPELerderen aktivitet<humanform>,sommuliggørinteraktionenmedmenneskerviaxforms. DataietworkflowgemmesiBPELs<variable>element,somderkandefineres0..naf.Disse variablerkandefineressomglobalellerlokale.deglobaledefineresindenielementet <variables>,somerenbarnenodetil<process>elementet.lokalevariablerervariabler,der defineressomenbarnenodetilbpelaktiviteten<scope>.denneworkflowmodelunderstøtter ogsåatprocesinstanserindenforsammebrowsersessionkanbenytteandresdeltevariabler. SM BPEL<onChange>aktivitetenkansætteetworkflowiventepositionindtilengivenvariabel Kapitel5 47
fårtildeltennyværdi.denneaktivitetbrugesogsåi<humanform>strukturen,beggevilblive gennemgåetikapitel6. Kapitel5 48
Kapitel6 Designogimplementering Dettekapiteldiskutererdesignetogimplementeringenafsoftwarekomponenten,dererblevet udvikletsomendelafdetteprojekt. 6.1Arkitektur Tilstandsmaskinendererblevetudviklet,erdesignetogimplementeretsomenløskoblet komponent.workflowkomponentenlevererenobjekt orienteretmaskinetilateksekverebpel workflows. EtworkflowvilværedefineretsomenBPELproces,derbestårafbasis ogstrukturelleaktiviteter (setabel2.1).disseaktivitetervilbliveanalyseretafklasserneleveretmedparsingapi'etog fortolkettilobjekterafklasserneleveretmedbpelprocess&instancemodelapi'et.sidstnævnte APIlevererdesudenalfunktionalitettildeenkelteBPELogSM BPELaktivitetersudførelse,mens valideringafboolskeudtrykhåndteresafvalidationapi'et.persistenceapi'etlevererfunktionalitet tilatgemme(versionere)ogindlæseworkflowdefinitionerfraetdatalager.dererblevet implementeretétdatalager,somerbpelfiler.workflowexecutionapi'ethåndterer,atetworkflow kanstartes,afbrydesoggenoptagesefterbehov.deflesteapi'ergørbrugafforskelligexml teknologier,såsomxpathogxmlschemam.fl.,somdennederstekomponentillustrerer.se AppendiksBforenkompletreferenceoveralleAPI'erneiworkflowEnginepakken. Figur6.1viserdenkonceptuellearkitekturforworkflowmaskinen. Kapitel6 49
Figur6.1:Konceptuelarkitekturforworkflowmaskinen. Ovenpåworkflowkomponentenkanderimplementeresandrekomponenter,detkunnepassende værekomponenter,derendelafworkflow/bpmarkitekturen,præsenteretiafsnit1.2.1: Administrationogovervågning Arbejdslistetilstyringafmenneskeligeaktiviteter. Grafiskeditor standardnotation(sombpmn) Eksporter(BPMNtilBPELmapning) Hverafdissekomponentererkarakteriseretveddetsindkapslingafendesignbeslutning,somden skjulerfordeøvrigekomponenter[parnas].dissekomponenterkankonfigureresogerstattes. Idéenomkringatetworkflowsystemskalbeståafløstkobledekomponenterdiskutereseksempelvis i[mf01],hvormanolescufremsætterat Kapitel6 50
Anobject orientedworkflowarchitecturemustprovideabstractionsthatenable softwaredeveloperstodefineandenacthowtheworkflowsthroughthesystem.it shouldalsoallowthemtotailorthearchitectureinwaysspecifictoobjectsystems12. DenkomponentbaseretarkitekturiMicro Workflowindkapslerworkflowfunktioneriseparate komponenter.denminimalistiskekerneafmicro Workflowarkitekturenbeståraftrekomponenter, derlevererbasisfunktionalitet[mf01]. 1. Process komponenten,derimplementererenaktivitetbaseretworkflowmodel,derleverer deabstraktioner,dererbehovforforatbyggeworkflows. 2. Synchronization komponenten,dertilladerudviklereatdefinereafhængighederindenfor workflowdomænet. 3. Execution komponenten,derimplementererfunktionalitettilatudføreworkflows. DennearkitekturfølgerdesignmønstretMicrokernel. TheMicrokernelarchitecturalpatternappliestosoftwaresystemsthatmustbeableto adapttochangingsystemrequirements.itseparatesaminimalfunctionalcorefrom extendedfunctionalityandcustomer specificparts.themicrokernelalsoservesasa socketforpluggingintheseextensionsandcoordinatingtheircollaboration13 [FB96]. 6.2Implementering 6.2.1Workflowvariabler TilstandsmaskinenanvenderBPELs<variable>(seafsnit2.1)somworkflowvariabler.Disse variablerkanindeholdeværdier,somudgørenvigtigdelaf,hvilkentilstandetworkflowbefinder sigi.bpelanvendertredeklarationerforvariabler:wdslbeskedtyper,xmlschematyper 12 Enobjektorienteretworkflowarkitekturskallevereabstraktioner,dergørdetmuligtforsoftwareudviklereatdefinereogvedtage,hvordan arbejdetflydergennemsystemet.denskaldesudentilladedemattilpassearkitektureniretningaf,hvaddererspecifikforobjektsystemer. 13 ArktekturdesignmøsntretMicrokernelanvendesisystem,derskalkunnetilpassesigtilskiftesystemkrav.Detadskillerenminialfunktionelkerne fraudvidetfunktionalitetogkundespecifikkedele.microkernelerogsåvelegnetsomsokkeltilattilsluttedisseudvidelserogkoordinerederes samarbejde. Kapitel6 51
(simpelogkompleks)ogxmlschemaelementer,hvorkunxmlschemasimpletyper,på nuværendetidspunkt,understøttesafworkflowmaskinen. Synlighed DaBPELikke,pånuværendetidspunkt,understøtterenworkflowmodelbaseretpåetdelt lager, somdennetilstandsmaskine(seafsnit5.4)gør,er<variable>blevetudvidetmedenattribut shared=(yes no),derindikerersynlighedenforeksterneworkflowprocesserindenforsamme browsersession.erattributtensattil yes kandenlæsesogopdateresafandre,hvorimoddenalene ersynligforprocessenselv,nårdenersattil no.somstandardendensattil no. <variablename="input"type="xsd:string"shared="yes"/> Deltevariablerindlæsesoggemmesibrowserenssession,nåretBpelWfExecutionobjektet instansieres,somvistioversigt6.1.hvilketbetyderatvariablerp.t.kundelesmellem workflowinstanserisammebrowsersession. DeltevariablergemtibrowserenssessionkanafandreworkflowinstanserændresgennemsetValue metodenpåetobjektafklassenbpelvariable.variablerindenforsammeworkflowinstanskan ændresgennembpelaktivitetenassign(seafsnit6.2.3.1 )ogsetvalueinternalmetodenpåetobjekt afklassenbpelvariable.... $globalvars=$this >xpath >query('//bpel:variable[@shared="yes"]'); foreach($globalvarsas$var){ $variablename=$var >getattribute('name'); $variablevalue=$var >nodevalue; $variableshare=$var >getattribute('shared'); $this >globalvariables[$variablename]= newbpelvariable($variablename,$variablevalue,$variableshare); } $_SESSION[$this >definitionname]['variables']=$this >globalvariables;... Oversigt6.1:Indlæsningoggemafdeltevariablerpåsession. Kapitel6 52
6.2.2Afviklingafetworkflow AfviklingenafetworkflowerimplementeretiklassenBpelWfExecution.Etobjektafdenne klasserepræsentereretworkflow,dereksekveres.afviklingsobjektetharreferencetilflg.objekter DOMDocument,DOMXPath,BpelWfDefinitionStorageog BpelDOMNodeListIterator.Figur6.2viseretobjektdiagramforetobjektafklassen BpelWfExecutionogdetsreferencer. Figur6.2:ObjektdiagramforetobjektafklassenBpelWfExecutionogdetsreferencer. Nåretnytworkflowstartes,bliverderskabtennyinstansafetobjektafklassen BpelWfExecution.Detteobjektindlæseroggemmer,isamarbejdemedetobjektafklassen BpelWfDefinitionStorage,enDOM repræsentationafprocesdefinitionen. AfviklingsobjektetgemmerDOM repræsentationietobjektafklassendomdocumentog anvenderdettilatnavigereietworkflow,hvortildetbenyttersigafobjekterafklasserne BpelDOMNodeListIteratorogDOMXPath. Erworkflowetikkealleredestartet,finderafviklingsobjektetdennæsteaktivitet,hvorefterden udføres.enstartaktiviteteribpelangivetmedattributten(createinstance= yes )påelementerne <receive>eller<pick>.dadenneworkflowmaskine,pånuværendetidspunkt,ikkeunderstøtter nogenafdem,fungereralledeunderstøttedeaktivitetersomstartaktivitet. Påaktiviteten<onChange>erderattributten createinstance,somsvarerlidttilden,vikenderfra <receive>og<pick>ibpel.hvisattributtenersatmedværdi,såopretter<onchange>enny Kapitel6 53
procesinstansafdefinitionsfilen,dererangivetiattributten.... //Mainloop do{ $currentactivity=bpelwfutils::parsedomnodetobpelwfnode( $this >domiterator >current()); //Onlyparsednodes(supportednodesrightnow)willbeexecuted. if(!is_null($currentactivity)){ $currentactivity >execute($this); if(!$this >started){ $this >started=true; if($this >dombookmark==0){ $this >domiterator >next(); while(!$this >suspended&&$this >domiterator >valid());... Overigt6.2:Tilstandsmaskinensprimæreloop Oversigt6.2visertilstandsmaskinensprimæreloop.Sålængeafviklingenafetworkflowikkeer bleveteksplicitafsluttet(afvikletfærdig),vildennæstenodeidom repræsentationblive analyseret,fortolketogudført,hvisdenkanblivefortolkettilobjektafenafklassernefrapakken activities.instanstieringenafdisseklasserskergennemdesignmønstretfactory[gof94]. AktivitetsobjekterudføreriformafXML omskrivning(seafsnit6.2.3),derestildelteopgavei relationtilworkflowet.nårenaktiviteterblevetudført,fjernesdensrespektivenodefradom repræsentationenogdennyedom repræsentationgemmes. Isituationerhvorenaktivitetikkeertom(indeholderenellerflereopgaver,derskaludføres),men ikkekanudføres(fordideneksempelvisventerpåinput),suspenderesafviklingenafworkflowet indtildenmodtagerdetventetinput.nårderikkeerflereaktiviteteratudføre,erworkflowet Kapitel6 54
afsluttetkorrekt(implicitafslutning). Idennekontekst,erprocessproget(somworkflowdefinitionssprogetBPEL)ikkeandetend implementeringerafetsætaktiviteter,dererkendtfortilstandsmaskinen.deimplementerer designmønstretcommand[gof94]ogindkapslerenhandlingogdetsparameter. 6.2.3XML omskrivning DetofølgendeafsnitgiverenmeredeltaljeretbeskrivelseafXML omskrivningenforalle strukturelleaktiviteterogprimitiveaktiviteter(setabel2.1),der,pånuværendetidspunkt, understøttesafworkflowmaskinen. XML omskrivningenideenkelteaktivitetereropbyggetomkringdesignmønstretbuilder [GoF94],derheropbyggerderesDOM repræsentation. Dengrafiskenotation(sefigur6.3),entræstruktur,anvendttilatillustreredengenerelleXML omskrivningforudvalgtestrukturelleaktiviteter(whileogif),erinspireretafcosmobizprojektet [COSMOBIZ]. Figur6.3:GrafisknotationforXML omskrivning. Kapitel6 55
6.2.3.1BPELaktiviteter sequence Sombeskrevetitabel2.1udfører<sequence>alledensaktivitetersekventieltidenrækkefølge,de erangivet.semantikkenfor<sequence>[bpel4ws]ervistioversigt6.3. <sequencestandard attributes> standard elements activity+ </sequence> Oversigt6.3:Semantikkenfor<sequence> Selveimplementeringeninspicererenbarneknudeadgangen,somforsøgesfortolkettiletobjektaf typenactivity.fortolkesdetkorrektudføresaktivitetenogxml omskrivningfjernerknudenefter udførelsen.xml omskrivningenresultereri,atdergemmesennydefinitionsfilmeddenopdateret DOM repræsentation.dettegøressålænge,dereraktiviteter,dermangleratbliveudført.når <sequence>ikkeharflerebørneknuder,erdenblevetudført,hvorefterdenfjernesogenny definitionsfilgemmes.oversigt6.4visereteksempelpåenxml omskrivning....... <sequencename="main"> <sequencename="main"> <onchangename= onchangeinput <empty/> variable= input /> </sequence> <empty/>... </sequence>......... <sequencename="main"/>... Oversigt6.4:XML omskrivningfor<sequence> aktiviteten. SeappendiksBforselveimplementeringenaffigur6.4. Kapitel6 56
if Sombeskrevetiafsnit3.1.1forgrenerenifaktivitettilflereaktiviteter,hvorafdeneneudføres. Betingelsererudtryktgennemetboolskudtryk,derevalueresmedXPath[XPATH].Derkan defineresenelse,derbevirker,athvisikkeifbetingelsenellerelseifbetingelserne(hvisnogen)er opfyldt,såudføresden.oversigt6.5visersemantikkenforif[bpel4ws]. <ifstandard attributes> standard elements <conditionexpressionlanguage="anyuri"?>bool expr</condition> activity <elseif>* <conditionexpressionlanguage="anyuri"?>bool expr</condition> activity </elseif> <else>? activity </else> </if> Oversigt6.5:Semantikkenfor<if> Implementeringenafdenneaktivitetitilstandsmaskinenstartermedatfortolkeoginstanstiereet objektaftypenbpelifactivity.opfyldesif betingelsen,udføresdenefterfølgendeaktivitet.opfyldes betingelsenderimodikke,findertilstandsmaskinendennæsteelseifellerelse,hvisderernogenog omskriverden.forenelseifgældersammeproceduresomforif,hvorimodelseingenbetingelse har,menkunudførerdensaktivitet(hvisnogen). Enifaktivitetansessomudført,hvis: 1. allebetingelserforhhv.ifogalleelseifevalueresfalskogderingenelseerdefineret. 2. Enbetingelseevalueressandogdensaktiviteterblevetudført. SelveXML omskrivningenforif konstruktionenskerløbendeunderudførelsen,hvorbetingelser, fjernesfradom træetumiddelbartefterevalueringen.evalueresenbetingelsefalskfjernesdens aktivitetsknude,udenatblivefortolketyderligereaftilstandsmaskinen,fradom træet.nåren aktivitetudføres,somfølgeafenopfyldtbetingelse,fjernesknudenefterudførelsen. Selveif aktivitetensknudefjernes,nårdenansesforudført.hvergangderskerenxml Kapitel6 57
omskrivning,gemmesderennyopdateretdefinitionsfil. Figur6.4viserdengenerelleomskrivningafif,baseretpåsemantikkenlistetioversigt6.5. Øverstetræafspejlerenifmeddensbetingelse(condition1)ogenukendtaktivitet(T1),T2afspejler enelseifmeddenukendtebetingelseogaktivitet.enifkanhave0 nelseifdefineret.t3afspejleren ukendtelseaktivitet.t2bafspejleretukendtantalelseif'er Midterstetræafspejleromskrivningenafdenførsteellerenesteelseifogdensbetingelseogaktivitet it2tilenif,fordievalueringenafcondition1varfalsk.idettetræafspejlert2enbetingelse,en ukendtaktivitetog,hvisflere,etukendtantalelseif.midterstetrævilforekommesålængeen betingelseit2evalueresfalskellertilt2ikkelængereeksisterer. Nederstetræafspejlerelseaktiviteten,dogudenenelsesomforældreknude. Figur6.4:Generelleomskrivningafif. Oversigterne6.6 6.11viseretkonkreteksempelpåenifomskrivning.Førstevalueresif Kapitel6 58
betingelsen.omskrivningenskeriettrin,hvorbetingelsenomskrives(fjernes)ogeneventuelelseif omskrivestilenif.oversigterne6.6og6.7....... <variablename= input shared= yes >234 <variablename= input shared= yes >234 </variable> </variable>...... <ifname= ifconditiona > <ifname= ifconditiona > <condition>$input<=225</condition> <! T2(condition,empty) > <! T1(sequence) > <conditon>$input>225</condition> <sequence>...</sequence> <empty/> <! T2(elseif) > <! T3(else) > <elseif> <else> <condition>$input>225</condition> <throwfaultname= UnknownVariable /> <empty/> </else> </elseif> </if> <! T3(else) >... <else> <throwfaultname= UnknownVariable /> </else> </if>... Oversigt6.6:Føreval.afif betingelsen Oversigt6.7:Eftereval.Afif betingelsen. Daif betingelsenvarfalsk,blevelseifomskrevetogevalueresefterfølgende.efteromskrivningen udføresdensomenganskealmindeligif.betingelsenerdennegangsandogdensaktivitet(empty) udføresogifaktivitetenansesforudført.oversigterne6.8og6.9....... <variablename= input shared= yes >234 <variablename= input shared= yes >234 </variable> </variable>...... <! T2(empty) > <empty/>... Oversigt6.8:Eftereval.afif betingelsen Kapitel6 Oversigt6.9:Efterudførelseafempty. 59
Eteksempelpåenomskrivningafelseervisti[oversigt6.10og6.11....... <variablename= input shared= yes >234 <variablename= input shared= yes >234 </variable> </variable>...... <ifname= ifconditiona > <! T3(throw) > <! T2(condition,empty) > <throwfaultname= UnknownVariable /> <conditon>$input>225</condition>... <empty/> <! T3(else) > <else> <throwfaultname= UnknownVariable /> </else> </if>... Oversigt6.10:Føromskriv.afelse betingelsen Oversigt6.11:Efteromskrivafelse betingelsen. SeAppendiksBforselveimplementeringen. While Sombeskrevetiafsnit2.1udførerenwhileaktivitetsinaktivitet,sålængedensbetingelseersand. Betingelserer,ligesomiif aktiviteten,udtryktgennemetboolskudtryk,derevalueresmedxpath [XPATH].Oversigt6.12visersemantikkenforwhile[BPEL4WS]. <whilestandard attributes> standard elements <conditionexpressionlanguage="anyuri"?>bool expr</condition> activity </while> Oversigt6.12:Semantikkenforwhile. Implementeringenafdenneaktivitetiworkflowmaskinenstartermedatfortolkeoginstanstiereet objektaftypenbpelwhileactivity.opfyldesbetingelsen,udføresdenefterfølgendeaktivitet,men opfyldesbetingelsenderimodikke,ansesaktivitetenforudført. Kapitel6 60
Figur6.5viserdengenerelleomskrivningafwhile,baseretpåsemantikkenlistetioversigt6.12. Øverstetræafspejlerenwhilemeddensbetingelse(condition1)ogenukendtaktivitet(T1). Midterstetræafspejlerenomskrevetwhile,nårdensbetingelseersand.Whileeromskrevettilenif, hvorif aktivitetenerensequencebeståendeaftoaktiviteter.whileaktivitetenogwhile konstruktionenselv.nederstetræafspejlerifomskrevet,nårbetingelsenersand. Kapitel6 61
Figur6.5:Generelleomskrivningafwhile. SelveXML omskrivningenafwhile konstruktionenskerløbendeunderudførelsen,hvordetførste skridteratomskriveselvewhile konstruktionentilenif konstruktion,somvistioversigt6.12og 6.13....... <variables> <variables> Kapitel6 62
<variablename="input" <variablename="input" shared="yes">10</variable> shared="yes">10</variable> </variables> </variables> <while> <if> <condition>$input<30</condition> <condition>$input<30</condition> <! T1(onChange) > <sequence> <onchangename="whilechange" <! T1(onChange) > variable="input"/> <onchangename="whilechange" </while> variable="input"/>... <while> <condition> $input<30 </condition> <! T1(onChange) > <onchangename="whilechange" variable="input"/> </while> </sequence> </if>... Oversigt6.12:while konstruktion Oversigt6.13:whileomskrevettilif. Hergenbrugeswhilebetingelsensomifbetingelse.Ifaktiviteteneromskrevettilensequence,hvor førsteaktiviteterwhileaktivitetenogdenandenaktiviteterwhilekonstruktionselv.næsteskridter atudføreif,sombeskrevettidligere.detspecielleherer,athvisbetingelsenersandomskrivesiftil ensequence,somvistioversigt6.14.... <variables> <variablename="input"shared="yes">10</variable> </variables> <sequence> Kapitel6 63
<! T1(onChange) > <onchangename="whilechange"variable="input"/> <while> <condition>$input<30</condition> <! T1(onChange) > <onchangename="whilechange"variable="input"/> </while> </sequence>... Oversigt6.14:ifomskrevettilsequence. Sequenceudføressombeskrevettidligereidetteafsnit.Hvergangenwhileoptrædersker omskrivningenbeskrevetioversigterne6.12,6.13og6.14. EvalueresenwhilebetingelsefalskfjernesaktivitetensknudefraDOM træet,udenatblivefortolket yderligereaftilstandsmaskinen.hvergangderskerenxml omskrivning,gemmesderenny opdateretdefinitionsfil. SeAppendiksBforselveimplementeringen. wait Denneaktivitetbrugestilatudsætteeksekveringenietnærmerefastsattidsrum.Aktivitetenwait kanentenbrugeetduration udtrykelleretdatetime udtryk,somhhv.gørbrugafxml schema typerne duration eller datetime tiludsættelsen[schema],førstnævnteudsætter eksekveringenibestemttidsrum,hvorimodsidstnævnteindtilenbestemtdeadlineerpasseret. Oversigt6.15visersemantikkenforwait[BPEL4WS]. <waitstandard attributes> standard elements ( <forexpressionlanguage="anyuri"?>duration expr</for> Kapitel6 64
<untilexpressionlanguage="anyuri"?>deadline expr</until> ) </wait> Oversigt6.15:Semantikkenforwait. Implementeringenafdenneaktivitetitilstandsmaskinenstartermedatfortolkeoginstanstiereet objektaftypenbpelwaitactivity.derefterstarterudførelsen,somførsttjekkeromderanvendesen durationellerdatetimetype,sådenpåkorrektviskanudsætteworkfloweksekveringen.når udsættelseerafsluttet,ansesaktivitetensomudført. DenneaktiviteterkræverendvidereatPEARpakkenSOAP(læsmerepåhttp://pear.php.net/)er installeretpåcomputerenforatkunneudførespåkorrektvis. SelveXML omskrivningenafwait konstruktionenkanskeietellertotrin.harmanvalgtatangive udsættelsenienuntil,skeromskrivningeniettrin,hvorwaitfjernes,nårdenerblevetudført.er udsættelsenangivetienfor,skeromskrivningenderimoditotrin,damanskalsikresig,atitilfælde afnedbrud,såforsættesudsættelsen,hvordengikned.detbetyder,atenforomskrivestilenuntil, daforvilstarteudsættelsenforfravednedbrud.hvorimoduntilangiverendeadline.omskrivningen affortiluntilervistioversigterne6.16og6.17....... <variables> <variables> <variablename="fromvariable"> <variablename="fromvariable"> PHProcks PHProcks </variable> </variable> <variablename="tovariable"/> <variablename="tovariable"/> </variables> </variables> <sequencename="waittest"> <sequencename="waittest"> <wait> <wait> <! Waitfor15seconds > <until>2008 06 21T16:51:08+02:00</until> <for>pt15s</for> </wait> </wait> <empty/> <empty/> </sequence> </sequence>...... Oversigt6.16:forføromskrivningen. Kapitel6 Oversigt6.17:Trin1afomskrivningen. 65
SeAppendiksBforselveimplementeringen. assign Somnævntiafsnit6.2.1brugesdenneaktivitettilatoverføredatafraenvariabletilanden.Desuden tilladerdenneaktivitetogså,atmankanoverføreetudplukafenvariabelsindhold.nydatakan ogsåbliverkonstrueretogindsatgennembrugenafudtryk.oversigt6.18visersemantikkenfor <assign>[bpel4ws]. <assignvalidate="yes no"?standard attributes> standard elements ( <copykeepsrcelementname="yes no"?ignoremissingfromdata="yes no"?> from specto spec </copy> <extensionassignoperation> assign element of other namespace </extensionassignoperation> )+ </assign> Oversigt6.18:Semantikkenforwait. Assignaktivitetenharseksforskelligevarianteratdefinere from spec icopydelenafaktiviteten ogfemvarianteratdefinere to spec.varianternessemantikerlistetioversigterne6.19og6.20. <fromvariable="bpelvariablename"part="ncname"?> <queryquerylanguage="anyuri"?>? querycontent </query> </from> <frompartnerlink="ncname"endpointreference="myrole partnerrole"/> <fromvariable="bpelvariablename"property="qname"/> <fromexpressionlanguage="anyuri"?>expression</from> <from><literal>literalvalue</literal></from> <from/> Oversigt6.19:Semantikkenforfrom spec Kapitel6 66
og <tovariable="bpelvariablename"part="ncname"?> <queryquerylanguage="anyuri"?>? querycontent </query> </to> <topartnerlink="ncname"/> <tovariable="bpelvariablename"property="qname"/> <toexpressionlanguage="anyuri"?>expression</to> <to/> Oversigt6.20:Semantikkenforto spec. Implementeringenafdenneaktivitetunderstøtterpånuværendetidspunktkunvariabelvarianten (markeretmedkursivioversigterneovenfor)forhhv.from specogto spec,menudendevalgfrie delpart.desudenunderstøttesderkunéncopypr.assign,skullemanunderstøtteflerecopyien assignvilledetbetyde,atmanisinimplementeringskulletagehøjdeforsamtidighedsproblemer, fordienassignskaludføres,somomdeterdenenesteaktivitet,derudføresidenslevetid.itilfælde affejlundervejsiudførelsenafassign,skalallevariablerito specvendetilbagetilsammetilstand, somdevari,førstartenafassignaktiviteten(somvaraktivitetenatomar). SelveXML omskrivningenskerietenkelttrin,hvoraktivitetenfjernes,nårfrom specvariablens indholderkopierettilto specvariablen. SeAppendiksBforselveimplementeringen. 6.2.3.2SM BPELaktiviteter onchange Somnævntiafsnit6.2.1afventerdenneaktivitet,atendeltvariabelændrerværdi.OnChange startersinudførelsemedatsuspendereworkflowetindtildenpågældendevariabelsværdierblevet ændret,nårværdienændres,genoptagesworkflowet.oversigt6.21visersemantikkenfor <onchange>. Kapitel6 67
<onchangename= QName?variable= BPELVariableName createinstance= definitionname /> Oversigt6.21:Semantikkenfor<onChange>. Attributten name angivernavnetforaktiviteten,hvisangivet.attributten variable angiver navnetpådenbpelvariable,derskalændreværdi.attributten createinstance opretterenny procesinstansafdenworkflowdefinition,dererangivetiattributten. SelveXML omskrivningenafdenneaktivitetforegåritotrin,førstgemmesdennyeværdiiden pågældendevariableogderfterfjernesonchangeaktivitetensdomknudefradom træet.detteer illustreretioversigterne6.22og6.23....... <variables> <variables> <variablename="input"shared="yes"> <variablename="input"shared="yes"> 4356 4356 </variable> </variable> </variables> </variables> <sequencename="init"> <onchangename="change" <sequencename="init"/> variable="input"/>... </sequence>... Oversigt6.22:Trin1:variablensværdiændres. Oversigt6.23:Trin2:onChangefjernet. SeAppendiksBforselveimplementeringen. humanform Somnævntiafsnit5.5understøtterBPELikkemanuelleaktiviteter.Hvilketgør,atdetkuner automatiseredeworkflows,derkanudføres.minnyeaktivitet<humanform>muliggør,at tilstandsmaskinenkaninterageremedmenneskerviawebformsdefineretsomxforms.denne aktivitetanvenderudvalgteaktiviteterfrabpelsaktivitetsmodel,samtsm BPELaktiviteten <onchange>.semantikkenfor<humanform>ervistioversigt6.24. <humanformname= QName?> <sequence> <invokeurl= URL /> Kapitel6 68
<onchangename= QName?variable= BPELVariableName createinstance= definitionname /> <assign>* <copy> <fromvariable= BPELVariableName > <query>querycontent</guery>? </from> <tovariable= BPELVariableName /> </copy> </assign> </sequence> </humanform> Oversigt6.24:Semantikkenfor<humanForm> Attributten name på<humanform>angivernavnetforaktiviteten,hvisangivet. Selvestrukturforaktivitetener,somfølger: En<sequence>,derindeholderdeaktiviteter,derskaludføresi<humanForm>levetid. En<invoke>derhenvisertillokationen,hvorXFormenskalvises.Attributten URL findesikkeidagibpel. En<onChange>dersuspendererworkflowetindtilengivenvariableændres.Deterher, manangiver,hvilkenvariabel,derkommertilatindeholdesubmittededatafraxformen. Nultilmange<assign>aktiviteter,derangiverhvordandataskalkopieresrundti workflowmaskinen. SelveXML omskrivningenforaktivitetenskerigennemdeenkelteunderaktivitet,nårderikkeer flere,fjernes<humanform>fraprocesdefinitionenogansesforafsluttet. 6.3Betingelser DebetingelsersomkanbrugesiaktivitetererudtryktgennemetudvalgafprimitiveXML schema typer[schema],pånuværendeunderstøttesboolean,durationogdatetime. Kapitel6 69
Boolean Etboolskudtrykeretudtryk,derresultererienboolskværdiiformaf TRUE eller FALSE. Udtrykafandretyperenbooleanskanblivekonverterettilbooleansomfølger: Numeriskeværdier:0erbehandletsomFALSE,altandetsomTRUE. Strengeværdier:tomstrengerbehandletsomFALSEogaltandetsomTRUE. Node sets:entomknudeerbehandletsomfalseogaltandetsomtrue. ValideringenogevalueringenafXPathboolskeudtrykerimplementeretiklassen BpelWfBooleanExpression. Duration Durationrepræsentererettidsinterval.Tidsintervalletkanspecificerespåflg.måde "PnYnMnDTnHnMnS"hvor: Pindikererperiode(påkrævet) nyindikererantalletafår nmindikererantalletafmåneder ndindikererantalletafdage Tindikererstartenaftidsektionen(påkrævethvismanspecificerertimer,minuttereller sekunder) nhindikererantalletaftimer nmindikererantalletafminutter nsindikererantalletafsekunder Oversigt6.25visereteksempelpå,hvordanetelementetkunneseudixmlstruktur,detindikereren periodepå15minutter.... <periode>pt15m</periode>... Kapitel6 70
Oversigt6.25:Durationeksempel. ValideringenogevalueringenafdurationerimplementeretiklassenBpelWfDurationExpression. DateTime DateTimerepræsentererendeadline,hvorderbådekanspecificeresdatoogtid.DateTime specificerespåflg.måde"yyyy MM DDThh:mm:ss"hvor: YYYYindikereråret MMindikerermåneden DDindikererdagen. Tindikererstartenafdenpåkrævettidssektion. hhindikerertimen. mmindikererminuttet. ssindikerersekundet. Alleovenståendeerpåkrævet. Oversigt6.26visereteksempelpå,hvordanetelementetixmlstrukturkunneseud,detindikereret sluttidspunkt,derhedder22.06.2008,klokken16:56:31.... <sluttid>2008 06 22T16:56:31</sluttid>... Oversigt6.26:DateTimeeksempel. DesudenkanmanopererepåtotyperaftidszoneriendateTime.Hvormanentenkanspecificereen datetimeiutcvedattilføjeet Z eftertiden(seoversigt6.27)ellermankanangiveetoffsetfra UTCtidenvedattilføjeenpositivellernegativtideftertiden(seoversigt6.28).... <sluttid>2008 06 22T16:56:31Z</sluttid>... Oversigt6.27:DateTimeeksempelmed Z. eller Kapitel6 71
... <sluttid>2008 06 22T16:56:31+06:00</sluttid>... Oversigt6.28:DateTimeeksempelmedpositivtidtilføjet. ValideringenogevalueringenafdateTimeerimplementeretiklassen BpelWfDateTimeExpression. SeAppendiksBforfleredetaljeromkringselveimplementeringenafbetingelserne. 6.4Sammenfatning Dettekapitelpræsenteredetilstandsmaskinen,dererblevetudviklet.Tilstandsmaskinenerdesignet ogimplementeretsomenløskobletkomponent,hvorhverafdissekomponentererkarakteriseretved detsindkapslingafendesignbeslutning,somdenskjulerfordeøvrigekomponenter[parnas]. Dissekomponenterkankonfigureresogerstattes.InspirationtildennearkitekturerhentetfraMicro Workflow[MF01]. Denimplementeredetilstandsmaskinelevererensolidobjekt orienteretmaskinetilateksekvere BPELworkflows. BPELunderstøtterikkeetsåkaldtdelt lager,somgørdetmuligtatdelesinevariablermedandre kørendeworkflows.dennetilstandsmaskineharimplementeretenlightudgave,dergørdetmuligt atdelesinevariablermedkørendeworkflowsindeforsammebrowsersession.detgøresvedatsætte attributten shared til yes påbpels<variable>element. TilstandenforselveworkflowetsudførelsegemmesvedXML omskrivning,hvoraktiviteterløbende omskrivesunderderesudførelse.implementeringenafxml omskrivningerbaseretpåbuilder mønstret[gof94].inspirationentilatanvendedennemodelfremforenrelationeldatabaseerhentet fraforskningsprojektetcosmobiz[cosmobiz]. Shared ModelBPEL(SM BPEL)bestårindtilvidereaftoaktiviteter,somkanintegreresmed Kapitel6 72
BPELsnuværendeaktivitetsmodel.Dererdefineretenaktivitet(<onChange>)tilsuspendere udførelsenafetworkflowindtilengivenvariabelfårtildeltennyværdi,samtoprettenye procesinstanser.denandenaktivitet(<humanform>)gørdetmuligtforenbpelprocesat interageremedmenneskergennemxforms(læsmereombrugenafdenneaktivitetiappendiksa). Workflowmaskinenunderstøtterpånuværendetidspunkttretyperafbetingelser,somer: 1. Booleans 2. Duration 3. DateTime Kapitel6 73
Kapitel7 Konklusionogfremtidigtarbejde 7.1Konklusion Detteprojekthar,medudgangspunktikendtlitteraturindenforproblemdomænetogdetaktuelle forskningsprojektcosmobiz[cosmobiz],forførstegangkombineretdettetilatdesigneog implementereentilstandsmaskineudvikletiphp,deranvenderbpelsomdefinitionssprogfor workflows. Softwarekomponenten,dererblevetudvikletsomendelafdetteprojektertiltænktsomendonation tilphpfællesskabet(phpcommunity).detstillerenmaskine,tilateksekverebpelworkflows,til rådighed,somnemtkanindlejresiphpapplikationer,såledesatdekanbliveudvidetmed workflowfunktionalitet.tilstandsmaskinenkanskræddersysefterbehovognemtudvidesgennem sammensætningenafkomponenter.densworkflowmodelkanogsånemtskræddersysogudvides gennemdeklasser,deropbyggerkontrolflowet.denerikkebundettildenkonkreteapplikation, hvoridenerblevetindlejret,hvilketgør,atdererstørregradaffrihedforbrugenoggenbrugenaf tilstandsmaskinen.denunderstøtterdogikkepånuværendetidspunktbpelskommunikationvia webservice,menderimodetudplukafbpelsoverordnetobjekt ogaktivitetsmodel. TilforskelfraBPELanvenderdenneworkflowmodeletsåkaldtdelt lager.hvilketbetyderatbpel variablerkandelesmedandrekørendeworkflowinstanserindenforsammebrowsersession.denne delingmuliggørlæsningogopdateringafdissedeltevariabler. Kapitel7 74
Workflowmodellenanvenderenmemory modeltilatgemmeenproces'tilstand.idéenog inspirationenkommerfraforskningsprojektetcosmobiz[cosmobiz],somanvenderxml omskrivningtilatgemmeenproces'tilstand,hvilketdenneworkflowmodelligeledesgør.denne modelervalgtfremforenruntimedatamodel[ebpm05],somnæstenerdetsamme,mensomdog errepræsentationafinstansen.pointenerher,atmemory ogpersistensformatetnæstenerensfor memory modellen. Menneskeliginteraktionmedtilstandsmaskineneropnåetvedatdefinereetsætafaktiviteterkaldet SM BPELaktiviteter.VedatkombineredetoSM BPELaktivitetermedetudvalgafBPEL aktiviteter,erdetmuligtatinterageremedmenneskerviaxforms,samtatsætteenworkflowinstans iventepositionindtilenvariableopdateres.disseaktiviteterkanudenvidereintegreresibpel. 7.2Fremtidigtarbejde 7.2.1Workflowmodel WorkflowmodellenkannemtogbørudvidestilatunderstøttealleworkflowmønstreiBPEL.Det gøresvedatimplementeredemanglendeaktiviteterogrestenafbpelsobjektmodel.parallel udførelseerdogenstørreopgave,daphperenkelttrådet,hvilketbetyder,atderskaldesignesog implementeresenschedulerrutine. 7.2.2Udvidelseafdelt lager Atworkflowmodellenpånuværendetidspunktkununderstøtteretdelt lagerindenforsamme browsersessionernogetafenbegrænsning.detdeltelagerbørudvidestilatkunnedelevariablerpå tværsafbrowsersessions.detgørdennemodelmereanvendeligogkraftfuld.detkunnepassende implementeresvedatbrugeendatabase,hvorallekørendeinstansersdeltevariablerogderes respektiveværdiergemmes,sålængederesworkflowikkeerafsluttet. Kapitel7 75
7.2.3Arbejdsliste Nårnuworkflowmodellenunderstøtterinteraktionmedmennesker,børderimplementeresen arbejdsliste,såbrugernekaninterageremeddeforskelligeworkflowinstanser.detkunnepassende væreetwebinterface,deranvenderxforms. Kapitel7 76
AppendiksA Tutorial Detteappendiksfungerersomenintroduktiontiltilstandsmaskinen(sefigur6.1).Dentutorial,som vilblivegennemgåetidetteappendikserbaseretpåusecasenfrakapitel4. A.1Forudsætninger Idetteafsnitbeskrivesdeforudsætninger,dererforatkunneintegrereogafvikleetworkflowpå denimplementeredetilstandsmaskine.forudsætningerersomfølger: Unixsystem(somlinux) PHP5.2.4 5.2.6 PEARchannelinstalleret Seneste(vers.0.11.0)PEARpakke SOAP installeret(sehttp://pear.php.net/). Apache2.2.8 MozillaFirefox2.0.0.16 MozillaFirefoxudvidelsenXForms0.8.5 Dennetutorialerblevettestetmedsuccespåtolinuxinstallationer:enMandriva2008.0medPHP 5.2.6,Apache2.2.8,Firefox2.0.0.16ogXForms0.8.5installeretogenUbuntu8.04medPHP 5.2.4,Apache2.2.8,Firefox2.0.0.16ogXForms0.8.5. AppendiksA 77
A.2Konfiguration Tilstandsmaskinenskalkonfigureres,sådenbliverkendtforapplikationen,deragteratanvende den.konfigurationskerifilenconfig.php,somliggerirodenaftilstandsmaskinen.idennefil skalmanangivestientiltilstandsmaskinen,eksempelvissomvistioversigta.1. define('wf_engine_dir', '/home/dkt/projects/diplomprojekt/softwarekomponent/trunk/src/'); OversigtA.1:Konfig.afstitilworkflowmaskinen. A.3Struktur FilerdererinvolveretidennetutorialervistifigurA.1.Udfradennestruktur,kanvise,atderskal tofilertilatdefinereen<humanform>,dermåtteværedefinereti.bpelfilen.en.xhtmlfil, hvorimodxformendefineresogetphpscript,derbehandlersubmittededatafraformen.der desudenbrugeretphpscripttilatinstanstiereogstarteetworkflow. FigurA.1:Strukturforfileritutorialen. AppendiksA 78
A.4Definereetworkflow IdetteafsnitdefinerervietworkflowgennembrugenafBPELogSM BPEL,somblevbeskreveti kapitel6. A.4.1Procesdefinitionen Vistartermedatoprettevoresprocesdefinitionoggemmerdenien.bpelfil.OversigtA.2viseren procesdefinitiongemtifilen reviewdocument.bpel. <?xmlversion="1.0"?> <processname="reviewdocument"xmlns="http://docs.oasis open.org/wsbpel/2.0/process/executable"> <variables> <variablename="draft"shared="yes"/> <variablename="reviewresult"shared="yes"/> <variablename="comment"/> <variablename="approved">n</variable> <variablename="publisheddocument"/> </variables> <onchangename="draftcreated"variable="draft"/> <sequence> <while> <condition>$approved="n"</condition> <sequence> <humanformname="reviewform"> <sequence> <invoke url="http://localhost/wfexamples/reviewdoc/reviewform.xhtml"/> <onchangename="updatereviewresult"variable="reviewresult"/> <assign> <copy> <fromvariable="reviewresult"> <query>/review/comment</query> </from> <tovariable="comment"/> </copy> </assign> <assign> <copy> <fromvariable="reviewresult"> <query>/review/approved</query> </from> <tovariable="approved"/> </copy> </assign> </sequence> AppendiksA 79
</humanform> <if> <condition>$approved="n"</condition> <humanformname="updatedraft"> <sequence> <invoke url="http://localhost/wfexamples/reviewdoc/updatedraftform.xhtml"/> <onchangename="draftupdated"variable="draft"/> </sequence> </humanform> </if> </sequence> </while> <assign> <copy> <fromvariable="draft"/> <tovariable="publisheddocument"/> </copy> </assign> </sequence> </process> OversigtA.2:Procesdefinition. A.4.2Humanforms Dadenneprocesdefinitionindeholderflere<humanForm>elementer,kræverdetmenneskelig interaktion.derforskalderoprettesenxformforhver<humanform>element.<humanform name= reviewform >gemmesifilen reviewform.xhtml.vikanse,atmanfraxformenskal kunnekopieretotyperafdataenkaldet comment og approved,derforbørxformensom minimumkunnesendedissedata,nårdersubmittes.oversigta.3viserxformensklidekode,der ligeerblevetbeskrevet. AppendiksA 80
<?xmlversion="1.0"encoding="utf 8"?> <htmlxmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml events"> <head> <title>reviewdocument</title> <metaname="author"content="danielk.theemann"/> <scripttype="text/javascript"> functionbuildactionurl(){ varparam_array=window.location.href.split("?"); varlocation="reviewformsubmit.php"; if(param_array.length>1){ location="reviewformsubmit.php?"+param_array[1]; document.getelementbyid('reviewform').setattribute('action', location); </script> <! thexforminstancemodel > <xf:model> <! thesubmittedresultwillbestoredinaxmldocumentwiththisstructure. > <xf:instanceid="result"xmlns=""> <review> <comment/> <approved/> </review> </xf:instance> <xf:instanceid="js"> <dataurl="javascript:buildactionurl()"/> </xf:instance> <! theinputfieldsareallrequired > <xf:bindnodeset="/review/comment"id="comment"required="true()"/> <xf:bindnodeset="/review/approved"id="approved"required="true()"/> AppendiksA 81
<! submission > <xf:submissionid="reviewform"method="post"includenamespaceprefixes="" action=""/> <! messagesonsubmit > <xf:messageev:event="xforms submit"level="modal"> Submitting... </xf:message> <xf:messageev:event="xforms submit done"level="modal"> Submissioncompleted </xf:message> <xf:messageev:event="xforms submit error"level="modal"> Can'tsubmit! </xf:message> </xf:model> </head> <body> <h3>pleasefillinyourcommentandapprove/rejectthedraft.</h3> <! thexforminterfacemodel > <xf:textarearef="comment"> <xf:label>placeyourcommenthere:<br/></xf:label> </xf:textarea> <br/><br/> <xf:select1ref="approved"> <xf:label>state:<br/></xf:label> <xf:item> <xf:label>approve</xf:label> <xf:value>j</xf:value> </xf:item> <xf:item> <xf:label>reject</xf:label> <xf:value>n</xf:value> </xf:item> </xf:select1> <br/><br/> <xf:trigger> <xf:label>submit</xf:label> AppendiksA 82
<xf:loadref="instance('js')/@url"ev:event="domactivate"/> <xf:actionev:event="domactivate"id="dynamicsubmission"> <xf:sendsubmission="reviewform"/> </xf:action> </xf:trigger> </body> </html> OversigtA.3:reviewFormXFormen(kildekoden). DenneXFormsenderindtastededatasomxmlstrukturen <review><comment>...</comment><approved>...</approved></review>.datafra <comment/>og<approved/>brugesiprocesdefinitiontilatfyldedataivariablerne comment og approved.helexmlstrukturengemmesidendeltevariabel reviewresult.figura.2viser XFormeniFirefoxbrowseren. FigurA.2:XFormen reviewform. Desubmittededatabehandlesifilen reviewformsubmit.php.filensindholdervistioversigta.4. <?php session_start(); include($_server['document_root'].'/workflowengine/config.php'); $wfdefinitionname=$_get['wf']; $variables=unserialize($_session[$wfdefinitionname]['variables']); AppendiksA 83
$variables['reviewresult'] >setvalue(htmlentities($http_raw_post_data, ENT_QUOTES)); serialize($_session[$wfdefinitionname]['variables']);?> OversigtA.4:reviewFormSubmit.php Denandenogsidste<humanFormname= updatedraft >gemmesifilen updatedraftform.xhtml.vikanse,atmanfradenneformikkeskalkopierenogendata,men derimodkunventetilvariablen draft blivertildeltdensubmittedeværdi.oversigta.5viser XFormenskildekode,derligeerblevetbeskrevet. <?xmlversion="1.0"encoding="utf 8"?> <htmlxmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml events"> <head> <title>updatedraft</title> <metaname="author"content="danielk.theemann"/> <scripttype="text/javascript"> functionbuildactionurl(){ varparam_array=window.location.href.split("?"); varlocation="upddraftformsubmit.php"; if(param_array.length>1){ location="upddraftformsubmit.php?"+param_array[1]; document.getelementbyid('updatedraftform'). setattribute('action',location); </script> <! thexforminstancemodel > <xf:model> <! thesubmittedresultwillbestoredinaxmldocumentwiththisstructure. > <xf:instanceid="result"xmlns=""> <draft> AppendiksA 84
<title/> </draft> </xf:instance> <xf:instanceid="js"> <dataurl="javascript:buildactionurl()"/> </xf:instance> <! theinputfieldsareallrequired > <xf:bindnodeset="/draft/title"id="title"required="true()"/> <! submission > <xf:submissionid="updatedraftform"method="post"includenamespaceprefixes="" action=""/> <! messagesonsubmit > <xf:messageev:event="xforms submit error"level="modal"> Can'tsubmit! </xf:message> </xf:model> </head> <body> <h3>pleaseupdatethedraft.</h3> <! thexforminterfacemodel > <xf:inputref="title"> <xf:label>writeyourdraft'stitlehere:<br/></xf:label> </xf:input> <br/><br/> <xf:trigger> <xf:label>submit</xf:label> <xf:loadref="instance('js')/@url"ev:event="domactivate"/> <xf:actionev:event="domactivate"id="dynamicsubmission"> <xf:sendsubmission="updatedraftform"/> </xf:action> </xf:trigger> </body> </html> OversigtA.5:XFormen updatedraft kildekoden. AppendiksA 85
DenneXFormsenderogsåindtastetdatasomxmlistrukturen<draft><title>...</title></ draft>.helexmlstrukturengemmesidendeltevariabel reviewresult.figura.3viser XFormeniFirefoxbrowseren. FigurA.3:XFormen updatedraft. Desubmittededatabehandlesifilen upddraftformsubmit.php.filensindholdervistioversigt A.6. <?php session_start(); include($_server['document_root'].'/workflowengine/config.php'); $wfdefinitionname=$_get['wf']; $variables=unserialize($_session[$wfdefinitionname]['variables']); $variables['draft'] >setvalue(htmlentities($http_raw_post_data, ENT_QUOTES)); serialize($_session[$wfdefinitionname]['variables']);?> OversigtA.6:updDraftFormSubmit.php A.5Starteetworkflow Foratkunnestarteetworkflow,skalderopretteseninstansafklassenBpelWfExecution,der gøresietphpscript(her reviewdocwf.php ),somogsåindeholderenformtilatstarte workflowet.instanstieringenogstarteafudførelsenafworkflowetervistioversigta.7. AppendiksA 86
<?php session_start(); include($_server['document_root'].'/workflowengine/config.php'); //Startworkflow if(isset($_post['start']) isset($_get['newinst'])){ $definitionfile=$_server['document_root']. '/wfexamples/reviewdoc/reviewdocument'; $processinstance=newbpelwfexecution($definitionfile,true); $processinstance >executeworkflow();...?>... OversigtA.7:Instanstieringogstartafworkflow. AppendiksA 87
AppendiksB API'er B.1BPELProcess&instancemodelAPI BpelVariable.php <?php session_start(); PHPversions5.2.6 @categoryworkflowdefinition AppendiksB 88
@packagedefault @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann @examplebpelvariable.php Themaintenanceofthestateofabusinessprocessrequirestheuseofstate variables, whichisrepresented bythe<variable>. Thisclassrepresentsthe<variable>elementfromtheWS BPEL2.0spec. classbpelvariable { @vararray private$attlist=array(); Thevalueofthevariableifany otherwisenull. @varmixed private$value=null; publicfunction construct($name,$value,$shared=false){ $this >attlist['name']=$name; $this >attlist['shared']=$shared; $this >value=$value; GETTERforattributes @paramstring$attname @returnstring publicfunction get($attname){ return$this >attlist[$attname]; SETTERforattributes @paramstring$attname @paramstring$newvalue publicfunction set($attname,$newvalue){ $this >attlist[$attname]=$newvalue; Getsthecurrentvalueofthisvariables. publicfunctiongetvalue(){ return$this >value; AppendiksB 89
Setsanewvaluetothisvariablefromanexternalsource,writesthenewvalueto the DOMdocument, savetonewdom treetoanewbpelprocessfileandresumetheexecutionofthe workflow. <b>onlyusedforsharedvariables.</b> @parammixed$newvalue publicfunctionsetvalue($newvalue){ $execution=unserialize($_session['execution']); $domnode=$execution >xpath >query('//bpel:variable[@name="'. $this >attlist['name'].'"]'); $domnode >item(0) >nodevalue=$newvalue; $this >value=$newvalue; if(strtolower($this >attlist['shared'])=='yes'){ $this >updatesharedvariable($execution >getdefinitionname()); $execution >savenewdefinitionversion(); $execution >resume(); Updatesthesharedvariableonsession @parammixed$definitionname privatefunctionupdatesharedvariable($definitionname){ $variables=unserialize($_session[$definitionname]['variables']); $variables[$this >attlist['name']]=$this; serialize($variables); Setsavalueforannonesharedvariableandsavesanewdefinitionfile afterwards. @parambpelwfexecution$execution @parammixed$newvalue publicfunctionsetvalueinternal($execution,$newvalue){ $domnode=$execution >xpath >query('//bpel:variable[@name="'. $this >attlist['name'].'"]'); $domnode >item(0) >nodevalue=$newvalue; $this >value=$newvalue; $execution >savenewdefinitionversion();?> AppendiksB 90
B.1.1activities Activity.php <?php PHPversions5.2.6 @categoryworkflowactivites @packageactivities @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisclassmodelsthecommonapsectsofallconcreteactvities supportedbythisworkflowengine. abstractclassactivityimplementsidomexporter{ Thenameofthebpelnode. Ifemptyitsunnamed. @varstring protected$name; Ifitisfilledin,itindicatestheprefixfortheactivity. @varstring protected$prefix; AppendiksB 91
Theactivity'sDOMNoderepresentation. @vardomnode protected$domnode; MustbeoverriddenbyBpelActivityimplementations. @parambpelwfexecution$execution publicabstractfunctionexecute($execution);?> B.1.1.1bpel AppendiksB 92
BpelEmptyActivity.php <?php PHPversions5.2.6 @categoryworkflowactivity @packageactivities @subpackagebpel @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann ThisclassrepresentstheemptyactivityfromtheBPELactivitymodelandis implemented aroundthe'nullobject'designpattern. classbpelemptyactivityextendsactivityimplementsidomexporter { publicfunction construct($domnode){ $this >domnode=$domnode; Thisrepresentsanullstatewhichisthesameasanactivenothing behaviour. ItjustremovesitselffromtheDOMDocument. @parambpelwfexecution$execution publicfunctionexecute($execution){ //Activenothingbehaviour $execution >removenode($this >domnode); @seeidomexporter::exportasdomelement @returndomelement publicfunctionexportasdomelement($domdocument){ $emptynode=$domdocument >createelement("empty"); return$emptynode;?> AppendiksB 93
BpelAssignActivity.php <?php PHPversions5.2.6 @categoryworkflowactivity @packageactivities @subpackagebpel @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann ThisclassrepresentsWS BPELassignactivity,whichcantransferavarietyofdata betweenbpelvariables. Fornowthisclassonlyimplementsthefunctionalitytocopythedataofavariableto another. classbpelassignactivityextendsactivity { @varbpelvariable private$fromvariable; @varbpelvariable private$tovariable; Instantiatesanewobjectofthisclass. @parammixed$name @parammixed$prefix @paramdomnode$domnode publicfunction construct($name,$prefix,$domnode){ $this >name=$name; $this >prefix=$prefix; $this >domnode=$domnode; Copiesavariablescontentfromthe<from>to<to> Ifthe<query>specified,itusesXPath1.0toselecttherequestedpartofeither <from>or<to>. @parambpelwfexecution$execution @throwsbpelwfvariablenotfoundexception publicfunctionexecute($execution){ $execution >adddombookmark($execution >domiterator >getoffset()); $execution >domiterator >next(); $copynode=$execution >domiterator >current(); $childs=$copynode >childnodes; $variablevalue; AppendiksB 94
foreach($childsas$childnode){ if($childnode >nodetype!=xml_text_node&&$childnode >nodename!= 'documentation'){ $variablename=$childnode >getattribute("variable"); if($childnode >nodename=='from'){ $this >fromvariable=bpelwfutils::parsedomvariabletobpelvariable( $execution >xpath, $variablename); $variablevalue=$this >fromvariable >getvalue(); //Performqueryif<query>ispresent. $querynode=$this >hasquery($childnode); if($querynode!==false){ $queryexpr=$querynode >nodevalue; $variablevalue=$this >evalquery($queryexpr, $this >fromvariable >getvalue()); elseif($childnode >nodename=='to'){ $this >tovariable=bpelwfutils::parsedomvariabletobpelvariable( $execution >xpath,$variablename); $this >tovariable >setvalueinternal($execution,$variablevalue); $execution >cleardombookmark(); $execution >removenode($execution >domiterator >current()); ExportsthisobjecttoaDOMNoderepresentation. @paramdomdocment$domdocument @returndomnode$assignnode publicfunctionexportasdomelement($domdocument){ //Createthe<assign>node. $assignelement=$domdocument >createelement("assign"); //Settheattribute"name"ifspecified. if(strlen(trim($this >name))>0){ $assignattname=sprintf("%s",$this >prefix,$this >name); $assignelement >setattribute("name",$assignattname); //loopthroughall<copy>elements. foreach($this >domnode >childnodesas$copynode){ $copyelement=$domdocument >createelement("copy"); foreach($copynode >childnodesas$copychild){ $childelement=$domdocument >createelement( $copychild >nodename); $childelement >setattribute('variable', $copychild >getattribute('variable')); if($copychild >haschildnodes()){ $queryelement=$domdocument >createelement('query', AppendiksB 95
$copychild >firstchild >nodevalue); $childelement >appendchild($queryelement); $copyelement >appendchild($childelement); $assignelement >appendchild($copyelement); return$assignelement; Checksandperformsthequeryinside<query>andreturns theresultdomnodelist. @paramstring$queryexpression @paramstring$variablevalue @returndomnodelistifthequeryisvalid,otherwisefalse. privatefunctionevalquery($queryexpression,$variablevalue){ $domdoc=domdocument::loadxml($variablevalue); if($domdoc!==false){ $xpath=newdomxpath($domdoc); if(xpathvalidator::validatexpathexpression($xpath,$queryexpression)!== false){ $querynodelist=$xpath >query($queryexpression); return$querynodelist >item(0) >nodevalue; return$variablevalue; Checkifa<from>or<to>hasan<query>elementaschildandreturnsit. @paramdomnode$node @returndomnodelistifa<query>elementispresentasachild, otherwisefalseisreturned. privatefunctionhasquery($node){ if($node >haschildnodes()){ return$node >childnodes >item(0); returnfalse;?> AppendiksB 96
BpelExitActivity.php <?php PHPversions5.2.6 @categoryworkflowactivity @packageactivities @subpackagebpel @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisclassrepresentsthe<exit> activityfromthebpelactivitymodel. classbpelexitactivityextendsactivityimplementsidomexporter { CreatesanewinstanceofaBPEL<exit> activity. @parammixed$name @parammixed$prefix publicfunction construct($name,$prefix,$domnode){ $this >name=$name; $this >prefix=strlen(trim($prefix))>0?sprintf("%s:",$prefix):""; $this >domnode=$domnode; Immidiatelyexittheworkflowandallconcurrentprocesseswillbeexited withoutanyhandling. @parambpelwfexecution$execution @seeactivity::execute() @throwsbpelwfexplicitterminationexception publicfunctionexecute($execution){ $definitionname=$execution >getdefinitionname(); unset($_session[$definitionname]); $execution=null; thrownewbpelwfexplicitterminationexception( "Thisworkflowinstanceandallitsrunningactivitiesareimmediatelyended!"); AppendiksB 97
Createsanelement<exitname="QName"?/>. @seeidomexporter::exportasdomelement @returndomelement publicfunctionexportasdomelement($domdocument){ //Createthe<exit>nodewiththeattribute"name". $exitnode=$domdocument >createelement("exit"); //Setattributes. $exitnodeattname=sprintf("%s%s",$this >prefix,$this >name); $exitnode >setattribute("name",$exitnodeattname); return$exitnode;?> BpelIfActivity.php <?php session_start(); PHPversions5.2.6 @categoryworkflowactivity @packageactivities @subpackagebpel @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisclassrepresentstheif activityfromthebpelactivitymodel. classbpelifactivityextendsactivity { ifconditionexpressionusedbyexportingtheactivityasdomelement. @varbpelwfbooleanexpression private$ifcondtionexpression; ifacitvityusedbyexportingtheactivityasdomelement. @varactivity private$ifactivity; CreatesanewinstanceofaBPEL<if> activity. @parammixed$name @parammixed$prefix AppendiksB 98
@paramdomnode$domnode publicfunction construct($name,$prefix,$domnode){ $this >name=$name; $this >prefix=strlen(trim($prefix))>0?sprintf("%s:",$prefix):""; $this >domnode=$domnode; Lastitremovestherestofthe<if> activitynodefromthedom. @parambpelwfexecution$execution @seeactivity::execute() publicfunctionexecute($execution){ $execution >domiterator >next(); if($this >dobooleancondition($execution)){ $execution >domiterator >next(); $this >ifxmlrewrite($execution,true); else{ $this >ifxmlrewrite($execution,false); $foundactivity=$this >findnextelseiforelse($execution); if($foundactivity===true){ if($execution >domiterator >key()==='elseif'){ $this >elseifxmlrewrite($execution,$execution >domiterator >current()); elseif($execution >domiterator >key()==='else'){ $this >elsexmlrewrite($execution,$execution >domiterator >current()); else{ $execution >cleardombookmark(); $execution >removenode($this >domnode); Evaluatesif condition. @parambpelwfexecution$execution @returntrueifitevaluates'true'. privatefunctiondobooleancondition($execution){ $conditionnode=$execution >domiterator >current(); $exprvalue=$conditionnode >nodevalue; $boolcondition=newbpelwfbooleanexpression($exprvalue,$execution >xpath); if($boolcondition >evaluate()===true){ returntrue; returnfalse; XML rewriteanifnode. AppendiksB 99
Iftheconditionistrueitremovesallofthenodeitschilds, exceptfortheifactivity. Iftheconditionisfalseitjustremovesthewholenodeanditschildrens. @parambpelwfexecution$execution @paramboolean$conditionok privatefunctionifxmlrewrite($execution,$conditionok){ if($conditionok){ $activitynode=$execution >domiterator >current(); $this >domnode >parentnode >insertbefore($activitynode,$this >domnode); $this >domnode >parentnode >removechild($this >domnode); $execution >cleardombookmark(); $execution >savenewdefinitionversion(); else{ $execution >domiterator >next(); $activitynode=$execution >domiterator >current(); $this >domnode >removechild($this >domnode >firstchild); $this >domnode >removechild($activitynode); XMLrewritestheelseifnode.Itremovetheelseifnode, anditsconditionandactivity willnowserveasconditionandactivityfromanif. @parambpelwfexecution$exection @paramdomnode$elsenode privatefunctionelseifxmlrewrite($execution,$elseifnode){ $conditionnode=$elseifnode >firstchild; $activitynode=$elseifnode >lastchild; $this >domnode >insertbefore($conditionnode,$elseifnode); $this >domnode >insertbefore($activitynode,$elseifnode); $this >domnode >removechild($elseifnode); $execution >savenewdefinitionversion(); XMLrewritestheelsenode.Itremovetheelsenodeanditsparent(if). Theelseactivity(ifone) willnowserveasnormalactivityinthedefinitionfile. @parambpelwfexecution$exection @paramdomnode$elsenode privatefunctionelsexmlrewrite($execution,$elsenode){ if($elsenode >haschildnodes()){ $activitynode=$elsenode >firstchild; $this >domnode >parentnode >insertbefore($activitynode,$this >domnode); $execution >cleardombookmark(); $execution >removenode($elsenode >parentnode); AppendiksB 100
Searchforthenextelseiforelse.Returnsthenext(ifany). @parambpelwfexecution$execution @returntrueif<elseif>or<else>found. privatefunctionfindnextelseiforelse($execution){ while($execution >domiterator >valid()){ if($execution >domiterator >key()==='elseif' $execution >domiterator >key()==='else'){ returntrue; $execution >domiterator >next(); returnfalse; Addsa<if>nodetotheDOMDocumentofthecurrentexecution. @paramdomdocument$domdocument @returndomelement$ifnode publicfunctionexportasdomelement($domdocument){ $ifnode=$domdocument >createelement("if"); if($this >ifactivity!=null&&$this >ifcondtionexpression!=null){ $this >exportfromprogrammaticif($ifnode,$domdocument); else{ foreach($this >domnode >childnodesas$ifchild){ switch($ifchild >nodename){ case'elseif':$childelement=$domdocument >createelement('elseif'); break; case'else':$childelement=$domdocument >createelement('else'); break; case'condition':$childelement=$domdocument > createelement('condition',$ifchild >nodevalue); break; default:$childelement=$domdocument >createelement( $ifchild >nodename); break; if($ifchild >nodename!='condition'){ foreach($ifchild >childnodesas$ifchildactivity){ $activitynode= BpelWfUtils::parseDOMNodeToBpelWfNode($ifChildActivity); $activitynode= $activitynode >exportasdomelement($domdocument); $childelement >appendchild($activitynode); $ifnode >appendchild($childelement); return$ifnode; AppendiksB 101
Exportsanifactivitywhichhasbeencreatedprogrammatically. Exampleinthewhileactivity. @seewhileactivity::buildif @paramdomnode$ifnode @paramdomdocment$domdoc @returndomnode$ifnode privatefunctionexportfromprogrammaticif($ifnode,$domdoc){ //Addconditionnode $ifconditionnode=$this >ifcondtionexpression >exportasdomelement($domdoc); $ifnode >appendchild($ifconditionnode); //Addactivitynode $ifactivitynode=$this >ifactivity >exportasdomelement($domdoc); $ifnode >appendchild($ifactivitynode); return$ifnode; SETTER @parambpelwfbooleanexpression$expression publicfunctionaddcondition($expression){ $this >ifcondtionexpression=$expression; SETTER @paramactivity$activity publicfunctionaddactivity($activity){ $this >ifactivity=$activity;?> AppendiksB 102
BpelSequenceActivity.php <?php PHPversions5.2.6 @categoryworkflowactivity @packageactivities @subpackagebpel @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann ThisclassrepresentsthesequenceactivityfromtheBPELactivitymodel. classbpelsequenceactivityextendsactivity { Holdsallactivitiesaddedtothissequence whenbuildedprogramatically. @vararray private$activitylist=array(); publicfunction construct($name,$prefix,$domnode){ $this >name=$name; $this >prefix=strlen(trim($prefix))>0?sprintf("%s:",$prefix):""; $this >domnode=$domnode; Performsallsubactivitiessequentially. WheneverasubactivityisfinisheditwillberemovedfromtheDOM. Ifthisactivitydon'tcontainsanyactivitiesithasfinishedand willberemovedfromthedom. @parambpelwfexecution$execution publicfunctionexecute($execution){ $execution >adddombookmark($execution >domiterator >getoffset()); $finished=false; $childs=$execution >domiterator >current() >childnodes >length; while(!$finished&&!$execution >issuspended()&& $execution >domiterator >getoffset()!=0){ if($childs==0){ $finished=true; if($execution >domiterator >getoffset()!=0){ $nodetoremove=$execution >domiterator >key()=="sequence"? $execution >domiterator >current():$this >domnode; $execution >cleardombookmark(); $execution >removenode($nodetoremove); AppendiksB 103
else{ $execution >domiterator >next(); if($execution >domiterator >current() >nodetype!=xml_text_node&& $execution >domiterator >key()!='documentation'){ $activity=bpelwfutils::parsedomnodetobpelwfnode( $execution >domiterator >current()); //Onlyparsednodes(supportednodesrightnow)willbeexecuted. if(!is_null($activity)){ $activity >execute($execution); $childs ; Addsa<sequence>nodetotheDOMDocumentofthecurrentexecution. @paramdomdocument$domdocument @return@seeidomexporter::exportasdomelement publicfunctionexportasdomelement($domdocument){ //Createthe<sequence>nodewitha"name"attribute. $sequencenode=$domdocument >createelement("sequence"); if(strlen(trim($this >name))>0){ $sequencenodeattname=sprintf("%s%s",$this >prefix,$this >name); $sequencenode >setattribute("name",$sequencenodeattname); //Appendallchildactivities if(count($this >activitylist)>0){ foreach($this >activitylistas$activity){ $activitynode=$activity >exportasdomelement($domdocument); $sequencenode >appendchild($activitynode); else{ foreach($this >domnode >childnodesas$activity){ $activity=bpelwfutils::parsedomnodetobpelwfnode($activity); $activitynode=$activity >exportasdomelement($domdocument); $sequencenode >appendchild($activitynode); return$sequencenode; AddsanActivitytothesequence. @paramactivity$activity publicfunctionaddsequenceactivity($activity){ array_push($this >activitylist,$activity); AppendiksB 104
}?> BpelThrowActivity.php <?php session_start(); PHPversions5.2.6 @categoryworkflowactivity @packageactivities @subpackagebpel @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisclassrepresentsthe<throw> activityfromthebpelactivitymodel. classbpelthrowactivityextendsactivityimplementsidomexporter { Ifspecified,itisthenameofthefaulttocatch. (NOTIMPLEMENTEDYET,WILLBEWITHWSSUPPORT) @varmixed private$faultname; Ifspecified,thevariablewiththefaultdata. @varmixed private$faultvariable; CreatesanewinstanceofaBPELthrowactivity. @parammixed$faultname @parammixed$faultvariable function construct($faultname,$faultvariable,$prefix,$domnode){ $this >faultvariable=$faultname; $this >faultvariable=$faultvariable; $this >prefix=$prefix; $this >domnode=$domnode; Seeifafaultvariableisspecified.Ifsoitthrowitsvalueasthefault message,otherwiseitwilljustuseadefaultfaultmessage. Removesthecurrentactivityfromthedomtree. @parambpelwfexecution$execution @seeactivity::execute() @throwsbpelwfinternalfaultexception publicfunctionexecute($execution){ AppendiksB 105
$wfdefinitioname=$execution >getdefinitionname(); $bpelfaultvariable=null; if(strlen(trim($this >faultvariable))>0){ if(!is_null($_session[$wfdefinitioname]['variables'] [$this >faultvariable])){ $bpelfaultvariable=$_session[$wfdefinitioname]['variables'] [$this >faultvariable]; else{ $bpelfaultvariable=bpelwfutils::parsedomvariabletobpelvariable( $execution >xpath,$this >faultvariable); $faultmsg=!is_null($bpelfaultvariable)?$bpelfaultvariable >getvalue(): 'DEFAULTFAULTMESSAGE:Aninternalfaulthasbeenraised...'; thrownewbpelwfinternalfaultexception($faultmsg); Createsa<throw>nodewiththeattributes"faultName"and"faultVariable". @seeidomexporter::exportasdomelement @returndomelement publicfunctionexportasdomelement($domdocument){ $thrownode=$domdocument >createelement("throw"); //Setattributes. $thrownode >setattribute("faultname",$this >faultname); $thrownode >setattribute("faultvariable",$this >faultvariable); return$thrownode;?> BpelWaitActivity.php <?php PHPversions5.2.6 @categoryworkflowactivity @packageactivities @subpackagebpel @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann ThisclassrepresentsthewaitactivityfromtheBPELactivitymodel. classbpelwaitactivityextendsactivityimplementsidomexporter { Thetimeindicatesforhowlongtheprocessinstancewillsleep, whenexecutingthisacitvity. AppendiksB 106
Thetimeisinseconds. @varint private$sleeptime; ThetimespecifiedasadurationordateTimetype. @varmixed private$dtime; Instantiatesanewobjectofthisclass. @parammixed$name @parammixed$prefix @paramdomnode$domnode publicfunction construct($name,$prefix,$domnode){ $this >name=$name; $this >prefix=$prefix; $this >domnode=$domnode; Firstitfindsoutifthewaitactivity'schildisa<for>or<until>. NextitdoesatestifthedataisgiveninsideaBPELvariableotherwiseitsaISO 8601durationogdateTimeinsidethechild. Ifitisan<until>aBpelWfDateTimeExpressionisusedtoevaluateitandgetthe datetimeasunixtime. Ifitisa<for>werewriteittoan<until>andalsoconvertsthedurationtounix timewithbpelwfdurationexpression. Aftertheithasbeendelayedandresumes,the<wait>itselfweberemoved. @parambpelwfexecution$execution @throwsbpelwfvariablenotfoundexception publicfunctionexecute($execution){ $execution >adddombookmark($execution >domiterator >getoffset()); $waittimenode=$this >findfororuntil(); $this >setwaittimestring($waittimenode >nodevalue,$execution >xpath); if($waittimenode >nodename==='for'){ $durationexpression=newbpelwfdurationexpression($this >dtime, $execution >xpath); $durationasunixtime=$durationexpression >evaluate(); $datetimeunixtime=time()+$durationasunixtime; $datedatimeexpression=newbpelwfdatetimeexpression("",$execution >xpath); $datetimestring=$datedatimeexpression > convertunixtimetodatetime($datetimeunixtime); //XML rewriteto<until>. $this >xmlrewritewaitfortountil($execution,$waittimenode,$datetimestring); AppendiksB 107
elseif($waittimenode >nodename==='until'){ $datetimeexpression=newbpelwfdatetimeexpression($this >dtime, $execution >xpath); $datetimeunixtime=$datetimeexpression >evaluate(); //Onlydelayexecutionifthedelaytimeisnotpassedyet. $now=time(); if($now<$datetimeunixtime){ time_sleep_until($datetimeunixtime); $execution >adddombookmark($execution >domiterator >getoffset() 1); $execution >removenode($execution >domiterator >current()); Searchforthe<for>or<until>specified.Itwillreturnfalseif noneofthemisfound.that'sanerror. Validationoftheprocesdefinitionfilelaterwillsecureagainstthis. @returndomnode privatefunctionfindfororuntil(){ if($this >domnode >haschildnodes()){ foreach($this >domnode >childnodesas$child){ if($child >nodename==='for' $child >nodename==='until'){ return$child; returnfalse; Testsifthevalueineither<for>or<until>isaBPELvariablename. Ifsoitreturnstrue,otherwisefalse. @parammixed$value @returntrueifitavariablename. privatefunctionisvariablename($value){ if(substr($value,0,1)=='$'){ returntrue; returnfalse; XML rewritea<for>toan<until>. Fordifferencebetweenthem,pleaserefertoWS BPEL2.0specs. @parambpelwfexecution$execution @paramdomnode$waitfornode @parammixed$datetimestring privatefunctionxmlrewritewaitfortountil($execution,$waitfornode,$datetimestring){ $domdoc=$execution >getdomdocument(); AppendiksB 108
$untilnode=$domdoc >createelement("until"); $untilnode >nodevalue=$datetimestring; $this >domnode >insertbefore($untilnode,$waitfornode); $this >domnode >removechild($waitfornode); $execution >savenewdefinitionversion(); Setsthewaittime. @parammixed$value @paramdomxpath$xpath privatefunctionsetwaittimestring($value,$xpath){ if(substr($value,0,1)=='$'){ $variablename=trim(str_replace('$','',$value));//weremovethe'$'. $bpelvariable=bpelwfutils::parsedomvariabletobpelvariable($xpath, $variablename); if(is_null($bpelvariable)){ thrownewbpelwfvariablenotfoundexception("thevariable{$variablenamecould notbefoundintheprocesdefinition file."); else{ $this >dtime=$bpelvariable >getvalue(); else{ $this >dtime=$value;?> BpelWhileActivity.php <?php PHPversions5.2.6 @categoryworkflowactivity @packageactivities @subpackagebpel @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisclassrepresentsthe<while>activityfromtheBpeldefinitionlanguage. classbpelwhileactivityextendsactivity { whileconditionexpressionusedbyexportingtheactivityasdomelement. @varbpelwfbooleanexpression AppendiksB 109
private$whilecondtionexpression; whileacitvityusedbyexportingtheactivityasdomelement. @varactivity private$whileactivity; CreatesanewinstanceofaBPEL<while> activity. @parammixed$name @parammixed$prefix @paramdomnode$domnode publicfunction construct($name,$prefix,$domnode){ $this >name=$name; $this >prefix=strlen(trim($prefix))>0?sprintf("%s:",$prefix):""; $this >domnode=$domnode; XMLrewritesthe<while>activtytothefollowingstructure. @example <if><condition>a</condition><sequence>b<while><condition>a</condition>b</while> </sequence></if> @parambpelwfexecution$execution @seeactivity::execute() publicfunctionexecute($execution){ $domdoc=$execution >getdomdocument(); $xpath=$execution >xpath; $ifactivity=$this >buildif($xpath); $newifactivitynode=$ifactivity >exportasdomelement($domdoc); $whileparentnode=$this >domnode >parentnode; $execution >cleardombookmark(); if($whileparentnode >parentnode >nodename==="if"){ //Iftheparentofthiswhileisa<sequence>,replacetheparentofthe //<sequence>withthe<sequence>itself. $execution >replacenode($whileparentnode >parentnode,$whileparentnode); else{ //ReplacethiswhilewithitsXML rewritted<if>. $execution >replacenode($this >domnode,$newifactivitynode); InstansiatesanewBpelSequenceActivityandexportsitasaDOMElement. Theactivitesinsidethesequencearethiswhileactivity'sactivityandthewhile activityitself. @paramdomxpath$xpath @returnbpelsequenceactivity$sequenceactivity AppendiksB 110
privatefunctionbuildsequence($xpath){ $sequenceactivity=newbpelsequenceactivity("","",null); //Buildthe<while>'sactivity. $this >whileactivity=bpelwfutils::parsedomnodetobpelwfnode( $this >domnode >lastchild); //Buildthe<while>itself. $whileactivtyitself=bpelwfutils::parsedomnodetobpelwfnode($this >domnode); $whileactivtyitself >addcondition(newbpelwfbooleanexpression( $this >domnode >firstchild >nodevalue,$xpath)); $whileactivtyitself >addactivity($this >whileactivity); //Addbuildedactivities $sequenceactivity >addsequenceactivity($this >whileactivity); $sequenceactivity >addsequenceactivity($whileactivtyitself); return$sequenceactivity; XML rewritesthewhileactivitytoanifactivity. @seebpelifactivity @paramdomxpath$xpath @returnbpelifactivity$ifactivity privatefunctionbuildif($xpath){ $ifactivity=newbpelifactivity("","",null); //Buildandaddthe<while>'scondition. $this >whilecondtionexpression=newbpelwfbooleanexpression( $this >domnode >firstchild >nodevalue,$xpath); $ifactivity >addcondition($this >whilecondtionexpression); //getandadd<sequence>activity. $ifactivity >addactivity($this >buildsequence($xpath)); return$ifactivity; Addsa<while>nodetotheDOMDocumentofthecurrentexecution. @paramdomdocument$domdocument @returndomelement$whilenode publicfunctionexportasdomelement($domdocument){ $whilenode=$domdocument >createelement("while"); //Addconditionnode $this >whilecondtionexpression=newbpelwfbooleanexpression( $this >domnode >firstchild >nodevalue,$xpath); $whileconditionnode=$this >whilecondtionexpression > exportasdomelement($domdocument); $whilenode >appendchild($whileconditionnode); //Addactivitynode $whileactivitynode=$this >whileactivity >exportasdomelement($domdocument); $whilenode >appendchild($whileactivitynode); return$whilenode; AppendiksB 111
SETTER @parambpelwfbooleanexpression$expression publicfunctionaddcondition($expression){ $this >whileconditionexpression=$expression; SETTER @paramactivity$activity publicfunctionaddactivity($activity){ $this >whileactivity=$activity;?> BpelInvokeActivity.php <?php PHPversions5.2.6 @categoryworkflowactivity @packageactivities @subpackagebpel @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisclassrepresents,rightnowalimitedversion,oftheinvokeactivityfromthe BPEL activitymodel. Sincewebserivesisn'tsupportedathemoment,thisactivitystillservesasaan invoker,inthewaythatit invokesurlsfromthesm bpelactivity<humanform>. Infuturereleasesitwillalsosupportitrealintentionstowardsthews bpel2.0 specification. classbpelinvokeactivityextendsactivityimplementsidomexporter { Willcontaintheurltoinvoke. @varmixed private$url; Instantiatesanewobjectofthisclass. @paramstring$name @paramstring$prefix AppendiksB 112
@paramdomnode$domnode @paramstring$url publicfunction construct($name,$prefix,$domnode,$url){ $this >name=$name; $this >prefix=$prefix; $this >domnode=$domnode; $this >url=$url; Justtriestoinvokethespecifiedurlandlaunchitaseparatebrowserwindow. ItthrowsaBpelWfUrlNotFoundFoundExceptioniftherequestedurlisabadurl. @parambpelwfexecution$execution @throwsbpelwfurlnotfoundfoundexception publicfunctionexecute($execution){ //Checkiftheurlspecifiedexists,otherwisethrowanexception. if(file_get_contents($this >url)===false){ thrownewbpelwfurlnotfoundexception("therequestedurl'{$this >url}'' couldnotbereach..."); $execution >removenode($execution >domiterator >current()); $location=sprintf("%s?wf=%s",$this >url,$execution >getdefinitionname()); header('location:'.$location); exit(); ExportstheinvokeobjecttoaDOMNoderepresentation. @paramdomdocment$domdocument @returndomnode$invokenode publicfunctionexportasdomelement($domdocument){ //Createthe<invoke>node. $invokenode=$domdocument >createelement("invoke"); //Settheattribute"name"ifspecified. if(strlen(trim($this >name))>0){ $invokenodeattname=sprintf("%s%s",$this >prefix,$this >name); $invokenode >setattribute("name",$invokenodeattname); //Settheattribute"inputVariable". $invokenode >setattribute("url",$this >url); return$invokenode; Apieceofjavascriptthatopentherequestedurlinanewbrowserwindow. privatefunctioninvokeurl(){ print"<scriptlanguage=\"javascript\">\n"; print"<! hidefromoldbrowser\n\n"; print"functioninvokeurl(){\n"; print"window.open(\"".$this >url."\");\n"; print"}\n\n"; AppendiksB 113
print"invokeurl();\n\n"; print" >\n"; print"</script>\n";?> AppendiksB 114
B.1.1.2sm bpel OnChangeActivity.php <?php session_start(); PHPversions5.2.6 @categoryworkflowactivity @packageactivities @subpackagesm bpel @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisclassrepresentstheworkflowengineactivity"onChange".Thisactivitywait until acertainbpelvariablehasbeenchange.duringitswaitingtheworkflowwillbe suspended. Besidesitcanactastheinitiatorofnewprocessinstance,whentheattribute "createinstance"issetto"yes". Whencreatinganewprocessinstanceandthevariable"processDefinition"isset,it willcreateanewinstance ofthatprocessdef.,otherwiseitwillcreateanewinstanceofitsowntheprocess def. AppendiksB 115
classonchangeactivityextendsactivityimplementsidomexporter { NameoftheBPELVariabletoreadthevaluefrom. @varstring private$variable; Ifsetto"Yes",itIndicatesthatanewinstancehastobecreated. @varstring private$createinstance; @paramstring$name @paramstring$variable @paramstring$prefix @paramdomnode$domnode @paramstring$createinstance publicfunction construct($name,$variable,$prefix,$domnode, $createinstance=""){ $this >name=$name; $th is >variable=$variable; $this >createinstance=$createinstance; $this >prefix=$prefix; $this >domnode=$domnode; Findsthebpelvariabletogetdatafrom.Ifitdoesn'tcontainany data,thisactivitywilljustexecutebutnotmoveontothenextactivity (servesasa"waitstate"). Ifthevariablehasdataitremovesthisactivity'snodefromthedomdocument and definitionfile.anewversionofthedefinitionfilewillbesavedandthe iteratorgoestothenextnode. Ifitisthestartactivityitsetstheexecutiontostartedandsetsthe current nodetoitsparentnode. @parambpelwfexecution$execution publicfunctionexecute($execution){ $wfdefintionname=$execution >getdefinitionname(); $_SESSION[$wfDefintionName]['prevValues']= isset($_session[$wfdefintionname]['prevvalues'])? $_SESSION[$wfDefintionName]['prevValues']:array(); $variables=unserialize($_session[$wfdefintionname]['variables']); $bpelvariable=$variables[$this >variable]; $prevvalue=isset($_session[$wfdefintionname]['prevvalues'][$this >variable])? $_SESSION[$wfDefintionName]['prevValues'][$this >variable]:""; if($bpelvariable >getvalue()==$prevvalue){ AppendiksB 116
$execution >adddombookmark($execution >domiterator >getoffset()); $execution >suspend(); else{ $_SESSION[$wfDefintionName]['prevValues'][$this >variable]= $bpelvariable >getvalue(); //Createanewinstanceoftherequestedworkflow. if(strlen(trim($this >createinstance))>0){ $this >createprocessinstance(); $execution >cleardombookmark(); $execution >removenode($this >domnode); @seeidomexporter::exportasdomelement publicfunctionexportasdomelement($domdocument){ //Createthe<onChange>nodewiththeattributes"name"and"variable". $onchangenode=$domdocument >createelement("onchange"); //Setattributes. $onchangeattname=sprintf("%s%s",$this >prefix,$this >name); $onchangenode >setattribute("name",$onchangeattname); $onchangenode >setattribute("variable",$this >variable); return$onchangenode; Openstherequestedworkflowinanewbrowserwindow.Therequestedfile instantiatesthenewprocessinstance(bpelwfexecution). privatefunctioncreateprocessinstance(){ print"<scriptlanguage=\"javascript\">\n"; print"<! hidefromoldbrowser\n\n"; print"functioncreatenewinstance(){\n"; print"window.open(\"".$this >createinstance."\",\"".time()."\");\n"; print"}\n\n"; print"createnewinstance();\n\n"; print" >\n"; print"</script>\n";?> AppendiksB 117
HumanFormActivity.php <?php PHPversions5.2.6 @categoryworkflowactivity @packageactivities @subpackagesm bpel @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.php(mitlicence) @copyrightcopyright 2008,DanielK.Theemann Classthatrepresentsthesm bpel<humanform>element.thisactivityisatryto integratehuman interactionintobpel,whereaformisincludedandthesubmitteddataisintegrated into thedefinitionfile. classhumanformactivityextendsactivityimplementsidomexporter { Instantiatesanewobjectofthisclass. @paramstring$name @paramstring$prefix @paramdomnode$domnode publicfunction construct($name,$prefix,$domnode){ $this >name=$name; $this >prefix=$prefix; $this >domnode=$domnode; Executesthe<humanForm>element.Itloopsthroughllitactivitesandexecutes them.oncetherearenochildsleft,itwillremoveitselffromdefinition file. @parambpelwfexecution$execution publicfunctionexecute($execution){ $execution >adddombookmark($execution >domiterator >getoffset()); if($this >domnode >haschildnodes()){ foreach($this >domnode >childnodesas$childnode){ $activity=bpelwfutils::parsedomnodetobpelwfnode($childnode); if(!is_null($activity)){ $activity >execute($execution); else{ $execution >cleardombookmark(); $execution >removenode($this >domnode); AppendiksB 118
ExportstheinvokeobjecttoaDOMNoderepresentation. @paramdomdocment$domdocument @returndomnode$invokenode publicfunctionexportasdomelement($domdocument){ $humanformnode=null; if($this >domnode >haschildnodes()){ //Createthe<humanForm>node. $humanformnode=$domdocument >createelement("humanform"); //Settheattribute"name"ifspecified. if(strlen(trim($this >name))>0){ $humanformnodeattname=sprintf("%s%s",$this >prefix,$this >name); $humanformnode >setattribute("name",$humanformnodeattname); //Appendallchildactivities foreach($this >domnode >childnodesas$activity){ $activity=bpelwfutils::parsedomnodetobpelwfnode($activity); $activitynode=$activity >exportasdomelement($domdocument); $humanformnode >appendchild($activitynode); return$humanformnode;?> AppendiksB 119
B.1.2expressions BpelWfExpression.php <?php PHPversions5.2.6 @categoryworkflowactivity @packageexpressions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Interfaceforexpressionsinthisworkflowengine. abstractclassbpelwfexpression { AnobjectoftheclassDOMXPath, whichcanqueryandexaluatethecurrentdom tree. @vardomxpath protected$domxpath; Theexpressiontobevalidate,evaluatedorbuilded. AppendiksB 120
@varmixed protected$expressionstring; Validatestheexpression. protectedabstractfunctionvalidate(); GivenaxpathexpressionwherethereisminimumoneoccurrenceofthetheBPEL variablebindingchar'$',itrewritesthe$navntovariable[@name="navn"]. $invalidoperatorlist('<',<=','&&',...); @paramarray$invalidoperatorlist @returnstring protectedfunctionrewritebpelxpathvariablebinding($invalidoperatorlist){ $xpathexpr=$this >findvariablesinexpr($this >expressionstring); $xpathtolist=split('/',trim($xpathexpr)); $variablebinding=""; for($j=0;$j<count($strtmp);$j++){ if(!in_array($strtmp[$j],$invalidoperatorlist)&&!$varnamefound){ $variablename.=$strtmp[$j]; else{ $varnamefound=true; $tail.=$strtmp[$j]; Evaluatesthisexpression. @returnbooleantruewhentheexpressionholds,falseotherwise. publicabstractfunctionevaluate(); for($i=0;$i<count($xpathtolist);$i++){ if(strlen(trim($xpathtolist[$i]))==0){ $variablebinding.='/'; else{ if(substr($xpathtolist[$i],0,1)=='$'){ $strtmp=str_split($xpathtolist[$i]); $varnamefound=false; $variablename=""; $tail=""; $variablebinding.=$i==0? sprintf('//bpel:variable[@name="%s"]', trim($variablename)): sprintf('bpel:variable[@name="%s"]',trim($variablename)); $variablebinding.=$tail; else{ $variablebinding.=$xpathtolist[$i]; AppendiksB if($xpathtolist[$i 1]!='/'&&$i<count($xpathToList) 1){ 121
$variablebinding.='/'; returnstr_replace('$','',$variablebinding); Searchesthexpathexpressionforvariables($navn)and put"//"infrontofthe'$',ifthereisnotalreadya'/'; @paramstring$expr @returnstring privatefunctionfindvariablesinexpr($expr){ $chars=str_split($expr); $returnstring=""; for($i=0;$i<count($chars);$i++){ if($chars[$i]==='$'&&$chars[$i 1]!=='/'){ $chars[$i]='//$'; $returnstring.=$chars[$i]; return$returnstring; BuildsaDOMElement<condition>withanexpressionasnodevalue. @paramdomdocument$domdocument @returndomelement protectedfunctionbuildconditiondomelement($domdocument){ $conditionnode=$domdocument >createelement("condition",$this >expressionstring); return$conditionnode;?> BpelWfBooleanExpression.php <?php PHPversions5.2.6 @categoryworkflowactivityexpressions @packageexpressions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann ThisclassevaluatesagivenbooleanexpressionwithXPath. classbpelwfbooleanexpressionextendsbpelwfexpressionimplementsidomexporter AppendiksB 122
{ '>=', BooleanXPath1.0operators. @vararray private$operator_list=array(' ','+',' ','div','=','!=','<','<=','>', 'mod','(',')','>','<'); 'or','and', ConstructsanewBpelWfBooleanExpression. @parammixed$expressionstring @paramdomxpath$domxpath publicfunction construct($expressionstring,$domxpath){ $this >expressionstring=$expressionstring; $this >domxpath=$domxpath; EvaluatesanWS BPELbooleanexpressionasaXPathbooleanexpression @parammixed$value @parammixed$operator @returntrueifthews BPELexpressionevaluatestrue. publicfunctionevaluate(){ $evaluationvalue=false; $strpos=strpos($this >expressionstring,'$'); if($strpos!==false){ $this >expressionstring=$this >rewritebpelxpathvariablebinding( if($this >validate()!==false){ $query=sprintf("boolean(%s)",$this >expressionstring); $evaluationvalue=$this >domxpath >evaluate($this >expressionstring); return$evaluationvalue; Validatesthebooleanexpression. @parammixed$value @returntrueifvalid. protectedfunctionvalidate(){ returnxpathvalidator::validatexpathexpression($this >domxpath, $this >operator_list); $this >expressionstring); @seeidomexporter::exportasdomelement @seebpelwfexpression::buildconditiondomelement AppendiksB 123
publicfunctionexportasdomelement($domdocument){ return$this >buildconditiondomelement($domdocument);?> BpelWfDurationExpression.php <?php PHPversions5.2.6 @categoryworkflowactivityexpressions @packageexpressions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann ThisclassrepresentsthedurationexpressionusedincertainBPELactivities. ThedurationexpressionmustbevalidXMLschematype(duration). @seehttp://www.w3.org/tr/2001/rec xmlschema 2 20010502/#duration @seehttp://pear.php.net/package/soap/type/duration.php */ require"soap/type/duration.php";//pear classbpelwfdurationexpressionextendsbpelwfexpression { publicfunction construct($expressionvalue,$domxpath){ $this >domxpath=$domxpath; $this >expressionstring=$expressionvalue; it Validatesthe#durationexpressionandreturnsitasunixtime,ifvalid. Otherwiseitwillthrowanexception. PEAR::SOAPisusedtobothvalidatethedurationexpressionandconversionof tounixtime. @returntrueifvalid. @throwsbpelwfinvalidxpathexpressionexception */ publicfunctionevaluate(){ if(!$this >validate($this >expressionstring)){ thrownewbpelwfinvalidxpathexpressionexception( 'Invaliddurationexpression.('.$this >expressionstring.')'); returnsoap_type_duration::duration_to_unix($this >expressionstring); Validatesthegivendurationstring. @returntrueifvalid. protectedfunctionvalidate(){ AppendiksB 124
if(!soap_type_duration::is_duration($this >expressionstring)){ returnfalse;?> returntrue; BpelWfDateTimeExpression.php <?php PHPversions5.2.6 @categoryworkflowactivityexpressions @packageexpressions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann ThisclassrepresentstheDateTimeexpressionusedincertainBPELactivities. Sofarin: wait TheDateTimeexpressionmustbevalidXMLschematype(DateTime). require"soap/type/datetime.php";//pear classbpelwfdatetimeexpressionextendsbpelwfexpression { CreatesanewinstanceofadateTimeexpression. @paramdomxpath$domxpath publicfunction construct($expressionvalue,$domxpath){ $this >domxpath=$domxpath; $this >expressionstring=$expressionvalue; Validatesthe#dateTo,eexpressionandreturnsitasunixtime,ifvalid. Otherwiseitwillthrowanexception. PEAR::SOAPisusedtobothvalidatethedateTimeexpressionandconversionof ittounixtime. @parammixed$value @returntrueifvalid. @throwsbpelwfinvalidxpathexpressionexception publicfunctionevaluate(){ if(!$this >validate()){ thrownewbpelwfinvalidxpathexpressionexception('invaliddatetime expression.'); returnstrtotime($this >expressionstring); AppendiksB 125
?> TODOsupportvalidationofthedateTimeISO 8601. ValidatesthegivendateTimestring. @returntrueifvalid. protectedfunctionvalidate(){ returntrue; ConvertsaunixtimetoaschemaDateTime. UsesPEAR::SOAPpackage. @paramint$unixtime @returnmixeddatetimestring @seesoap_type_datetime::tostring publicfunctionconvertunixtimetodatetime($unixtime){ returnsoap_type_datetime::tostring($unixtime); AppendiksB 126
B.2WorkflowExecutionAPI B.2.1executions AppendiksB 127
BpelDOMNodeListIterator.php <?php PHPversions5.2.6 @categoryworkflowexecution @packageexecutions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann RecursiveIteratorisaclassinthePHPclasshierarchi. classbpeldomnodelistiterator { private$nodes; private$offset; publicfunction construct(domnodelist$nodes,$bookmark){ if($bookmark>0){ $this >offset=$bookmark; return$this >nodes=$nodes; Resetstheoffset(ie.placethepointeratthefirstelement). @returnint$offset publicfunctionrewind(){ return$this >offset=0; publicfunctiongetoffset(){ return$this >offset; ReturnsthecurrentDOMNode. @returndomnode publicfunctioncurrent(){ return$this >nodes >item($this >offset); Returnstheparentnodeofthecurrentnode. @returndomnode publicfunctionparentnode(){ return$this >nodes >item($this >offset) >parentnode; Returnsthenodenameofthecurrentelement. AppendiksB 128
@returnstring publicfunctionkey(){ return$this >current() >nodename; Movesthepointertothenextposition(index). @returnint$offset publicfunctionnext(){ return$this >offset++; TestsiftheendoftheDOMDocumenthasbeenreached. @returnbooleantrueifendisreached,otherwisefalse. publicfunctionvalid(){ return$this >offset<$this >nodes >length; Testswhetherthecurrentnodehaschildnodes. @returnbooleantrueifanychildnodes,falseotherwise. publicfunctionhaschildren(){ returnisset($this >current() >childnodes >length)&& $this >current() >childnodes >length>0; Getsallthechildnodesforthecurrentnode. @returndomnodelist publicfunctiongetchildren(){ returnnewself($this >current() >childnodes); @deprecated FindsaspecificnodeintheDOMrepresentation. @paramdomnode$node @returnbooleantrueiffound. publicfunctionfindnode($node){ while($this >valid()){ if($this >current()instanceofdomelement&&$this >current()=== $node){ returntrue; $this >next(); returnfalse; AppendiksB 129
Removesthecurrentnode. @throwsbpelwfactivitynodenotremovefromdom publicfunctionremovenode($node){ $parentnode=$node >parentnode; $oldnode=$parentnode >removechild($node); if($oldnode!=$node){ thrownewbpelwfactivitynodenotremovefromdom( sprintf('couldnotremoveactivitynode(tagname"%s")from DOM', $node >tagname) ); DOM', Replaceagivennodewithanother. @paramdomnode$oldnode @paramdomnode$newnode publicfunctionreplacenode($oldnode,$newnode){ $parentnode=$oldnode >parentnode; $oldnodereplaced=$parentnode >replacechild($newnode,$oldnode); if($oldnodereplaced!=$oldnode){ thrownewbpelwfnodenotreplacedindom( sprintf('couldnotreplacenode(tagname"%s")with(tagname%s)in ); $oldnode >tagname,$newnode >tagname) AppendsanewnodetotheDOMrepresentation. @paramdomnode$node @paramdomnode$parent publicfunctionappendnode($node,$parent){ $oldnode=$parent >appendchild($node); if($oldnode!=$node){ thrownewbpelwfnodenotappendedtodom( sprintf('couldnotappendnode(tagname"%s")todom',$node >tagname) );?> AppendiksB 130
BpelWfExecution.php <?php session_start(); PHPversions5.2.6 @categoryworkflowexecution @packageexecutions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann @exampleexecutions/bpelwfexecution.php Thisclassrepresentsaworkflowinstansandhandlestheexecutionofaworkflow, whichinvolvessuspend,resumeandtraversing. classbpelwfexecution { @varbpeldomnodelistiterator public$domiterator; @vardomdocument private$bpeldomdocument; Nameofthedefinitionfileitexecutes. @varstring private$definitionname; Nameanddestinationofthedefinitionfiletouse. @varstring private$definitionfile; @varbpelwfdefinitionstorage private$definitionstorage; @vardomxpath public$xpath; falseiftheworkflowhasnotbeenstartedyet. Itstartsassoonasthenodewith(@createInstance="yes")hasbeenexecuted. @varboolean public$started; AppendiksB 131
@varboolean private$suspended=false; Indicateswhethertheworkflowhasfinishedornot. @varboolean private$finished=false; Holdsthecurrentpositioninthedom,sothatwheninitanewiterator, westartfromthisposition. @varint private$dombookmark; Holdsallvariableswithintheglobalscope. array("varname"=>bpelvariable) @vararray public$globalvariables=array(); Indicatesifanewinstanceofthedefinitionfileshall becreated. @varboolean private$createinstance; @paramstring$definitionfile theabsolutepaththedefinitionfiletobe loaded. publicfunction construct($bpeldefinitionfile,$createinstance){ $this >definitionfile=$bpeldefinitionfile; $this >createinstance=$createinstance; $this >setupdomdocument(); $this >started=$this >definitionstorage >isstarted(); Calledwhentheexecutionisunserializedagain,beforecontinuing theworkflowexecution. publicfunction wakeup(){ $this >setupdomdocument(); SetsuptheBpeldefinitionstoragetooperateon. AlsosetsupXPathanddomnodelistiterator. @paramstring$definitionfile privatefunctionsetupdomdocument(){ AppendiksB 132
$this >definitionstorage=newbpelwfdefinitionstorage($this >definitionfile, $this >createinstance); $this >bpeldomdocument=$this >definitionstorage >loadbyname(); $this >createinstance=false; $this >definitionfile=$this >definitionstorage >getdefinitionfile(); $this >definitionname=$this >definitionstorage >getdefinitionname(); $this >setupxpath(); $this >setupdomiterator(); $this >findglobalbpelvariables(); SetuptheDOMXPathobjecttousefromtheloadedDOMDocument. privatefunctionsetupxpath(){ $this >xpath=newdomxpath($this >bpeldomdocument); //RegisterthedefaultnamespaceforexecutableBPELprocessinstances. $this >xpath >registernamespace("bpel", 'http://docs.oasis open.org/wsbpel/2.0/process/executable'); InstantiatesanewDOMIteratorforthecurrentDOMDocument.Willbecalledevery timeanodeiremovedfromthedomdocument. privatefunctionsetupdomiterator(){ $nodelist=$this >xpath >query('//bpel:*'); $this >domiterator=newbpeldomnodelistiterator($nodelist,$this >dombookmark); then Themainexecutionloopintheworkflowengine. IttraversestheDOMDocumentrepresentationofthe.bpelfilecurrentbeing processed. AllchildnodeswillbeparsedintoanobjectfromthewfProcessComponentand executed. publicfunctionexecuteworkflow(){ //Mainloop do{ $currentactivity=bpelwfutils::parsedomnodetobpelwfnode( $this >domiterator >current()); //Onlyparsednodes(supportednodesrightnow)willbeexecuted. if(!is_null($currentactivity)){ $currentactivity >execute($this); if(!$this >started){ $this >started=true; AppendiksB 133
if($this >dombookmark==0){ $this >domiterator >next(); while(!$this >suspended&&$this >domiterator >valid()); if(!$this >suspended){ print"workflowsuccesfullycompleted."; Suspendstheworkflowuntilitisresumedagain. publicfunctionsuspend(){ $this >suspended=true; $_SESSION['execution']=serialize($this); Resumesthesuspendedworkflow. publicfunctionresume(){ $this >suspended=false; $this >executeworkflow(); UseXPathtofindallglobalvariablesintheprocessdefinitionfile. (Selectall<variable>elementsthatchildrenofthe<process>element.) Storesanyvariablesfoundonsession. privatefunctionfindglobalbpelvariables(){ $globalvars=$this >xpath >query('//bpel:variable[@shared="yes"]'); foreach($globalvarsas$var){ $variablename=$var >getattribute('name'); $variablevalue=$var >nodevalue; $variableshare=$var >getattribute('shared'); $this >globalvariables[$variablename]=new BpelVariable($variableName, $variablevalue, $variableshare); $_SESSION[$this >definitionname]['variables']=serialize($this >globalvariables); Justawrapper @seebpelwfdefinitionstorage >savenewversion publicfunctionsavenewdefinitionversion(){ $this >bpeldomdocument=$this >definitionstorage >savenewversion( AppendiksB 134
$this >bpeldomdocument); $this >setupdomdocument(); RemovesthecurrentnodeinspecifiedDOMNodeListIteratorand savesanewversionofthedefinitionfile. publicfunctionremovenode($node){ $this >domiterator >removenode($node); $this >savenewdefinitionversion(); Replaceagivennodeandsaveanewdefinitionfile. @paramdomnode$oldnode @paramdomnode$newnode @seebpeldomnodelistiterator::replacenode publicfunctionreplacenode($oldnode,$newnode){ $this >domiterator >replacenode($oldnode,$newnode); $this >savenewdefinitionversion(); Appendsthecurrentnodetothespecifiedparentnode. @paramdomnode$parent @paramdomnode$node publicfunctionappendnode($node,$parent){ $this >domiterator >appendnode($node,$parent); $this >savenewdefinitionversion(); Addsabookmarktotheiterator.Theiteratorwillstartfromthis indexnextinitialised. @paramint$domindex publicfunctionadddombookmark($domindex){ $this >dombookmark=$domindex; Removesthebookmarkcurrentlyset. publicfunctioncleardombookmark(){ $this >dombookmark=0; GETTER(suspended) @returntrueifsuspended. publicfunctionissuspended(){ return$this >suspended; AppendiksB 135
GETTERforDOMDocument @returndomdocument publicfunctiongetdomdocument(){ return$this >bpeldomdocument; Getsthenameofthedefinitionfilebeingprocessed. @returnstring publicfunctiongetdefinitionname(){ return$this >definitionname; PrintsoutthecurrentDOMDocumentrepresentationtothescreen. publicfunctiontostringdomdocument(){ $this >bpeldomdocument >formatoutput=true; var_dump($this >bpeldomdocument >savexml());?> B.2.2exceptions AppendiksB 136
BpelWfException.php <?php PHPversions5.2.6 @categoryworkflowexception @packageexceptions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann GeneralexceptionfortheBPELworkflowcomponent abstractclassbpelwfexceptionextendsexception{?> BpelWfDefinitionStorageException.php <?php PHPversions5.2.6 @categoryworkflowexception @packageexceptions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisexceptionwillbethrownwhenanerroroccursduring loadingorsavingabpeldefinitionorwhenanerroroccursinconditionsets. classbpelwfdefinitionstorageexceptionextendsbpelwfexception{?> BpelWfActivityNodeNotRemoveFromDOM.php <?php PHPversions5.2.6 @categoryworkflowexception @packageexceptions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisexceptionwillbethrownifitfailstoremoveaactivity(DOMNode)from thedomdocument. AppendiksB 137
classbpelwfactivitynodenotremovefromdomextendsbpelwfexception{?> BpelWfExplicitTerminationException.php <?php PHPversions5.2.6 @categoryworkflowexception @packageexceptions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisexceptionwillbethrownwhentheworkflowinstanceisendedwiththe<exit> activity. classbpelwfexplicitterminationexceptionextendsbpelwfexception{?> BpelWfInternalFaultException.php <?php PHPversions5.2.6 @categoryworkflowexception @packageexceptions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisexceptionwillbethrownwhentheworkflowinstancegetsaninternalfault. classbpelwfinternalfaultexceptionextendsbpelwfexception{?> BpelWfInvalidXPathExpressionException.php <?php PHPversions5.2.6 @categoryworkflowexception AppendiksB 138
@packageexceptions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann ThisexceptionwillbethrownwhenXPathexpressionisinvalid. classbpelwfinvalidxpathexpressionexceptionextendsbpelwfexception{?> BpelWfNodeNotAppendedToDOM.php <?php PHPversions5.2.6 @categoryworkflowexceptions @packageexceptions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann ThisexceptionwillbethrownifitfailstoappendanewnodetotheDOMDocument. classbpelwfnodenotappendedtodomextendsbpelwfexception{?> BpelWfNodeNotReplacedInDOM.php <?php PHPversions5.2.6 @categoryworkflowexceptions @packageexceptions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisexceptionwillbethrownifitfailstoreplaceagivennodewithanewnodein the DOM. classbpelwfnodenotreplacedindomextendsbpelwfexception{?> AppendiksB 139
BpelWfVariableNotFoundException.php <?php PHPversions5.2.6 @categoryworkflowactivity @packageexceptions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisclassrepresentsanexceptionthatwillbethrownwhenevertheenginesearchfor a BPELvariable intheprocesdefinitionfileandnotfindit. classbpelwfvariablenotfoundexceptionextendsbpelwfexception{?> BpelWfUrlNotFoundException.php <?php PHPversions5.2.6 @categoryworkflowexception @packageexceptions @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisexceptionwillbethrownwhenanerroroccurstryingtoredirecttoagivenurl. classbpelwfurlnotfoundexceptionextendsbpelwfexception{?> AppendiksB 140
B.3ParsingAPI BpelWfUtils.php <?php PHPversions5.2.6 @categoryworkflowutilities @packagedefault @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann @examplebpelwfutils.php BPELworkflowutilitymethods. abstractclassbpelwfutils { ParsesaDOMNodeobjectintotoaBPELworkflownode. TheparsingisbasedontheDOMNode's(namespacePrefix:)tagName. @paramdomelement$domnode @paramboolean$startnode @returnactivity$activity publicstaticfunctionparsedomnodetobpelwfnode($domnode,$startnode=false){ $activity=null; $namespaceprefix=strlen($domnode >prefix)>0? sprintf("%s:",$domnode >prefix):""; AppendiksB switch($domnode >nodename){ case$namespaceprefix.'sequence': $activity=newbpelsequenceactivity( 141
$domnode >attributes >getnameditem("name") >nodevalue, $namespaceprefix,$domnode); break; case$namespaceprefix.'empty':$activity=new BpelEmptyActivity($domNode); break; case$namespaceprefix.'if':$activity=newbpelifactivity( $domnode >attributes >getnameditem("name") >nodevalue, $namespaceprefix,$domnode); break; case$namespaceprefix.'onchange':$activity=newonchangeactivity( $domnode >attributes >getnameditem("name") >nodevalue, $domnode >attributes >getnameditem("variable") >nodevalue, namespaceprefix,$domnode, $domnode >attributes >getnameditem("createinstance") >nodevalue); break; case$namespaceprefix.'throw':$activity=newbpelthrowactivity( $domnode >attributes >getnameditem("faultname") >nodevalue, $domnode >attributes >getnameditem("faultvariable") >nodevalue, $namespaceprefix,$domnode); break; case$namespaceprefix.'exit':$activity=newbpelexitactivity( $domnode >attributes >getnameditem("name") >nodevalue, $namespaceprefix,$domnode); break; case$namespaceprefix.'while':$activity=newbpelwhileactivity( $domnode >attributes >getnameditem("name") >nodevalue, $namespaceprefix,$domnode); break; case$namespaceprefix.'humanform':$activity=newhumanformactivity( $domnode >attributes >getnameditem("name") >nodevalue, $namespaceprefix,$domnode, $domnode >attributes >getnameditem("inputvariable") >nodevalue); break; case$namespaceprefix.'wait':$activity=newbpelwaitactivity( $domnode >attributes >getnameditem("name") >nodevalue, $namespaceprefix,$domnode); break; case$namespaceprefix.'assign':$activity=newbpelassignactivity( $domnode >attributes >getnameditem("name") >nodevalue, $namespaceprefix,$domnode); break; case$namespaceprefix.'invoke':$activity=newbpelinvokeactivity( $domnode >attributes >getnameditem("name") >nodevalue, $namespaceprefix,$domnode, $domnode >attributes >getnameditem("url") >nodevalue); break; default:$activity=null; break; return$activity; Splitsthe$filePathintothreechunksandreturnsthemasanarraylikethis: AppendiksB 142
array("dirname"=>string,"filename"=>string,"currentversion"=>boolean); @paramstring$filepath @returnarray publicstaticfunctionsplitdefinitionfilepath($filepath){ $splitpositiondirfile=strrchr($filepath,'/'); $currentversion=preg_match("^._[0 9]+[.bpel]$",$filePath)===false? true:false; returnarray( "dirname"=>substr($filepath,0,$splitpositiondirfile), "filename"=>substr($filepath,$splitpositiondirfile+1), "currentversion"=>$currentversion ); Searchesforagivenvariablewithinthecurrentprocessdefinition. @paramdomxpath$xpathobj @paramstring$variablename @returnmixed(bpelvariableornullifnotfound). publicstaticfunctionparsedomvariabletobpelvariable($xpathobj,$variablename){ $variablenodelist=$xpathobj >query('//bpel:variable[@name="'. $variablename.'"]'); $bpelvariable=null; if($variablenodelist >length==1){ $bpelvariable=newbpelvariable($variablename, $variablenodelist >item(0) >nodevalue, $variablenodelist >item(0) >getattribute('shared')); } return$bpelvariable;?> IDOMExporter.php <?php PHPversions5.2.6 @categoryworkflowactivity @packagedefault @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann ThisinterfacerepresentsallcommonmethodsforexportingBpelActivityobjectto adomelement. interfaceidomexporter { ExportsthecurrentobjectasanDOMElement. AppendiksB 143
?> @paramdomdocument$domdocument publicfunctionexportasdomelement($domdocument); AppendiksB 144
B.4validationAPI XpathValidator.php <?php PHPversions5.2.6 @categoryworkflowvalidators @packagevalidators @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann ThisclassconsistsofstaticfunctionstovalidateXPathexpressionstowardsthe workflowengine. classxpathvalidator { Itonlyconsistsofstaticfunction,sowedon'tneed toinitializenewinstancesofthisclass. privatefunction construct(){ Validatesaxpahexpressionsandhandlesitasvalidifit doesn'treturnabooleanfalse. @parammixed$expr @returnbooleantrueifvalid. @throwsbpelwfinvalidxpathexpressionexception staticfunctionvalidatexpathexpression($xpath,$expr){ if($xpath >query($expr)===false){ thrownewbpelwfinvalidxpathexpressionexception( sprintf("invalidxpathbooleanexpression:%s",$expr)); returntrue;?> AppendiksB 145
B.5PersistenceAPI BpelWfDefinitionStorage.php <?php PHPversions5.2.6 @categoryworkflowdefinitionstorage @packagexml @authordanielk.theemann<daniel@theemann.dk> @licensehttp://www.opensource.org/licenses/mit license.phpmitlicence @copyrightcopyright 2008,DanielK.Theemann Thisclasshandlesloadingandsavingadefinitionfile.Itdoesalltheversioning ofthedefinitionfiles. Italsohandlescreatingnewinstancesofthesamedefinitionfilebyplacingaunix timestamp attheendofthefilename(likenewemployee_1215336827.bpel) classbpelwfdefinitionstorage { Thedirectorythatholdsthe.bpelfiles. @varstring AppendiksB 146