r518 - in trunk/faxtomail-service/src: main/java/com/franciaflex/faxtomail/services/service main/java/com/franciaflex/faxtomail/services/service/imports test/java/com/franciaflex/faxtomail/services/service test/resources test/resources/archives
Author: echatellier Date: 2014-08-11 16:46:33 +0200 (Mon, 11 Aug 2014) New Revision: 518 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/518 Log: refs-50 #5559: Import csv des archives existantes Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportBean.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportModel.java trunk/faxtomail-service/src/test/resources/archives/ trunk/faxtomail-service/src/test/resources/archives/archives.csv trunk/faxtomail-service/src/test/resources/archives/att1.txt trunk/faxtomail-service/src/test/resources/archives/att2.txt 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/EmailServiceImpl.java trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java 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-08-11 10:58:27 UTC (rev 517) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java 2014-08-11 14:46:33 UTC (rev 518) @@ -37,11 +37,14 @@ import com.franciaflex.faxtomail.services.FaxToMailService; import com.franciaflex.faxtomail.services.service.exceptions.AlreadyLockedMailException; import com.franciaflex.faxtomail.services.service.exceptions.InvalidClientException; + import org.apache.commons.mail.EmailException; import org.nuiton.util.pagination.PaginationParameter; import org.nuiton.util.pagination.PaginationResult; import javax.mail.MessagingException; + +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Collection; @@ -99,4 +102,12 @@ void updateRangeRowsWithEdiReturns(); AttachmentFile getEmailDetailAsAttachment(Email email); + + /** + * Import archive from input stream. + * + * @param is input stream of csv file + * @param attachmentBase base folder containing attachment listed in csv file + */ + void importArchive(InputStream is, File attachmentBase); } Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-08-11 10:58:27 UTC (rev 517) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-08-11 14:46:33 UTC (rev 518) @@ -32,6 +32,8 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.ArrayList; import java.util.Collection; @@ -40,6 +42,7 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -48,9 +51,9 @@ import javax.activation.FileDataSource; import javax.mail.MessagingException; -import com.google.common.collect.Collections2; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; +import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; @@ -66,6 +69,9 @@ import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; import org.apache.pdfbox.pdmodel.interactive.form.PDField; import org.hibernate.Hibernate; +import org.nuiton.csv.Import; +import org.nuiton.csv.ImportRuntimeException; +import org.nuiton.jaxx.application.ApplicationTechnicalException; import org.nuiton.topia.persistence.TopiaEntities; import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; import org.nuiton.util.beans.Binder; @@ -77,10 +83,14 @@ import com.franciaflex.faxtomail.services.FaxToMailServiceSupport; import com.franciaflex.faxtomail.services.service.exceptions.AlreadyLockedMailException; import com.franciaflex.faxtomail.services.service.exceptions.InvalidClientException; +import com.franciaflex.faxtomail.services.service.imports.ArchiveImportBean; +import com.franciaflex.faxtomail.services.service.imports.ArchiveImportModel; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; import com.google.common.base.Strings; +import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -1173,4 +1183,117 @@ Hibernate.initialize(email.getEtatAttente()); Hibernate.initialize(email.getPriority()); } + + /** + * Compute mail folder path (separated by /) from root to current. + * + * @param folder folder to get path + * @return full mail folder path + */ + protected String getFullMailFolderPath(MailFolder folder) { + StringBuilder sb = new StringBuilder(folder.getName()); + MailFolder loopFolder = folder.getParent(); + while (loopFolder != null) { + sb.insert(0, "/"); + sb.insert(0, loopFolder.getName()); + loopFolder = loopFolder.getParent(); + } + return sb.toString(); + } + + @Override + public void importArchive(InputStream inputStream, File attachmentBase) { + + // all doas involved + EmailTopiaDao emailDao = getPersistenceContext().getEmailDao(); + DemandTypeTopiaDao demandTypedao = getPersistenceContext().getDemandTypeDao(); + PriorityTopiaDao priorityDao = getPersistenceContext().getPriorityDao(); + EtatAttenteTopiaDao etatAttenteDao = getPersistenceContext().getEtatAttenteDao(); + MailFolderTopiaDao mailFolderDao = getPersistenceContext().getMailFolderDao(); + AttachmentTopiaDao attachmentDao = getPersistenceContext().getAttachmentDao(); + AttachmentFileTopiaDao attachmentFileDao = getPersistenceContext().getAttachmentFileDao(); + + // get referentiel map + Map<String, DemandType> allDemandTypes = Maps.uniqueIndex(demandTypedao, new Function<DemandType, String>() { + @Override + public String apply(DemandType input) { + return input.getLabel(); + } + }); + Map<String, Priority> allPriority = Maps.uniqueIndex(priorityDao, new Function<Priority, String>() { + @Override + public String apply(Priority input) { + return input.getLabel(); + } + }); + Map<String, EtatAttente> allEtatAttentes = Maps.uniqueIndex(etatAttenteDao, new Function<EtatAttente, String>() { + @Override + public String apply(EtatAttente input) { + return input.getLabel(); + } + }); + + // build folder map + Map<String, MailFolder> mailFolderMap = Maps.uniqueIndex(mailFolderDao, new Function<MailFolder, String>() { + @Override + public String apply(MailFolder input) { + return getFullMailFolderPath(input); + } + }); + + // run import + ArchiveImportModel archiveImportModel = new ArchiveImportModel(';', allEtatAttentes, allDemandTypes, allPriority, mailFolderMap); + Binder<ArchiveImportBean, Email> emailBinder = BinderFactory.newBinder(ArchiveImportBean.class, Email.class); + Import<ArchiveImportBean> importer = null; + try { + importer = Import.newImport(archiveImportModel, new InputStreamReader(inputStream, getApplicationConfig().getImportFileEncoding())); + for (ArchiveImportBean archiveBean : importer) { + + // create new email to persist + Email email = emailDao.newInstance(); + emailBinder.copy(archiveBean, email); + email.setDemandStatus(DemandStatus.ARCHIVED); + + // persist it + email = emailDao.create(email); + + // manage attachments + if (archiveBean.getAttachmentPaths() != null) { + Iterable<String> itAttachmentPaths = Splitter.on(',').omitEmptyStrings().trimResults().split(archiveBean.getAttachmentPaths()); + for (String attachmentPath : itAttachmentPaths) { + File attFile = new File(attachmentBase, attachmentPath); + if (!attFile.isFile()) { + throw new RuntimeException("Missing file " + attFile.getAbsolutePath()); + } + + Attachment attachment = new AttachmentImpl(); + AttachmentFile attachmentFile = new AttachmentFileImpl(); + attachmentFile.setFilename(attFile.getName()); + attachmentFile.setContent(FileUtils.readFileToByteArray(attFile)); + attachmentFile = attachmentFileDao.create(attachmentFile); + attachment.setOriginalFile(attachmentFile); + + attachment = attachmentDao.create(attachment); + email.addAttachment(attachment); + } + + emailDao.update(email); + } + } + + getPersistenceContext().commit(); + + } catch (ImportRuntimeException|IOException e) { + String message; + if (e.getCause() != null) { + message = e.getCause().getMessage(); + } else { + message = e.getMessage(); + } + throw new ApplicationTechnicalException(message, e); + } finally { + IOUtils.closeQuietly(importer); + IOUtils.closeQuietly(inputStream); + } + } } Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportBean.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportBean.java (rev 0) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportBean.java 2014-08-11 14:46:33 UTC (rev 518) @@ -0,0 +1,49 @@ +package com.franciaflex.faxtomail.services.service.imports; + +import com.franciaflex.faxtomail.persistence.entities.EmailImpl; + +/** + * Bean model d'import des archives. (très proche de l'entité + * {@link com.franciaflex.faxtomail.persistence.entities.Email}). + * + * @author Eric Chatellier + */ +public class ArchiveImportBean extends EmailImpl { + + /** serialVersionUID. */ + private static final long serialVersionUID = 1498046445018851410L; + + protected static final String PROPERTY_ATTACHMENT_PATHS = "attachmentPaths"; + protected static final String PROPERTY_CLIENT_CODE = "clientCode"; + protected static final String PROPERTY_CLIENT_BRAND = "clientBrand"; + + protected String attachmentPaths; + + protected String clientCode; + + protected String clientBrand; + + public String getAttachmentPaths() { + return attachmentPaths; + } + + public void setAttachmentPaths(String attachmentPaths) { + this.attachmentPaths = attachmentPaths; + } + + public String getClientCode() { + return clientCode; + } + + public void setClientCode(String clientCode) { + this.clientCode = clientCode; + } + + public String getClientBrand() { + return clientBrand; + } + + public void setClientBrand(String clientBrand) { + this.clientBrand = clientBrand; + } +} Property changes on: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportBean.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportModel.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportModel.java (rev 0) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportModel.java 2014-08-11 14:46:33 UTC (rev 518) @@ -0,0 +1,97 @@ +package com.franciaflex.faxtomail.services.service.imports; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; + +import org.nuiton.csv.ValueParser; +import org.nuiton.csv.ext.AbstractImportModel; + +import com.franciaflex.faxtomail.persistence.entities.DemandType; +import com.franciaflex.faxtomail.persistence.entities.Email; +import com.franciaflex.faxtomail.persistence.entities.EtatAttente; +import com.franciaflex.faxtomail.persistence.entities.MailFolder; +import com.franciaflex.faxtomail.persistence.entities.Priority; + +/** + * Modele d'import des archives, défini comme suit: + * + * receptionDate;projectReference;sender;fax;recipient;object;archiveDate;companyReference; + * originalEmail;comment;etatAttente;demandType;priority;mailFolder;client-code;client-brand;attachments + * + * @author Eric Chatellier + */ +public class ArchiveImportModel extends AbstractImportModel<ArchiveImportBean> { + + /** + * Parse date pattern : dd/MM/yyyy hh:mm:ss. + */ + protected ValueParser<Date> dateValueParser = new ValueParser<Date>() { + protected DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss"); + @Override + public Date parse(String value) throws ParseException { + return dateFormat.parse(value); + } + }; + + /** + * Parser for boolean fields. + */ + protected ValueParser<Boolean> yesNoParser = new ValueParser<Boolean>() { + @Override + public Boolean parse(String value) throws ParseException { + return "oui".equalsIgnoreCase(value); + } + }; + + public ArchiveImportModel(char separator, + final Map<String, EtatAttente> etatAttentes, final Map<String, DemandType> demandTypes, + final Map<String, Priority> priorities, final Map<String, MailFolder> mailFolderMap) { + super(separator); + + newMandatoryColumn("receptionDate", Email.PROPERTY_RECEPTION_DATE, dateValueParser); + newMandatoryColumn("projectReference", Email.PROPERTY_PROJECT_REFERENCE); + newMandatoryColumn("sender", Email.PROPERTY_SENDER); + newMandatoryColumn("fax", Email.PROPERTY_FAX, yesNoParser); + newMandatoryColumn("recipient", Email.PROPERTY_RECIPIENT); + newMandatoryColumn("object", Email.PROPERTY_OBJECT); + newMandatoryColumn("archiveDate", Email.PROPERTY_ARCHIVE_DATE, dateValueParser); + newMandatoryColumn("companyReference", Email.PROPERTY_COMPANY_REFERENCE); + newMandatoryColumn("originalEmail", Email.PROPERTY_ORIGINAL_EMAIL); + newMandatoryColumn("comment", Email.PROPERTY_COMMENT); + newMandatoryColumn("etatAttente", Email.PROPERTY_ETAT_ATTENTE, new ValueParser<EtatAttente>() { + @Override + public EtatAttente parse(String value) throws ParseException { + return etatAttentes.get(value); + } + }); + newMandatoryColumn("demandType", Email.PROPERTY_DEMAND_TYPE, new ValueParser<DemandType>() { + @Override + public DemandType parse(String value) throws ParseException { + return demandTypes.get(value); + } + }); + newMandatoryColumn("priority", Email.PROPERTY_PRIORITY, new ValueParser<Priority>() { + @Override + public Priority parse(String value) throws ParseException { + return priorities.get(value); + } + }); + newMandatoryColumn("mailFolder", Email.PROPERTY_MAIL_FOLDER, new ValueParser<MailFolder>() { + @Override + public MailFolder parse(String value) throws ParseException { + return mailFolderMap.get(value); + } + }); + newMandatoryColumn("client-code", ArchiveImportBean.PROPERTY_CLIENT_CODE); + newMandatoryColumn("client-brand", ArchiveImportBean.PROPERTY_CLIENT_BRAND); + newMandatoryColumn("attachments", ArchiveImportBean.PROPERTY_ATTACHMENT_PATHS); + } + + @Override + public ArchiveImportBean newEmptyInstance() { + return new ArchiveImportBean(); + } +} Property changes on: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportModel.java ___________________________________________________________________ Added: svn:eol-style + native Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java =================================================================== --- trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java 2014-08-11 10:58:27 UTC (rev 517) +++ trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java 2014-08-11 14:46:33 UTC (rev 518) @@ -24,14 +24,12 @@ * #L% */ +import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.util.Collections; import java.util.Set; -import com.franciaflex.faxtomail.persistence.entities.MailFolder; -import com.franciaflex.faxtomail.persistence.entities.MailFolderTopiaDao; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -43,6 +41,10 @@ import com.franciaflex.faxtomail.persistence.entities.DemandStatus; import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.persistence.entities.EmailFilter; +import com.franciaflex.faxtomail.persistence.entities.MailFolder; +import com.franciaflex.faxtomail.persistence.entities.MailFolderTopiaDao; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; /** * Email service tests. @@ -155,4 +157,17 @@ Assert.assertTrue(Sets.intersection(page1Ids, page2Ids).isEmpty()); } + + /** + * Test de l'import de la reprise des archives. + * + * @throws IOException + */ + @Test + public void testImportArchive() throws IOException { + try (InputStream is = EmailServiceTest.class.getResourceAsStream("/archives/archives.csv")) { + File attachmentBase = new File("src/test/resources/archives"); + service.importArchive(is, attachmentBase); + } + } } Added: trunk/faxtomail-service/src/test/resources/archives/archives.csv =================================================================== --- trunk/faxtomail-service/src/test/resources/archives/archives.csv (rev 0) +++ trunk/faxtomail-service/src/test/resources/archives/archives.csv 2014-08-11 14:46:33 UTC (rev 518) @@ -0,0 +1,2 @@ +receptionDate;projectReference;sender;fax;recipient;object;archiveDate;companyReference;originalEmail;comment;etatAttente;demandType;priority;mailFolder;client-code;client-brand;attachments +30/07/1984 23:10:00;naissance de l'élu;dieu@skysupport.com;non;humanity@populasse.fr;Une nouvelle ere commence;30/07/2014 12:00:00;osef;"Ha la la, je te raconte pas...";"no comment";Pris;Retour;Haut;Franciaflex/Chargés de clientèle/Agathe;99153;FX;att1.txt,att2.txt Added: trunk/faxtomail-service/src/test/resources/archives/att1.txt =================================================================== --- trunk/faxtomail-service/src/test/resources/archives/att1.txt (rev 0) +++ trunk/faxtomail-service/src/test/resources/archives/att1.txt 2014-08-11 14:46:33 UTC (rev 518) @@ -0,0 +1 @@ +Test \ No newline at end of file Added: trunk/faxtomail-service/src/test/resources/archives/att2.txt =================================================================== --- trunk/faxtomail-service/src/test/resources/archives/att2.txt (rev 0) +++ trunk/faxtomail-service/src/test/resources/archives/att2.txt 2014-08-11 14:46:33 UTC (rev 518) @@ -0,0 +1 @@ +Re test \ No newline at end of file
participants (1)
-
echatellier@users.forge.codelutin.com