/** * 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); } }
/** * 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); } }
/** * 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. ) 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; }