From cb22b36577ba39c937f4b3474eca793b12e2f3f1 Mon Sep 17 00:00:00 2001 From: Anatoly Satanovskiy Date: Mon, 17 Jul 2017 18:33:45 +0300 Subject: [PATCH] issue #216: continued to work + fixes --- .../slee/services/charging/ChargingSbb.java | 4 +- .../deliverysbb/DeliveryCommonSbb.java | 2 +- .../http/server/tx/TxHttpServerSbb.java | 395 ++++++++++-------- .../smpp/server/rx/RxSmppServerSbb.java | 15 +- .../smpp/server/tx/TxSmppServerSbb.java | 81 ++-- .../services/submitsbb/SubmitCommonSbb.java | 33 +- .../smsc/library/CdrDetailedGenerator.java | 129 ++++-- .../mobicents/smsc/library/CdrGenerator.java | 4 +- 8 files changed, 399 insertions(+), 264 deletions(-) diff --git a/core/slee/services/chargingsbb/src/main/java/org/mobicents/smsc/slee/services/charging/ChargingSbb.java b/core/slee/services/chargingsbb/src/main/java/org/mobicents/smsc/slee/services/charging/ChargingSbb.java index 4f2011867..06dd44d5e 100644 --- a/core/slee/services/chargingsbb/src/main/java/org/mobicents/smsc/slee/services/charging/ChargingSbb.java +++ b/core/slee/services/chargingsbb/src/main/java/org/mobicents/smsc/slee/services/charging/ChargingSbb.java @@ -683,7 +683,9 @@ private void rejectSmsByDiameter(ChargingData chargingData, RoCreditControlAnswe switch (sms.getOriginationType()) { case SMPP: EsmeManagement esmeManagement = EsmeManagement.getInstance(); - Esme esme = esmeManagement.getEsmeByClusterName(sms.getSmsSet().getDestClusterName()); + Esme esme = null; + if (esmeManagement != null) + esme = esmeManagement.getEsmeByClusterName(sms.getOrigEsmeName()); eventType = EventType.IN_SMPP_REJECT_DIAMETER; if (esme != null) { diff --git a/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/deliverysbb/DeliveryCommonSbb.java b/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/deliverysbb/DeliveryCommonSbb.java index f3f95ab31..53aa65bde 100644 --- a/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/deliverysbb/DeliveryCommonSbb.java +++ b/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/deliverysbb/DeliveryCommonSbb.java @@ -1538,7 +1538,7 @@ protected void generateCDR(Sms sms, String status, String reason, boolean messag protected void generateDetailedCDR(Sms sms, EventType eventType, ErrorCode errorCode, String messageType, int statusCode, String destAddrAndPort, int seqNumber) { - CdrDetailedGenerator.generateDetailedCdr(sms, eventType, errorCode, messageType, statusCode, 0, null, destAddrAndPort, + CdrDetailedGenerator.generateDetailedCdr(sms, eventType, errorCode, messageType, statusCode, -1, null, destAddrAndPort, seqNumber, smscPropertiesManagement.getGenerateReceiptCdr(), smscPropertiesManagement.getGenerateDetailedCdr()); } diff --git a/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/http/server/tx/TxHttpServerSbb.java b/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/http/server/tx/TxHttpServerSbb.java index 0dbde8d18..deeb50f32 100644 --- a/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/http/server/tx/TxHttpServerSbb.java +++ b/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/http/server/tx/TxHttpServerSbb.java @@ -23,20 +23,13 @@ package org.mobicents.smsc.slee.services.http.server.tx; import com.cloudhopper.smpp.SmppConstants; +import com.cloudhopper.smpp.pdu.BaseSm; +import com.cloudhopper.smpp.tlv.Tlv; + import net.java.slee.resource.http.events.HttpServletRequestEvent; import org.mobicents.protocols.ss7.map.api.errors.MAPErrorCode; import org.mobicents.smsc.cassandra.PersistenceException; import org.mobicents.smsc.domain.*; -import org.mobicents.smsc.library.CdrDetailedGenerator; -import org.mobicents.smsc.library.MessageState; -import org.mobicents.smsc.library.MessageUtil; -import org.mobicents.smsc.library.OriginationType; -import org.mobicents.smsc.library.QuerySmResponse; -import org.mobicents.smsc.library.SbbStates; -import org.mobicents.smsc.library.Sms; -import org.mobicents.smsc.library.SmsSet; -import org.mobicents.smsc.library.SmscProcessingException; -import org.mobicents.smsc.library.TargetAddress; import org.mobicents.smsc.library.*; import org.mobicents.smsc.slee.resources.persistence.PersistenceRAInterface; import org.mobicents.smsc.slee.services.http.server.tx.data.*; @@ -49,6 +42,7 @@ import org.mobicents.smsc.slee.services.http.server.tx.utils.HttpUtils; import org.mobicents.smsc.slee.services.http.server.tx.utils.ResponseFormatter; import org.mobicents.smsc.slee.services.submitsbb.SubmitCommonSbb; +import org.restcomm.smpp.parameter.TlvSet; import javax.naming.Context; import javax.naming.InitialContext; @@ -191,7 +185,8 @@ public void onHttpPost(HttpServletRequestEvent event, ActivityContextInterface a } else if (requestURL.endsWith(MSG_QUERY)) { processHttpGetMessageIdStatusEvent(event, aci); } else { - throw new HttpApiException("Unknown operation on the HTTP API. Parameter set from the request does not match any of the HTTP API services."); + throw new HttpApiException( + "Unknown operation on the HTTP API. Parameter set from the request does not match any of the HTTP API services."); } } } catch (HttpApiException e) { @@ -232,11 +227,8 @@ private void sendErrorResponse(HttpServletRequestEvent event, Exception e) throw outgoingData.setStatus(Status.ERROR); outgoingData.setMessage(e.getMessage()); ResponseFormat responseFormat = BaseIncomingData.getFormat(logger, event.getRequest()); - HttpUtils.sendErrorResponseWithContent(logger, - event.getResponse(), - HttpServletResponse.SC_OK, - outgoingData.getMessage(), - ResponseFormatter.format(outgoingData, responseFormat), responseFormat); + HttpUtils.sendErrorResponseWithContent(logger, event.getResponse(), HttpServletResponse.SC_OK, + outgoingData.getMessage(), ResponseFormatter.format(outgoingData, responseFormat), responseFormat); if (smscPropertiesManagement.isGenerateRejectionCdr()) { generateCDR(event.getRequest(), CdrGenerator.CDR_SUBMIT_FAILED_HTTP, e.getMessage(), true); } @@ -246,7 +238,8 @@ private boolean checkCharging() { return smscPropertiesManagement.getTxHttpCharging() != MoChargingType.accept; } - private void processHttpSendMessageEvent(HttpServletRequestEvent event, ActivityContextInterface aci) throws HttpApiException, UnauthorizedException { + private void processHttpSendMessageEvent(HttpServletRequestEvent event, ActivityContextInterface aci) + throws HttpApiException, UnauthorizedException { logger.fine("processHttpSendMessageEvent"); HttpServletRequest request = event.getRequest(); HttpSendMessageIncomingData incomingData = null; @@ -255,7 +248,8 @@ private void processHttpSendMessageEvent(HttpServletRequestEvent event, Activity sendMessage(event, incomingData, aci); } - private void processHttpGetMessageIdStatusEvent(HttpServletRequestEvent event, ActivityContextInterface aci) throws HttpApiException, UnauthorizedException { + private void processHttpGetMessageIdStatusEvent(HttpServletRequestEvent event, ActivityContextInterface aci) + throws HttpApiException, UnauthorizedException { logger.fine("processHttpGetMessageIdStatusEvent"); HttpServletRequest request = event.getRequest(); HttpGetMessageIdStatusIncomingData incomingData; @@ -264,7 +258,8 @@ private void processHttpGetMessageIdStatusEvent(HttpServletRequestEvent event, A getMessageIdStatus(event, incomingData, aci); } - private HttpSendMessageIncomingData createSendMessageIncomingData(HttpServletRequest request) throws HttpApiException, UnauthorizedException { + private HttpSendMessageIncomingData createSendMessageIncomingData(HttpServletRequest request) + throws HttpApiException, UnauthorizedException { logger.fine("createSendMessageIncomingData"); if (GET.equals(request.getMethod())) { final String userId = request.getParameter(RequestParameter.USER_ID.getName()); @@ -278,9 +273,9 @@ private HttpSendMessageIncomingData createSendMessageIncomingData(HttpServletReq final String senderTon = request.getParameter(RequestParameter.SENDER_TON.getName()); final String senderNpi = request.getParameter(RequestParameter.SENDER_NPI.getName()); final String udhStr = request.getParameter(RequestParameter.UDH.getName()); - final String[] destAddresses = destAddressParam != null ? destAddressParam.split(",") : new String[]{}; - return new HttpSendMessageIncomingData(userId, password, encodedMsg, format, msgEncoding, bodyEncoding, - senderId, senderTon, senderNpi, destAddresses, smscPropertiesManagement, httpUsersManagement, udhStr); + final String[] destAddresses = destAddressParam != null ? destAddressParam.split(",") : new String[] {}; + return new HttpSendMessageIncomingData(userId, password, encodedMsg, format, msgEncoding, bodyEncoding, senderId, + senderTon, senderNpi, destAddresses, smscPropertiesManagement, httpUsersManagement, udhStr); } else if (POST.equals(request.getMethod())) { String userId = request.getParameter(RequestParameter.USER_ID.getName()); @@ -294,7 +289,7 @@ private HttpSendMessageIncomingData createSendMessageIncomingData(HttpServletReq String senderNpi = request.getParameter(RequestParameter.SENDER_NPI.getName()); String destAddressParam = request.getParameter(RequestParameter.TO.getName()); String udhStr = request.getParameter(RequestParameter.UDH.getName()); - String[] destAddresses = destAddressParam != null ? destAddressParam.split(",") : new String[]{}; + String[] destAddresses = destAddressParam != null ? destAddressParam.split(",") : new String[] {}; Map map = HttpRequestUtils.extractParametersFromPost(logger, request); @@ -330,10 +325,11 @@ private HttpSendMessageIncomingData createSendMessageIncomingData(HttpServletReq } if (destAddresses == null || destAddresses.length < 1) { String[] tmp = map.get(RequestParameter.TO.getName()); - destAddresses = (tmp == null ? new String[]{""} : tmp); + destAddresses = (tmp == null ? new String[] { "" } : tmp); } - HttpSendMessageIncomingData incomingData = new HttpSendMessageIncomingData(userId, password, encodedMsg, format, msgEncoding, bodyEncoding, - senderId, senderTon, senderNpi, destAddresses, smscPropertiesManagement, httpUsersManagement, udhStr); + HttpSendMessageIncomingData incomingData = new HttpSendMessageIncomingData(userId, password, encodedMsg, format, + msgEncoding, bodyEncoding, senderId, senderTon, senderNpi, destAddresses, smscPropertiesManagement, + httpUsersManagement, udhStr); return incomingData; } else { throw new HttpApiException("Unsupported method of the Http Request. Method is: " + request.getMethod()); @@ -346,7 +342,8 @@ private String getValueFromMap(Map map, String key) { return terValue; } - private HttpGetMessageIdStatusIncomingData createGetMessageIdStatusIncomingData(HttpServletRequest request) throws HttpApiException, UnauthorizedException { + private HttpGetMessageIdStatusIncomingData createGetMessageIdStatusIncomingData(HttpServletRequest request) + throws HttpApiException, UnauthorizedException { logger.fine("createGetMessageIdStatusIncomingData"); String userId = request.getParameter(RequestParameter.USER_ID.getName()); String password = request.getParameter(RequestParameter.PASSWORD.getName()); @@ -356,22 +353,24 @@ private HttpGetMessageIdStatusIncomingData createGetMessageIdStatusIncomingData( if (userId == null && password == null && msgId == null) { Map map = HttpRequestUtils.extractParametersFromPost(logger, request); String[] tmp = map.get(RequestParameter.USER_ID.getName()); - userId = (tmp == null ? new String[]{""} : tmp)[0]; + userId = (tmp == null ? new String[] { "" } : tmp)[0]; tmp = map.get(RequestParameter.PASSWORD.getName()); - password = (tmp == null ? new String[]{""} : tmp)[0]; + password = (tmp == null ? new String[] { "" } : tmp)[0]; tmp = map.get(RequestParameter.MESSAGE_ID.getName()); - msgId = (tmp == null ? new String[]{""} : tmp)[0]; + msgId = (tmp == null ? new String[] { "" } : tmp)[0]; tmp = map.get(RequestParameter.FORMAT.getName()); - format = (tmp == null ? new String[]{""} : tmp)[0]; + format = (tmp == null ? new String[] { "" } : tmp)[0]; } - HttpGetMessageIdStatusIncomingData incomingData = new HttpGetMessageIdStatusIncomingData(userId, password, msgId, format, httpUsersManagement); + HttpGetMessageIdStatusIncomingData incomingData = new HttpGetMessageIdStatusIncomingData(userId, password, msgId, + format, httpUsersManagement); return incomingData; } - public void sendMessage(HttpServletRequestEvent event, HttpSendMessageIncomingData incomingData, ActivityContextInterface aci) { + public void sendMessage(HttpServletRequestEvent event, HttpSendMessageIncomingData incomingData, + ActivityContextInterface aci) { logger.fine("sendMessage"); if (logger.isFineEnabled()) { logger.fine("\nReceived sendMessage = " + incomingData); @@ -381,11 +380,13 @@ public void sendMessage(HttpServletRequestEvent event, HttpSendMessageIncomingDa SendMessageParseResult parseResult; Sms currSms = null; + long timestampB = 0L; + try { parseResult = createSmsEventMultiDest(incomingData, persistence); for (Sms sms : parseResult.getParsedMessages()) { - currSms = sms; - currSms.setTimestampA(System.currentTimeMillis()); + currSms = sms; + currSms.setTimestampA(System.currentTimeMillis()); processSms(sms, persistence, incomingData); } } catch (SmscProcessingException e1) { @@ -397,6 +398,7 @@ public void sendMessage(HttpServletRequestEvent event, HttpSendMessageIncomingDa } smscStatAggregator.updateMsgInFailedAll(); } + try { final String message = "Error while trying to send SMS message."; if (e1.getHttpErrorCode() < 0) { @@ -405,25 +407,39 @@ public void sendMessage(HttpServletRequestEvent event, HttpSendMessageIncomingDa outgoingData.setStatus(e1.getHttpErrorCode()); } outgoingData.setMessage(message + " " + e1.getMessage()); - HttpUtils.sendErrorResponseWithContent(logger, event.getResponse(), - HttpServletResponse.SC_OK, - message, + HttpUtils.sendErrorResponseWithContent(logger, event.getResponse(), HttpServletResponse.SC_OK, message, ResponseFormatter.format(outgoingData, incomingData.getFormat()), incomingData.getFormat()); - if (currSms != null) { - currSms.setTimestampB(System.currentTimeMillis()); - generateFailureDetailedCdr(currSms, EventType.IN_HTTP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, CdrDetailedGenerator.CDR_MSG_TYPE_HTTP, - HttpServletResponse.SC_OK, event.getRequest().getRemoteAddr(), -1); - } + timestampB = System.currentTimeMillis(); if (smscPropertiesManagement.isGenerateRejectionCdr()) { generateCDR(event.getRequest(), CdrGenerator.CDR_SUBMIT_FAILED_HTTP, message, true); } } catch (IOException e) { logger.severe("Error while trying to send HttpErrorResponse", e); - if (currSms != null) { - generateFailureDetailedCdr(currSms, EventType.IN_HTTP_ERROR, ErrorCode.REJECT_INCOMING, CdrDetailedGenerator.CDR_MSG_TYPE_HTTP, - HttpServletResponse.SC_OK, event.getRequest().getRemoteAddr(), -1); - } } + EventType eventType = null; + + if (e1.getInternalErrorCode() == SmscProcessingException.INTERNAL_ERROR_STATE_OVERLOADED) { + eventType = EventType.IN_HTTP_REJECT_CONG; + } else { + eventType = EventType.IN_HTTP_REJECT_FORBIDDEN; + } + if (currSms != null) { + + currSms.setTimestampB(timestampB); + HttpServletRequest request = event.getRequest(); + String remoteAddrAndPort = request.getRemoteAddr() + ":" + request.getRemotePort(); + generateFailureDetailedCdr(currSms, eventType, ErrorCode.REJECT_INCOMING, + CdrDetailedGenerator.CDR_MSG_TYPE_HTTP, HttpServletResponse.SC_OK, remoteAddrAndPort, + -1); + } else { + HttpServletRequest request = event.getRequest(); + String remoteAddrAndPort = request.getRemoteAddr() + ":" + request.getRemotePort(); + CdrDetailedGenerator.generateDetailedCdr(false, null, null, null, timestampB, null, null, null, eventType, + ErrorCode.REJECT_INCOMING, CdrDetailedGenerator.CDR_MSG_TYPE_HTTP, HttpServletResponse.SC_OK, -1, + remoteAddrAndPort, null, -1, smscPropertiesManagement.getGenerateReceiptCdr(), + smscPropertiesManagement.getGenerateDetailedCdr()); + } + return; } catch (Throwable e1) { String s = "Exception when processing SubmitMulti message: " + e1.getMessage(); @@ -434,26 +450,31 @@ public void sendMessage(HttpServletRequestEvent event, HttpSendMessageIncomingDa final String message = "Error while trying to send SubmitMultiResponse"; outgoingData.setStatus(Status.ERROR); outgoingData.setMessage(message); - HttpUtils.sendErrorResponseWithContent(logger, - event.getResponse(), - HttpServletResponse.SC_OK, - message + " " + e1.getMessage(), - ResponseFormatter.format(outgoingData, incomingData.getFormat()), incomingData.getFormat()); - if (currSms != null) { - currSms.setTimestampB(System.currentTimeMillis()); - generateFailureDetailedCdr(currSms, EventType.IN_HTTP_ERROR, ErrorCode.REJECT_INCOMING, CdrDetailedGenerator.CDR_MSG_TYPE_HTTP, - HttpServletResponse.SC_OK, event.getRequest().getRemoteAddr(), -1); - } + HttpUtils.sendErrorResponseWithContent(logger, event.getResponse(), HttpServletResponse.SC_OK, + message + " " + e1.getMessage(), ResponseFormatter.format(outgoingData, incomingData.getFormat()), + incomingData.getFormat()); + timestampB = System.currentTimeMillis(); if (smscPropertiesManagement.isGenerateRejectionCdr()) { generateCDR(event.getRequest(), CdrGenerator.CDR_SUBMIT_FAILED_HTTP, message, true); } } catch (IOException e) { logger.severe("Error while trying to send SubmitMultiResponse=", e); - if (currSms != null) { - generateFailureDetailedCdr(currSms, EventType.IN_HTTP_ERROR, ErrorCode.REJECT_INCOMING, CdrDetailedGenerator.CDR_MSG_TYPE_HTTP, - HttpServletResponse.SC_OK, event.getRequest().getRemoteAddr(), -1); - } } + + if (currSms != null) { + currSms.setTimestampB(System.currentTimeMillis()); + generateFailureDetailedCdr(currSms, EventType.IN_HTTP_ERROR, ErrorCode.REJECT_INCOMING, + CdrDetailedGenerator.CDR_MSG_TYPE_HTTP, HttpServletResponse.SC_OK, event.getRequest().getRemoteAddr(), + -1); + } else { + HttpServletRequest request = event.getRequest(); + String remoteAddrAndPort = request.getRemoteAddr() + ":" + request.getRemotePort(); + CdrDetailedGenerator.generateDetailedCdr(false, null, null, null, timestampB, null, null, null, EventType.IN_HTTP_ERROR, + ErrorCode.REJECT_INCOMING, CdrDetailedGenerator.CDR_MSG_TYPE_HTTP, HttpServletResponse.SC_OK, -1, + remoteAddrAndPort, null, -1, smscPropertiesManagement.getGenerateReceiptCdr(), + smscPropertiesManagement.getGenerateDetailedCdr()); + } + return; } for (Sms sms : parseResult.getParsedMessages()) { @@ -462,7 +483,8 @@ public void sendMessage(HttpServletRequestEvent event, HttpSendMessageIncomingDa // Lets send the Response with success here try { outgoingData.setStatus(Status.SUCCESS); - HttpUtils.sendOkResponseWithContent(logger, event.getResponse(), ResponseFormatter.format(outgoingData, incomingData.getFormat()), incomingData.getFormat()); + HttpUtils.sendOkResponseWithContent(logger, event.getResponse(), + ResponseFormatter.format(outgoingData, incomingData.getFormat()), incomingData.getFormat()); for (Sms sms : parseResult.getParsedMessages()) { sms.setTimestampB(System.currentTimeMillis()); } @@ -470,13 +492,14 @@ public void sendMessage(HttpServletRequestEvent event, HttpSendMessageIncomingDa logger.severe("Error while trying to send SubmitMultiResponse=" + outgoingData, e); if (currSms != null) { generateFailureDetailedCdr(currSms, EventType.IN_HTTP_ERROR, ErrorCode.REJECT_INCOMING, - CdrDetailedGenerator.CDR_MSG_TYPE_HTTP, - HttpServletResponse.SC_OK, event.getRequest().getRemoteAddr(), -1); + CdrDetailedGenerator.CDR_MSG_TYPE_HTTP, HttpServletResponse.SC_OK, event.getRequest().getRemoteAddr(), + -1); } } } - private void getMessageIdStatus(HttpServletRequestEvent event, HttpGetMessageIdStatusIncomingData incomingData, ActivityContextInterface aci) throws HttpApiException { + private void getMessageIdStatus(HttpServletRequestEvent event, HttpGetMessageIdStatusIncomingData incomingData, + ActivityContextInterface aci) throws HttpApiException { if (logger.isFineEnabled()) { logger.fine("\nReceived getMessageIdStatus = " + incomingData); } @@ -498,16 +521,18 @@ private void getMessageIdStatus(HttpServletRequestEvent event, HttpGetMessageIdS outgoingData.setStatus(Status.SUCCESS); outgoingData.setStatusMessage(messageState.toString()); - HttpUtils.sendOkResponseWithContent(logger, event.getResponse(), ResponseFormatter.format(outgoingData, incomingData.getFormat()), incomingData.getFormat()); + HttpUtils.sendOkResponseWithContent(logger, event.getResponse(), + ResponseFormatter.format(outgoingData, incomingData.getFormat()), incomingData.getFormat()); } catch (PersistenceException e) { - throw new HttpApiException("PersistenceException while obtaining message status from the database for the " + - "message with id: " + incomingData.getMsgId()); + throw new HttpApiException("PersistenceException while obtaining message status from the database for the " + + "message with id: " + incomingData.getMsgId()); } catch (IOException e) { throw new HttpApiException("IOException while trying to send response ok message with content"); } } - private TargetAddress createDestTargetAddress(String addr, final int anUserSpecificNetworkId) throws SmscProcessingException { + private TargetAddress createDestTargetAddress(String addr, final int anUserSpecificNetworkId) + throws SmscProcessingException { if (addr == null || "".equals(addr)) { SmscProcessingException e = new SmscProcessingException("DestAddress digits are absent", 0, MAPErrorCode.systemFailure, SmscProcessingException.HTTP_ERROR_CODE_NOT_SET, addr); @@ -533,7 +558,7 @@ private void generateCDR(HttpServletRequest request, String status, String reaso final int senderTon = Integer.parseInt(request.getParameter(RequestParameter.SENDER_TON.getName())); final int senderNpi = Integer.parseInt(request.getParameter(RequestParameter.SENDER_NPI.getName())); final String message = request.getParameter(RequestParameter.MESSAGE_BODY.getName()); - final String[] destAddresses = destAddressParam != null ? destAddressParam.split(",") : new String[]{}; + final String[] destAddresses = destAddressParam != null ? destAddressParam.split(",") : new String[] {}; CdrGenerator.generateCdr(senderId, senderTon, senderNpi, destAddresses[0], 0, 0, OriginationType.HTTP, null, null, null, 0, 0, null, 0, message, status, reason, smscPropertiesManagement.getGenerateReceiptCdr(), true, lastSegment, @@ -543,8 +568,8 @@ private void generateCDR(HttpServletRequest request, String status, String reaso private void generateCDR(HttpSendMessageIncomingData data, String status, String reason, boolean lastSegment) { CdrGenerator.generateCdr(data.getSender(), data.getSenderTon().getCode(), data.getSenderNpi().getCode(), - data.getDestAddresses().get(0), 0, 0, OriginationType.HTTP, null, null, null, - 0, 0, null, 0, data.getShortMessage(), status, reason, smscPropertiesManagement.getGenerateReceiptCdr(), true, lastSegment, + data.getDestAddresses().get(0), 0, 0, OriginationType.HTTP, null, null, null, 0, 0, null, 0, + data.getShortMessage(), status, reason, smscPropertiesManagement.getGenerateReceiptCdr(), true, lastSegment, smscPropertiesManagement.getCalculateMsgPartsLenCdr(), smscPropertiesManagement.getDelayParametersInCdr()); } @@ -583,7 +608,8 @@ public void onActivityEndEvent(ActivityEndEvent event, ActivityContextInterface } } - protected SendMessageParseResult createSmsEventMultiDest(HttpSendMessageIncomingData incomingData, PersistenceRAInterface store) throws SmscProcessingException { + protected SendMessageParseResult createSmsEventMultiDest(HttpSendMessageIncomingData incomingData, + PersistenceRAInterface store) throws SmscProcessingException { List addressList = incomingData.getDestAddresses(); if (addressList == null || addressList.size() == 0) { throw new SmscProcessingException("For received SubmitMessage no DestAddresses found: ", 0, @@ -695,130 +721,129 @@ protected SendMessageParseResult createSmsEventMultiDest(HttpSendMessageIncoming return new SendMessageParseResult(msgList); } - private void processSms(Sms sms0, PersistenceRAInterface store, HttpSendMessageIncomingData eventSubmitMulti) throws SmscProcessingException { + private void processSms(Sms sms0, PersistenceRAInterface store, HttpSendMessageIncomingData eventSubmitMulti) + throws SmscProcessingException { if (logger.isInfoEnabled()) { logger.info(String.format("\nReceived sms=%s", sms0.toString())); } this.checkSmscState(sms0, smscCongestionControl, SubmitCommonSbb.MaxActivityCountFactor.factor_12); -// // checking if SMSC is stopped -// if (smscPropertiesManagement.isSmscStopped()) { -// SmscProcessingException e = new SmscProcessingException("SMSC is stopped", 0, 0, null); -// e.setSkipErrorLogging(true); -// throw e; -// } -// // checking if SMSC is paused -// if (smscPropertiesManagement.isDeliveryPause() -// && (!MessageUtil.isStoreAndForward(sms0) || smscPropertiesManagement.getStoreAndForwordMode() == StoreAndForwordMode.fast)) { -// SmscProcessingException e = new SmscProcessingException("SMSC is paused", 0, 0, null); -// e.setSkipErrorLogging(true); -// throw e; -// } -// // checking if cassandra database is available -// if (!store.isDatabaseAvailable() && MessageUtil.isStoreAndForward(sms0)) { -// SmscProcessingException e = new SmscProcessingException("Database is unavailable", 0, 0, -// null); -// e.setSkipErrorLogging(true); -// throw e; -// } -// if (!MessageUtil.isStoreAndForward(sms0) -// || smscPropertiesManagement.getStoreAndForwordMode() == StoreAndForwordMode.fast) { -// // checking if delivery query is overloaded -// int fetchMaxRows = (int) (smscPropertiesManagement.getMaxActivityCount() * 1.2); -// int activityCount = SmsSetCache.getInstance().getProcessingSmsSetSize(); -// if (activityCount >= fetchMaxRows) { -// smscCongestionControl.registerMaxActivityCount1_2Threshold(); -// SmscProcessingException e = new SmscProcessingException("SMSC is overloaded", 0, -// 0, null); -// e.setSkipErrorLogging(true); -// throw e; -// } else { -// smscCongestionControl.registerMaxActivityCount1_2BackToNormal(); -// } -// } + // // checking if SMSC is stopped + // if (smscPropertiesManagement.isSmscStopped()) { + // SmscProcessingException e = new SmscProcessingException("SMSC is stopped", 0, 0, null); + // e.setSkipErrorLogging(true); + // throw e; + // } + // // checking if SMSC is paused + // if (smscPropertiesManagement.isDeliveryPause() + // && (!MessageUtil.isStoreAndForward(sms0) || smscPropertiesManagement.getStoreAndForwordMode() == + // StoreAndForwordMode.fast)) { + // SmscProcessingException e = new SmscProcessingException("SMSC is paused", 0, 0, null); + // e.setSkipErrorLogging(true); + // throw e; + // } + // // checking if cassandra database is available + // if (!store.isDatabaseAvailable() && MessageUtil.isStoreAndForward(sms0)) { + // SmscProcessingException e = new SmscProcessingException("Database is unavailable", 0, 0, + // null); + // e.setSkipErrorLogging(true); + // throw e; + // } + // if (!MessageUtil.isStoreAndForward(sms0) + // || smscPropertiesManagement.getStoreAndForwordMode() == StoreAndForwordMode.fast) { + // // checking if delivery query is overloaded + // int fetchMaxRows = (int) (smscPropertiesManagement.getMaxActivityCount() * 1.2); + // int activityCount = SmsSetCache.getInstance().getProcessingSmsSetSize(); + // if (activityCount >= fetchMaxRows) { + // smscCongestionControl.registerMaxActivityCount1_2Threshold(); + // SmscProcessingException e = new SmscProcessingException("SMSC is overloaded", 0, + // 0, null); + // e.setSkipErrorLogging(true); + // throw e; + // } else { + // smscCongestionControl.registerMaxActivityCount1_2BackToNormal(); + // } + // } // TODO how to check if charging is used for http request? Is it turned on for all requests? boolean withCharging = false; this.forwardMessage(sms0, withCharging, smscStatAggregator, CdrDetailedGenerator.CDR_MSG_TYPE_HTTP, -1); - -// if (withCharging) { -// ChargingSbbLocalObject chargingSbb = getChargingSbbObject(); -// chargingSbb.setupChargingRequestInterface(ChargingMedium.TxSmppOrig, sms0); -// } else { -// // applying of MProc -// MProcResult mProcResult = MProcManagement.getInstance().applyMProcArrival(sms0, store); -// if (mProcResult.isMessageRejected()) { -// sms0.setMessageDeliveryResultResponse(null); -// SmscProcessingException e = new SmscProcessingException("Message is rejected by MProc rules", -// 0, 0, null); -// e.setSkipErrorLogging(true); -// if (logger.isInfoEnabled()) { -// logger.info("TxHttp: incoming message is rejected by mProc rules, message=[" + sms0 + "]"); -// } -// throw e; -// } -// if (mProcResult.isMessageDropped()) { -// sms0.setMessageDeliveryResultResponse(null); -// smscStatAggregator.updateMsgInFailedAll(); -// if (logger.isInfoEnabled()) { -// logger.info("TxHttp: incoming message is dropped by mProc rules, message=[" + sms0 + "]"); -// } -// return; -// } -// -// smscStatAggregator.updateMsgInReceivedAll(); -// -// FastList smss = mProcResult.getMessageList(); -// for (FastList.Node n = smss.head(), end = smss.tail(); (n = n.getNext()) != end; ) { -// Sms sms = n.getValue(); -// TargetAddress ta = new TargetAddress(sms.getSmsSet()); -// TargetAddress lock = store.obtainSynchroObject(ta); -// -// try { -// synchronized (lock) { -// boolean storeAndForwMode = MessageUtil.isStoreAndForward(sms); -// if (!storeAndForwMode) { -// try { -// scheduler.injectSmsOnFly(sms.getSmsSet(), true); -// } catch (Exception e) { -// throw new SmscProcessingException("Exception when runnung injectSmsOnFly(): " + e.getMessage(), -// 0, MAPErrorCode.systemFailure, null, e); -// } -// } else { -// // store and forward -// if (smscPropertiesManagement.getStoreAndForwordMode() == StoreAndForwordMode.fast && sms.getScheduleDeliveryTime() == null) { -// try { -// sms.setStoringAfterFailure(true); -// scheduler.injectSmsOnFly(sms.getSmsSet(), true); -// } catch (Exception e) { -// throw new SmscProcessingException("Exception when runnung injectSmsOnFly(): " + e.getMessage(), -// 0, MAPErrorCode.systemFailure, null, e); -// } -// } else { -// try { -// sms.setStored(true); -// scheduler.setDestCluster(sms.getSmsSet()); -// store.c2_scheduleMessage_ReschedDueSlot(sms, -// smscPropertiesManagement.getStoreAndForwordMode() == StoreAndForwordMode.fast, -// false); -// } catch (PersistenceException e) { -// throw new SmscProcessingException("PersistenceException when storing LIVE_SMS : " + e.getMessage(), -// 0, MAPErrorCode.systemFailure, null, e); -// } -// } -// } -// } -// } finally { -// store.releaseSynchroObject(lock); -// } -// } -// } - + // if (withCharging) { + // ChargingSbbLocalObject chargingSbb = getChargingSbbObject(); + // chargingSbb.setupChargingRequestInterface(ChargingMedium.TxSmppOrig, sms0); + // } else { + // // applying of MProc + // MProcResult mProcResult = MProcManagement.getInstance().applyMProcArrival(sms0, store); + // if (mProcResult.isMessageRejected()) { + // sms0.setMessageDeliveryResultResponse(null); + // SmscProcessingException e = new SmscProcessingException("Message is rejected by MProc rules", + // 0, 0, null); + // e.setSkipErrorLogging(true); + // if (logger.isInfoEnabled()) { + // logger.info("TxHttp: incoming message is rejected by mProc rules, message=[" + sms0 + "]"); + // } + // throw e; + // } + // if (mProcResult.isMessageDropped()) { + // sms0.setMessageDeliveryResultResponse(null); + // smscStatAggregator.updateMsgInFailedAll(); + // if (logger.isInfoEnabled()) { + // logger.info("TxHttp: incoming message is dropped by mProc rules, message=[" + sms0 + "]"); + // } + // return; + // } + // + // smscStatAggregator.updateMsgInReceivedAll(); + // + // FastList smss = mProcResult.getMessageList(); + // for (FastList.Node n = smss.head(), end = smss.tail(); (n = n.getNext()) != end; ) { + // Sms sms = n.getValue(); + // TargetAddress ta = new TargetAddress(sms.getSmsSet()); + // TargetAddress lock = store.obtainSynchroObject(ta); + // + // try { + // synchronized (lock) { + // boolean storeAndForwMode = MessageUtil.isStoreAndForward(sms); + // if (!storeAndForwMode) { + // try { + // scheduler.injectSmsOnFly(sms.getSmsSet(), true); + // } catch (Exception e) { + // throw new SmscProcessingException("Exception when runnung injectSmsOnFly(): " + e.getMessage(), + // 0, MAPErrorCode.systemFailure, null, e); + // } + // } else { + // // store and forward + // if (smscPropertiesManagement.getStoreAndForwordMode() == StoreAndForwordMode.fast && sms.getScheduleDeliveryTime() == + // null) { + // try { + // sms.setStoringAfterFailure(true); + // scheduler.injectSmsOnFly(sms.getSmsSet(), true); + // } catch (Exception e) { + // throw new SmscProcessingException("Exception when runnung injectSmsOnFly(): " + e.getMessage(), + // 0, MAPErrorCode.systemFailure, null, e); + // } + // } else { + // try { + // sms.setStored(true); + // scheduler.setDestCluster(sms.getSmsSet()); + // store.c2_scheduleMessage_ReschedDueSlot(sms, + // smscPropertiesManagement.getStoreAndForwordMode() == StoreAndForwordMode.fast, + // false); + // } catch (PersistenceException e) { + // throw new SmscProcessingException("PersistenceException when storing LIVE_SMS : " + e.getMessage(), + // 0, MAPErrorCode.systemFailure, null, e); + // } + // } + // } + // } + // } finally { + // store.releaseSynchroObject(lock); + // } + // } + // } } } - - diff --git a/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/smpp/server/rx/RxSmppServerSbb.java b/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/smpp/server/rx/RxSmppServerSbb.java index dad1e4e9f..16f133116 100644 --- a/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/smpp/server/rx/RxSmppServerSbb.java +++ b/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/smpp/server/rx/RxSmppServerSbb.java @@ -1184,14 +1184,19 @@ private void onDeliveryError(SmsSet smsSet, ErrorAction errorAction, ErrorCode s EsmeManagement esmeManagement = EsmeManagement.getInstance(); Esme esme = esmeManagement.getEsmeByClusterName(smsSet.getDestClusterName()); - String messageType = esme.getSmppSessionType() == Type.CLIENT ? CdrDetailedGenerator.CDR_MSG_TYPE_SUBMITSM - : CdrDetailedGenerator.CDR_MSG_TYPE_DELIVERSM; + String messageType = null; + String remoteAddr = null; + if (esme != null) { + messageType = esme.getSmppSessionType() == Type.CLIENT ? CdrDetailedGenerator.CDR_MSG_TYPE_SUBMITSM + : CdrDetailedGenerator.CDR_MSG_TYPE_DELIVERSM; + remoteAddr = esme.getRemoteAddressAndPort(); + } + System.out.println(smsSet); // generating of a temporary failure CDR (one record for all unsent messages) if (smscPropertiesManagement.getGenerateTempFailureCdr()) { this.generateTemporaryFailureCDR(CdrGenerator.CDR_TEMP_FAILED_ESME, reason); - this.generateTemporaryFailureDetailedCDR(eventType, messageType, smStatus, esme.getRemoteAddressAndPort(), - seqNumber); + this.generateTemporaryFailureDetailedCDR(eventType, messageType, smStatus, remoteAddr, seqNumber); } ArrayList lstPermFailured = new ArrayList(); @@ -1234,7 +1239,7 @@ private void onDeliveryError(SmsSet smsSet, ErrorAction errorAction, ErrorCode s this.generateCDRs(lstPermFailured2, CdrGenerator.CDR_FAILED_ESME, reason); generateDetailedCDRs(lstPermFailured2, EventType.OUT_SMPP_ERROR, smStatus, messageType, - esme.getRemoteAddressAndPort(), seqNumber); + remoteAddr, seqNumber); // sending of intermediate delivery receipts this.generateIntermediateReceipts(smsSet, lstTempFailured2); diff --git a/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/smpp/server/tx/TxSmppServerSbb.java b/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/smpp/server/tx/TxSmppServerSbb.java index 936a0c5d3..e45999aed 100644 --- a/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/smpp/server/tx/TxSmppServerSbb.java +++ b/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/smpp/server/tx/TxSmppServerSbb.java @@ -349,20 +349,27 @@ private void onSubmitSmLocal(final TxSmppServerSbbUsage anSbbUsage, final com.cl } // Lets send the Response with error here + long timestampB = 0L; try { this.smppServerSessions.sendResponsePdu(esme, event, response); - if (sms != null) { - sms.setTimestampB(System.currentTimeMillis()); - generateFailureDetailedCdr(sms, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, - CdrDetailedGenerator.CDR_MSG_TYPE_SUBMITSM, e1.getSmppErrorCode(), esme.getRemoteAddressAndPort(), - event.getSequenceNumber()); - } + timestampB = System.currentTimeMillis(); } catch (Exception e) { anSbbUsage.incrementCounterErrorSubmitSmResponding(ONE); this.logger.severe("Error while trying to send SubmitSmResponse. Message: " + e.getMessage() + ".\nResponse: " + response + ".", e); } + if (sms != null) { + sms.setTimestampB(timestampB); + generateFailureDetailedCdr(sms, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, + CdrDetailedGenerator.CDR_MSG_TYPE_SUBMITSM, e1.getSmppErrorCode(), esme.getRemoteAddressAndPort(), + event.getSequenceNumber()); + } else { + generateFailureDetailedCdr(event, esme, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, + CdrDetailedGenerator.CDR_MSG_TYPE_SUBMITSM, e1.getSmppErrorCode(), parseShortMessageText(event), + timestampB); + } + return; } catch (Throwable e1) { anSbbUsage.incrementCounterErrorSubmitSm(ONE); @@ -533,19 +540,26 @@ private void onDataSmLocal(final TxSmppServerSbbUsage anSbbUsage, final com.clou } // Lets send the Response with error here + long timestampB = 0L; try { this.smppServerSessions.sendResponsePdu(esme, event, response); - if (sms != null) { - sms.setTimestampB(System.currentTimeMillis()); - generateFailureDetailedCdr(sms, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, - CdrDetailedGenerator.CDR_MSG_TYPE_DATASM, e1.getSmppErrorCode(), esme.getRemoteAddressAndPort(), - event.getSequenceNumber()); - } + timestampB = System.currentTimeMillis(); } catch (Exception e) { anSbbUsage.incrementCounterErrorDataSmResponding(ONE); this.logger.severe("Error while trying to send DataSmResponse=" + response, e); } + if (sms != null) { + sms.setTimestampB(System.currentTimeMillis()); + generateFailureDetailedCdr(sms, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, + CdrDetailedGenerator.CDR_MSG_TYPE_DATASM, e1.getSmppErrorCode(), esme.getRemoteAddressAndPort(), + event.getSequenceNumber()); + } else { + generateFailureDetailedCdr(event, esme, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, + CdrDetailedGenerator.CDR_MSG_TYPE_SUBMITSM, e1.getSmppErrorCode(), parseShortMessageText(event), + timestampB); + } + return; } catch (Throwable e1) { anSbbUsage.incrementCounterErrorDataSm(ONE); @@ -640,8 +654,10 @@ private void onSubmitMultiLocal(final TxSmppServerSbbUsage anSbbUsage, final com } // Lets send the Response with error here + long timestampB = 0L; try { this.smppServerSessions.sendResponsePdu(esme, event, response); + timestampB = System.currentTimeMillis(); } catch (Exception e) { anSbbUsage.incrementCounterErrorSubmitMultiSmResponding(ONE); this.logger.severe("Error while trying to send SubmitMultiResponse=" + response, e); @@ -650,7 +666,7 @@ private void onSubmitMultiLocal(final TxSmppServerSbbUsage anSbbUsage, final com try { TargetAddress ta = createDestTargetAddress(event.getDestAddress(), esme.getNetworkId()); Sms sms = this.createSmsEvent(event, esme, ta, persistence); - sms.setTimestampB(System.currentTimeMillis()); + sms.setTimestampB(timestampB); generateFailureDetailedCdr(sms, EventType.IN_SMPP_REJECT_CONG, ErrorCode.REJECT_INCOMING, CdrDetailedGenerator.CDR_MSG_TYPE_SUBMITMULTI, SmppConstants.STATUS_THROTTLED, esme.getRemoteAddressAndPort(), event.getSequenceNumber()); @@ -709,20 +725,26 @@ private void onSubmitMultiLocal(final TxSmppServerSbbUsage anSbbUsage, final com } // Lets send the Response with error here + long timestampB = 0L; try { this.smppServerSessions.sendResponsePdu(esme, event, response); - if (singleSms != null) { - singleSms.setTimestampB(System.currentTimeMillis()); - generateFailureDetailedCdr(singleSms, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, - CdrDetailedGenerator.CDR_MSG_TYPE_SUBMITMULTI, e1.getSmppErrorCode(), - esme.getRemoteAddressAndPort(), event.getSequenceNumber()); - } - + timestampB = System.currentTimeMillis(); } catch (Exception e) { anSbbUsage.incrementCounterErrorSubmitMultiSmResponding(ONE); this.logger.severe("Error while trying to send SubmitMultiResponse=" + response, e); } + if (singleSms != null) { + singleSms.setTimestampB(timestampB); + generateFailureDetailedCdr(singleSms, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, + CdrDetailedGenerator.CDR_MSG_TYPE_SUBMITMULTI, e1.getSmppErrorCode(), esme.getRemoteAddressAndPort(), + event.getSequenceNumber()); + } else { + generateFailureDetailedCdr(event, esme, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, + CdrDetailedGenerator.CDR_MSG_TYPE_SUBMITMULTI, e1.getSmppErrorCode(), parseShortMessageText(event), + timestampB); + } + return; } catch (Throwable e1) { anSbbUsage.incrementCounterErrorSubmitMultiSm(ONE); @@ -884,19 +906,26 @@ private void onDeliverSmLocal(final TxSmppServerSbbUsage anSbbUsage, final com.c } // Lets send the Response with error here + long timestampB = 0L; try { this.smppServerSessions.sendResponsePdu(esme, event, response); - if (sms != null) { - sms.setTimestampB(System.currentTimeMillis()); - generateFailureDetailedCdr(sms, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, - CdrDetailedGenerator.CDR_MSG_TYPE_DELIVERSM, e1.getSmppErrorCode(), esme.getRemoteAddressAndPort(), - event.getSequenceNumber()); - } + timestampB = System.currentTimeMillis(); } catch (Exception e) { anSbbUsage.incrementCounterErrorDeliverSmResponding(ONE); this.logger.severe("Error while trying to send SubmitSmResponse=" + response, e); } + if (sms != null) { + sms.setTimestampB(timestampB); + generateFailureDetailedCdr(sms, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, + CdrDetailedGenerator.CDR_MSG_TYPE_DELIVERSM, e1.getSmppErrorCode(), esme.getRemoteAddressAndPort(), + event.getSequenceNumber()); + } else { + generateFailureDetailedCdr(event, esme, EventType.IN_SMPP_REJECT_FORBIDDEN, ErrorCode.REJECT_INCOMING, + CdrDetailedGenerator.CDR_MSG_TYPE_SUBMITSM, e1.getSmppErrorCode(), parseShortMessageText(event), + timestampB); + } + return; } catch (Throwable e1) { anSbbUsage.incrementCounterErrorDeliverSm(ONE); diff --git a/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/submitsbb/SubmitCommonSbb.java b/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/submitsbb/SubmitCommonSbb.java index 38c27ede8..5bb8c61c0 100644 --- a/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/submitsbb/SubmitCommonSbb.java +++ b/core/slee/services/sbbs/src/main/java/org/mobicents/smsc/slee/services/submitsbb/SubmitCommonSbb.java @@ -22,6 +22,8 @@ package org.mobicents.smsc.slee.services.submitsbb; +import java.util.ArrayList; + import javax.slee.ActivityContextInterface; import javax.slee.CreateException; import javax.slee.RolledBackContext; @@ -56,8 +58,11 @@ import org.mobicents.smsc.slee.services.charging.ChargingSbbLocalObject; import org.restcomm.smpp.Esme; import org.restcomm.smpp.EsmeManagement; +import org.restcomm.smpp.parameter.TlvSet; import com.cloudhopper.smpp.SmppConstants; +import com.cloudhopper.smpp.pdu.BaseSm; +import com.cloudhopper.smpp.tlv.Tlv; import javolution.util.FastList; @@ -295,12 +300,14 @@ protected void forwardMessage(Sms sms0, boolean withCharging, SmscStatAggregator TargetAddress ta = new TargetAddress(sms.getSmsSet()); TargetAddress lock = persistence.obtainSynchroObject(ta); + String sourceAddr = null; + try { sms.setTimestampC(System.currentTimeMillis()); - if (eventTypeSuccess != null) { + if (eventTypeSuccess == EventType.IN_SMPP_RECEIVED) { EsmeManagement esmeManagement = EsmeManagement.getInstance(); - String sourceAddr = null; + if (esmeManagement != null) { // for testing there is no EsmeManagement Esme esme = esmeManagement.getEsmeByClusterName(sms0.getOrigEsmeName()); @@ -309,10 +316,10 @@ protected void forwardMessage(Sms sms0, boolean withCharging, SmscStatAggregator sourceAddr = esme.getRemoteAddressAndPort(); } } - generateDetailedCDR(sms, eventTypeSuccess, messageType, SmppConstants.STATUS_SYSERR, sourceAddr, - seqNumber); } + generateDetailedCDR(sms, eventTypeSuccess, messageType, 0, sourceAddr, seqNumber); + sms.setTimestampA(0); sms.setTimestampB(0); sms.setTimestampC(0); @@ -461,6 +468,24 @@ protected void generateFailureDetailedCdr(Sms sms, EventType eventType, ErrorCod smscPropertiesManagement.getGenerateDetailedCdr()); } + protected void generateFailureDetailedCdr(BaseSm event, Esme esme, EventType eventType, ErrorCode errorCode, + String messageType, int statusCode, String shortMessageText, Long timestampB) { + TlvSet tlvSet = new TlvSet(); + ArrayList optionalParameters = event.getOptionalParameters(); + if (optionalParameters != null && optionalParameters.size() > 0) { + for (Tlv tlv : optionalParameters) { + if (tlv.getTag() != SmppConstants.TAG_MESSAGE_PAYLOAD) { + tlvSet.addOptionalParameter(tlv); + } + } + } + boolean mcDeliveryReceipt = (event.getEsmClass() & Sms.ESME_DELIVERY_ACK) != 0; + CdrDetailedGenerator.generateDetailedCdr(mcDeliveryReceipt, shortMessageText, tlvSet, null, timestampB, null, null, + esme.getName(), eventType, errorCode, messageType, statusCode, -1, esme.getRemoteAddressAndPort(), null, + event.getSequenceNumber(), smscPropertiesManagement.getGenerateReceiptCdr(), + smscPropertiesManagement.getGenerateDetailedCdr()); + } + protected void generateMprocFailureDetailedCdr(Sms sms, EventType eventType, ErrorCode errorCode, String messageType, int statusCode, int mprocRuleId, String sourceAddrAndPort, int seqNumber) { CdrDetailedGenerator.generateDetailedCdr(sms, eventType, errorCode, messageType, statusCode, mprocRuleId, diff --git a/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrDetailedGenerator.java b/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrDetailedGenerator.java index d5617b69e..d9a653f5c 100644 --- a/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrDetailedGenerator.java +++ b/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrDetailedGenerator.java @@ -5,6 +5,7 @@ import org.apache.log4j.Logger; import org.mobicents.smsc.mproc.DeliveryReceiptData; +import org.restcomm.smpp.parameter.TlvSet; public class CdrDetailedGenerator { private static final Logger logger = Logger.getLogger(CdrDetailedGenerator.class); @@ -37,65 +38,111 @@ public static void generateDetailedCdr(String message) { logger.debug(message); } - public static void generateDetailedCdr(Sms smsEvent, EventType eventType, ErrorCode errorCode, String messageType, + public static void generateDetailedCdr(Sms sms, EventType eventType, ErrorCode errorCode, String messageType, long statusCode, int mprocRuleId, String sourceAddrAndPort, String destAddrAndPort, int seqNumber, boolean generateReceiptCdr, boolean generateDetailedCdr) { + + generateDetailedCdr(sms.isMcDeliveryReceipt(), sms.getShortMessageText(), sms.getTlvSet(), sms.getTimestampA(), + sms.getTimestampB(), sms.getTimestampC(), sms.getMessageId(), sms.getOrigEsmeName(), eventType, errorCode, + messageType, statusCode, mprocRuleId, sourceAddrAndPort, destAddrAndPort, seqNumber, generateReceiptCdr, + generateDetailedCdr); + } + + public static void generateDetailedCdr(boolean mcDeliveryReceipt, String shortMessageText, TlvSet tlvSet, Long tsA, + Long tsB, Long tsC, Long messageId, String origEsmeName, EventType eventType, ErrorCode errorCode, + String messageType, long statusCode, int mprocRuleId, String sourceAddrAndPort, String destAddrAndPort, + int seqNumber, boolean generateReceiptCdr, boolean generateDetailedCdr) { // Format is // CDR recording timestamp, Event type, ErrorCode (status), MessageType, Status code, CorrelationId, OrigCorrelationId // DlrStatus, mprocRuleId, ESME name, Timestamp A, Timestamp B, Timestamp C, Source IP, Source port, Dest IP, Dest port, // SequenceNumber - if (!generateDetailedCdr) + if (!generateDetailedCdr) { return; + } - if (!generateReceiptCdr && smsEvent.isMcDeliveryReceipt()) + if (!generateReceiptCdr && mcDeliveryReceipt) { // we do not generate CDR's for receipt if generateReceiptCdr option is off return; - + } String timestamp = DATE_FORMAT.format(new Date()); - Long receiptLocalMessageId = smsEvent.getReceiptLocalMessageId(); - - DeliveryReceiptData deliveryReceiptData = MessageUtil.parseDeliveryReceipt(smsEvent.getShortMessageText(), - smsEvent.getTlvSet()); String dlrStatus = null; - if (deliveryReceiptData != null) { - dlrStatus = deliveryReceiptData.getStatus(); - int tlvMessageState = deliveryReceiptData.getTlvMessageState(); - if (tlvMessageState != 0 && dlrStatus != null) - if (!dlrStatus.substring(0, 4).equals(MessageState.fromInt(tlvMessageState).toString().substring(0, 5))) { - dlrStatus = "err"; + String origMessageID = null; + + DeliveryReceiptData deliveryReceiptData = null; + if (shortMessageText != null && tlvSet != null) { + deliveryReceiptData = MessageUtil.parseDeliveryReceipt(shortMessageText, tlvSet); + if (deliveryReceiptData != null) { + dlrStatus = deliveryReceiptData.getStatus(); + if (deliveryReceiptData.getTlvMessageState() != null) { + int tlvMessageState = deliveryReceiptData.getTlvMessageState(); + if (tlvMessageState != 0 && dlrStatus != null) + if (!dlrStatus.substring(0, 4) + .equals(MessageState.fromInt(tlvMessageState).toString().substring(0, 5))) { + dlrStatus = "err"; + } } + origMessageID = deliveryReceiptData.getMessageId(); + } } - String[] parts = destAddrAndPort.split(":"); - String destIP = parts[0]; - int destPort = Integer.parseInt(parts[1]); - parts = sourceAddrAndPort.split(":"); - String sourceIP = parts[0]; - int sourcePort = Integer.parseInt(parts[1]); - - String timestampA = DATE_FORMAT.format(smsEvent.getTimestampA()); - String timestampB = DATE_FORMAT.format(smsEvent.getTimestampB()); - String timestampC = DATE_FORMAT.format(smsEvent.getTimestampC()); - - StringBuffer sb = new StringBuffer(); - sb.append(timestamp).append(CdrGenerator.CDR_SEPARATOR) - .append(eventType != null ? eventType : CdrDetailedGenerator.CDR_EMPTY).append(CdrGenerator.CDR_SEPARATOR) - .append(errorCode != null ? errorCode : CdrDetailedGenerator.CDR_EMPTY).append(CdrGenerator.CDR_SEPARATOR) - .append(messageType).append(CdrGenerator.CDR_SEPARATOR).append(statusCode).append(CdrGenerator.CDR_SEPARATOR) - .append(smsEvent.getMessageId()).append(CdrGenerator.CDR_SEPARATOR) - .append(receiptLocalMessageId == null ? receiptLocalMessageId : CdrDetailedGenerator.CDR_EMPTY) - .append(CdrGenerator.CDR_SEPARATOR).append(dlrStatus == null ? dlrStatus : CdrDetailedGenerator.CDR_EMPTY) - .append(CdrGenerator.CDR_SEPARATOR).append(mprocRuleId != -1 ? mprocRuleId : CDR_EMPTY) - // check this, maybe it should be smsEvent.getSmsSet().getCorrelationId() - .append(smsEvent.getMessageId()).append(CdrGenerator.CDR_SEPARATOR).append(smsEvent.getOrigEsmeName()) - .append(CdrGenerator.CDR_SEPARATOR).append(timestampA).append(CdrGenerator.CDR_SEPARATOR).append(timestampB) - .append(CdrGenerator.CDR_SEPARATOR).append(timestampC).append(CdrGenerator.CDR_SEPARATOR).append(sourceIP) - .append(CdrGenerator.CDR_SEPARATOR).append(sourcePort).append(CdrGenerator.CDR_SEPARATOR).append(destIP) - .append(CdrGenerator.CDR_SEPARATOR).append(destPort).append(CdrGenerator.CDR_SEPARATOR) - .append(seqNumber != -1 ? seqNumber : CDR_EMPTY).append(CdrGenerator.CDR_SEPARATOR); + String destIP = null, destPort = null; + if (destAddrAndPort != null) { + String[] parts = destAddrAndPort.split(":"); + destIP = parts[0]; + destPort = parts[1]; + } + + String sourceIP = null, sourcePort = null; + if (sourceAddrAndPort != null) { + String[] parts = sourceAddrAndPort.split(":"); + sourceIP = parts[0]; + sourcePort = parts[1]; + } + + String timestampA = null, timestampB = null, timestampC = null; + if (tsA != null && tsA != 0) + timestampA = DATE_FORMAT.format(tsA); + if (tsB != null && tsB != 0) + timestampB = DATE_FORMAT.format(tsB); + if (tsC != null && tsC != 0) + timestampC = DATE_FORMAT.format(tsC); + + StringBuilder sb = new StringBuilder(); + appendObject(sb, timestamp); + appendObject(sb, eventType); + appendObject(sb, errorCode); + appendObject(sb, messageType); + appendNumber(sb, statusCode); + appendNumber(sb, messageId); + appendObject(sb, origMessageID); + appendObject(sb, dlrStatus); + appendNumber(sb, Long.valueOf(mprocRuleId)); + appendObject(sb, origEsmeName); + appendObject(sb, timestampA); + appendObject(sb, timestampB); + appendObject(sb, timestampC); + appendObject(sb, sourceIP); + appendObject(sb, sourcePort); + appendObject(sb, destIP); + appendObject(sb, destPort); + appendNumber(sb, Long.valueOf(seqNumber)); CdrDetailedGenerator.generateDetailedCdr(sb.toString()); } + + // 14:23:08.421,IN_SMPP_REJECT_FORBIDDEN,REJECT_INCOMING,SubmitSm,,,,-1,test,2017-07-15 + // 14:23:08.415,,,127.0.0.1,null45542,,,2 + + private static void appendObject(StringBuilder sb, Object obj) { + sb.append(obj != null ? obj : CdrDetailedGenerator.CDR_EMPTY); + sb.append(CdrGenerator.CDR_SEPARATOR); + } + + private static void appendNumber(StringBuilder sb, Long num) { + sb.append(num != null ? num != -1 ? num : CdrDetailedGenerator.CDR_EMPTY : CdrDetailedGenerator.CDR_EMPTY); + sb.append(CdrGenerator.CDR_SEPARATOR); + } + } diff --git a/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrGenerator.java b/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrGenerator.java index 15a57df93..0ea4d4e2e 100644 --- a/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrGenerator.java +++ b/core/smsc-common-library/src/main/java/org/mobicents/smsc/library/CdrGenerator.java @@ -113,7 +113,9 @@ public static void generateCdr(Sms smsEvent, String status, String reason, boole if (deliveryReceiptData != null) { st = deliveryReceiptData.getStatus(); - tlvMessageState = deliveryReceiptData.getTlvMessageState(); + if(deliveryReceiptData.getTlvMessageState() != null) { + tlvMessageState = deliveryReceiptData.getTlvMessageState(); + } err = deliveryReceiptData.getError(); }