Letvægts PHP engine for BPEL baseret på XML omskrivning

Relaterede dokumenter
Chapter 17 - Web Service Composition

PHP Crash course. Databaser

Nintex Workflow UK/DK

Design Diaries.

A Declarative Framework for Enterprise Information Systems

Component based software enginering Diku 2005 Kritikopgave

Indholdsfortegnelse If-sætningen... 3 Opgaver... 4 OR, AND sammen med if-sætningen... 5 Rand() funktion... 5 Opgave... 5 Include() funktionen...

"# $%$ " # $ % $ $ " & ( ) *+!,! Sum_Cost >= 5000SirName = Beltov Continue = %!- + ( ( - True) Continue *! If Antal <= 20 Then EnhedsOmk = 1.

PHP 3 UGERS FORLØB PHP, MYSQL & SQL

Lektion 3. Grundlæggende programmering i VR

Terese B. Thomsen 1.semester Formidling, projektarbejde og webdesign ITU DMD d. 02/

Dagens program. Domæner. change log- screen shots hver gang I har arbejdet med themet. Arkitekturen bag en wp blog. Hvad er widgets.

Hassansalem.dk/delpin User: admin Pass: admin BACKEND

Databaseadgang fra Java

Foto-Applikation Dokumentation. Et Kod-i-Ferien projekt

Programmering I Java/C#

Data load og udtræk. 2. iteration: implmentation (test af backend) PHP mysql. Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON

Indholdsfortegnelse Databaser og PHP... 3 Opgave... 4 Opgave... 5 Opgave... 6 Sidste opgave er en lille gæstebog... 7 Kilder og nyttige links:...

PHP guide af Daniel Pedersen

3C03 Concurrency: Model-based Design

Indholdsfortegnelse. Rasmus R. Sørensen, Christina Svenstrup og Lasse Bager 1

Øvelse Slides må ikke deles uden godkendelse fra Anne Holmbæck

Åben uddannelse, Efterår 1996, Oversættere og køretidsomgivelser

IBM Software Group. SOA v akciji. Srečko Janjić WebSphere Business Integration technical presales IBM Software Group, CEMA / SEA IBM Corporation

Navision Stat (NS 9.2)

HTML, PHP, SQL, webserver, hvad er hvad??

Reeksamen, DSDS, forår 2008

Software Construction 1 semester (SWC) Spørgsmål 1

VÆR EFFEKTIV SOM SAS PROGRAMMØR MED SAS ENTERPRISE GUIDE 7.12 GEORG MORSING

Webkorpora: Yahoo API og perl

FBS for praktikere Fyn. Notifikation og print skabeloner

Dynamiske Billeder, Image Map & XY coordinater. ASP.NET og Access Databasen.

Python programmering. Per Tøfting. MacFest

Parallelle algoritmer

CentOS 7. Lavet af Ali Sarac og Andreas Jensen

Denne artikel gennemgår kort nogle mulighederne for brug af XML i ASP. Det sker ved brug af eksempler. Eksemplerne vil være i VBS.

Dokumentering af umbraco artikeleksport:

XML webservice for pensionsordninger. Version 1.0 Draft A

Start på javascript. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 03. Feb 2009 af webstuff I kategorien Programmering / JavaScript

Programmering i C. Lektion september 2009

software bricks & glue for system integration

Undervisningsbeskrivelse

IDENTIFON. Emil Hauberg, Jakob Christoffersen, Ninette Nielsen og Senia Lundberg

WS-Architecture, forretningsprocesser og sikkerhed

Undervisningsbeskrivelse

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

I mit script tager jeg højde for det problem ved, at gemme et unikt tal mellem 0-9 på 6 cifre og derved vil de så blive vist som 2 online.

Installationsvejledning SAS Foundation 9.2 SAS Enterprise Guide 4.2. Windows Vista

Portal Registration. Check Junk Mail for activation . 1 Click the hyperlink to take you back to the portal to confirm your registration

Eksamen, DSDS, efterår 2007

SYSTEMDOKUMENTATION AF POC

Modern Concurrency Abstractions for C#

Opgaven fortsat. Opfølgning på Opgave 2 og Use Cases. Opgaven. Trin 1: Væsentlige begreber. Resultatliste: 100 bryst, herrer

Undervisningsbeskrivelse

! "# $$ &'()*"* +*, & &"*0* & "# % %- %

Eksamens spørgsmål Software Construction. Objekter. Spørgsmål 1: Januar Giv en beskrivelse af Objekt-begrebet og deres brug

KIS Kvalitet I Skolerne

Emner. Baggrund Flash s historie, udbredelse, scene og anvendelse.

IBM WebSphere Operational Decision Management

Bilag 3 - Designspecifikation Bistand til administration og udvikling af Dynamisk Database. November 2018

Kontrol-strukturer i PHP

Værktøjer fra værktøjskassen. Søren Breddam, Stevns Kommune

Dokumentation. Karen-Louise Fejerskov

Loginsystem (med MySQL)

Klik på linket her for en beskrivelse af hvordan du installerer CIP 4.3 opdateringen.

KIH Database. Systemdokumentation for KIH Databasen. 1. maj Side 1 af 13

Ordbøgerne.dk. Navne: Andreas Foldager og Rasmus Bjerring Pedersen Fag: IT B Lærer: Karl Bjarnason Afleveringsdato:

Tredjepart webservices

Undervisningsbeskrivelse

Curriculum Vitae for Søren Brønsted

Eksamen, DSDS, efterår 2008

De 10 JavaScript eksamensspørgsmål

Parallelisering/Distribuering af Genetiske Algoritmer

I denne arktikle går jeg gennem Slet, Ret og Opret data i en MySQL database. der er også en lille del i den hvor den postere datanen ud i en løkke

Eksempel: et ordresystem note 5 Lagdeling s. 1

Referencemodeller for løsninger i Statens It s standarddriftsplatform. Aftalekompleksets bilag 11 Statens It s standarddriftsplatform Underbilag A

I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen.

Indhold. Senest opdateret : 30. juli Side 1 af 5

Resultmaker Online Consultant

Netværksværktøj til BUPL s medlemmer. Mikkel Flindt Heisterberg, IntraVision Brian Andersen, BUPL

LØKKER METODER C S HISTORIE. Grundlæggende programmering Lektion 4

Begrynder til at lave log ind system

Sporbarhed og Rapportering i Quality Center. Kim Stenbo Nielsen NNIT Application Management Services

Projekt 3: Interaktionsudvikling 11/04.14

DTU Net Teknologi A Webprogrammering og Datakommunikation Eksamensprojekt Krav til rapport September 2008 KRAV TIL RAPPORTEN

VANSEnvelope TESTPROTOKOL FOR DEN GODE VANSENVELOPE. Namespace: urn:oio:medcom:vans-envelope: VANS

Google Maps og SAS/GRAPH software

Miniprojekt2011. Formålet er at lære og indlære god objektorienteret programudvikling og programmering med Java, samt undervejs at opfylde studiekrav.

MSI pakke til distribution af AutoPilot komponenter.

Eksamen, DSDS, forår 2008

1.1 Formål Webservicen gør det muligt for eksterne parter, at fremsøge informationer om elevers fravær.

TCP & UDP. - de transportansvarlige på lag 4. Netteknik 1

PHP Snippets. De små korte. Skrevet af Daniel Pedersen

Da beskrivelserne i danzig Profile Specification ikke er fuldt færdige, foreslås:

Indhold. Senest opdateret:03. september Side 1 af 8

Programmering i C. Kursusintroduktion. Lektion september Målgruppe 2 Indhold 3 Form 4 Materiale. Målgruppe Indhold Form Materiale

IBM WebSphere Operational Decision Management

KFileReplace-håndbogen. Emiliano Gulmini Oversætter: Rune Rønde Laursen

Byggebasen Javascript

Undervisningsbeskrivelse

Transkript:

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