/**
   * Find messages order by descending timestamp by different criteria.
   *
   * @param data The message data value object carrying query criteria.
   * @param numberOfMessage max no. of message in return.
   * @param offset no. of starting record in return.
   * @throws DAOException
   */
  public List findMessagesByHistory(MessageDVO data, int numberOfMessage, int offset)
      throws DAOException {

    List parameters = new ArrayList();
    boolean hasSearchCriteria = false;
    String sql = super.getFinder("find_message_by_history");

    if (data.getMessageId() != null && !data.getMessageId().trim().equals("")) {
      sql += " AND " + getFilter("find_message_by_history_filter_message_id");
      parameters.add(data.getMessageId());
    }

    if (data.getMessageBox() != null && !data.getMessageBox().trim().equals("")) {
      sql += " AND " + getFilter("find_message_by_history_filter_message_box");
      parameters.add(data.getMessageBox());
    }

    if (data.getCpaId() != null && !data.getCpaId().trim().equals("")) {
      sql += " AND " + getFilter("find_message_by_history_filter_cpa_id");
      parameters.add(data.getCpaId());
    }

    if (data.getService() != null && !data.getService().trim().equals("")) {
      sql += " AND " + getFilter("find_message_by_history_filter_service");
      parameters.add(data.getService());
    }

    if (data.getAction() != null && !data.getAction().trim().equals("")) {
      sql += " AND " + getFilter("find_message_by_history_filter_action");
      parameters.add(data.getAction());
    }

    if (data.getStatus() != null && !data.getStatus().trim().equals("")) {
      sql += " AND " + getFilter("find_message_by_history_filter_status");
      parameters.add(data.getStatus());
    }

    if (data.getConvId() != null && !data.getConvId().trim().equals("")) {
      sql += " AND " + getFilter("find_message_by_history_filter_conv_id");
      parameters.add(data.getConvId());
    }

    if (data.getPrimalMessageId() != null && !data.getPrimalMessageId().trim().equals("")) {
      sql += " AND " + getFilter("find_message_by_history_filter_primal_message_id");
      parameters.add(data.getPrimalMessageId());
    }

    sql += " " + getOrder("find_message_by_history_order");
    parameters.add(new Integer(numberOfMessage));
    parameters.add(new Integer(offset));

    return executeQuery(sql, parameters.toArray());
  }
  /**
   * Find number of messages by different criteria.
   *
   * @param data The message data value object carrying query criteria.
   * @throws DAOException
   */
  public int findNumberOfMessagesByHistory(MessageDVO data) throws DAOException {
    try {
      List parameters = new ArrayList();
      String sql = super.getFinder("find_number_of_message_by_history");

      if (data.getMessageId() != null && !data.getMessageId().trim().equals("")) {
        sql += " AND " + getFilter("find_number_of_message_by_history_filter_message_id");
        parameters.add(data.getMessageId());
      }

      if (data.getMessageBox() != null && !data.getMessageBox().trim().equals("")) {
        sql += " AND " + getFilter("find_number_of_message_by_history_filter_message_box");
        parameters.add(data.getMessageBox());
      }

      if (data.getCpaId() != null && !data.getCpaId().trim().equals("")) {
        sql += " AND " + getFilter("find_number_of_message_by_history_filter_cpa_id");
        parameters.add(data.getCpaId());
      }

      if (data.getService() != null && !data.getService().trim().equals("")) {
        sql += " AND " + getFilter("find_number_of_message_by_history_filter_service");
        parameters.add(data.getService());
      }

      if (data.getAction() != null && !data.getAction().trim().equals("")) {
        sql += " AND " + getFilter("find_number_of_message_by_history_filter_action");
        parameters.add(data.getAction());
      }

      if (data.getStatus() != null && !data.getStatus().trim().equals("")) {
        sql += " AND " + getFilter("find_number_of_message_by_history_filter_status");
        parameters.add(data.getStatus());
      }

      if (data.getConvId() != null && !data.getConvId().trim().equals("")) {
        sql += " AND " + getFilter("find_number_of_message_by_history_filter_conv_id");
        parameters.add(data.getConvId());
      }

      if (data.getPrimalMessageId() != null && !data.getPrimalMessageId().trim().equals("")) {
        sql += " AND " + getFilter("find_number_of_message_by_history_filter_primal_message_id");
        parameters.add(data.getPrimalMessageId());
      }

      List queryResult = executeRawQuery(sql, parameters.toArray());
      List resultEntry = (List) queryResult.get(0);
      return ((Number) resultEntry.get(0)).intValue();
    } catch (Exception e) {
      throw new DAOException("Unable to find the number of messages by history", e);
    }
  }
 // find all the ordered messages by messagebox, cpa and status
 public List findOrderedMessagesByMessageBoxAndCpaAndStatus(MessageDVO data) throws DAOException {
   return super.find(
       "find_ordered_messages_by_message_box_and_cpa_and_status",
       new Object[] {
         data.getMessageBox(),
         data.getCpaId(),
         data.getService(),
         data.getAction(),
         data.getConvId(),
         data.getStatus()
       });
 }