in server/src/main/java/org/apache/hupa/server/preferences/InImapUserPreferencesStorage.java [124:171]
protected static void saveUserPreferencesInIMAP(Log logger, User user, Session session, IMAPStore iStore, String folderName, String subject, Object object)
throws MessagingException, IOException, InterruptedException {
IMAPFolder folder = (IMAPFolder) iStore.getFolder(folderName);
if (folder.exists() || folder.create(IMAPFolder.HOLDS_MESSAGES)) {
if (!folder.isOpen()) {
folder.open(Folder.READ_WRITE);
}
// Serialize the object
ByteArrayOutputStream fout = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(object);
oos.close();
ByteArrayInputStream is = new ByteArrayInputStream(fout.toByteArray());
// Create a new message with an attachment which has the serialized object
MimeMessage message = new MimeMessage(session);
message.setSubject(subject);
Multipart multipart = new MimeMultipart();
MimeBodyPart txtPart = new MimeBodyPart();
txtPart.setContent("This message contains configuration used by Hupa, do not delete it", "text/plain");
multipart.addBodyPart(txtPart);
FileItem item = createPreferencesFileItem(is, subject, HUPA_DATA_MIME_TYPE);
multipart.addBodyPart(MessageUtils.fileitemToBodypart(item));
message.setContent(multipart);
message.saveChanges();
// It seems it's not possible to modify the content of an existing message using the API
// So I delete the previous message storing the preferences and I create a new one
Message[] msgs = folder.getMessages();
for (Message msg : msgs) {
if (subject.equals(msg.getSubject())) {
msg.setFlag(Flag.DELETED, true);
}
}
// It is necessary to copy the message before saving it (the same problem in AbstractSendMessageHandler)
message = new MimeMessage((MimeMessage)message);
message.setFlag(Flag.SEEN, true);
folder.appendMessages(new Message[] { message });
folder.close(true);
logger.info("Saved preferences " + subject + " in imap folder " + folderName + " for user " + user);
} else {
logger.error("Unable to save preferences " + subject + " in imap folder " + folderName + " for user " + user);
}
}