<?xml version="1.0" encoding="iso-8859-1"?>
<spooler>
  <config>

    <web_services>
        <web_service debug="no"
                     name="hello"
                     url_path="/hello"
                     request_xslt_stylesheet="config/scheduler_soap_request.xslt"
                     response_xslt_stylesheet="config/scheduler_soap_response.xslt">
            <params>
                <param name="jobchain"
                       value="hello"/>
            </params>
        </web_service>

        <web_service debug="no"
                     job_chain="hello_service"
                     name="hello_service"
                     url_path="/hello_service"/>
    </web_services>


    <jobs>

      <!-- This job simply says "hello world" -->
      <job name  = "sample_hello_world"
           title = "process orders from a Web Service to say: hello world"
           order = "yes">

          <description>
            <include file = "jobs/JobSampleWebServiceHelloWorld.xml"/>
          </description>

          <script language = "JavaScript">
              <![CDATA[
function spooler_process() {              
  try {
    var order = spooler_task.order;
    if (order.payload != null && order.payload.value("hello") != null) {
      // either we could address parameters from the order's payload
      spooler_log.info("hello " + order.payload.value("hello"));
    } else {
      // .. or we process the content of the order's xml payload and use a Java helper class for XPath expressions
      spooler_log.debug3("content of xml payload: " + order.xml_payload);
      var xpath = new sos.xml.SOSXMLXPath(new java.lang.StringBuffer(order.xml_payload));
      spooler_log.info("hello " + String(xpath.selectSingleNodeValue("//hellos/hello")));
    }
    return true;
  } catch (e) {
    spooler_log.warn(String(e));
    return false;
  }
}
              ]]>
          </script>
      </job>


      <!-- This job is started to process a synchronous web service request -->
      <job name  = "sample_hello_request"
           title = "Process synchronous Web Service Request"
           order = "yes"
           idle_timeout="300">

          <description>
              <include file="jobs/JobSampleWebServiceRequestHelloWorld.xml"/>
          </description>

          <params>
              <param name="request_stylesheet"
                     value="config/scheduler_soap_request.xslt"/>
          </params>
          <script language="javascript">
              <![CDATA[
function spooler_process() {

  try {
    var order = spooler_task.order;
    var operation;
    var request;

    try { // to retrieve the web service operation
      operation = order.web_service_operation;
    } catch (e) {
      spooler_log.warn("error occurred processing web service operation: " + String(e));
      throw String(e);
    }

    try { // to retrieve the web service request
      request = operation.request;
      spooler_log.debug1("content of web service request:\n" + request.string_content);

      // should the request be previously transformed ...
      // var stylesheet = spooler.create_xslt_stylesheet();
      // stylesheet.load_file(spooler_task.params.value("request_stylesheet"));
      // var xml_document = String(stylesheet.apply_xml(request.string_content));
      // spooler_log.debug1("content of request transformation:\n" + xml_document);
    
      // Javascript has no XML support, so we use a helper class for XPath expressions
      var xpath = new sos.xml.SOSXMLXPath(new java.lang.StringBuffer(request.string_content));

      // add order parameters from request
      var params = spooler.create_variable_set();
      params.set_var("hello",   String(xpath.selectSingleNodeValue("//hellos/hello")));
      order.payload = params;

      // altenatively add the (possibly transformed) request to the xml payload of this order
      // spooler_log.debug1("content of xml order payload:\n" + String(xpath.selectDocumentText("//xml_payload/*")));
      // order.xml_payload = String(xpath.selectDocumentText("//xml_payload/*"));
 
      spooler_log.info("web service request accepted from order \"" + order.id() + "\" " + 
                       "for hello \"" + params.value("hello") + "\"");
    } catch (e) {
      spooler_log.warn("error occurred processing web service request: " + String(e));
      throw String(e);
    }

    return true; 
  } catch (e) {
    spooler_log.warn(String(e));
    return false;
  }

}
              ]]>
          </script>
      </job>


      <job name="sample_hello_response"
           title="Process synchronous Web Service Response"
           order="yes"
           idle_timeout="300">

          <description>
              <include file="jobs/JobSampleWebServiceResponseHelloWorld.xml"/>
          </description>

          <params>
              <param name="response_stylesheet" value="config/scheduler_soap_response.xslt"/>
          </params>
          
          <script language="javascript">
              <![CDATA[
function spooler_process() {

  try {
    var order = spooler_task.order;
    var operation;

    try {
      operation = order.web_service_operation;
    } catch (e) {
      spooler_log.warn("error occurred processing web service operation: " + String(e));
      throw String(e);
    }

    try {
      var request  = operation.request;
      var response = operation.response;

      // either send the response without soap headers
      // response.string_content = spooler_task.order.xml_payload;

      // .. or transform the response from order parameters and payload
      var stylesheet = spooler.create_xslt_stylesheet();
      stylesheet.load_file(spooler_task.params.value("response_stylesheet"));
      var xml_document = stylesheet.apply_xml(order.xml);
      spooler_log.debug1("content of response transformation:\n" + xml_document);
      response.string_content = xml_document;

      response.send();
      spooler_log.info("web service response successfully processed from order \"" + order.id() + "\" " + 
                       "for hello \"" + order.payload.value("hello") + "\"");
    } catch (e) {
      spooler_log.warn("error occurred processing web service response: " + String(e));
      throw String(e);
    }

    return true;
  } catch (e) {
    spooler_log.warn(String(e));
    return false;
  }

}
                  ]]>
              </script>
          </job>

    </jobs>

    <job_chains>
        <job_chain name="hello"
                   orders_recoverable="yes"
                   visible="yes">
            <job_chain_node state="in"
                            job="sample_hello_world"
                            next_state="out"
                            error_state="error"/>
            <job_chain_node state="out"/>
            <job_chain_node state="error"/>
        </job_chain>

        <job_chain name="hello_service"
                   orders_recoverable="yes"
                   visible="yes">
            <job_chain_node state="request"
                            job="sample_hello_request"
                            next_state="in"
                            error_state="error"/>
            <job_chain_node state="in"
                            job="sample_hello_world"
                            next_state="response"
                            error_state="error"/>
            <job_chain_node state="response"
                            next_state="out"
                            job="sample_hello_response"/>
            <job_chain_node state="out"/>
            <job_chain_node state="error"/>
        </job_chain>
    </job_chains>

  </config>
</spooler>