package org.esupportail.helpdesk.services.feed.imap; import java.io.IOException; import javax.mail.Message; import javax.mail.Part; import org.esupportail.commons.utils.Assert; import org.esupportail.helpdesk.domain.ActionScope; import org.esupportail.helpdesk.domain.beans.Ticket; import org.esupportail.helpdesk.domain.beans.User; import org.esupportail.helpdesk.services.feed.ErrorHolder; import org.esupportail.helpdesk.services.feed.imap.replytocleaner.ReplyToMessageCleaner; import org.springframework.util.StringUtils; /** * @author lusl0338 * Reads email message and creates action (comments) from it. */ public class ActionMessageReaderImpl extends TicketMessageReaderImpl implements ActionMessageReader { /** * The serialization id. */ private static final long serialVersionUID = 8704592124129262036L; /** * The sender of email. */ private User sender; /** * The content is set (only the first one should be set as comment). */ private Boolean contentPartSet; /** * Message cleaner used for stripping original message in reply. */ private ReplyToMessageCleaner messageCleaner; /** * Bean constructor. */ public ActionMessageReaderImpl() { super(); } /** * @see org.esupportail.helpdesk.services.feed.imap.TicketMessageReaderImpl#afterPropertiesSet() */ @Override public void afterPropertiesSet() { super.afterPropertiesSet(); Assert.notNull(messageCleaner, "property messageCleaner of class " + this.getClass().getName() + " can not be null"); } /** * @see org.esupportail.helpdesk.services.feed.imap.TicketMessageReaderImpl#getTextPart( * javax.mail.Part, org.esupportail.helpdesk.domain.beans.Ticket, java.lang.String, * org.esupportail.helpdesk.services.feed.ErrorHolder) */ @Override protected void getTextPart( final Part part, final Ticket ticket, @SuppressWarnings("unused") final String partIndex, final ErrorHolder errorHolder) { if (contentPartSet) { return; } errorHolder.addInfo("analysing text/plain part " + part + "..."); String content = getPartContentAsString(part, errorHolder); if (!StringUtils.hasText(content)) { return; } byte [] contentByteArray = contentToByteArray(content, errorHolder); if (contentByteArray == null) { return; } content = messageCleaner.clean(content); content = content.replaceAll("\"", """); content = content.replaceAll("<", "<"); content = content.replaceAll(">", ">"); content = content.replaceAll("[\\r\\n]+", "<br />"); getDomainService().giveInformation( sender, ticket, content, ActionScope.OWNER, false); contentPartSet = true; } /** * @see org.esupportail.helpdesk.services.feed.imap.TicketMessageReaderImpl#getHtmlPart( * javax.mail.Part, org.esupportail.helpdesk.domain.beans.Ticket, java.lang.String, * org.esupportail.helpdesk.services.feed.ErrorHolder) */ @Override protected void getHtmlPart( final Part part, final Ticket ticket, @SuppressWarnings("unused") final String partIndex, final ErrorHolder errorHolder) { if (contentPartSet) { return; } errorHolder.addInfo("analysing text/html part " + part + "..."); String content = getPartContentAsString(part, errorHolder); if (!StringUtils.hasText(content)) { return; } byte [] contentByteArray = contentToByteArray(content, errorHolder); if (contentByteArray == null) { return; } content = messageCleaner.clean(content); MessageHtmlCleaner cleaner = new MessageHtmlCleaner(content); String output; try { cleaner.clean(); output = cleaner.getXmlAsString(); } catch (IOException e) { errorHolder.addInfo("could not clean the HTML: " + e.getMessage()); return; } getDomainService().giveInformation( sender, ticket, output, ActionScope.OWNER, false); contentPartSet = true; } /** * @see org.esupportail.helpdesk.services.feed.imap.ActionMessageReader#readMessage( * javax.mail.Message, org.esupportail.helpdesk.domain.beans.Ticket, * org.esupportail.helpdesk.services.feed.ErrorHolder) */ @Override public User readMessage( final Message message, final Ticket ticket, final ErrorHolder errorHolder) { sender = extractSender(message, errorHolder); if (errorHolder.hasErrors()) { errorHolder.addInfo(errorHolder.getErrorNumber() + " error(s) found, skiping the mail"); } else { contentPartSet = false; getMessageParts(message, ticket, errorHolder); } return sender; } /** * Gets message cleaner object. * @return the message cleaner */ protected ReplyToMessageCleaner getMessageCleaner() { return messageCleaner; } /** * Sets the message cleaner object. * @param messageCleaner the message cleaner */ public void setMessageCleaner(final ReplyToMessageCleaner messageCleaner) { this.messageCleaner = messageCleaner; } }