use of org.mobicents.protocols.ss7.map.api.service.sms.SMDeliveryOutcome in project smscgateway by RestComm.
the class MtCommonSbb method onDeliveryError.
/**
* Processing a case when an error in message sending process. This stops of message sending, reschedule or drop messages
* and clear resources.
*
* @param smsSet
* @param errorAction
* @param smStatus
* @param reason
* @param removeSmsSet
* @param errMessage
* @param isImsiVlrReject
* @param processingType
*/
protected void onDeliveryError(SmsSet smsSet, ErrorAction errorAction, ErrorCode smStatus, String reason, boolean removeSmsSet, MAPErrorMessage errMessage, boolean isImsiVlrReject, ProcessingType processingType) {
try {
smscStatAggregator.updateMsgOutFailedAll();
// generating of a temporary failure CDR
if (smscPropertiesManagement.getGenerateTempFailureCdr())
this.generateTemporaryFailureCDR(CdrGenerator.CDR_TEMP_FAILED, reason);
StringBuilder sb = new StringBuilder();
sb.append("onDeliveryError: errorAction=");
sb.append(errorAction);
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());
ArrayList<Sms> lstPermFailured = new ArrayList<Sms>();
ArrayList<Sms> lstTempFailured = new ArrayList<Sms>();
ArrayList<Sms> lstPermFailured2 = new ArrayList<Sms>();
ArrayList<Sms> lstTempFailured2 = new ArrayList<Sms>();
ArrayList<Sms> lstRerouted = new ArrayList<Sms>();
ArrayList<Integer> lstNewNetworkId = new ArrayList<Integer>();
// generate text for Delivery receipts
// false
String dlrText = null;
if (errMessage != null) {
MAPErrorMessageSMDeliveryFailure smDeliveryFailure = errMessage.getEmSMDeliveryFailure();
if (smDeliveryFailure != null) {
SmsDeliverReportTpdu tpdu = null;
try {
tpdu = errMessage.getEmSMDeliveryFailure().getSmsDeliverReportTpdu();
} catch (MAPException e) {
// we ignore Exception here
}
if (tpdu != null) {
UserData userData = tpdu.getUserData();
if (userData != null) {
byte[] data = userData.getEncodedData();
if (data != null) {
String text = DatatypeConverter.printHexBinary(data);
String smDlrWithTpdu = SmscPropertiesManagement.getInstance().getSmDeliveryFailureDlrWithTpdu();
if (smDlrWithTpdu.equals("short")) {
if (text.length() > 20)
dlrText = text.substring(0, 20);
else
dlrText = text;
} else if (smDlrWithTpdu.equals("full")) {
dlrText = text;
}
}
}
}
}
}
TargetAddress lock = persistence.obtainSynchroObject(new TargetAddress(smsSet));
synchronized (lock) {
try {
Date curDate = new Date();
smsSet.setStatus(smStatus);
// calculating of newDueDelay and NewDueTime
int newDueDelay = calculateNewDueDelay(smsSet, (errorAction == ErrorAction.subscriberBusy));
Date newDueTime = calculateNewDueTime(smsSet, newDueDelay);
// creating of failure lists
this.createFailureLists(lstPermFailured, lstTempFailured, errorAction, newDueTime);
// mproc rules applying for delivery phase
this.applyMprocRulesOnFailure(lstPermFailured, lstTempFailured, lstPermFailured2, lstTempFailured2, lstRerouted, lstNewNetworkId, processingType);
// sending of a failure response for transactional mode
this.sendTransactionalResponseFailure(lstPermFailured2, lstTempFailured2, errorAction, errMessage);
// Processing messages that were temp or permanent failed or rerouted
this.postProcessPermFailures(lstPermFailured2, null, null);
this.postProcessTempFailures(smsSet, lstTempFailured2, newDueDelay, newDueTime, true);
this.postProcessRerouted(lstRerouted, lstNewNetworkId);
// generating CDRs for permanent failure messages
this.generateCDRs(lstPermFailured2, (isImsiVlrReject ? CdrGenerator.CDR_FAILED_IMSI : CdrGenerator.CDR_FAILED), reason);
// sending of intermediate delivery receipts
this.generateIntermediateReceipts(smsSet, lstTempFailured2);
// sending of failure delivery receipts
this.generateFailureReceipts(smsSet, lstPermFailured2, dlrText);
// sending of ReportSMDeliveryStatusRequest if needed
SMDeliveryOutcome smDeliveryOutcome = null;
switch(errorAction) {
case memoryCapacityExceededFlag:
smDeliveryOutcome = SMDeliveryOutcome.memoryCapacityExceeded;
break;
case mobileNotReachableFlag:
smDeliveryOutcome = SMDeliveryOutcome.absentSubscriber;
break;
case notReachableForGprs:
smDeliveryOutcome = SMDeliveryOutcome.absentSubscriber;
break;
}
if (smDeliveryOutcome != null && lstTempFailured2.size() > 0) {
Sms sms0 = smsSet.getSms(0);
String mtLocalSccpGt = null;
Integer mtRemoteSccpTt = null;
if (sms0 != null) {
mtLocalSccpGt = sms0.getMtLocalSccpGt();
mtRemoteSccpTt = sms0.getMtRemoteSccpTt();
}
this.setupReportSMDeliveryStatusRequest(smsSet.getDestAddr(), smsSet.getDestAddrTon(), smsSet.getDestAddrNpi(), smDeliveryOutcome, smsSet.getTargetId(), smsSet.getNetworkId(), mtLocalSccpGt, mtRemoteSccpTt);
}
this.markDeliveringIsEnded(removeSmsSet);
} finally {
persistence.releaseSynchroObject(lock);
}
}
} catch (Throwable e) {
logger.severe("Exception in MtCommonSbb.onDeliveryError(): " + e.getMessage(), e);
markDeliveringIsEnded(true);
}
}
Aggregations