<process name="TestP" 
         targetNamespace="http://acme.com/loanprocessing"
         suppressJoinFailure="yes"
         xmlns="http://schemas.xmlsoap.org/ws/2002/07/business-process/"
         xmlns:lns="http://loans.org/wsdl/loan-approval"
         xmlns:tns="urn:berechnung" 
         xmlns:multipliziererNS="http://tempuri.org/services/loanassessor"
         xmlns:addiererNS="http://tempuri.org/services/loanapprover">

  <partners>
    <partner name="caller" serviceLinkType="tns:berechnungSLT"/>
    <partner name="meinAddierer" serviceLinkType="tns:berechnungSLT"/>
    <partner name="meinMultiplizierer" serviceLinkType="tns:berechnungSLT"/>
  </partners>

  <variables>
    <variable name="request" messageType="tns:berechnungRequest"/>
    <variable name="ersteSummanden" messageType="tns:addiererOderMultipliziererRequest"/>
    <variable name="zweiteSummanden" messageType="tns:addiererOderMultipliziererRequest"/>
    <variable name="dieMultiplikatoren"
        messageType="tns:addiererOderMultipliziererRequest"/>
    <variable name="response" messageType="tns:berechnungsResponse"/>
    <variable name="erstesErgebnis" messageType="addiererNS:addiereResponse"/>
    <variable name="zweitesErgebnis" messageType="addiererNS:addiereResponse"/>
  </variables>

  <sequence name="BerechnungSequence">
    <receive name="BerechnungReceive"
              partner="caller" portType="tns:BerechnungPT" operation="berechne"
             variable="request" createInstance="yes">
    </receive>

    <assign>
        <copy>
            <from variable="request" part="a"/>
            <to variable="ersteSummanden" part="a"/>
        </copy>
        <copy>
            <from variable="request" part="b"/>
            <to variable="ersteSummanden" part="b"/>
        </copy>
        <copy>
            <from variable="request" part="c"/>
            <to variable="zweiteSummanden" part="a"/>
        </copy>
        <copy>
            <from variable="request" part="d"/>
            <to variable="zweiteSummanden" part="b"/>
        </copy>
    </assign>

<!-- Anmerkung: <assign> kann natürlich arithmetische Operationen von sich aus... -->

    <flow>
<!-- zum Testen der Parallelität auskommentieren
        <sequence name="seq1">
-->
            <invoke name="ErsterBerechnungsSchritt"
                    partner="meinAddierer" portType="addiererNS:MeinWebServiceAddierer"
                    operation="addiere"
                    inputVariable="ersteSummanden" outputVariable="erstesErgebnis">
            </invoke>
<!-- zum Testen der Parallelität auskommentieren
            <wait for="'PT10S'"/>
        </sequence>
        <sequence name="seq2">
-->
            <invoke name="ZweiterBerechnungsSchritt"
                    partner="meinAddierer" portType="addiererNS:MeinWebServiceAddierer"
                    operation="addiere"
                    inputVariable="zweiteSummanden" outputVariable="zweitesErgebnis">
            </invoke>
<!-- zum Testen der Parallelität auskommentieren
            <wait for="'PT5S'"/>
        </sequence>
-->
    </flow>

    <assign>
        <copy>
            <from variable="erstesErgebnis" part="addiereReturn"/>
            <to variable="dieMultiplikatoren" part="a"/>
        </copy>
        <copy>
            <from variable="zweitesErgebnis" part="addiereReturn"/>
            <to variable="dieMultiplikatoren" part="b"/>
        </copy>
    </assign>

    <invoke name="DieMultiplikation"
            partner="meinMultiplizierer" portType="multipliziererNS:MeinWebServiceMultiplizierer"
            operation="multipliziere"
            inputVariable="dieMultiplikatoren" outputVariable="response">
<!-- response ist das Endergebnis! -->
    </invoke>
    <reply name="BerechnungReply"
           partner="caller" portType="tns:BerechnungPT" operation="berechne"
           variable="response">
    </reply>
  </sequence>

</process>
