Search in sources :

Example 11 with MProcResult

use of org.mobicents.smsc.mproc.impl.MProcResult in project smscgateway by RestComm.

the class SubmitCommonSbb method forwardMessage.

protected void forwardMessage(Sms sms0, boolean withCharging, SmscStatAggregator smscStatAggregator, String messageType, int seqNumber) throws SmscProcessingException {
    ChargingMedium chargingMedium = null;
    EventType eventTypeFailure = null;
    int statusCode = 0;
    switch(sms0.getOriginationType()) {
        case SMPP:
            chargingMedium = ChargingMedium.TxSmppOrig;
            eventTypeFailure = EventType.IN_SMPP_REJECT_MPROC;
            break;
        case SS7_MO:
        case SS7_HR:
            chargingMedium = ChargingMedium.MoOrig;
            break;
        case SIP:
            chargingMedium = ChargingMedium.TxSipOrig;
            break;
        case HTTP:
            chargingMedium = ChargingMedium.HttpOrig;
            eventTypeFailure = EventType.IN_HTTP_REJECT_MPROC;
            break;
    }
    if (withCharging) {
        ChargingSbbLocalObject chargingSbb = getChargingSbbObject();
        chargingSbb.setupChargingRequestInterface(chargingMedium, sms0);
    } else {
        // applying of MProc
        MProcResult mProcResult = MProcManagement.getInstance().applyMProcArrival(itsMProcRa, sms0, persistence);
        FastList<Sms> smss = mProcResult.getMessageList();
        if (smss != null) {
            for (FastList.Node<Sms> n = smss.head(), end = smss.tail(); (n = n.getNext()) != end; ) {
                Sms sms = n.getValue();
                TargetAddress ta = new TargetAddress(sms.getSmsSet());
                TargetAddress lock = persistence.obtainSynchroObject(ta);
                try {
                    sms.setTimestampC(System.currentTimeMillis());
                    synchronized (lock) {
                        boolean storeAndForwMode = MessageUtil.isStoreAndForward(sms);
                        if (!storeAndForwMode) {
                            try {
                                this.scheduler.injectSmsOnFly(sms.getSmsSet(), true);
                            } catch (Exception e) {
                                throw new SmscProcessingException("Exception when running injectSmsOnFly(): " + e.getMessage(), SmppConstants.STATUS_SYSERR, MAPErrorCode.systemFailure, SmscProcessingException.HTTP_ERROR_CODE_NOT_SET, null, e, SmscProcessingException.INTERNAL_ERROR_INJECT_STORE_AND_FORWARD_NOT_SET);
                            }
                        } else {
                            // store and forward
                            if (smscPropertiesManagement.getStoreAndForwordMode() == StoreAndForwordMode.fast && sms.getScheduleDeliveryTime() == null) {
                                try {
                                    sms.setStoringAfterFailure(true);
                                    this.scheduler.injectSmsOnFly(sms.getSmsSet(), true);
                                } catch (Exception e) {
                                    throw new SmscProcessingException("Exception when running injectSmsOnFly(): " + e.getMessage(), SmppConstants.STATUS_SYSERR, MAPErrorCode.systemFailure, SmscProcessingException.HTTP_ERROR_CODE_NOT_SET, null, e, SmscProcessingException.INTERNAL_ERROR_INJECT_STORE_AND_FORWARD_FAST);
                                }
                            } else {
                                try {
                                    sms.setStored(true);
                                    this.scheduler.setDestCluster(sms.getSmsSet());
                                    persistence.c2_scheduleMessage_ReschedDueSlot(sms, smscPropertiesManagement.getStoreAndForwordMode() == StoreAndForwordMode.fast, false);
                                } catch (PersistenceException e) {
                                    throw new SmscProcessingException("PersistenceException when storing LIVE_SMS : " + e.getMessage(), SmppConstants.STATUS_SUBMITFAIL, MAPErrorCode.systemFailure, SmscProcessingException.HTTP_ERROR_CODE_NOT_SET, null, e, SmscProcessingException.INTERNAL_ERROR_INJECT_STORE_AND_FORWARD_NORMAL);
                                }
                            }
                        }
                    }
                } finally {
                    persistence.releaseSynchroObject(lock);
                }
            }
        }
        if (mProcResult.isMessageRejected()) {
            sms0.setMessageDeliveryResultResponse(null);
            if (eventTypeFailure != null) {
                String sourceAddrAndPort = null;
                if (eventTypeFailure == EventType.IN_SMPP_REJECT_MPROC) {
                    EsmeManagement esmeManagement = EsmeManagement.getInstance();
                    if (esmeManagement != null) {
                        // for testing there is no EsmeManagement
                        Esme esme = esmeManagement.getEsmeByClusterName(sms0.getOrigEsmeName());
                        // null check is for testing
                        if (esme != null) {
                            sourceAddrAndPort = esme.getRemoteAddressAndPort();
                        }
                    }
                    statusCode = mProcResult.getSmppErrorCode();
                } else if (eventTypeFailure == EventType.IN_HTTP_REJECT_MPROC) {
                    statusCode = mProcResult.getHttpErrorCode();
                }
                generateMprocFailureDetailedCdr(sms0, eventTypeFailure, ErrorCode.REJECT_INCOMING_MPROC, messageType, statusCode, mProcResult.getRuleIdDropReject(), sourceAddrAndPort, seqNumber);
            }
            rejectSmsByMProc(sms0, "Message is rejected by MProc rules.", mProcResult);
        }
        if (mProcResult.isMessageDropped()) {
            sms0.setMessageDeliveryResultResponse(null);
            smscStatAggregator.updateMsgInFailedAll();
            if (eventTypeFailure != null) {
                String sourceAddrAndPort = null;
                if (eventTypeFailure == EventType.IN_SMPP_REJECT_MPROC) {
                    eventTypeFailure = EventType.IN_SMPP_DROP_MPROC;
                    EsmeManagement esmeManagement = EsmeManagement.getInstance();
                    if (esmeManagement != null) {
                        // for testing there is no EsmeManagement
                        Esme esme = esmeManagement.getEsmeByClusterName(sms0.getOrigEsmeName());
                        // null check is for testing
                        if (esme != null) {
                            sourceAddrAndPort = esme.getRemoteAddressAndPort();
                        }
                    }
                    statusCode = mProcResult.getSmppErrorCode();
                } else if (eventTypeFailure == EventType.IN_HTTP_REJECT_MPROC) {
                    eventTypeFailure = EventType.IN_HTTP_DROP_MPROC;
                    statusCode = mProcResult.getHttpErrorCode();
                }
                generateMprocFailureDetailedCdr(sms0, eventTypeFailure, ErrorCode.REJECT_INCOMING_MPROC, messageType, statusCode, mProcResult.getRuleIdDropReject(), sourceAddrAndPort, seqNumber);
            }
            rejectSmsByMProc(sms0, "Message is dropped by MProc rules.", mProcResult);
        }
        smscStatAggregator.updateMsgInReceivedAll();
        switch(sms0.getOriginationType()) {
            case SMPP:
                smscStatAggregator.updateMsgInReceivedSmpp();
                break;
            case SS7_MO:
                smscStatAggregator.updateMsgInReceivedSs7();
                smscStatAggregator.updateMsgInReceivedSs7Mo();
                break;
            case SS7_HR:
                smscStatAggregator.updateMsgInReceivedSs7();
                smscStatAggregator.updateMsgInReceivedSs7Hr();
                break;
            case SIP:
                smscStatAggregator.updateMsgInReceivedSip();
                break;
        }
    }
}
Also used : EsmeManagement(org.restcomm.smpp.EsmeManagement) EventType(org.mobicents.smsc.library.EventType) SmscProcessingException(org.mobicents.smsc.library.SmscProcessingException) Esme(org.restcomm.smpp.Esme) FastList(javolution.util.FastList) TargetAddress(org.mobicents.smsc.library.TargetAddress) SmscProcessingException(org.mobicents.smsc.library.SmscProcessingException) CreateException(javax.slee.CreateException) PersistenceException(org.mobicents.smsc.cassandra.PersistenceException) ChargingSbbLocalObject(org.mobicents.smsc.slee.services.charging.ChargingSbbLocalObject) ChargingMedium(org.mobicents.smsc.slee.services.charging.ChargingMedium) MProcResult(org.mobicents.smsc.mproc.impl.MProcResult) Sms(org.mobicents.smsc.library.Sms) PersistenceException(org.mobicents.smsc.cassandra.PersistenceException)

Example 12 with MProcResult

use of org.mobicents.smsc.mproc.impl.MProcResult in project smscgateway by RestComm.

the class DeliveryCommonSbb method endDeliveryAfterValidityPeriod.

/**
 * Finishing delivering of a message which validity period is over at the start of delivery time.
 *
 * @param sms
 * @param processingType
 * @param dlvMessageId
 * @param dlvDestId
 */
protected void endDeliveryAfterValidityPeriod(Sms sms, ProcessingType processingType, String dlvMessageId, String dlvDestId) {
    // ending of delivery process in this SBB
    ErrorCode smStatus = ErrorCode.VALIDITY_PERIOD_EXPIRED;
    ErrorAction errorAction = ErrorAction.permanentFailure;
    String reason = "Validity period is expired";
    smsSet.setStatus(smStatus);
    StringBuilder sb = new StringBuilder();
    sb.append("onDeliveryError: errorAction=validityExpired");
    sb.append(", smStatus=");
    sb.append(smStatus);
    sb.append(", targetId=");
    sb.append(smsSet.getTargetId());
    sb.append(", smsSet=");
    sb.append(smsSet);
    sb.append(", reason=");
    sb.append(reason);
    if (this.logger.isInfoEnabled())
        this.logger.info(sb.toString());
    // mproc rules applying for delivery phase
    MProcResult mProcResult = MProcManagement.getInstance().applyMProcDelivery(itsMProcRa, sms, true, processingType);
    if (mProcResult.isMessageIsRerouted()) {
        // we do not reroute a message with expired validity period
        sb = new StringBuilder();
        sb.append("Can not reroute of a message with expired ValidityPeriod, sms=");
        sb.append(sms);
        this.logger.warning(sb.toString());
    }
    FastList<Sms> addedMessages = mProcResult.getMessageList();
    if (addedMessages != null) {
        for (FastList.Node<Sms> n = addedMessages.head(), end = addedMessages.tail(); (n = n.getNext()) != end; ) {
            Sms smst = n.getValue();
            TargetAddress ta = new TargetAddress(smst.getSmsSet().getDestAddrTon(), smst.getSmsSet().getDestAddrNpi(), smst.getSmsSet().getDestAddr(), smst.getSmsSet().getNetworkId());
            this.sendNewGeneratedMessage(smst, ta);
            if (this.logger.isInfoEnabled()) {
                sb = new StringBuilder();
                sb.append("Posting of a new message after PermFailure-ValidityPeriod: targetId=");
                sb.append(smst.getSmsSet().getTargetId());
                sb.append(", sms=");
                sb.append(smst);
                this.logger.info(sb.toString());
            }
        }
    }
    ArrayList<Sms> lstPermFailured = new ArrayList<Sms>();
    lstPermFailured.add(sms);
    // sending of a failure response for transactional mode
    this.sendTransactionalResponseFailure(lstPermFailured, null, errorAction, null);
    // Processing messages that were temp or permanent failed or rerouted
    this.postProcessPermFailures(lstPermFailured, dlvMessageId, dlvDestId);
    // generating CDRs for permanent failure messages
    this.generateCDRs(lstPermFailured, CdrGenerator.CDR_FAILED, reason);
    EsmeManagement esmeManagement = EsmeManagement.getInstance();
    if (esmeManagement != null) {
        Esme esme = null;
        if (smsSet.getDestClusterName() != null) {
            esme = esmeManagement.getEsmeByClusterName(smsSet.getDestClusterName());
        }
        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();
        }
        this.generateDetailedCDRs(lstPermFailured, EventType.VALIDITY_PERIOD_TIMEOUT, smStatus, messageType, remoteAddr, -1);
    }
    // sending of failure delivery receipts
    this.generateFailureReceipts(smsSet, lstPermFailured, null);
}
Also used : EsmeManagement(org.restcomm.smpp.EsmeManagement) Esme(org.restcomm.smpp.Esme) FastList(javolution.util.FastList) ArrayList(java.util.ArrayList) TargetAddress(org.mobicents.smsc.library.TargetAddress) ISDNAddressString(org.restcomm.protocols.ss7.map.api.primitives.ISDNAddressString) ErrorAction(org.mobicents.smsc.library.ErrorAction) MProcResult(org.mobicents.smsc.mproc.impl.MProcResult) Sms(org.mobicents.smsc.library.Sms) ErrorCode(org.mobicents.smsc.library.ErrorCode)

Example 13 with MProcResult

use of org.mobicents.smsc.mproc.impl.MProcResult in project smscgateway by RestComm.

the class ChargingSbb method acceptSms.

private void acceptSms(ChargingData chargingData) throws SmscProcessingException {
    Sms sms0 = chargingData.getSms();
    if (logger.isInfoEnabled()) {
        logger.info("ChargingSbb: accessGranted for: chargingType=" + chargingData.getChargingType() + ", message=[" + sms0 + "]");
    }
    try {
        MProcResult mProcResult = MProcManagement.getInstance().applyMProcArrival(itsMProcRa, sms0, persistence);
        FastList<Sms> smss = mProcResult.getMessageList();
        if (smss != null) {
            for (FastList.Node<Sms> n = smss.head(), end = smss.tail(); (n = n.getNext()) != end; ) {
                Sms sms = n.getValue();
                TargetAddress ta = new TargetAddress(sms.getSmsSet());
                TargetAddress lock = persistence.obtainSynchroObject(ta);
                sms.setTimestampC(System.currentTimeMillis());
                try {
                    synchronized (lock) {
                        boolean storeAndForwMode = MessageUtil.isStoreAndForward(sms);
                        if (!storeAndForwMode) {
                            try {
                                this.scheduler.injectSmsOnFly(sms.getSmsSet(), true);
                            } catch (Exception e) {
                                throw new SmscProcessingException("Exception when runnung injectSmsOnFly(): " + e.getMessage(), SmppConstants.STATUS_SYSERR, MAPErrorCode.systemFailure, SmscProcessingException.HTTP_ERROR_CODE_NOT_SET, null, e);
                            }
                        } else {
                            if (smscPropertiesManagement.getStoreAndForwordMode() == StoreAndForwordMode.fast) {
                                try {
                                    sms.setStoringAfterFailure(true);
                                    this.scheduler.injectSmsOnFly(sms.getSmsSet(), true);
                                } catch (Exception e) {
                                    throw new SmscProcessingException("Exception when runnung injectSmsOnFly(): " + e.getMessage(), SmppConstants.STATUS_SYSERR, MAPErrorCode.systemFailure, SmscProcessingException.HTTP_ERROR_CODE_NOT_SET, null, e);
                                }
                            } else {
                                sms.setStored(true);
                                // if (smscPropertiesManagement.getDatabaseType() == DatabaseType.Cassandra_1) {
                                // persistence.createLiveSms(sms);
                                // persistence.setNewMessageScheduled(sms.getSmsSet(),
                                // MessageUtil.computeDueDate(MessageUtil.computeFirstDueDelay(smscPropertiesManagement.getFirstDueDelay())));
                                // } else {
                                this.scheduler.setDestCluster(sms.getSmsSet());
                                persistence.c2_scheduleMessage_ReschedDueSlot(sms, smscPropertiesManagement.getStoreAndForwordMode() == StoreAndForwordMode.fast, false);
                            // }
                            }
                        }
                    }
                } finally {
                    persistence.releaseSynchroObject(lock);
                }
            }
        }
        if (mProcResult.isMessageRejected()) {
            rejectSmsByMproc(chargingData, true);
            return;
        }
        if (mProcResult.isMessageDropped()) {
            rejectSmsByMproc(chargingData, false);
            return;
        }
        // sending success response for charging result
        if (sms0.getMessageDeliveryResultResponse() != null && sms0.getMessageDeliveryResultResponse().isOnlyChargingRequest()) {
            sms0.getMessageDeliveryResultResponse().responseDeliverySuccess();
            sms0.setTimestampB(System.currentTimeMillis());
            EventType eventTypeSuccess = null;
            String messageType = null;
            String sourceAddr = null;
            int seqNum = -1;
            switch(sms0.getOriginationType()) {
                case SMPP:
                    eventTypeSuccess = EventType.IN_SMPP_RECEIVED;
                    MessageDeliveryResultResponseInterface resp = sms0.getMessageDeliveryResultResponse();
                    messageType = resp.getMessageType();
                    seqNum = resp.getSeqNumber();
                    break;
                case HTTP:
                    eventTypeSuccess = EventType.IN_HTTP_RECEIVED;
                    messageType = CdrDetailedGenerator.CDR_MSG_TYPE_HTTP;
                    break;
                default:
                    break;
            }
            if (eventTypeSuccess != null) {
                EsmeManagement esmeManagement = EsmeManagement.getInstance();
                if (esmeManagement != null) {
                    // for testing there is no EsmeManagement
                    Esme esme = esmeManagement.getEsmeByClusterName(sms0.getOrigEsmeName());
                    // null check is for testing
                    if (esme != null) {
                        sourceAddr = esme.getRemoteAddressAndPort();
                    }
                }
                CdrDetailedGenerator.generateDetailedCdr(sms0, eventTypeSuccess, sms0.getSmsSet().getStatus(), messageType, SmppConstants.STATUS_OK, -1, sourceAddr, null, seqNum, smscPropertiesManagement.getGenerateReceiptCdr(), smscPropertiesManagement.getGenerateDetailedCdr());
            }
            sms0.setMessageDeliveryResultResponse(null);
        }
        smscStatAggregator.updateMsgInReceivedAll();
        switch(sms0.getOriginationType()) {
            case SMPP:
                smscStatAggregator.updateMsgInReceivedSmpp();
                break;
            case SS7_MO:
                smscStatAggregator.updateMsgInReceivedSs7();
                smscStatAggregator.updateMsgInReceivedSs7Mo();
                break;
            case SS7_HR:
                smscStatAggregator.updateMsgInReceivedSs7();
                smscStatAggregator.updateMsgInReceivedSs7Hr();
                break;
            case SIP:
                smscStatAggregator.updateMsgInReceivedSip();
                break;
            default:
                break;
        }
    } catch (PersistenceException e) {
        if (sms0 != null) {
            generateCDR(sms0, CdrGenerator.CDR_SUBMIT_FAILED_CHARGING, e.getMessage(), false, true);
        }
        throw new SmscProcessingException("PersistenceException when storing LIVE_SMS : " + e.getMessage(), SmppConstants.STATUS_SUBMITFAIL, MAPErrorCode.systemFailure, SmscProcessingException.HTTP_ERROR_CODE_NOT_SET, null, e);
    }
}
Also used : EsmeManagement(org.restcomm.smpp.EsmeManagement) EventType(org.mobicents.smsc.library.EventType) SmscProcessingException(org.mobicents.smsc.library.SmscProcessingException) Esme(org.restcomm.smpp.Esme) FastList(javolution.util.FastList) TargetAddress(org.mobicents.smsc.library.TargetAddress) SmscProcessingException(org.mobicents.smsc.library.SmscProcessingException) CreateException(javax.slee.CreateException) PersistenceException(org.mobicents.smsc.cassandra.PersistenceException) MessageDeliveryResultResponseInterface(org.mobicents.smsc.library.MessageDeliveryResultResponseInterface) MProcResult(org.mobicents.smsc.mproc.impl.MProcResult) Sms(org.mobicents.smsc.library.Sms) PersistenceException(org.mobicents.smsc.cassandra.PersistenceException)

Example 14 with MProcResult

use of org.mobicents.smsc.mproc.impl.MProcResult in project smscgateway by RestComm.

the class HrSriClientSbb method onSriFullResponse.

private void onSriFullResponse() {
    SendRoutingInfoForSMResponse sendRoutingInfoForSMResponse = this.getSendRoutingInfoForSMResponse();
    MAPErrorMessage errorMessage = this.getErrorResponse();
    CorrelationIdValue correlationIdValue = this.getCorrelationIdValue();
    if (correlationIdValue == null) {
        this.logger.severe("Home routing HrSriClientSbb.onSriFullResponse(): CorrelationIdValue CMP missed");
        return;
    }
    if (sendRoutingInfoForSMResponse != null) {
        // we have positive response to SRI request
        correlationIdValue.setImsi(sendRoutingInfoForSMResponse.getIMSI().getData());
        correlationIdValue.setLocationInfoWithLMSI(sendRoutingInfoForSMResponse.getLocationInfoWithLMSI());
        correlationIdValue.setSendRoutingInfoForSMResponse(sendRoutingInfoForSMResponse);
        MProcResult mProcResult = MProcManagement.getInstance().applyMProcHrSri(getMProcRuleRa(), correlationIdValue);
        if (mProcResult.isHrIsByPassed()) {
            this.returnSriHrByPass(correlationIdValue);
        } else {
            this.returnSriSuccess(correlationIdValue);
        }
        return;
    }
    if (errorMessage != null) {
        // we have a negative response
        this.returnSriFailure(correlationIdValue, errorMessage, "Home routing HrSriClientSbb.onSriFullResponse(): MAP ErrorMessage received: " + errorMessage);
    } else {
        // we have no responses - this is an error behaviour
        this.returnSriFailure(correlationIdValue, null, "Home routing HrSriClientSbb.onSriFullResponse(): Empty response after SRI Request");
    }
}
Also used : MProcResult(org.mobicents.smsc.mproc.impl.MProcResult) SendRoutingInfoForSMResponse(org.restcomm.protocols.ss7.map.api.service.sms.SendRoutingInfoForSMResponse) CorrelationIdValue(org.mobicents.smsc.library.CorrelationIdValue) MAPErrorMessage(org.restcomm.protocols.ss7.map.api.errors.MAPErrorMessage)

Aggregations

MProcResult (org.mobicents.smsc.mproc.impl.MProcResult)14 FastList (javolution.util.FastList)12 Sms (org.mobicents.smsc.library.Sms)11 TargetAddress (org.mobicents.smsc.library.TargetAddress)6 MProcMessage (org.mobicents.smsc.mproc.MProcMessage)6 MProcRule (org.mobicents.smsc.mproc.MProcRule)6 MProcMessageImpl (org.mobicents.smsc.mproc.impl.MProcMessageImpl)5 MProcNewMessage (org.mobicents.smsc.mproc.MProcNewMessage)4 MProcNewMessageImpl (org.mobicents.smsc.mproc.impl.MProcNewMessageImpl)4 Esme (org.restcomm.smpp.Esme)4 EsmeManagement (org.restcomm.smpp.EsmeManagement)4 ArrayList (java.util.ArrayList)2 CreateException (javax.slee.CreateException)2 PersistenceException (org.mobicents.smsc.cassandra.PersistenceException)2 ErrorAction (org.mobicents.smsc.library.ErrorAction)2 ErrorCode (org.mobicents.smsc.library.ErrorCode)2 EventType (org.mobicents.smsc.library.EventType)2 SmscProcessingException (org.mobicents.smsc.library.SmscProcessingException)2 ISDNAddressString (org.restcomm.protocols.ss7.map.api.primitives.ISDNAddressString)2 CorrelationIdValue (org.mobicents.smsc.library.CorrelationIdValue)1