r82 - in trunk: faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities faxtomail-persistence/src/main/xmi faxtomail-service/src/main/java/com/franciaflex/faxtomail/services faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/cont
Author: echatellier Date: 2014-05-20 16:25:32 +0200 (Tue, 20 May 2014) New Revision: 82 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/82 Log: refs #4666: Stockage des pi?\195?\168ces jointes dans la base de donn?\195?\169es (byte[]) Added: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AttachmentFileImpl.java Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/DecoratorService.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/InitFaxToMailService.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/FaxToMailUIContext.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GenerateAnnotatedAttachmentAction.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/SaveDemandeAction.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentCellEditor.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUIModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentItem.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/ButtonAttachment.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/content/demande/DemandeUIModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/pdfeditor/PDFEditorUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/pdfeditor/PDFEditorUIModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/print/AttachmentToPrintChooserUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.css trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.jaxx trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailBeanUIModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_fr_FR.properties trunk/faxtomail-ui-swing/src/main/resources/log4j.properties trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/MailFilterJob.java Added: 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 (rev 0) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AttachmentFileImpl.java 2014-05-20 14:25:32 UTC (rev 82) @@ -0,0 +1,95 @@ +package com.franciaflex.faxtomail.persistence.entities; + +/* + * #%L + * FaxToMail :: Persistence + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2014 Franciaflex, Code Lutin + * %% + * 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 java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class AttachmentFileImpl extends AttachmentFileAbstract { + + private static final Log log = LogFactory.getLog(AttachmentFileImpl.class); + + /** Transient file instance with blob content on local file system. */ + protected transient File tmpLocalFile; + + @Override + public File getFile() { + if (tmpLocalFile == null && getContent() != null) { + try { + // create temp file + tmpLocalFile = File.createTempFile("faxtomail-", ".tmp"); + if (log.isDebugEnabled()) { + log.debug(String.format("Copy blob content to file : %s", tmpLocalFile.getAbsolutePath())); + } + tmpLocalFile.deleteOnExit(); + + // 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 + InputStream is = new ByteArrayInputStream(getContent()); + FileOutputStream fos = new FileOutputStream(tmpLocalFile); + IOUtils.copy(is, fos); + fos.close(); + + } catch (IOException ex) { + throw new RuntimeException("Can't create file on local file system", ex); + } + } + return tmpLocalFile; + } + + @Override + public long getLength() { + long result = 0; + if (getFile() != null) { + result = getFile().length(); + } + return result; + } + + /** + * Overwrite finalize to delete local tmp file if necessary. + */ + @Override + protected void finalize() throws Throwable { + try { + if (tmpLocalFile != null) { + if (log.isDebugEnabled()) { + log.debug(String.format("Deleting file : %s", tmpLocalFile.getAbsolutePath())); + } + tmpLocalFile.delete(); + } + } finally { + super.finalize(); + } + } +} Property changes on: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/AttachmentFileImpl.java ___________________________________________________________________ Added: svn:eol-style + native Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties =================================================================== --- trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties 2014-05-20 14:25:32 UTC (rev 82) @@ -24,5 +24,14 @@ model.tagValue.notGenerateToString=true model.tagValue.constantPrefix=PROPERTY_ model.tagValue.java.lang.String=text +#model.tagvalue.java.sql.Blob=blob +#model.tagvalue.byte=binary model.tagValue.useEnumerationName=true model.tagValue.doNotGenerateBooleanGetMethods=true + +# Attachment +com.franciaflex.faxtomail.persistence.entities.Attachment.attribute.originalFile.tagvalue.notNull=true + +# AttachmentFile +com.franciaflex.faxtomail.persistence.entities.AttachmentFile.attribute.filename.tagvalue.notNull=true +com.franciaflex.faxtomail.persistence.entities.AttachmentFile.attribute.content.tagvalue.notNull=true Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.zargo =================================================================== (Binary files differ) Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/DecoratorService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/DecoratorService.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/DecoratorService.java 2014-05-20 14:25:32 UTC (rev 82) @@ -24,17 +24,18 @@ * #L% */ +import java.text.DateFormat; +import java.util.Date; + +import org.nuiton.decorator.Decorator; +import org.nuiton.decorator.DecoratorProvider; + import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; import com.franciaflex.faxtomail.persistence.entities.HasLabel; import com.franciaflex.faxtomail.persistence.entities.Reply; -import org.nuiton.decorator.Decorator; -import org.nuiton.decorator.DecoratorProvider; -import java.io.File; -import java.text.DateFormat; -import java.util.Date; - /** * FaxToMail decorator service. * @@ -112,7 +113,7 @@ return DateFormat.getDateInstance(DateFormat.MEDIUM).format(bean); } }); - registerDecorator(new Decorator<File>(File.class) { + /*registerDecorator(new Decorator<File>(File.class) { private static final long serialVersionUID = 1L; @Override @@ -122,13 +123,45 @@ } return ((File) bean).getName(); } + });*/ + /*registerDecorator(new Decorator<AttachmentFile>(AttachmentFile.class) { + private static final long serialVersionUID = 1L; + + @Override + public String toString(Object bean) { + if (bean == null) { + return ""; + } + return ((AttachmentFile) bean).getFilename(); + } + });*/ + registerMultiJXPathDecorator(HasLabel.class, "${label}$s", SEPARATOR, " - "); + //registerMultiJXPathDecorator(Attachment.class, "${originalFile}$s", SEPARATOR, " - "); + registerDecorator(new Decorator<Attachment>(Attachment.class) { + private static final long serialVersionUID = 1L; + + @Override + public String toString(Object bean) { + if (bean == null) { + return ""; + } + return ((Attachment) bean).getOriginalFile().getFilename(); + } }); - registerMultiJXPathDecorator(HasLabel.class, "${label}$s", SEPARATOR, " - "); - registerMultiJXPathDecorator(Attachment.class, "${originalFile}$s", SEPARATOR, " - "); + registerDecorator(new Decorator<AttachmentFile>(AttachmentFile.class) { + private static final long serialVersionUID = 1L; + + @Override + public String toString(Object bean) { + if (bean == null) { + return ""; + } + return ((AttachmentFile) bean).getFilename(); + } + }); registerMultiJXPathDecorator(Reply.class, "${sentDate}$s#${subject}$s", SEPARATOR, " - "); registerMultiJXPathDecorator(FaxToMailUser.class, "${trigraph}$s#${firstName}$s#${lastName}$s", SEPARATOR, " "); } }; } - } 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-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java 2014-05-20 14:25:32 UTC (rev 82) @@ -24,22 +24,33 @@ * #L% */ +import static org.nuiton.i18n.I18n.t; + import java.io.BufferedWriter; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; import java.io.Writer; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.Enumeration; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.Set; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.mail.MessagingException; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -47,9 +58,15 @@ import org.apache.commons.mail.EmailConstants; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.MultiPartEmail; +import org.nuiton.topia.persistence.TopiaEntities; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; import com.franciaflex.faxtomail.persistence.entities.Attachment; -import com.franciaflex.faxtomail.persistence.entities.AttachmentTopiaDao; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFileImpl; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFileTopiaDao; +import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; import com.franciaflex.faxtomail.persistence.entities.Client; import com.franciaflex.faxtomail.persistence.entities.ClientTopiaDao; import com.franciaflex.faxtomail.persistence.entities.DemandStatus; @@ -71,12 +88,9 @@ import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import javax.mail.MessagingException; - -import static org.nuiton.i18n.I18n.t; - /** * @author kmorin <kmorin@codelutin.com> * @since x.x @@ -85,6 +99,9 @@ private static final Log log = LogFactory.getLog(EmailService.class); + protected Binder<Attachment, Attachment> attachmentBinder = + BinderFactory.newBinder(Attachment.class, Attachment.class); + public Email getEmailById(String id) { Email email = getPersistenceContext().getEmailDao().findByTopiaId(id); return email; @@ -100,10 +117,10 @@ * @throws InvalidClientException if client code is not valid */ public Email saveEmail(Email email, FaxToMailUser user, String... modifiedFields) throws InvalidClientException { - return saveEmail(email, null, user, modifiedFields); + return saveEmail(email, null, null, user, modifiedFields); } - public Email saveEmail(Email email, String clientCode, FaxToMailUser user, String... modifiedFields) throws InvalidClientException { + public Email saveEmail(Email email, Collection<Attachment> attachments, String clientCode, FaxToMailUser user, String... modifiedFields) throws InvalidClientException { Date now = getNow(); ClientTopiaDao clientDao = getPersistenceContext().getClientDao(); EmailTopiaDao dao = getPersistenceContext().getEmailDao(); @@ -119,15 +136,47 @@ email.setClient(client); } - if (email.getAttachment() != null) { - AttachmentTopiaDao attachmentDao = getPersistenceContext().getAttachmentDao(); - for (Attachment attachment : email.getAttachment()) { - if (!attachment.isPersisted()) { - attachmentDao.create(attachment); + if (attachments != null) { + Collection<Attachment> currentAttachments = CollectionUtils.emptyIfNull(email.getAttachment()); + Map<String, Attachment> currentAttachmentIndex = new HashMap<>(Maps.uniqueIndex(currentAttachments, TopiaEntities.getTopiaIdFunction())); + + AttachmentFileTopiaDao attachementFileTopiaDao = getPersistenceContext().getAttachmentFileDao(); + for (Attachment attachment : attachments) { + // get session attachment from id + Attachment currentAttachment; + if (StringUtils.isNoneBlank(attachment.getTopiaId())) { + currentAttachment = currentAttachmentIndex.remove(attachment.getTopiaId()); } else { - attachmentDao.update(attachment); + currentAttachment = new AttachmentImpl(); } + + // copy new data + attachmentBinder.copy(attachment, currentAttachment); + + // persist + if (currentAttachment.getEditedFile() != null) { + if (!currentAttachment.getEditedFile().isPersisted()) { + attachementFileTopiaDao.create(currentAttachment.getEditedFile()); + } else { + attachementFileTopiaDao.update(currentAttachment.getEditedFile()); + } + } + if (currentAttachment.getOriginalFile() != null) { + if (!currentAttachment.getOriginalFile().isPersisted()) { + attachementFileTopiaDao.create(currentAttachment.getOriginalFile()); + } else { + attachementFileTopiaDao.update(currentAttachment.getOriginalFile()); + } + } + + if (!attachment.isPersisted()) { + // persist using cascade + currentAttachments.add(currentAttachment); + } } + + // delete not found attachments + currentAttachments.removeAll(currentAttachmentIndex.values()); } if (email.getRangeRow() != null) { @@ -411,7 +460,7 @@ } public Email reply(String from, String to, String subject, - String content, Collection<File> attachments, + String content, Collection<AttachmentFile> attachments, String originalEmailId, FaxToMailUser user) throws EmailException, MessagingException, IOException { Email email = getEmailById(originalEmailId); @@ -429,12 +478,17 @@ final String smtpUser = properties.getProperty("mail.user"); final String password = properties.getProperty("mail.password"); + final String useSsl = properties.getProperty("mail.ssl"); MultiPartEmail message = new MultiPartEmail(); message.setHostName(properties.getProperty("mail.smtp.host")); message.setSmtpPort(Integer.parseInt(properties.getProperty("mail.smtp.port"))); - message.setAuthenticator(new DefaultAuthenticator(smtpUser, password)); - message.setSSLOnConnect(true); + if (StringUtils.isNotBlank(smtpUser) && password != null) { + message.setAuthenticator(new DefaultAuthenticator(smtpUser, password)); + } + if ("true".equalsIgnoreCase(useSsl)) { + message.setSSLOnConnect(true); + } message.setCharset(EmailConstants.UTF_8); message.setFrom(from); @@ -442,9 +496,11 @@ message.setSubject(subject); message.setMsg(content); - for (File attachment : attachments) { + for (AttachmentFile attachmentFile : attachments) { // Create the attachment - message.attach(attachment); + File file = attachmentFile.getFile(); + DataSource source = new FileDataSource(file); + message.attach(source, attachmentFile.getFilename(), null); } String emailId = message.send(); @@ -476,5 +532,24 @@ return email; } + + /** + * Save content stream into attachment file content. + * + * @param contentStream content + * @return attachmentFile filled by content + */ + public AttachmentFile getAttachmentFileFromStream(InputStream contentStream) { + AttachmentFile attachmentFile = new AttachmentFileImpl(); + try { + //Session hibernateSession = getPersistenceContext().getHibernateSupport().getHibernateSession(); + //Blob contentBlob = Hibernate.getLobCreator(hibernateSession).createBlob(contentStream, contentStream.available()); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + IOUtils.copy(contentStream, output); + attachmentFile.setContent(output.toByteArray()); + } catch (Exception ex) { + throw new RuntimeException("Can't save content", ex); + } + return attachmentFile; + } } - Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/InitFaxToMailService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/InitFaxToMailService.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/InitFaxToMailService.java 2014-05-20 14:25:32 UTC (rev 82) @@ -481,7 +481,7 @@ email.setDemandType(demandType); email.setPriority(priorities.get(random.nextInt(priorities.size()))); email.setRangeRow(rangeRows); - getEmailService().saveEmail(email, email.getClient().getCode(), user, + getEmailService().saveEmail(email, null, email.getClient().getCode(), user, Email.PROPERTY_DEMAND_TYPE, Email.PROPERTY_PRIORITY, Email.PROPERTY_RANGE_ROW); } } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/FaxToMailUIContext.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/FaxToMailUIContext.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/FaxToMailUIContext.java 2014-05-20 14:25:32 UTC (rev 82) @@ -46,17 +46,20 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import com.google.common.collect.Sets; + import jaxx.runtime.swing.editor.bean.BeanDoubleList; import jaxx.runtime.swing.editor.bean.BeanFilterableComboBox; import jaxx.runtime.swing.session.BeanDoubleListState; import jaxx.runtime.swing.session.BeanFilterableComboBoxState; import jaxx.runtime.swing.session.State; import jaxx.runtime.swing.session.SwingSession; + import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jdesktop.beans.AbstractBean; import org.nuiton.i18n.I18n; +import org.nuiton.i18n.init.ClassPathI18nInitializer; import org.nuiton.i18n.init.DefaultI18nInitializer; import org.nuiton.i18n.init.UserI18nInitializer; import org.nuiton.jaxx.application.ApplicationConfiguration; @@ -71,6 +74,7 @@ import javax.swing.*; import javax.swing.event.RowSorterEvent; import javax.swing.tree.TreePath; + import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -401,9 +405,15 @@ log.info(String.format("Starts i18n with locale [%s] at [%s]", i18nLocale, i18nDirectory)); } - I18n.init(new UserI18nInitializer( + + try { + I18n.init(new UserI18nInitializer( i18nDirectory, new DefaultI18nInitializer("faxtomail-i18n")), i18nLocale); + } catch (RuntimeException ex) { + // strange ide behaviour case (eclipse) + I18n.init(new ClassPathI18nInitializer(), i18nLocale); + } // //--------------------------------------------------------------------// // // init help Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GenerateAnnotatedAttachmentAction.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GenerateAnnotatedAttachmentAction.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GenerateAnnotatedAttachmentAction.java 2014-05-20 14:25:32 UTC (rev 82) @@ -24,21 +24,33 @@ * #L% */ +import java.awt.Insets; +import java.awt.Point; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; + +import javax.swing.JTextArea; + +import jaxx.runtime.JAXXContext; +import jaxx.runtime.JAXXUtil; +import jaxx.runtime.SwingUtil; + +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; +import com.franciaflex.faxtomail.ui.swing.content.attachment.AttachmentEditorUI; import com.franciaflex.faxtomail.ui.swing.content.pdfeditor.PDFEditorCrossUI; import com.franciaflex.faxtomail.ui.swing.content.pdfeditor.PDFEditorLineUI; import com.franciaflex.faxtomail.ui.swing.content.pdfeditor.PDFEditorNoteUI; import com.franciaflex.faxtomail.ui.swing.content.pdfeditor.PDFEditorUI; import com.franciaflex.faxtomail.ui.swing.content.pdfeditor.PDFEditorUIHandler; import com.franciaflex.faxtomail.ui.swing.content.pdfeditor.PDFEditorUIModel; -import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; import com.franciaflex.faxtomail.ui.swing.util.JImagePanel; -import com.franciaflex.faxtomail.ui.swing.content.attachment.AttachmentEditorUI; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Document; import com.itextpdf.text.Image; -import com.itextpdf.text.PageSize; import com.itextpdf.text.Phrase; -import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.ColumnText; import com.itextpdf.text.pdf.PdfAction; @@ -54,26 +66,11 @@ import com.sun.media.jai.codec.ImageDecoder; import com.sun.media.jai.codec.SeekableStream; import com.sun.pdfview.PDFFile; -import jaxx.runtime.JAXXContext; -import jaxx.runtime.JAXXUtil; -import jaxx.runtime.SwingUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.w3c.dom.css.Rect; -import javax.media.jai.PlanarImage; -import javax.swing.*; -import java.awt.*; -import java.awt.image.RenderedImage; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.net.URL; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; - /** * @author Kevin Morin (Code Lutin) * @since x.x @@ -89,9 +86,12 @@ @Override public void doAction() throws Exception { + AttachmentFile attachmentFile = getModel().getNotNullFile(); + File file = attachmentFile.getFile(); + PDFEditorUIModel model = getModel(); - File file = model.getNotNullFile(); + //File file = model.getNotNullFile(); // InputStream inputStream; // if (FaxToMailUIUtil.isFileAPDF(file)) { @@ -109,7 +109,10 @@ PdfReader pdfReader = new PdfReader(inputStream); - File target = new File(FileUtils.getTempDirectory(), model.getOriginalFile().getName() + "-annoté.pdf"); + //File target = new File(FileUtils.getTempDirectory(), getModel().getOriginalFile().getName() + "-annoté.pdf"); + File target = File.createTempFile("faxtomail-", ".tmp"); + target.deleteOnExit(); + FileOutputStream fos = new FileOutputStream(target); PdfStamper pdfStamper = new PdfStamper(pdfReader, fos); @@ -219,7 +222,11 @@ PdfAction action = new PdfAction(PdfAction.PRINTDIALOG); writer.setOpenAction(action); - getModel().setEditedFile(target); + // convert content to blob + InputStream is = new BufferedInputStream(new FileInputStream(target)); + AttachmentFile attachmentFileNew = getContext().getEmailService().getAttachmentFileFromStream(is); + attachmentFileNew.setFilename(getModel().getOriginalFile().getFilename() + "-annoté.pdf"); + getModel().setEditedFile(attachmentFileNew); } @Override Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/SaveDemandeAction.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/SaveDemandeAction.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/SaveDemandeAction.java 2014-05-20 14:25:32 UTC (rev 82) @@ -24,6 +24,16 @@ * #L% */ +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.nuiton.topia.persistence.TopiaEntities; +import org.nuiton.util.beans.BeanMonitor; + +import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.persistence.entities.EmailImpl; import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; @@ -37,20 +47,6 @@ import com.franciaflex.faxtomail.ui.swing.content.demande.RangeTableModel; import com.google.common.collect.Maps; -import org.apache.commons.lang3.StringUtils; -import org.nuiton.jaxx.application.swing.action.ApplicationActionException; -import org.nuiton.topia.persistence.TopiaEntities; -import org.nuiton.util.beans.BeanMonitor; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import javax.swing.JOptionPane; - -import static org.nuiton.i18n.I18n.t; - /** * @author Kevin Morin (Code Lutin) * @since x.x @@ -96,12 +92,13 @@ FaxToMailUser currentUser = context.getCurrentUser(); Email email = model.toEntity(persistedEmail); + Collection<Attachment> attachments = model.getAttachment(); String clientCode = model.getClientCode(); BeanMonitor monitor = getHandler().getMonitor(); String[] modifiedProperties = monitor.getModifiedProperties(); - email = context.getEmailService().saveEmail(email, clientCode, currentUser, modifiedProperties); + email = context.getEmailService().saveEmail(email, attachments, clientCode, currentUser, modifiedProperties); model.fromEntity(email); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentCellEditor.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentCellEditor.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentCellEditor.java 2014-05-20 14:25:32 UTC (rev 82) @@ -112,7 +112,7 @@ HistoryType.ATTACHMENT_OPENING, context.getCurrentUser(), new Date(), - attachment.getOriginalFile().getName()); + attachment.getOriginalFile().getFilename()); model.fromEntity(email); } } @@ -124,7 +124,7 @@ HistoryType.ATTACHMENT_MODIFICATION, context.getCurrentUser(), new Date(), - attachment.getOriginalFile().getName()); + attachment.getOriginalFile().getFilename()); model.fromEntity(email); } }; Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUIHandler.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUIHandler.java 2014-05-20 14:25:32 UTC (rev 82) @@ -26,7 +26,6 @@ import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; -import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.ui.swing.content.MainUI; import com.franciaflex.faxtomail.ui.swing.content.pdfeditor.PDFEditorUI; import com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupHandler; @@ -38,10 +37,25 @@ import org.apache.commons.collections4.CollectionUtils; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.decorator.HighlighterFactory; -import org.nuiton.jaxx.application.ApplicationTechnicalException; import org.nuiton.util.FileUtil; -import javax.swing.*; +import java.awt.Component; +import java.awt.Cursor; +import java.awt.Desktop; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +import javax.swing.AbstractCellEditor; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; @@ -51,13 +65,9 @@ import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; -import java.awt.*; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.File; -import java.io.IOException; -import java.util.List; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; + import static org.nuiton.i18n.I18n.t; /** @@ -148,7 +158,15 @@ attachment.setAddedByUser(true); File file = ui.getFile().getSelectedFile(); if (file != null) { - attachment.setOriginalFile(file); + try { + // warning, this not NOT be closed (will be by blob on commit) + InputStream is = new FileInputStream(file); + AttachmentFile attachmentFile = getContext().getEmailService().getAttachmentFileFromStream(is); + attachmentFile.setFilename(file.getName()); + attachment.setOriginalFile(attachmentFile); + } catch (Exception e) { + getContext().getErrorHelper().showErrorDialog(t("swing.error.cannot.copy.file"), e); + } getModel().addAttachment(attachment); resetFields(); } @@ -159,37 +177,28 @@ } public void openAttachment(Attachment attachment) { -// File file = getPersistenceService().getAttachmentFile(attachment.getId()); - File file = attachment.getOriginalFile(); - if (!file.exists()) { - throw new ApplicationTechnicalException(t("faxtomail.attachmentEditor.fileNotFound", file.getAbsolutePath())); - } getModel().fireAttachmentOpened(attachment); + File file = attachment.getOriginalFile().getFile(); Desktop desktop = FaxToMailUIUtil.getDesktopForBrowse(); try { -// desktop.browse(file.toURI()); desktop.open(file); - } catch (IOException e) { getContext().getErrorHelper().showErrorDialog(t("swing.error.cannot.open.file")); } } public void editAttachment(Attachment attachment) { - File file = attachment.getEditedFile(); - if (file == null) { - file = attachment.getOriginalFile(); + AttachmentFile attachmentFile = attachment.getEditedFile(); + if (attachmentFile == null) { + attachmentFile = attachment.getOriginalFile(); } - if (!file.exists()) { - throw new ApplicationTechnicalException(t("faxtomail.attachmentEditor.fileNotFound", file.getAbsolutePath())); - } - + File file = attachmentFile.getFile(); getModel().fireAttachmentEdited(attachment); - String extension = FileUtil.extension(file); + String extension = FileUtil.extension(attachmentFile.getFilename()); if (getModel().isEditable() && EDITABLE_EXTENSIONS.contains(extension.toUpperCase())) { MainUI mainUI = getContext().getMainUI(); @@ -203,9 +212,7 @@ } else { Desktop desktop = FaxToMailUIUtil.getDesktopForOpen(); try { -// desktop.browse(file.toURI()); desktop.open(file); - } catch (IOException e) { getContext().getErrorHelper().showErrorDialog(t("swing.error.cannot.open.file")); } @@ -220,7 +227,7 @@ } int answer = JOptionPane.showConfirmDialog(ui, t("faxtomail.attachmentEditor.deleteAttachment.message", - attachment.getOriginalFile().getName()), + attachment.getOriginalFile().getFilename()), t("faxtomail.attachmentEditor.deleteAttachment.title"), JOptionPane.YES_NO_OPTION ); @@ -239,7 +246,7 @@ } public boolean isAttachmentEditable(Attachment attachment) { - String extension = FileUtil.extension(attachment.getOriginalFile()); + String extension = FileUtil.extension(attachment.getOriginalFile().getFilename()); return EDITABLE_EXTENSIONS.contains(extension.toUpperCase()); } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUIModel.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentEditorUIModel.java 2014-05-20 14:25:32 UTC (rev 82) @@ -40,10 +40,10 @@ */ public class AttachmentEditorUIModel extends AbstractFaxToMailBeanUIModel<AttachmentModelAware, AttachmentEditorUIModel> { - public static final String PROPERTY_FILE = "file"; + //public static final String PROPERTY_FILE = "file"; public static final String PROPERTY_EDITABLE = "editable"; - protected File file; + //protected File file; protected boolean editable = true; protected final Collection<Attachment> attachments = new ArrayList<Attachment>(); @@ -61,7 +61,7 @@ super(fromBeanBinder, toBeanBinder); } - public File getFile() { + /*public File getFile() { return file; } @@ -69,7 +69,7 @@ Object oldValue = getFile(); this.file = file; firePropertyChange(PROPERTY_FILE, oldValue, file); - } + }*/ public boolean isEditable() { return editable; Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentItem.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentItem.css 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentItem.css 2014-05-20 14:25:32 UTC (rev 82) @@ -26,7 +26,7 @@ } #attachmentNameLabel { - text: { attachment != null ? getAttachment().getOriginalFile().getName() : null }; + text: { attachment != null ? getAttachment().getOriginalFile().getFilename() : null }; } #toolbar { @@ -41,7 +41,7 @@ #editAttachmentButton { actionIcon: "edit"; - toolTipText: "faxtomail.attachmentEditor.action.open.tip"; + toolTipText: "faxtomail.attachmentEditor.action.edit.tip"; enabled: { handler != null && handler.isAttachmentEditable(getAttachment()) }; visible: { isEditable() }; } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/ButtonAttachment.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/ButtonAttachment.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/ButtonAttachment.java 2014-05-20 14:25:32 UTC (rev 82) @@ -25,9 +25,7 @@ */ import com.franciaflex.faxtomail.persistence.entities.Attachment; -import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; -import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; import com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupButton; import org.apache.commons.collections4.CollectionUtils; 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-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java 2014-05-20 14:25:32 UTC (rev 82) @@ -22,7 +22,6 @@ * #L% */ -import com.ezware.oxbow.swingbits.table.filter.AbstractTableFilter; import com.ezware.oxbow.swingbits.table.filter.DistinctColumnItem; import com.ezware.oxbow.swingbits.table.filter.ITableFilter; import com.ezware.oxbow.swingbits.table.filter.JTableFilter; 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-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java 2014-05-20 14:25:32 UTC (rev 82) @@ -22,7 +22,6 @@ * #L% */ - import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.persistence.entities.DemandStatus; import com.franciaflex.faxtomail.persistence.entities.DemandType; @@ -33,20 +32,12 @@ import com.franciaflex.faxtomail.persistence.entities.Range; import com.franciaflex.faxtomail.persistence.entities.RangeRow; import com.franciaflex.faxtomail.services.service.ReferentielService; -import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; -import com.franciaflex.faxtomail.ui.swing.actions.SaveAndOpenDialogAction; import com.franciaflex.faxtomail.ui.swing.actions.SaveDemandeAction; -import com.franciaflex.faxtomail.ui.swing.content.print.AttachmentToPrintChooserUI; -import com.franciaflex.faxtomail.ui.swing.content.reply.ReplyFormUI; -import com.franciaflex.faxtomail.ui.swing.content.reply.ReplyFormUIModel; -import com.franciaflex.faxtomail.ui.swing.content.search.SearchToGroupUI; -import com.franciaflex.faxtomail.ui.swing.content.transmit.MailFolderChooserUI; import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailUIHandler; import com.franciaflex.faxtomail.ui.swing.util.CloseableUI; import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; import com.franciaflex.faxtomail.ui.swing.content.attachment.AttachmentEditorUIModel; import jaxx.runtime.validator.swing.SwingValidator; -import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -62,7 +53,6 @@ import org.nuiton.jaxx.application.swing.table.MoveToNextEditableRowAction; import org.nuiton.jaxx.application.swing.table.MoveToPreviousEditableCellAction; import org.nuiton.jaxx.application.swing.table.MoveToPreviousEditableRowAction; -import org.nuiton.jaxx.application.swing.util.ApplicationErrorHelper; import org.nuiton.util.beans.BeanMonitor; import javax.swing.*; @@ -74,7 +64,6 @@ import java.awt.event.KeyEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -341,7 +330,7 @@ HistoryType.ATTACHMENT_OPENING, getContext().getCurrentUser(), new Date(), - attachment.getOriginalFile().getName()); + attachment.getOriginalFile().getFilename()); getModel().setHistory(email.getHistory()); } } @@ -354,7 +343,7 @@ HistoryType.ATTACHMENT_MODIFICATION, getContext().getCurrentUser(), new Date(), - attachment.getOriginalFile().getName()); + attachment.getOriginalFile().getFilename()); getModel().setHistory(email.getHistory()); } } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java 2014-05-20 14:25:32 UTC (rev 82) @@ -23,6 +23,7 @@ */ import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; import com.franciaflex.faxtomail.persistence.entities.Client; import com.franciaflex.faxtomail.persistence.entities.DemandStatus; import com.franciaflex.faxtomail.persistence.entities.DemandType; @@ -42,6 +43,7 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; + import org.apache.commons.io.Charsets; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -60,6 +62,7 @@ import javax.mail.internet.ContentType; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; + import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.ByteArrayInputStream; @@ -133,6 +136,9 @@ protected static Binder<Email, DemandeUIModel> fromBeanBinder = BinderFactory.newBinder(Email.class, DemandeUIModel.class); + protected static Binder<Attachment, Attachment> fromAttachmentBinder = + BinderFactory.newBinder(Attachment.class, Attachment.class); + public DemandeUIModel() { super(fromBeanBinder, toBeanBinder); addPropertyChangeListener(Email.PROPERTY_HISTORY, new PropertyChangeListener() { @@ -177,6 +183,40 @@ } + /** + * Surcharge pour dupliquer correctement les pieces jointes. + * + * FIXME echatellier 20140520 c'est pas terrible, mais c'est comme ca :p + */ + @Override + public void fromEntity(Email entity) { + //super.fromEntity(entity); + fromBeanBinder.copyExcluding(entity, this, Email.PROPERTY_ATTACHMENT); + // specific attachment copy + Collection<Attachment> attachmentCopy = new ArrayList<Attachment>(); + if (entity.getAttachment() != null) { + for (Attachment attachment : entity.getAttachment()) { + Attachment clone = new AttachmentImpl(); + fromAttachmentBinder.copy(attachment, clone); + attachmentCopy.add(clone); + } + } + setAttachment(attachmentCopy); + } + + @Override + public Email toEntity() { + Email result = newEntity(); + toBeanBinder.copyExcluding(this, result, Email.PROPERTY_ATTACHMENT); + return result; + } + + @Override + public Email toEntity(Email entity) { + toBeanBinder.copyExcluding(this, entity, Email.PROPERTY_ATTACHMENT); + return entity; + } + public Boolean getFax() { return editObject.getFax(); } @@ -790,6 +830,7 @@ protected void decomposeEmail() { try { + // ce code peut provoquer une NPE avec les données de test Message message = new MimeMessage(null, new ByteArrayInputStream(getOriginalEmail().getBytes())); subject = message.getSubject(); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java 2014-05-20 14:25:32 UTC (rev 82) @@ -24,33 +24,25 @@ * #L% */ -import com.franciaflex.faxtomail.persistence.entities.Attachment; -import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; -import com.franciaflex.faxtomail.persistence.entities.Email; -import com.franciaflex.faxtomail.persistence.entities.Reply; -import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; -import com.franciaflex.faxtomail.ui.swing.content.reply.ReplyFormUI; -import com.franciaflex.faxtomail.ui.swing.content.reply.ReplyFormUIModel; -import com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupHandler; -import com.google.common.collect.Iterables; -import jaxx.runtime.validator.swing.SwingValidator; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.commons.mail.MultiPartEmail; -import org.jdesktop.swingx.JXTable; -import org.jdesktop.swingx.decorator.HighlighterFactory; +import static org.nuiton.i18n.I18n.t; +import java.awt.Component; +import java.awt.Dimension; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + import javax.activation.DataHandler; import javax.activation.DataSource; import javax.mail.BodyPart; import javax.mail.Message; -import javax.mail.MessagingException; import javax.mail.Part; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; -import javax.swing.*; +import javax.swing.AbstractCellEditor; +import javax.swing.JComponent; +import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; @@ -60,15 +52,25 @@ import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; -import java.awt.*; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileOutputStream; -import static org.nuiton.i18n.I18n.t; +import jaxx.runtime.validator.swing.SwingValidator; +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.jdesktop.swingx.JXTable; +import org.jdesktop.swingx.decorator.HighlighterFactory; + +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFileImpl; +import com.franciaflex.faxtomail.persistence.entities.Email; +import com.franciaflex.faxtomail.persistence.entities.Reply; +import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; +import com.franciaflex.faxtomail.ui.swing.content.reply.ReplyFormUI; +import com.franciaflex.faxtomail.ui.swing.content.reply.ReplyFormUIModel; +import com.franciaflex.faxtomail.ui.swing.util.AbstractToolbarPopupHandler; +import com.google.common.collect.Iterables; + /** * @author Kevin Morin (Code Lutin) * @since x.x @@ -243,17 +245,21 @@ } log.debug("FileName : " + fileName); - File dir = new File(FileUtils.getTempDirectory(), topiaId); + /*File dir = new File(FileUtils.getTempDirectory(), topiaId); if (!dir.exists()) { dir.mkdir(); } - File file = new File(dir, fileName); - FileOutputStream fos = new FileOutputStream(file); + File file = new File(dir, fileName);*/ + ByteArrayOutputStream fos = new ByteArrayOutputStream(); + DataHandler dh = bp.getDataHandler(); dh.writeTo(fos); - reply.addAttachment(file); + // copy content into an empty attachment + AttachmentFile attachment = new AttachmentFileImpl(); + attachment.setContent(fos.toByteArray()); + reply.addAttachment(attachment); } } } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/pdfeditor/PDFEditorUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/pdfeditor/PDFEditorUIHandler.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/pdfeditor/PDFEditorUIHandler.java 2014-05-20 14:25:32 UTC (rev 82) @@ -24,35 +24,14 @@ * #L% */ -import com.franciaflex.faxtomail.persistence.entities.Attachment; -import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailUIHandler; -import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; -import com.franciaflex.faxtomail.ui.swing.util.JImagePanel; -import com.itextpdf.text.*; -import com.itextpdf.text.pdf.PdfWriter; -import com.sun.media.jai.codec.ByteArraySeekableStream; -import com.sun.media.jai.codec.ImageCodec; -import com.sun.media.jai.codec.ImageDecoder; -import com.sun.media.jai.codec.SeekableStream; -import com.sun.pdfview.PDFFile; -import com.sun.pdfview.PDFPage; -import jaxx.runtime.swing.ComponentMover; -import jaxx.runtime.swing.ComponentResizer; -import jaxx.runtime.validator.swing.SwingValidator; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.jaxx.application.ApplicationDataUtil; - -import javax.media.jai.PlanarImage; -import javax.swing.*; -import javax.swing.text.JTextComponent; -import java.awt.*; -import java.awt.Font; +import java.awt.Component; +import java.awt.Cursor; +import java.awt.Dimension; import java.awt.Image; +import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ContainerEvent; import java.awt.event.ContainerListener; -import java.awt.event.KeyEvent; import java.awt.geom.Rectangle2D; import java.awt.image.RenderedImage; import java.beans.PropertyChangeEvent; @@ -70,6 +49,34 @@ import java.util.Date; import java.util.List; +import javax.media.jai.PlanarImage; +import javax.swing.JComponent; +import javax.swing.JPanel; + +import jaxx.runtime.swing.ComponentMover; +import jaxx.runtime.swing.ComponentResizer; +import jaxx.runtime.validator.swing.SwingValidator; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; +import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailUIHandler; +import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; +import com.franciaflex.faxtomail.ui.swing.util.JImagePanel; +import com.itextpdf.text.Document; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.PageSize; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.pdf.PdfWriter; +import com.sun.media.jai.codec.ByteArraySeekableStream; +import com.sun.media.jai.codec.ImageCodec; +import com.sun.media.jai.codec.ImageDecoder; +import com.sun.media.jai.codec.SeekableStream; +import com.sun.pdfview.PDFFile; +import com.sun.pdfview.PDFPage; + import static org.nuiton.i18n.I18n.t; /** @@ -144,10 +151,11 @@ || Attachment.PROPERTY_EDITED_FILE.equals(evt.getPropertyName())) { PDFEditorUIModel model = (PDFEditorUIModel) evt.getSource(); - File file = model.getNotNullFile(); + AttachmentFile attachmentFile = model.getNotNullFile(); - if (file != null) { - if (!FaxToMailUIUtil.isFileAPDF(file)) { + if (attachmentFile != null) { + File file = attachmentFile.getFile(); + if (!FaxToMailUIUtil.isFileAPDF(attachmentFile)) { try { file = convertFileToPdf(file); @@ -164,7 +172,7 @@ getContext().getErrorHelper().showErrorDialog(t("faxtomail.pdfEditor.convertToPdf.error")); } } - if (FaxToMailUIUtil.isFileAPDF(file)) { + if (FaxToMailUIUtil.isFileAPDF(attachmentFile)) { try { RandomAccessFile raf = new RandomAccessFile(file, "r"); FileChannel channel = raf.getChannel(); @@ -411,8 +419,11 @@ } public File convertFileToPdf(File file) throws IOException, DocumentException { - File target = File.createTempFile(file.getName(), ".pdf"); + AttachmentFile attachmentFile = getModel().getNotNullFile(); + File target = File.createTempFile("faxtomail-", ".tmp"); + target.deleteOnExit(); + Document document = new Document(); FileOutputStream fos = new FileOutputStream(target); PdfWriter writer = PdfWriter.getInstance(document, fos); @@ -421,7 +432,7 @@ document.setPageSize(PageSize.A4); document.open(); - if (FaxToMailUIUtil.isFileATxt(file)) { + if (FaxToMailUIUtil.isFileATxt(attachmentFile)) { FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); StringBuilder text = new StringBuilder(); @@ -430,7 +441,7 @@ } document.add(new Paragraph(text.toString())); - } else if (FaxToMailUIUtil.isFileATif(file)) { + } else if (FaxToMailUIUtil.isFileATif(attachmentFile)) { FileInputStream fis = new FileInputStream(file); FileChannel channel = fis.getChannel(); ByteBuffer buffer = ByteBuffer.allocate((int) channel.size()); @@ -459,9 +470,12 @@ document.close(); writer.close(); + + // convert content to blob + AttachmentFile attachmentFileNew = getContext().getEmailService().getAttachmentFileFromStream(new FileInputStream(target)); + attachmentFileNew.setFilename(attachmentFile.getFilename() + ".pdf"); + getModel().setEditedFile(attachmentFileNew); - getModel().setEditedFile(target); - return target; } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/pdfeditor/PDFEditorUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/pdfeditor/PDFEditorUIModel.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/pdfeditor/PDFEditorUIModel.java 2014-05-20 14:25:32 UTC (rev 82) @@ -24,18 +24,20 @@ * #L% */ +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JPanel; + +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; + import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailBeanUIModel; import com.franciaflex.faxtomail.ui.swing.util.JImagePanel; -import org.nuiton.util.beans.Binder; -import org.nuiton.util.beans.BinderFactory; -import javax.swing.*; -import java.io.File; -import java.util.ArrayList; -import java.util.List; - /** * @author Kevin Morin (Code Lutin) * @since x.x @@ -112,28 +114,28 @@ super(fromBeanBinder, toBeanBinder); } - public void setOriginalFile(File file) { + public void setOriginalFile(AttachmentFile file) { Object oldValue = getOriginalFile(); editObject.setOriginalFile(file); firePropertyChange(Attachment.PROPERTY_ORIGINAL_FILE, oldValue, file); } - public File getOriginalFile() { + public AttachmentFile getOriginalFile() { return editObject.getOriginalFile(); } - public void setEditedFile(File file) { + public void setEditedFile(AttachmentFile file) { Object oldValue = getEditedFile(); editObject.setEditedFile(file); firePropertyChange(Attachment.PROPERTY_EDITED_FILE, oldValue, file); } - public File getEditedFile() { + public AttachmentFile getEditedFile() { return editObject.getEditedFile(); } - public File getNotNullFile() { - File file = getEditedFile(); + public AttachmentFile getNotNullFile() { + AttachmentFile file = getEditedFile(); if (file == null) { file = getOriginalFile(); } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/print/AttachmentToPrintChooserUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/print/AttachmentToPrintChooserUIHandler.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/print/AttachmentToPrintChooserUIHandler.java 2014-05-20 14:25:32 UTC (rev 82) @@ -24,19 +24,25 @@ * #L% */ +import static org.nuiton.i18n.I18n.t; + +import java.sql.Blob; + +import javax.swing.JCheckBox; +import javax.swing.JComponent; +import javax.swing.JPanel; + +import jaxx.runtime.validator.swing.SwingValidator; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailUIHandler; import com.franciaflex.faxtomail.ui.swing.util.Cancelable; -import jaxx.runtime.validator.swing.SwingValidator; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import javax.swing.*; -import java.io.File; - -import static org.nuiton.i18n.I18n.t; - /** * @author Kevin Morin (Code Lutin) * @since x.x @@ -57,13 +63,12 @@ attachmentPanel.add(checkBox); for (Attachment attachment : model.getAttachment()) { - File originalFile = attachment.getOriginalFile(); - checkBox = new JCheckBox(originalFile.getName(), true); + checkBox = new JCheckBox(attachment.getOriginalFile().getFilename(), true); attachmentPanel.add(checkBox); - File file = attachment.getEditedFile(); + AttachmentFile file = attachment.getEditedFile(); if (file != null) { - checkBox = new JCheckBox(file.getName(), true); + checkBox = new JCheckBox(file.getFilename(), true); attachmentPanel.add(checkBox); } } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.css =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.css 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.css 2014-05-20 14:25:32 UTC (rev 82) @@ -27,7 +27,7 @@ #attachmentNameLabel { actionIcon: "attachment"; - text: { t("faxtomail.reply.attachment.label", getAttachment().getName(), getAttachment().length() / 1024) }; + text: { t("faxtomail.reply.attachment.label", getAttachmentFile().getFilename(), getAttachmentFile().getLength() / 1024) }; border: { BorderFactory.createEmptyBorder(3, 3, 3, 3) }; } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.jaxx =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.jaxx 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/AttachmentItem.jaxx 2014-05-20 14:25:32 UTC (rev 82) @@ -24,7 +24,7 @@ <JPanel id='attachmentPanel' layout='{new BorderLayout()}'> <import> - com.franciaflex.faxtomail.persistence.entities.Attachment + com.franciaflex.faxtomail.persistence.entities.AttachmentFile java.awt.Color java.io.File @@ -34,7 +34,7 @@ static jaxx.runtime.JAXXUtil.getStringValue </import> - <File id='attachment' javaBean='null'/> + <AttachmentFile id='attachmentFile' javaBean='null'/> <ReplyFormUIHandler id='handler' javaBean='null'/> @@ -42,9 +42,9 @@ <JToolBar id='toolbar' constraints='BorderLayout.EAST'> <JButton id='openAttachmentButton' - onActionPerformed='handler.openAttachment(attachment)'/> + onActionPerformed='handler.openAttachment(attachmentFile)'/> <JButton id='removeAttachmentButton' - onActionPerformed='handler.removeAttachment(attachment)'/> + onActionPerformed='handler.removeAttachment(attachmentFile)'/> </JToolBar> </JPanel> \ No newline at end of file Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIHandler.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIHandler.java 2014-05-20 14:25:32 UTC (rev 82) @@ -24,42 +24,46 @@ * #L% */ -import com.franciaflex.faxtomail.persistence.entities.Attachment; -import com.franciaflex.faxtomail.persistence.entities.Email; -import com.franciaflex.faxtomail.persistence.entities.MailFolder; -import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; -import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailUIHandler; -import com.franciaflex.faxtomail.ui.swing.util.Cancelable; -import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; -import com.google.common.collect.Lists; -import jaxx.runtime.JAXXUtil; -import jaxx.runtime.swing.editor.FileEditor; -import jaxx.runtime.swing.renderer.DecoratorListCellRenderer; -import jaxx.runtime.validator.swing.SwingValidator; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import static org.nuiton.i18n.I18n.t; import org.nuiton.validator.bean.simple.SimpleBeanValidator; -import javax.swing.*; -import javax.swing.plaf.basic.BasicComboBoxEditor; - -import java.awt.*; +import java.awt.Component; +import java.awt.Desktop; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.io.IOException; -import java.io.Serializable; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import static org.nuiton.i18n.I18n.t; +import javax.swing.ComboBoxEditor; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JEditorPane; +import javax.swing.JFileChooser; +import javax.swing.JPanel; +import javax.swing.JTextField; +import jaxx.runtime.JAXXUtil; +import jaxx.runtime.swing.renderer.DecoratorListCellRenderer; +import jaxx.runtime.validator.swing.SwingValidator; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +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.content.demande.DemandeUIModel; +import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailUIHandler; +import com.franciaflex.faxtomail.ui.swing.util.Cancelable; +import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; +import com.google.common.collect.Lists; + /** * @author Kevin Morin (Code Lutin) * @since x.x @@ -100,16 +104,16 @@ for (DemandeUIModel demandeUIModel : models) { for (Attachment attachment : demandeUIModel.getAttachment()) { - final File originalFile = attachment.getOriginalFile(); + AttachmentFile originalFile = attachment.getOriginalFile(); model.addAvailableAttachment(originalFile); - File file = attachment.getEditedFile(); + AttachmentFile file = attachment.getEditedFile(); if (file != null) { model.addAvailableAttachment(file); } } } - JComboBox addAttachmentFile = ui.getAddAttachmentFile(); + JComboBox<AttachmentFile> addAttachmentFile = ui.getAddAttachmentFile(); addAttachmentFile.setModel(newComboModel(model.getAvailableAttachments().toArray())); addAttachmentFile.setSelectedItem(null); @@ -143,7 +147,7 @@ model.addPropertyChangeListener(ReplyFormUIModel.PROPERTY_ATTACHMENT, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { - updateAttachmentPanel((Collection<File>) evt.getNewValue()); + updateAttachmentPanel((Collection<AttachmentFile>) evt.getNewValue()); } }); @@ -155,7 +159,7 @@ }); JComboBox addAttachmentFile = ui.getAddAttachmentFile(); - addAttachmentFile.setRenderer(new DecoratorListCellRenderer(getDecorator(File.class, null))); + addAttachmentFile.setRenderer(new DecoratorListCellRenderer(getDecorator(AttachmentFile.class, null))); addAttachmentFile.setEditor(new FileComboBoxEditor()); getValidator().addPropertyChangeListener(SimpleBeanValidator.VALID_PROPERTY, new PropertyChangeListener() { @@ -192,7 +196,7 @@ return getUI().getMessage(); } - public void removeAttachment(File attachment) { + public void removeAttachment(AttachmentFile attachment) { ReplyFormUIModel model = getModel(); model.removeAttachment(attachment); @@ -203,7 +207,7 @@ public void addAttachment() { JComboBox addAttachmentFile = ui.getAddAttachmentFile(); - File file = (File) addAttachmentFile.getSelectedItem(); + AttachmentFile file = (AttachmentFile) addAttachmentFile.getSelectedItem(); if (file != null) { ReplyFormUIModel model = getModel(); model.addAttachment(file); @@ -215,13 +219,13 @@ } } - protected void updateAttachmentPanel(Collection<File> attachments) { + protected void updateAttachmentPanel(Collection<AttachmentFile> attachments) { JPanel attachmentsPanel = ui.getAttachmentsPanel(); attachmentsPanel.removeAll(); - for (File attachment : attachments) { + for (AttachmentFile attachment : attachments) { AttachmentItem item = new AttachmentItem(); item.setHandler(this); - item.setAttachment(attachment); + item.setAttachmentFile(attachment); attachmentsPanel.add(item); } attachmentsPanel.updateUI(); @@ -251,10 +255,13 @@ } } - public void openAttachment(File attachment) { + public void openAttachment(AttachmentFile attachment) { + + File file = attachment.getFile(); + Desktop desktop = FaxToMailUIUtil.getDesktopForOpen(); try { - desktop.open(attachment); + desktop.open(file); } catch (IOException e) { getContext().getErrorHelper().showErrorDialog(t("swing.error.cannot.open.file")); @@ -263,7 +270,7 @@ protected class FileComboBoxEditor implements ComboBoxEditor { - protected File oldValue; + protected AttachmentFile oldValue; protected JTextField editorComponent = new JTextField(); @@ -275,7 +282,7 @@ @Override public void setItem(Object anObject) { String text; - File file = (File) anObject; + AttachmentFile file = (AttachmentFile) anObject; if ( anObject != null ) { text = decorate(file); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIModel.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/reply/ReplyFormUIModel.java 2014-05-20 14:25:32 UTC (rev 82) @@ -24,8 +24,12 @@ * #L% */ +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; + import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.jdesktop.beans.AbstractSerializableBean; import java.io.File; @@ -38,6 +42,8 @@ */ public class ReplyFormUIModel extends AbstractSerializableBean { + private static final Log log = LogFactory.getLog(ReplyFormUIModel.class); + public static final String PROPERTY_TO = "to"; public static final String PROPERTY_FROM = "from"; public static final String PROPERTY_SUBJECT = "subject"; @@ -59,8 +65,8 @@ protected boolean valid = true; protected boolean readonly = false; - protected Set<File> attachments = new HashSet<File>(); - protected Set<File> availableAttachments = new HashSet<File>(); + protected Set<AttachmentFile> attachments = new HashSet<AttachmentFile>(); + protected Set<AttachmentFile> availableAttachments = new HashSet<AttachmentFile>(); protected File lastVisitedDirectory = FileUtils.getUserDirectory(); @@ -114,41 +120,41 @@ firePropertyChange(PROPERTY_ORIGINAL_DEMAND, oldValue, originalDemand); } - public Set<File> getAttachments() { + public Set<AttachmentFile> getAttachments() { return attachments; } - public void addAttachment(File attachment) { + public void addAttachment(AttachmentFile attachment) { attachments.add(attachment); firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachments()); Object oldValue = getTotalAttachmentLength(); - totalAttachmentLength += attachment.length(); + totalAttachmentLength += attachment.getLength(); firePropertyChange(PROPERTY_TOTAL_ATTACHMENT_LENGHT, oldValue, getTotalAttachmentLength()); recomputeValidity(); } - public void removeAttachment(File attachment) { + public void removeAttachment(AttachmentFile attachment) { attachments.remove(attachment); firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachments()); Object oldValue = getTotalAttachmentLength(); - totalAttachmentLength -= attachment.length(); + totalAttachmentLength -= attachment.getLength(); firePropertyChange(PROPERTY_TOTAL_ATTACHMENT_LENGHT, oldValue, getTotalAttachmentLength()); recomputeValidity(); } - public Set<File> getAvailableAttachments() { + public Set<AttachmentFile> getAvailableAttachments() { return availableAttachments; } - public void addAvailableAttachment(File attachment) { + public void addAvailableAttachment(AttachmentFile attachment) { availableAttachments.add(attachment); } - public void removeAvailableAttachment(File attachment) { + public void removeAvailableAttachment(AttachmentFile attachment) { availableAttachments.remove(attachment); } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailBeanUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailBeanUIModel.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailBeanUIModel.java 2014-05-20 14:25:32 UTC (rev 82) @@ -22,7 +22,6 @@ * #L% */ -import com.franciaflex.faxtomail.persistence.entities.Email; import org.jdesktop.beans.AbstractSerializableBean; import org.nuiton.jaxx.application.listener.PropagatePropertyChangeListener; import org.nuiton.util.CollectionUtil; 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-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java 2014-05-20 14:25:32 UTC (rev 82) @@ -23,12 +23,15 @@ */ 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 jaxx.runtime.JAXXObject; import jaxx.runtime.JAXXUtil; + import org.apache.commons.collections4.ComparatorUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -52,6 +55,7 @@ import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; + import java.awt.*; import java.io.File; import java.io.FileOutputStream; @@ -175,7 +179,7 @@ return result; } - public static boolean isFileAPDF(File file) { + /*public static boolean isFileAPDF(File file) { return FileUtil.extension(file).toUpperCase().equals("PDF"); } @@ -185,8 +189,20 @@ 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"); } + public static boolean isFileATxt(AttachmentFile file) { + return FileUtil.extension(file.getFilename()).toUpperCase().equals("TXT"); + } + + public static boolean isFileATif(AttachmentFile file) { + return FileUtil.extension(file.getFilename()).toUpperCase().equals("TIF"); + } + public static void setEmailContentInTextPane(JTextPane textPane, DemandeUIModel demandeUIModel) { String content = demandeUIModel.getHtmlContent(); if (content != null) { @@ -207,11 +223,12 @@ content = content.replaceAll("<meta (.*?)>(</meta>)?", ""); for (Attachment attachment : demandeUIModel.getAttachment()) { - File file = attachment.getOriginalFile(); - log.info("file " + file.getName()); - String key = file.getName(); + AttachmentFile file = attachment.getOriginalFile(); + log.info("file " + file.getFilename()); + String key = file.getFilename(); // replace the inline attachments with the extracted attachment file url - content = content.replaceAll("<img src=\"cid:" + key + "\"(.*?>)", "<img src=\"file://" + file.getAbsolutePath() + "\"$1"); + //content = content.replaceAll("<img src=\"cid:" + key + "\"(.*?>)", "<img src=\"file://" + file.getAbsolutePath() + "\"$1"); + throw new RuntimeException("Fix it"); } } else { @@ -238,9 +255,10 @@ return desktop; } - public static void print(File file) { + public static void print(AttachmentFile attachmentFile) { Desktop desktop = getDesktopForPrint(); + File file = attachmentFile.getFile(); try { desktop.print(file); Modified: trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_fr_FR.properties =================================================================== --- trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_fr_FR.properties 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/resources/i18n/faxtomail-ui-swing_fr_FR.properties 2014-05-20 14:25:32 UTC (rev 82) @@ -19,6 +19,7 @@ faxtomail.attachmentCellRenderer.text=(%s) faxtomail.attachmentEditor.action.add.tip=Ajouter une pièce jointe faxtomail.attachmentEditor.action.closeAttachment.tip=Fermer la fenêtre des pièces-jointes +faxtomail.attachmentEditor.action.edit.tip=Editer la pièce jointe faxtomail.attachmentEditor.action.open.tip=Ouvrir la pièce jointe faxtomail.attachmentEditor.action.remove.tip=Supprimer la pièce jointe faxtomail.attachmentEditor.action.save.tip=Enregistrer la pièce jointe en local @@ -61,6 +62,7 @@ faxtomail.demandReplies.action.open.tip=Visualiser la réponse faxtomail.demandReplies.action.tip=Réponses envoyées faxtomail.demandReplies.empty=Aucune réponse envoyée +faxtomail.demandReplies.error= faxtomail.demandReplies.text=Réponses (%s) faxtomail.demandReplies.title=Réponses envoyées faxtomail.demandRepliesCellRenderer.text=(%s) @@ -231,6 +233,7 @@ faxtomail.reply.message=\nLe %1$s, %2$s a écrit \:\n> %3$s faxtomail.reply.subject=Re \: %s faxtomail.reply.title=Réponse à \: %s +faxtomail.search.action.error= faxtomail.search.action.gotoFolder=Aller au dossier faxtomail.search.action.gotoFolder.tip=Aller au dossier faxtomail.search.addGroupedElement.label=Ajouter les éléments groupés aux résultats @@ -259,5 +262,6 @@ jaxx.application.error.cannot.print= jaxx.application.error.desktop.not.supported= jaxx.application.error.desktop.print.not.supported= +swing.error.cannot.copy.file= swing.error.cannot.open.file= test= Modified: trunk/faxtomail-ui-swing/src/main/resources/log4j.properties =================================================================== --- trunk/faxtomail-ui-swing/src/main/resources/log4j.properties 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-swing/src/main/resources/log4j.properties 2014-05-20 14:25:32 UTC (rev 82) @@ -19,7 +19,7 @@ # <http://www.gnu.org/licenses/gpl-3.0.html>. # #L% ### -log4j.rootCategory=WARN, console +log4j.rootCategory=DEBUG, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/MailFilterJob.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/MailFilterJob.java 2014-05-16 16:05:30 UTC (rev 81) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/MailFilterJob.java 2014-05-20 14:25:32 UTC (rev 82) @@ -24,28 +24,19 @@ * #L% */ -import com.franciaflex.faxtomail.persistence.entities.Attachment; -import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; -import com.franciaflex.faxtomail.persistence.entities.DemandStatus; -import com.franciaflex.faxtomail.persistence.entities.Email; -import com.franciaflex.faxtomail.persistence.entities.EmailAccount; -import com.franciaflex.faxtomail.persistence.entities.EmailImpl; -import com.franciaflex.faxtomail.persistence.entities.MailFolder; -import com.franciaflex.faxtomail.services.DecoratorService; -import com.franciaflex.faxtomail.services.FaxToMailServiceContext; -import com.franciaflex.faxtomail.services.service.CompanyService; -import com.franciaflex.faxtomail.services.service.EmailService; -import com.franciaflex.faxtomail.services.service.MailFolderService; +import static org.nuiton.i18n.I18n.t; -import org.apache.commons.io.Charsets; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.nuiton.decorator.Decorator; -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; +import java.io.File; +import java.io.FileOutputStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.Enumeration; +import java.util.List; +import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; @@ -60,26 +51,33 @@ import javax.mail.Store; import javax.mail.URLName; import javax.mail.internet.ContentType; -import javax.mail.internet.MailDateFormat; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; -import java.io.File; -import java.io.FileOutputStream; -import java.io.UnsupportedEncodingException; -import java.nio.charset.Charset; -import java.text.DateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Date; -import java.util.Enumeration; -import java.util.List; -import java.util.Locale; -import java.util.Properties; +import org.apache.commons.io.Charsets; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.decorator.Decorator; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; -import static org.nuiton.i18n.I18n.t; +import com.franciaflex.faxtomail.persistence.entities.Attachment; +import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; +import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; +import com.franciaflex.faxtomail.persistence.entities.DemandStatus; +import com.franciaflex.faxtomail.persistence.entities.Email; +import com.franciaflex.faxtomail.persistence.entities.EmailAccount; +import com.franciaflex.faxtomail.persistence.entities.EmailImpl; +import com.franciaflex.faxtomail.persistence.entities.MailFolder; +import com.franciaflex.faxtomail.services.DecoratorService; +import com.franciaflex.faxtomail.services.FaxToMailServiceContext; +import com.franciaflex.faxtomail.services.service.CompanyService; +import com.franciaflex.faxtomail.services.service.EmailService; +import com.franciaflex.faxtomail.services.service.MailFolderService; /** * @author Kevin Morin (Code Lutin) @@ -172,10 +170,10 @@ log.debug(count + " messages, " + unread + " unread"); + EmailService emailService = serviceContext.newService(EmailService.class); + for (int i = 0 ; i < count ; i++) { Email email = new EmailImpl(); - - EmailService emailService = serviceContext.newService(EmailService.class); emailService.saveEmail(email, null); int messageNumber = count - i; @@ -249,7 +247,7 @@ email.setOriginalEmail(emailSource.toString()); if (message.isMimeType("multipart/*")) { - decomposeMultipartEmail(message, email); + decomposeMultipartEmail(message, email, emailService); // } else { // String content = IOUtils.toString(message.getInputStream(), charset); // email.setPlainContent(content); @@ -273,9 +271,10 @@ * * @param part the part to decompose * @param email the email object to fill with the attachments or content + * @param emailService email service * @throws Exception */ - protected void decomposeMultipartEmail(Part part, Email email) throws Exception { + protected void decomposeMultipartEmail(Part part, Email email, EmailService emailService) throws Exception { DataSource dataSource = part.getDataHandler().getDataSource(); MimeMultipart mimeMultipart = new MimeMultipart(dataSource); int multiPartCount = mimeMultipart.getCount(); @@ -296,7 +295,7 @@ // if it is multipart part, decompose it } else if (bp.isMimeType("multipart/*")) { - decomposeMultipartEmail(bp, email); + decomposeMultipartEmail(bp, email, emailService); // else, this is an attachment } else { @@ -333,7 +332,10 @@ Attachment attachment = new AttachmentImpl(); attachment.setAddedByUser(false); - attachment.setOriginalFile(file); + AttachmentFile attachmentFile = emailService.getAttachmentFileFromStream(dh.getInputStream()); + attachmentFile.setFilename(dh.getName()); + attachment.setOriginalFile(attachmentFile); + email.addAttachment(attachment); } } @@ -345,5 +347,4 @@ Charset charset = Charsets.toCharset(charsetName); return charset; } - }
participants (1)
-
echatellier@users.forge.codelutin.com