package com.finance.iso.iso8583.mediator; import javax.xml.namespace.QName; import org.apache.axiom.om.OMElement; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.synapse.ManagedLifecycle; import org.apache.synapse.MessageContext; import org.apache.synapse.core.SynapseEnvironment; import org.apache.synapse.core.axis2.Axis2MessageContext; import org.apache.synapse.mediators.AbstractMediator; import org.jpos.iso.ISOException; import org.jpos.iso.ISOMsg; import com.finance.iso.iso8583.bean.ReversalBean; import com.finance.iso.iso8583.jpos.util.XLinkMessageHelper; public class XLinkISO8583Mediator extends AbstractMediator implements ManagedLifecycle{ private static final Log log = LogFactory.getLog(XLinkISO8583Mediator.class); private static final String OPERATION_TYPE = "OperationType"; private String port; private String host; private int xlinkRetryCount=10; private long xlinkSuspendOnRetryFail=1000L; private long monitorTrigger=1000L; @Override public boolean mediate(MessageContext synCtx) { org.apache.axis2.context.MessageContext msgCtx = ((Axis2MessageContext) synCtx) .getAxis2MessageContext(); try { String mobileConnectionKey = (String) synCtx .getProperty(XLinkISO8583Constant.MOBILE_CONNECTION_KEY); log.info("Mediator : MSISDN "+mobileConnectionKey); XLinkConnnector connnector = XLinkConnnector.getInstance(); connnector.setMontorTriggerDuration(monitorTrigger); connnector.setXLinkOnErrorRetryCount(xlinkRetryCount); connnector.setXLinkOnRetrySuspend(xlinkSuspendOnRetryFail); XLinkISO8583TransactionHandler transactionHandler = new XLinkISO8583TransactionHandler(); log.info("Initializing the X-Link mediator"); XLinkSessionWrapper xLinkSessionWrapper = connnector.getSession( mobileConnectionKey, host, port,transactionHandler); log.info("Connector gotSession"); if (xLinkSessionWrapper != null && xLinkSessionWrapper.isSignOn()) { // if sign on means upto now // all session validation // done successfully log.info("Connector gotSession Success"); String accountno = (String) synCtx.getProperty("accountno"); String dob =(String) synCtx.getProperty("userDOB"); XLinkAccountInfoWrapper accountInfoWrapper = new XLinkAccountInfoWrapper(accountno, dob); ISOMsg request =XLinkMessageHelper.createFinacialMessage(msgCtx,synCtx,accountInfoWrapper, xLinkSessionWrapper); ReversalBean reversalBean = generateReversalKey(request, msgCtx); log.info("Reversal Key generated for the Request: "+ reversalBean.getReversalKey()); OMElement responseElement = transactionHandler.handleFinancialMessage(request, xLinkSessionWrapper, msgCtx, synCtx); // TODO: CAPTURE the ERROR for FIN MSGS HERE FROM DOWN STREAM and DO THE REVERSAL HERE if (responseElement != null) { // count++; log.info("API Response Decoding." ); OMElement statusCode = responseElement.getFirstChildWithName(new QName("StatusCode")); log.info("Decoding Status Code"); if (statusCode != null) { log.info("Decoded Status Code: "+statusCode.getText()); // String statusCodeValue = statusCode.getText(); // //TODO: FIX PROPERLY // if (!"000000".equals(statusCodeValue) && !"000068".equals(statusCodeValue)) { // //Set conditions for reversal // log.info("Starting Reversal builing"); // OMElement requestElement = msgCtx.getEnvelope().getBody().getFirstElement(); //.detach(); // log.info("First Child: "+requestElement.getLocalName()); // // //REmove API Response and add APIRequest Element // OMFactory fac = OMAbstractFactory.getOMFactory(); // OMElement apiRequest = fac.createOMElement(new QName("APIRequest")); // // OMElement operationType = fac.createOMElement(new QName("OperationType")); // operationType.setText("51"); // apiRequest.addChild(operationType); // // OMElement revOperationType = fac.createOMElement(new QName("RevOperationType")); // revOperationType.setText(reversalBean.getOperationType()); // apiRequest.addChild(revOperationType); // // OMElement revStatusCode = fac.createOMElement(new QName("RevStatusCode")); // revStatusCode.setText(statusCodeValue); // msgCtx.setProperty("RevStatusCode", statusCodeValue); // apiRequest.addChild(revStatusCode); // // OMElement revField32 = fac.createOMElement(new QName("RevField32")); // revField32.setText(reversalBean.getField32()); // msgCtx.setProperty("RevField32", revField32); // apiRequest.addChild(revField32); // // if(reversalBean.getAmount() != null){ // OMElement amountNode = fac.createOMElement(new QName("Amount")); // amountNode.setText(reversalBean.getAmount()); // apiRequest.addChild(amountNode); // } // // if(reversalBean.getDestination() != null){ // OMElement toNode = fac.createOMElement(new QName("To")); // toNode.setText(reversalBean.getDestination()); // apiRequest.addChild(toNode); // } // // if(reversalBean.getDestinationCode() != null){ // OMElement destCodeNode = fac.createOMElement(new QName("DIIC")); // destCodeNode.setText(reversalBean.getDestinationCode()); // apiRequest.addChild(destCodeNode); // } // // if(reversalBean.getDestinationCode() != null){ // OMElement revKeyNode = fac.createOMElement(new QName("RevKey")); // revKeyNode.setText(reversalBean.getReversalKey()); // apiRequest.addChild(revKeyNode); // } // // // requestElement.detach(); // msgCtx.getEnvelope().getBody().addChild(apiRequest); // // log.info("New Request is built"); // // log.info("Setting the ReversalKey msgctx property:"+reversalBean.getReversalKey()); // msgCtx.setProperty("reversalKey", reversalBean.getReversalKey()); // //Stage set // log.info("Setting up reversal case"); // request = XLinkMessageHelper.createFinacialMessage(msgCtx,synCtx, accountInfoWrapper,xLinkSessionWrapper); //// reversalBean = generateReversalKey(request, msgCtx);//DO we need REVERSAL for REVERSAL? // responseElement = transactionHandler.handleFinancialMessage(request,xLinkSessionWrapper,msgCtx, synCtx); // }else{ // //Successful message //// break; // } } } else { // TODO: STILL NOT SENDING THE REVERSAL // //TODO: DO a reversal from Bean and then send the error response to client // OMFactory fac = OMAbstractFactory.getOMFactory(); // OMElement apiRequest = fac.createOMElement(new QName("APIRequest")); // // OMElement operationType = fac.createOMElement(new QName("OperationType")); // operationType.setText("51"); // apiRequest.addChild(operationType); // // OMElement revOperationType = fac.createOMElement(new QName("RevOperationType")); // revOperationType.setText(reversalBean.getOperationType()); // apiRequest.addChild(revOperationType); // // String statusCodeValue="96"; // OMElement revStatusCode = fac.createOMElement(new QName("RevStatusCode")); // revStatusCode.setText(statusCodeValue); // msgCtx.setProperty("RevStatusCode", statusCodeValue); // apiRequest.addChild(revStatusCode); // // OMElement revField32 = fac.createOMElement(new QName("RevField32")); // revField32.setText(reversalBean.getField32()); // msgCtx.setProperty("RevField32", revField32); // apiRequest.addChild(revField32); // // if(reversalBean.getAmount() != null){ // OMElement amountNode = fac.createOMElement(new QName("Amount")); // amountNode.setText(reversalBean.getAmount()); // apiRequest.addChild(amountNode); // } // // if(reversalBean.getDestination() != null){ // OMElement toNode = fac.createOMElement(new QName("To")); // toNode.setText(reversalBean.getDestination()); // apiRequest.addChild(toNode); // } // // if(reversalBean.getDestinationCode() != null){ // OMElement destCodeNode = fac.createOMElement(new QName("DIIC")); // destCodeNode.setText(reversalBean.getDestinationCode()); // apiRequest.addChild(destCodeNode); // } // // if(reversalBean.getDestinationCode() != null){ // OMElement revKeyNode = fac.createOMElement(new QName("RevKey")); // revKeyNode.setText(reversalBean.getReversalKey()); // apiRequest.addChild(revKeyNode); // } // // // msgCtx.getEnvelope().getBody().addChild(apiRequest); // // log.info("New Request is built"); // // log.info("Setting the ReversalKey msgctx property:"+reversalBean.getReversalKey()); // msgCtx.setProperty("reversalKey", reversalBean.getReversalKey()); // //Stage set // log.info("Setting up reversal case"); // request = XLinkMessageHelper.createFinacialMessage(msgCtx,synCtx, accountInfoWrapper,xLinkSessionWrapper); //// reversalBean = generateReversalKey(request, msgCtx);//DO we need REVERSAL for REVERSAL? // responseElement = transactionHandler.handleFinancialMessage(request,xLinkSessionWrapper,msgCtx, synCtx); //// } } }else{ handleException("XLink Commuincation Failed", synCtx); } } catch (Exception e) { e.printStackTrace(); handleException("Error while sending message via JPos. Error: "+e.getLocalizedMessage(), synCtx); } return true; } private ReversalBean generateReversalKey(ISOMsg m, org.apache.axis2.context.MessageContext msgCtx){ try { OMElement jSonObject = msgCtx.getEnvelope().getBody() .getFirstElement(); OMElement requestElement=jSonObject.getFirstElement(); log.info("First Child: "+requestElement.getLocalName()); log.info("Generating Reversal Bean"); OMElement operationTypeNode = requestElement.getFirstChildWithName((new QName(OPERATION_TYPE))); String operationType = null; if(operationTypeNode != null){ operationType=operationTypeNode.getText(); log.info("Reversal: Op Type"+operationType); } OMElement amountNode = requestElement.getFirstChildWithName(new QName("Amount")); String amount = null; if(amountNode !=null){ amount=amountNode.getText(); log.info("Reversal: Amount"+amount); } OMElement userDataNode = requestElement.getFirstChildWithName(new QName("UserData")); String userData = null; if(userDataNode!=null){ userData=userDataNode.getText(); log.info("Reversal: userData"+userData); } OMElement destinationNode = requestElement.getFirstChildWithName(new QName("To")); String destination = null; if(destinationNode!=null){ destination=destinationNode.getText(); log.info("Reversal: To"+destination); } OMElement destinationCodeNode = requestElement.getFirstChildWithName(new QName("DIIC")); String destinationCode = null; if(destinationCodeNode!=null){ destinationCode=destinationCodeNode.getText(); log.info("Reversal: DIIC"+destinationCode); } return new ReversalBean((String)m.getValue(7),(String) m.getValue(11),(String)m.getValue(32), (String)m.getValue(37), userData, amount, destination, destinationCode, operationType); } catch (ISOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public String getPort() { return port; } public void setPort(String port) { this.port = port; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getXlinkRetryCount() { return xlinkRetryCount; } public void setXlinkRetryCount(int xlinkRetryCount) { this.xlinkRetryCount = xlinkRetryCount; } public long getXlinkSuspendOnRetryFail() { return xlinkSuspendOnRetryFail; } public void setXlinkSuspendOnRetryFail(long xlinkSuspendOnRetryFail) { this.xlinkSuspendOnRetryFail = xlinkSuspendOnRetryFail; } public long getMonitorTrigger() { return monitorTrigger; } public void setMonitorTrigger(long monitorTrigger) { this.monitorTrigger = monitorTrigger; } @Override public void destroy() { // TODO Auto-generated method stub } @Override public void init(SynapseEnvironment arg0) { // TODO Auto-generated method stub //connnector = new XLinkConnnector(); } }