Author: echatellier Date: 2014-06-19 14:16:21 +0200 (Thu, 19 Jun 2014) New Revision: 227 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/227 Log: Gestion des content-id des pieces jointes. Gestion du chargement ?\195?\160 la demande des pi?\195?\168ces jointes. Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AttachmentFileImpl.java trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AttachmentImpl.java trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/EditAttachmentAction.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/OpenAttachmentAction.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java 2014-06-18 17:13:29 UTC (rev 226) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java 2014-06-19 12:16:21 UTC (rev 227) @@ -235,10 +235,14 @@ return applicationConfig.getOption(FaxToMailConfigurationOption.SMTP_PASSWORD.getKey()); } - public boolean getSmtpUseSsl() { + public boolean isSmtpUseSsl() { return applicationConfig.getOptionAsBoolean(FaxToMailConfigurationOption.SMTP_SSL.getKey()); } + public boolean isMailDeleteRemote() { + return applicationConfig.getOptionAsBoolean(FaxToMailConfigurationOption.MAIL_DELETE_REMOTE.getKey()); + } + public String getLdapHost() { return applicationConfig.getOption(FaxToMailConfigurationOption.LDAP_HOST.getKey()); } Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java 2014-06-18 17:13:29 UTC (rev 226) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java 2014-06-19 12:16:21 UTC (rev 227) @@ -72,6 +72,11 @@ "Utilisation on non du mode ssl pour le stmp", "false", Boolean.class), + MAIL_DELETE_REMOTE( + "faxtomail.mail.deleteremote", + "Suppression automatique des mails sur le serveur distant (default : true)", + "true", Boolean.class), + DEV_MODE( "faxtomail.devMode", "Mode développement, court-circuite l'envoi de mail", Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AttachmentFileImpl.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AttachmentFileImpl.java 2014-06-18 17:13:29 UTC (rev 226) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AttachmentFileImpl.java 2014-06-19 12:16:21 UTC (rev 227) @@ -48,17 +48,14 @@ @Override public File getFile() { - log.info("get content"); byte[] content = getContent(); if (tmpLocalFile == null && content != null) { try { - log.info("create temp file"); // create temp file File tempFolder = new File(FileUtils.getTempDirectory(), "faxtomail"); tempFolder.mkdir(); - log.info("new file"); String fileName = getFilename(); tmpLocalFile = new File(tempFolder, fileName); @@ -76,7 +73,6 @@ tmpLocalFile.deleteOnExit(); - log.info("copy blob content"); // copy blob content // be sure that "is" is not closed because is can be a local fileinputstream // that hibernate must read to put in database Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AttachmentImpl.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AttachmentImpl.java 2014-06-18 17:13:29 UTC (rev 226) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AttachmentImpl.java 2014-06-19 12:16:21 UTC (rev 227) @@ -9,12 +9,16 @@ @Override public void setOriginalFile(AttachmentFile originalFile) { super.setOriginalFile(originalFile); - setOriginalFileName(originalFile != null ? originalFile.getFilename() : null); + if (originalFile != null) { + setOriginalFileName(originalFile.getFilename()); + } } @Override public void setEditedFile(AttachmentFile editedFile) { super.setEditedFile(editedFile); - setEditedFileName(editedFile != null ? editedFile.getFilename() : null); + if (editedFile != null) { + setEditedFileName(editedFile.getFilename()); + } } } Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo =================================================================== (Binary files differ) Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java 2014-06-18 17:13:29 UTC (rev 226) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java 2014-06-19 12:16:21 UTC (rev 227) @@ -167,7 +167,15 @@ } // copy new data - currentAttachment.setAddedByUser(attachment.isAddedByUser()); + attachmentBinder.copyExcluding(attachment, currentAttachment, + Attachment.PROPERTY_EDITED_FILE, + Attachment.PROPERTY_EDITED_FILE_NAME, + Attachment.PROPERTY_ORIGINAL_FILE, + Attachment.PROPERTY_ORIGINAL_FILE_NAME, + Attachment.PROPERTY_TOPIA_CREATE_DATE, + Attachment.PROPERTY_TOPIA_ID, + Attachment.PROPERTY_TOPIA_VERSION); + currentAttachment.setEditedFile(editedFile); currentAttachment.setOriginalFile(originalFile); @@ -532,7 +540,7 @@ final String smtpUser = getApplicationConfig().getSmtpUser(); final String password = getApplicationConfig().getSmtpPassword(); - final boolean useSsl = getApplicationConfig().getSmtpUseSsl(); + final boolean useSsl = getApplicationConfig().isSmtpUseSsl(); MultiPartEmail message = new MultiPartEmail(); message.setHostName(getApplicationConfig().getSmtpHost()); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/EditAttachmentAction.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/EditAttachmentAction.java 2014-06-18 17:13:29 UTC (rev 226) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/EditAttachmentAction.java 2014-06-19 12:16:21 UTC (rev 227) @@ -41,7 +41,8 @@ MainUI mainUI = getContext().getMainUI(); PDFEditorUI dialogContent = new PDFEditorUI(getUI()); - boolean editedNull = attachment.getEditedFileName() == null; + FaxToMailUIUtil.forceAttachmentFileLoading(getContext(), attachment); + /*boolean editedNull = attachment.getEditedFileName() == null; AttachmentFile attachmentFile = editedNull ? attachment.getOriginalFile() : attachment.getEditedFile(); if (attachmentFile == null) { attachmentFile = getContext().getEmailService().getAttachmentFile(attachment.getTopiaId(), editedNull); @@ -51,7 +52,7 @@ attachment.setOriginalFile(attachmentFile); } else { attachment.setEditedFile(attachmentFile); - } + }*/ dialogContent.getModel().fromEntity(attachment); getHandler().openDialog(dialogContent, attachment.getOriginalFileName(), mainUI.getSize()); dialogContent.getModel().toEntity(attachment); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/OpenAttachmentAction.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/OpenAttachmentAction.java 2014-06-18 17:13:29 UTC (rev 226) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/OpenAttachmentAction.java 2014-06-19 12:16:21 UTC (rev 227) @@ -1,10 +1,33 @@ package com.franciaflex.faxtomail.ui.swing.actions; +/* + * #%L + * FaxToMail :: UI + * %% + * Copyright (C) 2014 Franciaflex + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; import com.franciaflex.faxtomail.ui.swing.content.attachment.AttachmentEditorUI; import com.franciaflex.faxtomail.ui.swing.content.attachment.AttachmentEditorUIHandler; import com.franciaflex.faxtomail.ui.swing.content.attachment.AttachmentEditorUIModel; +import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -39,16 +62,8 @@ @Override public void doAction() throws Exception { getModel().fireAttachmentOpened(attachment, original); + FaxToMailUIUtil.forceAttachmentFileLoading(getContext(), attachment); AttachmentFile attachmentFile = original ? attachment.getOriginalFile() : attachment.getEditedFile(); - if (attachmentFile == null) { - attachmentFile = getContext().getEmailService().getAttachmentFile(attachment.getTopiaId(), original); - if (original) { - attachment.setOriginalFile(attachmentFile); - } else { - attachment.setEditedFile(attachmentFile); - } - } - File file = attachmentFile.getFile(); DesktopUtil.browse(file.toURI()); } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java 2014-06-18 17:13:29 UTC (rev 226) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java 2014-06-19 12:16:21 UTC (rev 227) @@ -46,8 +46,6 @@ import com.franciaflex.faxtomail.ui.swing.util.CloseableUI; import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; import com.franciaflex.faxtomail.ui.swing.util.FolderTreeNode; -import com.google.common.base.Function; -import com.google.common.collect.Collections2; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -454,7 +452,6 @@ for (Attachment attachment : demandeUIModel.getAttachment()) { AttachmentFile attachmentFile = attachment.getEditedFile(); if (attachmentFile == null) { - // TODO kmorin 20140617 put it in action and check if file is null attachmentFile = attachment.getOriginalFile(); } FaxToMailUIUtil.print(attachmentFile, true); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java 2014-06-18 17:13:29 UTC (rev 226) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java 2014-06-19 12:16:21 UTC (rev 227) @@ -150,7 +150,7 @@ initBeanFilterableComboBox(ui.getEtatAttenteComboBox(), etatAttentes, model.getEtatAttente()); JTextPane editor = ui.getMailBodyField(); - FaxToMailUIUtil.setEmailContentInTextPane(editor, model); + FaxToMailUIUtil.setEmailContentInTextPane(this, editor, model); // init table final JXTable table = ui.getRangeTable(); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java 2014-06-18 17:13:29 UTC (rev 226) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java 2014-06-19 12:16:21 UTC (rev 227) @@ -22,23 +22,21 @@ * #L% */ -import com.franciaflex.faxtomail.persistence.entities.Attachment; -import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; -import com.franciaflex.faxtomail.persistence.entities.MailFolder; -import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; -import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; -import com.franciaflex.faxtomail.ui.swing.content.demande.RangeRowModel; +import static org.nuiton.i18n.I18n.t; -import jaxx.runtime.JAXXObject; -import jaxx.runtime.JAXXUtil; +import java.awt.Desktop; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.jaxx.application.ApplicationBusinessException; -import org.nuiton.jaxx.application.ApplicationTechnicalException; -import org.nuiton.jaxx.application.swing.util.ApplicationUIUtil; -import org.nuiton.util.FileUtil; - import javax.print.Doc; import javax.print.DocFlavor; import javax.print.DocPrintJob; @@ -49,7 +47,9 @@ import javax.print.SimpleDoc; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; -import javax.swing.*; +import javax.swing.Icon; +import javax.swing.JTextPane; +import javax.swing.JTree; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.html.HTMLEditorKit; @@ -59,19 +59,25 @@ import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; -import java.awt.*; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import jaxx.runtime.JAXXObject; +import jaxx.runtime.JAXXUtil; -import static org.nuiton.i18n.I18n.t; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.application.ApplicationBusinessException; +import org.nuiton.jaxx.application.ApplicationTechnicalException; +import org.nuiton.jaxx.application.swing.util.ApplicationUIUtil; +import org.nuiton.util.FileUtil; +import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; +import com.franciaflex.faxtomail.persistence.entities.MailFolder; +import com.franciaflex.faxtomail.services.service.EmailService; +import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; +import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIHandler; +import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; +import com.franciaflex.faxtomail.ui.swing.content.demande.RangeRowModel; + /** * @author tchemit <chemit@codelutin.com> * @since 0.1 @@ -181,18 +187,6 @@ return result; } - /*public static boolean isFileAPDF(File file) { - return FileUtil.extension(file).toUpperCase().equals("PDF"); - } - - public static boolean isFileATxt(File file) { - return FileUtil.extension(file).toUpperCase().equals("TXT"); - } - - public static boolean isFileATif(File file) { - return FileUtil.extension(file).toUpperCase().equals("TIF"); - }*/ - public static boolean isFileAPDF(AttachmentFile file) { return FileUtil.extension(file.getFilename()).toUpperCase().equals("PDF"); } @@ -205,7 +199,7 @@ return FileUtil.extension(file.getFilename()).toUpperCase().equals("TIF"); } - public static void setEmailContentInTextPane(JTextPane textPane, DemandeUIModel demandeUIModel) { + public static void setEmailContentInTextPane(DemandeUIHandler handler, JTextPane textPane, DemandeUIModel demandeUIModel) { String content = demandeUIModel.getHtmlContent(); if (content != null) { textPane.setContentType("text/html"); @@ -224,14 +218,36 @@ // the meta tag makes the content is not displayed content = content.replaceAll("<meta (.*?)>(</meta>)?", ""); + if (log.isTraceEnabled()) { + log.trace("Content before mail = " + content); + } + for (Attachment attachment : demandeUIModel.getAttachment()) { - String fileName = attachment.getOriginalFileName(); - log.info("file " + fileName); - String key = fileName; + String key = attachment.getContentId(); + if (key == null) { + key = attachment.getOriginalFileName(); + } + + // get file content + forceAttachmentFileLoading(handler.getContext(), attachment); + AttachmentFile attachmentFile = attachment.getOriginalFile(); + File file = attachmentFile.getFile(); + // replace the inline attachments with the extracted attachment file url - //content = content.replaceAll("<img src=\"cid:" + key + "\"(.*?>)", "<img src=\"file://" + file.getAbsolutePath() + "\"$1"); - throw new RuntimeException("Fix it"); + // match les patterns: + // <td background="cid:bg.gif" height="52"> + // <img border=0 src="cid:bg.gif" /> + // <img src='cid:5e9ef859-ea65-4f9b-a9fa-30d4a2c5837c' + content = content.replaceAll("(\\w+)=([\"'])cid:" + Pattern.quote(key) + "([\"'])", "$1=$2file://" + file.getAbsolutePath() + "$3"); + + if (log.isDebugEnabled()) { + log.debug("Mapping attachment id " + key + " to file " + file.getAbsolutePath()); + } } + + if (log.isTraceEnabled()) { + log.trace("Content after mail = " + content); + } } else { content = demandeUIModel.getPlainContent(); @@ -239,6 +255,27 @@ textPane.setText(content); } + /** + * Force le chargement des attachmentFile (edited and original) pour un attachment. + * + * @param context context + * @param attachment attachment + */ + public static void forceAttachmentFileLoading(FaxToMailUIContext context, Attachment attachment) { + if (log.isDebugEnabled()) { + log.debug("Force attachment loading " + attachment.getOriginalFileName()); + } + EmailService service = context.getEmailService(); + if (attachment.getOriginalFile() == null) { + AttachmentFile file = service.getAttachmentFile(attachment.getTopiaId(), true); + attachment.setOriginalFile(file); + } + if (attachment.getEditedFile() == null) { + AttachmentFile file = service.getAttachmentFile(attachment.getTopiaId(), false); + attachment.setEditedFile(file); + } + } + public static Desktop getDesktopForPrint() { if (!Desktop.isDesktopSupported()) { Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java 2014-06-18 17:13:29 UTC (rev 226) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java 2014-06-19 12:16:21 UTC (rev 227) @@ -299,7 +299,10 @@ null, modifiedProperties.toArray(new String[modifiedProperties.size()])); - message.setFlag(Flags.Flag.DELETED, true); + // suppression des mails sur le serveur distant (automatique par default) + if (serviceContext.getApplicationConfig().isMailDeleteRemote()) { + message.setFlag(Flags.Flag.DELETED, true); + } } log.debug("End of emails"); @@ -345,19 +348,25 @@ // else, this is an attachment } else { String fileName = bp.getFileName(); + + // parse Content-ID (content identifier in html mail content) + String[] headers = bp.getHeader("Content-ID"); + if (headers == null) { + break; + } + String contentID = headers[0]; + // remove the guillemets between the id + contentID = contentID.replaceFirst("^<(.*)>$", "$1"); + if (fileName == null) { - String[] headers = bp.getHeader("Content-ID"); - if (headers == null) { - break; - } - fileName = headers[0]; - // remove the guillemets between the id - fileName = fileName.replaceFirst("^<(.*)>$", "$1"); + fileName = contentID; } try { fileName = MimeUtility.decodeText(fileName); - log.debug("FileName : " + fileName); + if (log.isDebugEnabled()) { + log.debug("FileName : " + fileName + ", Content-ID : " + contentID); + } } catch (UnsupportedEncodingException ex) { // don't care, use filename raw value if (log.isWarnEnabled()) { @@ -372,6 +381,7 @@ AttachmentFile attachmentFile = emailService.getAttachmentFileFromStream(dh.getInputStream()); attachmentFile.setFilename(fileName); attachment.setOriginalFile(attachmentFile); + attachment.setContentId(contentID); //email.addAttachment(attachment); attachments.add(attachment);