@Override public void execute(final Object message) throws Exception { if (logger.isInfoEnabled()) { logger.info("Preparing the USSD Message"); } if (End.class.equals(message.getClass())) { Boolean hasCollect = false; UssdRestcommResponse ussdRestcommResponse = new UssdRestcommResponse(); String language = ""; if (ussdLanguageTag == null) { language = "en"; ussdRestcommResponse.setLanguage(language); } else { language = ussdLanguageTag.text(); ussdRestcommResponse.setLanguage(language); } if (language.equalsIgnoreCase("en")) { maxMessageLength = englishLength; ussdRestcommResponse.setMessageLength(englishLength); } else { maxMessageLength = nonEnglishLength; ussdRestcommResponse.setMessageLength(nonEnglishLength); } StringBuffer ussdText = processUssdMessageTags(ussdMessageTags); if (ussdCollectTag != null) { hasCollect = true; ussdCollectAction = ussdCollectTag.attribute("action").value(); ussdRestcommResponse.setUssdCollectAction(ussdCollectAction); Queue<Tag> children = new java.util.concurrent.ConcurrentLinkedQueue<Tag>(ussdCollectTag.children()); if (children != null && children.size() > 0) { ussdText.append(processUssdMessageTags(children)); } else if (ussdCollectTag.text() != null) { ussdText.append(ussdCollectTag.text()); } } if (ussdText.length() > maxMessageLength) { final String errorString = "Error while preparing the USSD response. Ussd text length more " + "than the permitted for the selected language: " + maxMessageLength; Notification notification = notification(ERROR_NOTIFICATION, 11100, errorString); if (notification != null) { final NotificationsDao notifications = storage.getNotificationsDao(); notifications.addNotification(notification); sendMail(notification); } if (logger.isInfoEnabled()) { logger.info(errorString); } ussdText = new StringBuffer(); ussdText.append( "Error while preparing the response.\nMessage length exceeds the maximum."); } ussdRestcommResponse.setMessage(ussdText.toString()); if (logger.isInfoEnabled()) { logger.info("UssdMessage prepared, hasCollect: " + hasCollect); logger.info( "UssdMessage prepared: " + ussdMessage.toString() + " hasCollect: " + hasCollect); } if (callInfo.direction().equalsIgnoreCase("inbound")) { // USSD PULL if (hasCollect) { ussdRestcommResponse.setMessageType(UssdMessageType.unstructuredSSRequest_Request); ussdRestcommResponse.setIsFinalMessage(false); } else { ussdRestcommResponse.setMessageType( UssdMessageType.processUnstructuredSSRequest_Response); ussdRestcommResponse.setIsFinalMessage(true); } } else { // USSD PUSH if (hasCollect) { ussdRestcommResponse.setMessageType(UssdMessageType.unstructuredSSRequest_Request); ussdRestcommResponse.setIsFinalMessage(false); } else { ussdRestcommResponse.setMessageType(UssdMessageType.unstructuredSSNotify_Request); if (ussdRestcommResponse.getErrorCode() != null) { ussdRestcommResponse.setIsFinalMessage(true); } else { ussdRestcommResponse.setIsFinalMessage(false); } } } if (logger.isInfoEnabled()) { logger.info("UssdRestcommResponse message prepared: " + ussdRestcommResponse); } ussdCall.tell(ussdRestcommResponse, source); } }