@SuppressWarnings({"rawtypes", "deprecation"})
  @Override
  public int getUndownloadUserAmountByApplicationVersionWithCardSecurityDomain(
      ApplicationVersion applicationVersion) {
    long appVerId = applicationVersion.getId();
    long appId = applicationVersion.getApplication().getId();
    String sql = " SELECT a.card_id ";
    sql += " FROM card_security_domain a";
    sql += " WHERE NOT EXISTS";
    sql += " (SELECT 1";
    sql += " FROM card_application b";
    sql += " WHERE a.card_id              = b.card_info_id";
    sql += " AND b.application_version_id = " + appVerId;
    sql +=
        " AND b.status                IN ("
            + CardApplication.STATUS_AVAILABLE
            + ","
            + CardApplication.STATUS_LOCKED
            + ","
            + CardApplication.STATUS_PERSONALIZED
            + ","
            + CardApplication.STATUS_AVAILABLE
            + ")";
    sql += " )";
    sql += " AND EXISTS";
    sql += " (SELECT 1 FROM application c WHERE a.security_id = c.sd_id AND c.id = " + appId;
    sql += " )";
    Session session = this.getSession();
    List list = session.createSQLQuery(sql).addScalar("card_id", Hibernate.LONG).list();
    if (list.isEmpty()) return 0;
    List<Long> cardIdList = new ArrayList<Long>();
    for (int index = 0; index < list.size(); index++) {
      Long cardId = (Long) list.get(index);
      String check =
          "SELECT COUNT(1) amount FROM card_application a WHERE EXISTS (SELECT 1 FROM application_version b WHERE a.application_version_id = b.id AND b.application_id = "
              + appId
              + " ) AND a.card_info_id = "
              + cardId
              + " AND a.application_version_id != "
              + appVerId
              + " AND a.status IN ("
              + CardApplication.STATUS_LOCKED
              + ","
              + CardApplication.STATUS_AVAILABLE
              + ","
              + CardApplication.STATUS_PERSONALIZED
              + ")";
      List l = session.createSQLQuery(check).addScalar("amount", Hibernate.LONG).list();
      long size = (Long) l.get(0);
      if (size > 0) continue;
      cardIdList.add(cardId);
    }

    if (cardIdList.isEmpty()) return 0;
    String cardIds = "";
    for (Long id : cardIdList) {
      cardIds += "," + id;
    }
    cardIds = cardIds.replaceFirst(",", "");

    String query = " SELECT COUNT(1) amount ";
    query += " FROM ";
    query += " (SELECT a.card_id, ";
    query += " a.free_non_volatile_space ram, ";
    query += " a.free_volatile_space rom ";
    query += " FROM card_security_domain a ";
    query += " WHERE a.card_id IN (" + cardIds + ") ";
    query += " AND EXISTS ";
    query +=
        " (SELECT 1 FROM application c WHERE a.security_id = c.sd_id AND c.id = " + appId + ") ";
    query += " ) a, ";
    query += " application_version b ";
    query += " WHERE b.id = " + appVerId;
    query += " AND a.ram >= b.non_volatile_space ";
    query += " AND a.rom >= b.volatile_space ";

    this.logger.debug("\n\n" + query + "\n\n");
    return getUndownloadUserAmountByApplicationVersion(query);
  }