Create the current account debit message subflow

Use the following instructions to create the current account debit message subflow.

  1. Create a new message flow:
    1. Right-click the existing SCANodesSample Message Broker project, click New > Message Flow.
    2. Set Message Flow Name to CurrentAccountDebit, click Finish.
  2. In the Message Flow editor add and rename the nodes listed in the following table.
    Node type Node name
    Input Input
    JavaCompute RetrieveCurrentAccountBalance
    JavaCompute DebitCurrentAccountBalance
    JavaCompute UpdateCurrentAccountBalance
    Output Output

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

    Node name Terminal Connect to this node
    Input Out RetrieveCurrentAccountBalance
    RetrieveCurrentAccountBalance Out DebitCurrentAccountBalance
    DebitCurrentAccountBalance Out UpdateCurrentAccountBalance
    UpdateCurrentAccountBalance Out Output
  4. Customize the RetrieveCurrentAccountBalance node:
    1. Double-click the RetrieveCurrentAccountBalance 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.currentaccount, click Next.
    4. Select the Modifying message class template, click Finish.
    5. Right-click the RetrieveCurrentAccountBalance node, click Open Java.
    6. Add the following import statements:
      import java.io.BufferedReader;
      import java.io.File;
      import java.io.FileReader;
      import java.io.IOException;
      		
    7. Add the following Java code:
      MbMessage locEnv = inAssembly.getLocalEnvironment();
      // create new message
      MbMessage newLocEnv = new MbMessage(locEnv);
      BufferedReader bufferedReader = null;
      try {
        //Read the current account balance from the local file system
        File file = null;
        String OS = System.getProperty("os.name").toLowerCase();
        if (OS.indexOf("windows") > -1) {
            file = new File("C:\\tmp\\CurrentAccount.txt");        	
        } else {
            file = new File("/tmp/CurrentAccount.txt");        	
        }
        //Construct the BufferedReader object
        bufferedReader = new BufferedReader(new FileReader(file));            
        //Put the current account balance in the LE
        MbElement variables = newLocEnv.getRootElement()
        .createElementAsLastChild
        (MbElement.TYPE_NAME, "Variables", null);
        variables.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
        "oldBalance", 
        bufferedReader.readLine());           
      } catch (Exception e) {
        throw new MbUserException( 
        CurrentAccount_RetrieveCurrentAccountBalance.class.getName(),
      					"evaluate()",
      					"",
      					"",
      					e.getMessage(),
      					null);
      } finally {
        //Close the BufferedReader
        try {
          if (bufferedReader != null)
            bufferedReader.close();
        } catch (IOException e) {
          throw new MbUserException( 
          CurrentAccount_RetrieveCurrentAccountBalance.class.getName(),
          					"evaluate()",
          					"",
          					"",
          					e.getMessage(),
          					null);
        }
      }
      MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly,
      				newLocEnv, inAssembly.getExceptionList(), 
      				inAssembly.getMessage());
              
    8. Remove the following Java code because it conflicts with MbMessageAssembly that you have just created:
      MbMessageAssembly outAssembly = new MbMessageAssembly
      (inAssembly, outMessage);
         		
  5. Customize the DebitCurrentAccountBalance node:
    1. Double-click the DebitCurrentAccountBalance 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.currentaccount, click Next.
    4. Select the Creating message class template, click Finish.
    5. Right-click the DebitCurrentAccountBalance node, click Open Java.
    6. Add the following import statement:
      import java.math.BigDecimal;
      		
    7. Add the following Java code:
      //Go to tree roots
      MbElement inRoot = inMessage.getRootElement();			
      MbElement outRoot = outMessage.getRootElement();	
      MbMessage locEnv = inAssembly.getLocalEnvironment();
      MbMessage newLocEnv = new MbMessage();
      //Get the operation name
      MbElement sca = locEnv.getRootElement().getFirstElementByPath("SCA");
      MbElement input = sca.getFirstElementByPath("Input");
      MbElement operation = input.getFirstElementByPath("Operation");
      String operationName = operation.getValue().toString();			
      //Get the old balance
      MbElement variables = locEnv.getRootElement()
      .getFirstElementByPath("Variables");
      float oldBalance = 
      Float.parseFloat(variables.getFirstElementByPath("oldBalance")
      .getValue().toString());			
      //Get the amount to transfer
      MbElement soap = inRoot.getFirstElementByPath("SOAP");
      MbElement body = soap.getFirstElementByPath("Body");
      MbElement action = body.getLastChild();
      MbElement request = action.getLastChild();
      MbElement amount = request.getFirstElementByPath("amount");
      float transferValue = Float.parseFloat(amount.getValue().toString());	
      //Calculate the difference
      float newBalance = oldBalance - transferValue;
      MbElement newVariables = newLocEnv.getRootElement()
      .createElementAsLastChild
      (MbElement.TYPE_NAME, "Variables", null);
      //Setup the message reply
      MbElement newXMLNSC = outRoot.createElementAsLastChild
      (MbXMLNSC.PARSER_NAME);
      MbElement newOperation = newXMLNSC.createElementAsLastChild
      (MbElement.TYPE_NAME, 
      operationName + "Response", null);
      newOperation.setNamespace("http://CurrentAccount/");
      MbElement newResponse = newOperation.createElementAsLastChild
      (MbElement.TYPE_NAME, 
      "CurrentAccountResponse", null);
      //If the difference is negative then do not accept the 
      transfer and retain old balance
      if (newBalance < 0) {	                 
      newVariables.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
      "newBalance", 
      new BigDecimal(oldBalance).setScale
      (2, java.math.BigDecimal.ROUND_HALF_UP).toString());	              
      newResponse.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
      "accept", "no");
      //Otherwise accept the transfer and set new balance in LE
      } else {	              newVariables.createElementAsLastChild
      (MbElement.TYPE_NAME_VALUE, 
      "newBalance", new BigDecimal(newBalance).setScale
      (2, java.math.BigDecimal.ROUND_HALF_UP).toString());	           
       newResponse.createElementAsLastChild(MbElement.TYPE_NAME_VALUE, 
       "accept", "yes");				
      }
      // 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 UpdateCurrentAccountBalance node:
    1. Double-click the UpdateCurrentAccountBalance 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.currentaccount, click Next.
    4. Select the Filtering message class template, click Finish.
    5. Right-click the UpdateCurrentAccountBalance node, click Open Java.
    6. Add the following import statements:
      import java.io.BufferedWriter;
      import java.io.File;
      import java.io.FileWriter;
      import java.io.IOException;
      import java.math.BigDecimal;
      		
    7. Add the following Java code:
      MbMessage locEnv = assembly.getLocalEnvironment();		
      //Read the new balance from the LE
      MbElement variables = locEnv.getRootElement()
      .getFirstElementByPath("Variables");
      String newBalance = new BigDecimal(variables.getFirstElementByPath
      ("newBalance").getValue().toString()).setScale
      (2, BigDecimal.ROUND_HALF_UP).toString();
      BufferedWriter bufferedWriter = null;     
      try {
        //Update current account balance on local file system
        File file = null;;
        String OS = System.getProperty("os.name").toLowerCase();
        if (OS.indexOf("windows") > -1) {
            file = new File("C:\\tmp\\CurrentAccount.txt");        	
        } else {
            file = new File("/tmp/CurrentAccount.txt");        	
        }
        //Construct the BufferedWriter object
        bufferedWriter = new BufferedWriter(new FileWriter(file));
        //Start writing new balance to the output stream
        bufferedWriter.write(newBalance);           
      } catch (Exception e) {
        throw new MbUserException
        ( CurrentAccount_UpdateCurrentAccountBalance.class.getName(),
      					"evaluate()",
      					"",
      					"",
      					e.getMessage(),
      					null);
      } finally {
        //Close the BufferedWriter
        try {
          if (bufferedWriter != null) {
            bufferedWriter.flush();
            bufferedWriter.close();
          }
        } catch (IOException e) {
          throw new MbUserException
          ( CurrentAccount_UpdateCurrentAccountBalance.class.getName(),
          					"evaluate()",
          					"",
          					"",
          					e.getMessage(),
          					null);
        }
      }
              

You can now create the current account credit message subflow, see Create the current account credit message subflow.

Back to Extend the sample

Back to sample home