protected static void saveUserPreferencesInIMAP()

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);
        }
    }