<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "stax.dtd">
<stax>
    <defaultcall function="startHere"/>

    <script>
        from com.ibm.staf import *
        STAXMessageLog = 1
        STAXLogMessage = 1

        # Set to the directory that contains PyInt.py
        pythonTestDir = 'C:/workspaces/test-workspace-xml/testProject1/src/TestSuite1'

        # Set to the machine where you want to run PyInt.py
        machine = 'local'
    </script>

    <function name="startHere">
        <function-map-args>
          <function-optional-arg name="machine" default="'local'">
            Set to the machine where you're running PyInt.py
          </function-optional-arg>
          <function-optional-arg name="pythonTestDir" default="'C:/dev/src/stax'">
            Set to the directory that contains PyInt.py
          </function-optional-arg>
        </function-map-args>

        <sequence>

            <script>
              # Create a STAF handle so that can receive messages on its queue
              jobHandle = STAFHandle('MyApplication')
              jobHandleNum = jobHandle.handle
            </script>

            <log>
              'STAX Job will receive messages using handle %s\'s queue' % \
              (jobHandleNum)
            </log>

            <script>
              pythonFile = '%s/PyInt.py' % (pythonTestDir)
            </script>

            <process name="'PyInt'">
                <location>machine</location>
                <command>'python %s' % (pythonFile)</command>
                <var>'MyTest/STAXJobHandleNumber=%s' % (jobHandleNum)</var>
                <var>'MyTest/STAXJobID=%s' % (STAXJobID)</var>
                <var>'MyTest/STAXMachine=%s' % (STAXServiceMachine)</var>
                <var>'MyTest/STAXService=%s' % (STAXServiceName)</var>
                <stderr mode="'stdout'"/>          
                <returnstdout/>
                <process-action>
                    <call function="'ProcessInteraction'"/>    
                </process-action>
            </process>
            
            <if expr="RC != 0">
                <sequence>
                    <log>
                      'Python process failed.  RC=%s, STAFResult=%s, STAXResult=\n%s' % \
                      (RC, STAFResult, STAXResult)
                    </log>
                    <return>'Failed'</return>
                </sequence>
            </if>

            <log>'Python Process Stdout:\n%s' % (STAXResult[0][1])</log>

            <script>
              # Unregister the STAF handle
              jobHandle.unRegister()
            </script>

            <log>'Job Complete'</log>
                        
        </sequence>
    </function>

    <function name="ProcessInteraction" scope="local">
        <sequence>

            <log>
              'The PyInt process is using handle %s on machine %s' % \
              (STAXProcessHandle, machine)
            </log>

            <!-- Delay while the Python process sets up to listen on its queue -->
            <stafcmd name="'Delay 2 seconds'">
                <location>'local'</location>
                <service>'DELAY'</service>
                <request>'DELAY 2s'</request>
            </stafcmd>

            <!-- Send message "WAIT" to the Python program's queue -->
            <call function="'SendMessage'">'WAIT'</call>
  
            <!-- Get message "OK" on my queue -->
            <if expr="STAXResult == 0">
              <call function="'ReceiveMessage'">'OK'</call>
              <elseif expr="STAXResult == STAFRC.HandleDoesNotExist">
                 <return>'Fail'</return>
              </elseif>
            </if>

            <!-- Send message "CLEAN-UP" to the Python program's queue -->
            <call function="'SendMessage'">'CLEAN-UP'</call>

            <!-- Get message "Clean-up Done" on my queue -->
            <if expr="STAXResult == 0">
              <call function="'ReceiveMessage'">'Clean-up Done'</call>         
            </if>

            <return>'Success'</return>

        </sequence>
    </function>

    <function name="SendMessage" scope="local">

        <function-single-arg>
            <function-required-arg name="message"/>
        </function-single-arg>

        <sequence>
            
            <script>
              request = 'QUEUE HANDLE %s MESSAGE "%s"' % (STAXProcessHandle, message)
            </script>

            <log>
              'Sending message "%s" to PyInt' % (message)
            </log>

            <stafcmd name="'Send message to PyInt'">
                <location>machine</location>
                <service>'QUEUE'</service>
                <request>request</request>
            </stafcmd>
            
            <if expr="RC != STAFRC.Ok">
                <sequence>
                    <log>
                      'Error: STAF %s QUEUE %s failed. RC=%s, STAFResult=%s' % \
                      (machine, request, RC, STAFResult)
                    </log>
                    <return>RC</return>
                </sequence>
            </if>

            <return>0</return>
 
        </sequence>
    </function>

    <function name="ReceiveMessage" scope="local">
 
        <function-single-arg>
            <function-required-arg name="expectedMessage"/>
        </function-single-arg>
 
        <sequence>

            <script>
              request = 'GET WAIT 10s'
            </script>

            <log>'Waiting to receive a message'</log>

            <script>
              result = jobHandle.submit2('local', 'QUEUE', request)
            </script>
            
            <if expr="result.rc != STAFRC.Ok">
                <sequence>
                    <log>
                      'Error: STAF local QUEUE %s failed. RC=%s, STAFResult=%s' % \
                      (request, result.rc, result.result)
                    </log>
                    <return>RC</return>               
                </sequence>
            </if>

            <script>
              queueMsgMap = result.resultObj
            </script>

            <log>
              'Received message "%s"' % (queueMsgMap['message'])
            </log>

            <if expr="queueMsgMap['message'] != expectedMessage">
                <log>'Error: Expected message "%s"' % (expectedMessage)</log>
            </if>          

            <return>0</return>

        </sequence>
    </function>

</stax>