Create the bank transfer request message flow

Use the following instructions to create the bank transfer request message flow.

  1. Create a new message flow:
    1. Right-click the existing Message Broker project, SCANodesSample, click New > Message Flow.
    2. Set Message Flow Name to BankTransferRequest, click Finish.
  2. In the Message Flow editor add and rename the nodes listed in the following table.

    Node type Node name
    HTTPInput HTTP Input
    JavaCompute SetupTransferRequest
    SCAAsyncRequest SCA Asynchronous Request
    SCAAsyncResponse SCA Asynchronous Response
    JavaCompute SetupTransferReply
    JavaCompute SetupTransferFailedReply
    HTTPReply HTTP Reply

  3. Connect the nodes as described in the following table.

    Node name Terminal Connect to this node
    HTTP Input Out SetupTransferRequest
    SetupTransferRequest Failure SetupTransferFailedReply
    SetupTransferFailedReply Out HTTP Reply
    SetupTransferRequest Out SCA Asynchronous Request
    SCA Asynchronous Response Out SetupTransferReply
    SetupTransferReply Out HTTP Reply
  4. Customize the HTTP Input node:
    1. Right-click the HTTP Input node, click Properties.
    2. Click Basic, set Path suffix for URL to /TransferRequestSample
    3. Click Input Message Parsing. For the Message domain property, select MIME from the list.
  5. Customize the SetupTransferRequest node:
    1. Double-click the SetupTransferRequest node, ensure that Project name is SCANodesSampleJava, click Next.
    2. Ensure that Source folders on build path and Default output folder contain SCANodesSampleJava, click Next.
    3. Set Package to sca.broker.sample.banktransfer, click Next.
    4. Select the Creating message class template, click Finish.
    5. Right-click the SetupTransferRequest node, click Open Java.
    6. Add the following import statement:
      import java.math.BigDecimal;
      		
    7. Add the following Java code:
      //Get the incoming MIME parts
      MbElement inRoot = inMessage.getRootElement();
      MbElement inMime = inRoot.getFirstElementByPath("MIME");
      MbElement inParts = inMime.getFirstElementByPath("Parts");
      //Traverse the local environment for property overrides
      MbElement outRoot = outMessage.getRootElement();			
      MbMessage locEnv = inAssembly.getLocalEnvironment();
      MbMessage newLocEnv = new MbMessage(locEnv);
      MbElement destination = newLocEnv.getRootElement()
      .getFirstElementByPath("Destination");
      MbElement http = destination.getFirstElementByPath("HTTP");
      MbElement requestIdentifier = http.getFirstElementByPath
      ("RequestIdentifier");
      MbElement soap = destination.createElementAsLastChild
      (MbElement.TYPE_NAME, "SCA", null);
      MbElement request = soap.createElementAsLastChild
      (MbElement.TYPE_NAME, "Request", null);
      request.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
      "UserContext", requestIdentifier.getValue());
              
      //Operation
      String operation = null;
      //Transfer amount
      String amount = null;
      //Get the first part
      MbElement part = inParts.getFirstChild();			
      //Iterate through all of the parts dynamically setting SCA overrides
      while (part != null) {
        //Strip out the property 
        String content = (String)part.getFirstChild().getValue();
        int start = content.indexOf("\"") + 1;
        int end = content.indexOf("\"", start);
        String property = content.substring(start, end);
        //Get the corresponding property data
        MbElement data = part.getLastChild().getFirstElementByPath("BLOB");
        //If there is a data part then setup the relevant property overrides
        if (data != null) {
          //Obtain the byte data
          byte[] blobData = (byte[])data.getFirstElementByPath
          ("BLOB").getValue(); 
          //Convert to a string
          String dataString = new String(blobData);
          //Set LE properties
          if (property.equals("Operation")) { 
            request.createElementAsLastChild
            (MbElement.TYPE_NAME_VALUE, property, dataString);
            operation = dataString;
          } 
          else if (property.equals("Amount")) {
            amount = dataString;						
            try {
              BigDecimal bigDecimal = new BigDecimal(amount);
              if (bigDecimal.scale() > 2 || bigDecimal.scale() < 0) {
                throw new Exception ("Invalid currency format specified!");
              }
            } catch (NumberFormatException nfe) {
              throw new Exception ("Invalid amount specified!");
            }
          }
        } else {
          throw new Exception("No amount specified!");				
        }
        //Get the next part
        part = part.getNextSibling();
      }
              
      //Delete the HTTPInputHeader since we don't need this 
      in our MQ message request
      MbElement httpInputHeader = outRoot.getFirstElementByPath
      ("HTTPInputHeader");
      httpInputHeader.detach();			
      //Create the Broker XMLNSC Parser element
      MbElement outParser = outRoot.createElementAsLastChild
      (MbXMLNSC.PARSER_NAME);
      MbElement service = outParser.createElementAsLastChild
      (MbElement.TYPE_NAME, 
      operation, null);
      service.setNamespace("http://SavingsAccount/SavingsAccountInterface");
      MbElement transferin = service.createElementAsLastChild
      (MbElement.TYPE_NAME, 
      "transferin", null);
      transferin.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
      "amount", amount);			
      //Create the new assembly with the new property overrides
      MbMessageAssembly outAssembly = new MbMessageAssembly(
      					inAssembly,
      					newLocEnv,
      					inAssembly.getExceptionList(),
      					outMessage);
              
    8. Remove the following Java code because it conflicts with MbMessageAssembly that you have just created:
      MbMessageAssembly outAssembly = new MbMessageAssembly
      (inAssembly, outMessage);
         		
  6. Customize the SCA Asynchronous Request node:
    1. Drag BankTransferRequest.outsca from the BankTransferMS project onto the node. You can find BankTransferRequest.outsca in the BankTransferMS > Broker SCA Definitions > Outbound (invoke an SCA Export) folder.
    2. In the "Configure Service Invocation on WPS" window, clear the Invoke Synchronously check box, click OK.
    3. Click Basic, set Unique identifier to SCA.
  7. Customize the SCA Asynchronous Response node:
    1. Drag BankTransferRequest.outsca from the BankTransferMS project onto the node, set Unique identifier to SCA.
  8. Customize the SetupTransferReply node:
    1. Double-click the SetupTransferReply node, ensure that Project name is SCANodesSampleJava, click Next.
    2. Ensure that Source folders on build path and Default output folder contain SCANodesSampleJava, click Next.
    3. Set Package to sca.broker.sample.banktransfer, click Next.
    4. Select the Creating message class template, click Finish.
    5. Right-click the SetupTransferReply node, click Open Java.
    6. Add the following import statement:
      import java.math.BigDecimal;
      		
    7. Add the following Java code:
      //Traverse the local environment for property overrides
      MbMessage locEnv = inAssembly.getLocalEnvironment();
      MbMessage newLocEnv = new MbMessage(locEnv);
      MbElement locEnvRoot = newLocEnv.getRootElement();
      MbElement soap = locEnvRoot.getFirstElementByPath("SCA");
      MbElement response = soap.getFirstElementByPath("Response");
      MbElement userContext = response.getFirstElementByPath
      ("UserContext");
      MbElement destination = locEnvRoot.getFirstElementByPath
      ("Destination");
      MbElement http = destination.createElementAsLastChild
      (MbElement.TYPE_NAME, "HTTP", null);
      http.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
      "RequestIdentifier", userContext.getValue());
      //Obtain response message values
      MbElement inRoot = inMessage.getRootElement();			
      MbElement XMLNSC = inRoot.getFirstElementByPath("XMLNSC");
      MbElement transferResponse = XMLNSC.getLastChild();
      MbElement transferOut = transferResponse.getFirstElementByPath
      ("transferout");
      String amount = new BigDecimal(transferOut.getFirstElementByPath
      ("amount").getValue().toString())
      .setScale(2, BigDecimal.ROUND_HALF_UP).toString();
      String oldBalance = new BigDecimal(transferOut.getFirstElementByPath
      ("oldbalance").getValue().toString())
      .setScale(2, BigDecimal.ROUND_HALF_UP).toString();
      String newBalance = new BigDecimal(transferOut.getFirstElementByPath
      ("newbalance").getValue().toString())
      .setScale(2, BigDecimal.ROUND_HALF_UP).toString();
      String accept = transferOut.getFirstElementByPath
      ("accept").getValue().toString();
              
      //Construct confirmation message
      StringBuffer html = new StringBuffer();
      html.append("<HTML><HEAD>");
      html.append("<META http-equiv='Content-Type' content='text/html; 
      charset=ISO-8859-1'></HEAD>");				  
      html.append("<BODY><form action='/TransferRequestForm' 
      method=post>");
      if (accept.equals("yes")) {
      	html.append("<h1>Your transfer of " + amount +" 
      	has been successful!</h1>");
      	html.append("<h3>Your old savings balance was " 
      	+ oldBalance + "</h3>");				
      	html.append("<h3>Your new savings balance is " 
      	+ newBalance + "</h3>");				
      } else {
      	html.append("<h1><font color=\"#ff0000\">
      	Your transfer of " + amount + " has been unsuccessful 
      	due to insufficient funds!
      	</font></h1>");				
      	html.append("<h3>Your savings balance 
      	remains unchanged at " + 
      	newBalance + "</h3>");				
      }
      html.append("<tr><td><input type='submit' name='OK' 
      value='OK'></td></tr>");
      html.append("</form></BODY></HTML>");
              
      //Set the content type to be html so that 
      it may be viewed by a browser
      MbElement outRoot = outMessage.getRootElement();			
      MbElement outProperties = outRoot.getFirstElementByPath
      ("Properties");	
      MbElement contentType = outProperties.getFirstElementByPath
      ("ContentType");			
      contentType.setValue("text/html");	
      //Delete the MQMD header since we don't 
      need this in our HTTP reply
      MbElement mqmd = outRoot.getFirstElementByPath("MQMD");
      mqmd.detach();			
      //Create the Broker Blob Parser element
      MbElement outParser = outRoot.createElementAsLastChild
      (MbBLOB.PARSER_NAME);
      //Create the BLOB element in the Blob parser domain 
      with the required text
      outParser.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
      "BLOB", html.toString().getBytes());
      //Create the new assembly with the new property overrides
      MbMessageAssembly outAssembly = new MbMessageAssembly(
      					inAssembly,
      					newLocEnv,
      					inAssembly.getExceptionList(),
      					outMessage);
              
    8. Remove the following Java code because it conflicts with MbMessageAssembly that you have just created:
      MbMessageAssembly outAssembly = new MbMessageAssembly
      (inAssembly, outMessage);
         		
  9. Customize the SetupTransferFailedReply node:
    1. Double-click the SetupTransferFailedReply node, ensure that Project name is SCANodesSampleJava, click Next.
    2. Ensure that Source folders on build path and Default output folder contain SCANodesSampleJava, click Next.
    3. Set Package to sca.broker.sample.banktransfer, click Next.
    4. Select the Modifying message class template, click Finish.
    5. Right-click the SetupTransferFailedReply node, click Open Java.
    6. Add the following Java code:
      //Set the content type to be html so that it can be viewed by a browser
      MbElement outRoot = outMessage.getRootElement();
      MbElement outProperties = outRoot.getFirstElementByPath
      ("Properties");	
      MbElement contentType = outProperties.getFirstElementByPath
      ("ContentType");			
      contentType.setValue("text/html");	
      //Clear out any messages 
      outRoot.getLastChild().detach();
              
      //Get the exception reported
      MbElement exception = inAssembly.getExceptionList()
      .getRootElement().getFirstElementByPath
      ("RecoverableException").getFirstElementByPath("UserException")
      .getFirstElementByPath("UserException");
      //Create a HTML response
      StringBuffer buffer = new StringBuffer();			
      String head = "<html><body text=\"#ff0000\">
      <form action=\"/TransferRequestForm\" 
      method=post>";			
      buffer.append(head);
      //Iterate through the exception stacktrace and 
      add the reason text to the message response
      MbElement insert = exception.getFirstElementByPath("Insert");
      for (int i=0;i<5;i++) {
        insert = insert.getNextSibling();
      }
      String text = (String)insert.getFirstElementByPath
      ("Text").getValue();
      if (text.length() > 0) {
        buffer.append("<h1>");					
        buffer.append(text);
        buffer.append("</h1>");					
      }
      //Complete the HTML body
      String tail = "<br><input type=\"submit\" 
      name=\"OK\" value=\"OK\">
      </form></body></html>";
      buffer.append(tail);
              
      //Create the Broker Blob Parser element
      MbElement outParser = outRoot.createElementAsLastChild
      (MbBLOB.PARSER_NAME);
      //Create the BLOB element in the Blob parser 
      domain with the required text
      outParser.createElementAsLastChild
      (MbElement.TYPE_NAME_VALUE, "BLOB", 
      buffer.toString().getBytes());
              

Back to Build the sample

Back to sample home