Use the following instructions to create the current account debit message subflow.
| Node type | Node name |
|---|---|
| Input | Input |
| JavaCompute | RetrieveCurrentAccountBalance |
| JavaCompute | DebitCurrentAccountBalance |
| JavaCompute | UpdateCurrentAccountBalance |
| Output | Output |
| Node name | Terminal | Connect to this node |
|---|---|---|
| Input | Out | RetrieveCurrentAccountBalance |
| RetrieveCurrentAccountBalance | Out | DebitCurrentAccountBalance |
| DebitCurrentAccountBalance | Out | UpdateCurrentAccountBalance |
| UpdateCurrentAccountBalance | Out | Output |
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException;
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());
MbMessageAssembly outAssembly = new MbMessageAssembly (inAssembly, outMessage);
import java.math.BigDecimal;
//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);
MbMessageAssembly outAssembly = new MbMessageAssembly (inAssembly, outMessage);
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.math.BigDecimal;
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.