Esempio n. 1
0
    @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);
      }
    }