/**
   * @param smsMessage
   * @param msg
   * @return
   * @throws PersistenceException
   */
  @Override
  public SendModem2Info saveOrUpdate(SendSMSMessage smsMessage, OutboundMessage msg)
      throws PersistenceException {
    SendModem2Info config = new SendModem2Info();

    config.setGatewayID(msg.getGatewayId());

    config.setMessageId(String.valueOf(msg.getMessageId()));
    config.setMessageUUID(msg.getUuid());
    config.setEncoding(msg.getEncoding().toString());
    config.setDataGerada(msg.getDate().toString());
    config.setSmscRefNum(msg.getRefNo());
    config.setNumDestinatario(smsMessage.getNumero());
    if (msg.getDispatchDate() == null) {

      config.setDataExapedicao("Não há data prevista para expedição");

    } else {
      config.setDataExapedicao(msg.getDispatchDate().toString());
    }
    config.setMsgStatus(msg.getMessageStatus().toString());
    config.setCausaFalha(String.valueOf(msg.getFailureCause()));
    config.setPeriodoValido(String.valueOf(msg.getValidityPeriod()));
    config.setRelatorioStatus(msg.getStatusReport());
    config.setPortaDestino(String.valueOf(msg.getSrcPort()));
    config.setFlashSMS(msg.getFlashSms());
    config.setMensagem(smsMessage.getMensagem());
    config.setPduData(msg.getPduUserData());

    if (msg.getScheduledDeliveryDate() == null) {

      config.setEntregaPrevista("SEM DATA PREVISTA");
    } else {
      config.setEntregaPrevista(msg.getScheduledDeliveryDate().toString());
    }
    return new BaseRepository<SendModem2Info>(SendModem2Info.class).saveOrUpdate(config);
  }
 @Override
 public boolean sendMessage(OutboundMessage msg)
     throws TimeoutException, GatewayException, IOException, InterruptedException {
   URL url = null;
   List<HttpHeader> request = new ArrayList<HttpHeader>();
   List<String> response;
   String reqLine;
   boolean ok = false;
   request.add(new HttpHeader("username", this.username, false));
   request.add(new HttpHeader("password", this.password, false));
   request.add(new HttpHeader("message", msg.getText(), false));
   request.add(new HttpHeader("msisdn", msg.getRecipient().substring(1), false));
   request.add(new HttpHeader("allow_concat_text_sms", "1", false));
   if (msg.getStatusReport()) request.add(new HttpHeader("want_report", "1", false));
   if (msg.getFlashSms()) request.add(new HttpHeader("msg_class", "0", false));
   if (msg.getFrom() != null && msg.getFrom().length() != 0)
     request.add(new HttpHeader("source_id", msg.getFrom(), false));
   else if (getFrom() != null && getFrom().length() != 0)
     request.add(new HttpHeader("source_id", getFrom(), false));
   reqLine = ExpandHttpHeaders(request);
   url = new URL(this.providerUrl + "/eapi/submission/send_sms/2/2.0" + "?" + reqLine);
   synchronized (this.SYNC_Commander) {
     response = HttpGet(url);
   }
   if (response.get(0).charAt(0) == '0') {
     StringTokenizer tokens = new StringTokenizer(response.get(0), "|");
     tokens.nextToken();
     tokens.nextToken();
     msg.setRefNo(tokens.nextToken());
     msg.setDispatchDate(new Date());
     msg.setGatewayId(getGatewayId());
     msg.setMessageStatus(MessageStatuses.SENT);
     incOutboundMessageCount();
     ok = true;
   } else {
     StringTokenizer tokens = new StringTokenizer(response.get(0), "|");
     switch (Integer.parseInt(tokens.nextToken())) {
       case 22:
         msg.setFailureCause(FailureCauses.GATEWAY_FAILURE);
         break;
       case 23:
         msg.setFailureCause(FailureCauses.GATEWAY_AUTH);
         break;
       case 24:
         msg.setFailureCause(FailureCauses.BAD_FORMAT);
         break;
       case 25:
       case 26:
       case 27:
       case 28:
         msg.setFailureCause(FailureCauses.NO_CREDIT);
         break;
       case 40:
         msg.setFailureCause(FailureCauses.GATEWAY_FAILURE);
         break;
     }
     msg.setRefNo(null);
     msg.setDispatchDate(null);
     msg.setMessageStatus(MessageStatuses.FAILED);
     ok = false;
   }
   return ok;
 }