コード例 #1
0
  /**
   * Deletes the specified offline message in the store for a user. The way to identify the message
   * to delete is based on the creationDate and username.
   *
   * @param username the username of the user who's message is going to be deleted.
   * @param creationDate the date when the offline message was stored in the database.
   */
  public void deleteMessage(String username, Date creationDate) {
    Connection con = null;
    PreparedStatement pstmt = null;
    try {
      con = DbConnectionManager.getConnection();
      pstmt = con.prepareStatement(DELETE_OFFLINE_MESSAGE);
      pstmt.setString(1, username);
      pstmt.setString(2, StringUtils.dateToMillis(creationDate));
      pstmt.executeUpdate();

      // Force a refresh for next call to getSize(username),
      // it's easier than loading the message to be deleted just
      // to update the cache.
      removeUsernameFromSizeCache(username);
    } catch (Exception e) {
      Log.error(
          "Error deleting offline messages of username: "******" creationDate: "
              + creationDate,
          e);
    } finally {
      DbConnectionManager.closeConnection(pstmt, con);
    }
  }
コード例 #2
0
  /**
   * Deletes all offline messages in the store for a user.
   *
   * @param username the username of the user who's messages are going to be deleted.
   */
  public void deleteMessages(String username) {
    Connection con = null;
    PreparedStatement pstmt = null;
    try {
      con = DbConnectionManager.getConnection();
      pstmt = con.prepareStatement(DELETE_OFFLINE);
      pstmt.setString(1, username);
      pstmt.executeUpdate();

      removeUsernameFromSizeCache(username);
    } catch (Exception e) {
      Log.error("Error deleting offline messages of username: " + username, e);
    } finally {
      DbConnectionManager.closeConnection(pstmt, con);
    }
  }
コード例 #3
0
  /**
   * Returns a Collection of all messages in the store for a user. Messages may be deleted after
   * being selected from the database depending on the delete param.
   *
   * @param username the username of the user who's messages you'd like to receive.
   * @param delete true if the offline messages should be deleted.
   * @return An iterator of packets containing all offline messages.
   */
  public Collection<OfflineMessage> getMessages(String username, boolean delete) {
    List<OfflineMessage> messages = new ArrayList<>();
    SAXReader xmlReader = null;
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    try {
      // Get a sax reader from the pool
      xmlReader = xmlReaders.take();
      con = DbConnectionManager.getConnection();
      pstmt = con.prepareStatement(LOAD_OFFLINE);
      pstmt.setString(1, username);
      rs = pstmt.executeQuery();
      while (rs.next()) {
        String msgXML = rs.getString(1);
        Date creationDate = new Date(Long.parseLong(rs.getString(2).trim()));
        OfflineMessage message;
        try {
          message =
              new OfflineMessage(
                  creationDate, xmlReader.read(new StringReader(msgXML)).getRootElement());
        } catch (DocumentException e) {
          // Try again after removing invalid XML chars (e.g. &#12;)
          Matcher matcher = pattern.matcher(msgXML);
          if (matcher.find()) {
            msgXML = matcher.replaceAll("");
          }
          try {
            message =
                new OfflineMessage(
                    creationDate, xmlReader.read(new StringReader(msgXML)).getRootElement());
          } catch (DocumentException de) {
            Log.error("Failed to route packet (offline message): " + msgXML, de);
            continue; // skip and process remaining offline messages
          }
        }

        // if there is already a delay stamp, we shouldn't add another.
        Element delaytest = message.getChildElement("delay", "urn:xmpp:delay");
        if (delaytest == null) {
          // Add a delayed delivery (XEP-0203) element to the message.
          Element delay = message.addChildElement("delay", "urn:xmpp:delay");
          delay.addAttribute("from", XMPPServer.getInstance().getServerInfo().getXMPPDomain());
          delay.addAttribute("stamp", XMPPDateTimeFormat.format(creationDate));
        }
        messages.add(message);
      }
      // Check if the offline messages loaded should be deleted, and that there are
      // messages to delete.
      if (delete && !messages.isEmpty()) {
        PreparedStatement pstmt2 = null;
        try {
          pstmt2 = con.prepareStatement(DELETE_OFFLINE);
          pstmt2.setString(1, username);
          pstmt2.executeUpdate();
          removeUsernameFromSizeCache(username);
        } catch (Exception e) {
          Log.error("Error deleting offline messages of username: "******"Error retrieving offline messages of username: " + username, e);
    } finally {
      DbConnectionManager.closeConnection(rs, pstmt, con);
      // Return the sax reader to the pool
      if (xmlReader != null) {
        xmlReaders.add(xmlReader);
      }
    }
    return messages;
  }