Author: kmorin Date: 2014-10-17 14:29:12 +0200 (Fri, 17 Oct 2014) New Revision: 678 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/678 Log: fixes #5963 Prise en compte des dossier d'archive lors de l'import des archives fixes #5974 Erreur lors de l'import d'un grand nombre d'archives Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportExportBean.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportExportModel.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportResult.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/InvalidArchiveImportBeanException.java Removed: 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 Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java trunk/faxtomail-persistence/src/main/resources/faxToMail.properties trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/FaxToMailServiceUtils.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/EmailServiceImpl.java trunk/faxtomail-service/src/main/resources/i18n/faxtomail-service_fr_FR.properties 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/util/FaxToMailUIUtil.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailApplicationListener.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ImportArchiveAction.java trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/import-archive-input.jsp Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java 2014-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java 2014-10-17 12:29:12 UTC (rev 678) @@ -281,6 +281,10 @@ return applicationConfig.getOption(FaxToMailConfigurationOption.JOB_CLIENT_EXPRESSION.getKey()); } + public int getArchiveImportCommitTreshold() { + return applicationConfig.getOptionAsInt(FaxToMailConfigurationOption.ARCHIVE_IMPORT_COMMIT_TRESHOLD.getKey()); + } + public String getInstanceUrl() { return applicationConfig.getOption(FaxToMailConfigurationOption.INSTANCE_URL.getKey()); } Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java 2014-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java 2014-10-17 12:29:12 UTC (rev 678) @@ -143,6 +143,10 @@ "faxtomail.job.client.expression", "Expression cron de lancement du job Client", "0 */15 * * * ?", String.class), + ARCHIVE_IMPORT_COMMIT_TRESHOLD( + "faxtomail.archiveImport.commitTreshold.expression", + "Nombre d'archives à importer avant de commiter", "100", Integer.class), + // TRANSIENT CONFIG VERSION( "faxtomail.version", Modified: trunk/faxtomail-persistence/src/main/resources/faxToMail.properties =================================================================== --- trunk/faxtomail-persistence/src/main/resources/faxToMail.properties 2014-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-persistence/src/main/resources/faxToMail.properties 2014-10-17 12:29:12 UTC (rev 678) @@ -24,7 +24,8 @@ hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:file:/tmp/faxtomail/h2data;MODE=MSSQLServer;AUTO_SERVER=TRUE +#hibernate.connection.url=jdbc:h2:file:/tmp/faxtomail/h2data;MODE=MSSQLServer;AUTO_SERVER=TRUE +hibernate.connection.url=jdbc:h2:file:/home/kmorin/faxtomail/h2data;MODE=MSSQLServer;AUTO_SERVER=TRUE;CACHE_SIZE=8192 hibernate.connection.username=sa hibernate.connection.password= @@ -37,6 +38,8 @@ #hibernate.hbm2ddl.auto=validate hibernate.hbm2ddl.auto= +hibernate.jdbc.batch_size=20 + hibernate.c3p0.min_size=5 hibernate.c3p0.max_size=20 hibernate.c3p0.timeout=1800 Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/FaxToMailServiceUtils.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/FaxToMailServiceUtils.java 2014-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/FaxToMailServiceUtils.java 2014-10-17 12:29:12 UTC (rev 678) @@ -74,4 +74,21 @@ } return result; } + + /** + * Compute mail folder path (separated by /) from root to current. + * + * @param folder folder to get path + * @return full mail folder path + */ + public static 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(); + } } 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-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java 2014-10-17 12:29:12 UTC (rev 678) @@ -37,6 +37,7 @@ import com.franciaflex.faxtomail.persistence.entities.EmailFilter; import com.franciaflex.faxtomail.persistence.entities.SearchFilter; +import com.franciaflex.faxtomail.services.service.imports.ArchiveImportResult; import org.apache.commons.mail.EmailException; import org.nuiton.util.pagination.PaginationParameter; import org.nuiton.util.pagination.PaginationResult; @@ -136,7 +137,6 @@ * * @param is input stream of csv file * @param attachmentBase base folder containing attachment listed in csv file - * @return the number of imported archives */ - int importArchive(InputStream is, File attachmentBase); + ArchiveImportResult 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-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-10-17 12:29:12 UTC (rev 678) @@ -35,6 +35,7 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.StringWriter; +import java.io.UnsupportedEncodingException; import java.io.Writer; import java.nio.charset.StandardCharsets; import java.sql.Connection; @@ -49,16 +50,24 @@ 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.Map.Entry; import java.util.Set; import java.util.TreeMap; +import java.util.UUID; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.MessagingException; +import com.franciaflex.faxtomail.services.service.imports.ArchiveImportExportBean; +import com.franciaflex.faxtomail.services.service.imports.ArchiveImportExportModel; +import com.franciaflex.faxtomail.services.service.imports.ArchiveImportResult; +import com.franciaflex.faxtomail.services.service.imports.InvalidArchiveImportBeanException; +import com.google.common.base.Optional; +import com.google.common.collect.Iterables; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; import org.apache.commons.io.FileUtils; @@ -73,11 +82,18 @@ import org.apache.commons.mail.EmailException; import org.apache.commons.mail.MultiPartEmail; import org.hibernate.Hibernate; +import org.hibernate.HibernateException; +import org.hibernate.StatelessSession; +import org.hibernate.Transaction; +import org.hibernate.TransactionException; +import org.nuiton.csv.Export; import org.nuiton.csv.Import; -import org.nuiton.csv.ImportRuntimeException; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.ApplicationTechnicalException; import org.nuiton.topia.persistence.TopiaEntities; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaQueryException; +import org.nuiton.topia.persistence.support.TopiaHibernateSupport; import org.nuiton.topia.persistence.support.TopiaSqlSupport; import org.nuiton.topia.persistence.support.TopiaSqlWork; import org.nuiton.util.beans.Binder; @@ -92,8 +108,6 @@ import com.franciaflex.faxtomail.services.service.exceptions.AlreadyLockedMailException; import com.franciaflex.faxtomail.services.service.exceptions.FolderNotReadableException; 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.github.mustachejava.DefaultMustacheFactory; import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheFactory; @@ -1432,35 +1446,30 @@ return writer.toString(); } - /** - * 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 int importArchive(InputStream inputStream, File attachmentBase) { + public ArchiveImportResult importArchive(InputStream inputStream, File attachmentBase) { - // all doas involved - EmailTopiaDao emailDao = getPersistenceContext().getEmailDao(); - DemandTypeTopiaDao demandTypedao = getPersistenceContext().getDemandTypeDao(); - PriorityTopiaDao priorityDao = getPersistenceContext().getPriorityDao(); - WaitingStateTopiaDao waitingStateDao = getPersistenceContext().getWaitingStateDao(); - MailFolderTopiaDao mailFolderDao = getPersistenceContext().getMailFolderDao(); - AttachmentTopiaDao attachmentDao = getPersistenceContext().getAttachmentDao(); - AttachmentFileTopiaDao attachmentFileDao = getPersistenceContext().getAttachmentFileDao(); + // all daos involved + FaxToMailTopiaPersistenceContext persistenceContext = getPersistenceContext(); + TopiaHibernateSupport hibernateSupport = persistenceContext.getHibernateSupport(); +// Session hibernateSession = hibernateSupport.getHibernateSession(); + StatelessSession statelessSession = hibernateSupport.getHibernateFactory().openStatelessSession(); + Transaction transaction = statelessSession.beginTransaction(); + EmailTopiaDao emailDao = persistenceContext.getEmailDao(); + DemandTypeTopiaDao demandTypedao = persistenceContext.getDemandTypeDao(); + PriorityTopiaDao priorityDao = persistenceContext.getPriorityDao(); + WaitingStateTopiaDao waitingStateDao = persistenceContext.getWaitingStateDao(); + MailFolderTopiaDao mailFolderDao = persistenceContext.getMailFolderDao(); + AttachmentTopiaDao attachmentDao = persistenceContext.getAttachmentDao(); + AttachmentFileTopiaDao attachmentFileDao = persistenceContext.getAttachmentFileDao(); + HistoryTopiaDao historyDao = persistenceContext.getHistoryDao(); + + int commitThreshold = getApplicationConfig().getArchiveImportCommitTreshold(); + if (log.isInfoEnabled()) { + log.info("commit every " + commitThreshold + " archives imported"); + } + // get referentiel map Map<String, DemandType> allDemandTypes = Maps.uniqueIndex(demandTypedao, new Function<DemandType, String>() { @Override @@ -1485,69 +1494,186 @@ Map<String, MailFolder> mailFolderMap = Maps.uniqueIndex(mailFolderDao, new Function<MailFolder, String>() { @Override public String apply(MailFolder input) { - return getFullMailFolderPath(input); + return FaxToMailServiceUtils.getFullMailFolderPath(input); } }); // run import - ArchiveImportModel archiveImportModel = new ArchiveImportModel(';', allWaitingStates, allDemandTypes, allPriority, mailFolderMap); - Binder<ArchiveImportBean, Email> emailBinder = BinderFactory.newBinder(ArchiveImportBean.class, Email.class); - Import<ArchiveImportBean> importer = null; + ArchiveImportExportModel archiveImportExportModel = new ArchiveImportExportModel(';', allWaitingStates, allDemandTypes, allPriority); + Binder<ArchiveImportExportBean, Email> emailBinder = BinderFactory.newBinder(ArchiveImportExportBean.class, Email.class); + Import<ArchiveImportExportBean> importer = null; - int result = 0; + // cache of archive folders + Map<MailFolder, MailFolder> archiveFoldersByFolder = new HashMap<>(); + Map<MailFolder, String> companyByFolder = new HashMap<>(); + ArchiveImportResult result = new ArchiveImportResult(); + + Set<ArchiveImportExportBean> notImportedBeans = new HashSet<>(); + Set<ArchiveImportExportBean> toCommitBeans = new HashSet<>(); + try { - importer = Import.newImport(archiveImportModel, new InputStreamReader(inputStream, getApplicationConfig().getImportFileEncoding())); - for (ArchiveImportBean archiveBean : importer) { + importer = Import.newImport(archiveImportExportModel, new InputStreamReader(inputStream, getApplicationConfig().getImportFileEncoding())); + Iterator<ArchiveImportExportBean> iterator = importer.iterator(); + int index = 0; - if (archiveBean.getProjectReference() == null) { - log.error("null project ref for " + archiveBean.getReceptionDate()); - } - if (archiveBean.getMailFolder() == null) { - log.error("null mail folder for " + archiveBean.getReceptionDate()); - } - // create new email to persist - //TODO add modified properties - Email email = emailDao.newInstance(); - emailBinder.copy(archiveBean, email); - email.setDemandStatus(DemandStatus.ARCHIVED); + while (iterator.hasNext()) { + try { + ArchiveImportExportBean archiveBean = iterator.next(); + toCommitBeans.add(archiveBean); + index++; + if (archiveBean.getProjectReference() == null) { + log.error("null project ref for " + archiveBean.getReceptionDate()); + } - // persist it - email = emailDao.create(email); + String mailFolderPath = archiveBean.getMailFolderPath(); + MailFolder folder = mailFolderMap.get(mailFolderPath); + archiveBean.setMailFolder(folder); - // manage attachments - if (archiveBean.getAttachmentPaths() != null) { - Iterable<String> itAttachmentPaths = Splitter.on(',').omitEmptyStrings().trimResults().split(archiveBean.getAttachmentPaths()); - for (String attachmentPath : itAttachmentPaths) { - File attFile; - if (attachmentBase != null) { - attFile = new File(attachmentBase, attachmentPath); - } else { - attFile = new File(attachmentPath); + if (archiveBean.getMailFolder() == null) { + log.error("null mail folder for " + archiveBean.getReceptionDate()); + String errorMessage = t("faxtomail.archives.import.error.invalidFolder", mailFolderPath); + throw new InvalidArchiveImportBeanException(errorMessage, archiveBean); + } + // create new email to persist + Email email = emailDao.newInstance(); + emailBinder.copy(archiveBean, email); + + email.setDemandStatus(DemandStatus.ARCHIVED); + + MailFolder archiveChild = null; + String company = null; + boolean companyFound = false; + + if (!archiveFoldersByFolder.containsKey(folder)) { + do { + if (archiveChild == null && folder.getChildren() != null) { + Optional<MailFolder> optArchiveChild = Iterables.tryFind(folder.getChildren(), new com.google.common.base.Predicate<MailFolder>() { + @Override + public boolean apply(MailFolder mailFolder) { + return mailFolder.isArchiveFolder(); + } + }); + if (optArchiveChild.isPresent()) { + archiveChild = optArchiveChild.get(); + } + } + if (!companyFound && folder.isUseCurrentLevelCompany()) { + companyFound = true; + company = folder.getCompany(); + } + folder = folder.getParent(); + + } while ((archiveChild == null || !companyFound) && folder != null); + + archiveFoldersByFolder.put(folder, archiveChild); + companyByFolder.put(folder, company); + + } else { + archiveChild = archiveFoldersByFolder.get(folder); + company = companyByFolder.get(folder); + } + + // le dossier d'archive peut ne pas exister. Dans ce cas on laisse le mail dans le dossier + // d'origine + if (archiveChild != null) { + email.setMailFolder(archiveChild); + } + + Client client = getClientService().getClientForCode(archiveBean.getClientCode(), company); + email.setClient(client); + + History history = historyDao.newInstance(); + history.setType(HistoryType.ARCHIVED); + history.setModificationDate(new Date()); + history.setTopiaId(getTopiaId(History.class, history)); + statelessSession.insert(history); + + email.addHistory(history); + // persist it + email.setTopiaId(getTopiaId(Email.class, email)); + statelessSession.insert(email); + + // manage attachments + if (archiveBean.getAttachmentPaths() != null) { + Iterable<String> itAttachmentPaths = Splitter.on(',').omitEmptyStrings().trimResults().split(archiveBean.getAttachmentPaths()); + for (String attachmentPath : itAttachmentPaths) { + File attFile; + if (attachmentBase != null) { + attFile = new File(attachmentBase, attachmentPath); + } else { + attFile = new File(attachmentPath); + } + if (!attFile.isFile()) { + String errorMessage = t("faxtomail.archives.import.error.invalidAttachmentPath", attachmentPath); + throw new InvalidArchiveImportBeanException(errorMessage, archiveBean); + } + + Attachment attachment = attachmentDao.newInstance(); + AttachmentFile attachmentFile = attachmentFileDao.newInstance(); + attachmentFile.setFilename(attFile.getName()); + + try { + attachmentFile.setContent(FileUtils.readFileToByteArray(attFile)); + } catch (IOException e) { + String errorMessage = t("faxtomail.archives.import.error.readingAttachmentFile", attachmentPath); + throw new InvalidArchiveImportBeanException(errorMessage, archiveBean); + } + attachmentFile.setTopiaId(getTopiaId(AttachmentFile.class, attachmentFile)); + statelessSession.insert(attachmentFile); + + attachment.setOriginalFile(attachmentFile); + + attachment.setTopiaId(getTopiaId(Attachment.class, attachment)); + statelessSession.insert(attachment); + + email.addAttachment(attachment); } - if (!attFile.isFile()) { - throw new RuntimeException("Missing file " + attFile.getAbsolutePath()); + + statelessSession.update(email); + if (log.isDebugEnabled()) { + log.debug("add archive " + index); } - 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); + if (index % commitThreshold == 0 || !iterator.hasNext()) { + transaction.commit(); + transaction = statelessSession.beginTransaction(); + + result.addNbImportedArchives(toCommitBeans.size()); + toCommitBeans.clear(); } - - emailDao.update(email); - result++; + + } catch (InvalidArchiveImportBeanException e) { + log.error(e.getMessage(), e); + notImportedBeans.add(e.getBean()); + + } catch (HibernateException | TopiaQueryException e) { + String message; + if (e.getCause() != null) { + message = e.getCause().getMessage(); + } else { + message = e.getMessage(); + } + log.error(message, e); + + String errorMessage = t("faxtomail.archives.import.error.persistence"); + for (ArchiveImportExportBean bean : toCommitBeans) { + bean.setError(errorMessage); + notImportedBeans.add(bean); + } + toCommitBeans.clear(); + + while (iterator.hasNext()) { + ArchiveImportExportBean next = iterator.next(); + next.setError(errorMessage); + notImportedBeans.add(next); + } } } - getPersistenceContext().commit(); - - } catch (ImportRuntimeException|IOException e) { + } catch (UnsupportedEncodingException e) { String message; if (e.getCause() != null) { message = e.getCause().getMessage(); @@ -1555,14 +1681,34 @@ message = e.getMessage(); } throw new ApplicationTechnicalException(message, e); + } finally { IOUtils.closeQuietly(importer); IOUtils.closeQuietly(inputStream); } + if (!notImportedBeans.isEmpty()) { + try { + result.addNbImportErrors(notImportedBeans.size()); + Export<ArchiveImportExportBean> exporter = Export.newExport(archiveImportExportModel, notImportedBeans); + + String fileName = DateFormatUtils.format(new Date(), "yyyyMMddhhmmss") + "-" + UUID.randomUUID() + ".csv"; + File errorFile = new File(getApplicationConfig().getDataDirectory(), fileName); + exporter.write(errorFile); + result.setErrorFile(errorFile); + + } catch (Exception e) { + log.error(e); + } + } + return result; } + protected String getTopiaId(Class clazz, TopiaEntity entity) { + return getPersistenceContext().getTopiaIdFactory().newTopiaId(clazz, entity); + } + @Override public long getArchivedMailCount() { EmailTopiaDao emailDao = getPersistenceContext().getEmailDao(); Deleted: 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 2014-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportBean.java 2014-10-17 12:29:12 UTC (rev 678) @@ -1,73 +0,0 @@ -package com.franciaflex.faxtomail.services.service.imports; - -/* - * #%L - * FaxToMail :: Service - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2014 Mac-Groupe, 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 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; - } -} Copied: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportExportBean.java (from rev 677, 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/ArchiveImportExportBean.java (rev 0) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportExportBean.java 2014-10-17 12:29:12 UTC (rev 678) @@ -0,0 +1,95 @@ +package com.franciaflex.faxtomail.services.service.imports; + +/* + * #%L + * FaxToMail :: Service + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2014 Mac-Groupe, 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 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 ArchiveImportExportBean extends EmailImpl { + + /** serialVersionUID. */ + private static final long serialVersionUID = 1498046445018851410L; + + protected static final String PROPERTY_MAIL_FOLDER_PATHS = "mailFolderPath"; + 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 static final String PROPERTY_ERROR = "error"; + + protected String mailFolderPath; + + protected String attachmentPaths; + + protected String clientCode; + + protected String clientBrand; + + protected String error; + + public String getMailFolderPath() { + return mailFolderPath; + } + + public void setMailFolderPath(String mailFolderPath) { + this.mailFolderPath = mailFolderPath; + } + + 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; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } +} Property changes on: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportExportBean.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Copied: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportExportModel.java (from rev 677, 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/ArchiveImportExportModel.java (rev 0) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportExportModel.java 2014-10-17 12:29:12 UTC (rev 678) @@ -0,0 +1,149 @@ +package com.franciaflex.faxtomail.services.service.imports; + +/* + * #%L + * FaxToMail :: Service + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2014 Mac-Groupe, 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.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; + +import com.franciaflex.faxtomail.persistence.entities.HasLabel; +import com.franciaflex.faxtomail.services.FaxToMailServiceUtils; +import org.nuiton.csv.Common; +import org.nuiton.csv.ValueParserFormatter; +import org.nuiton.csv.ext.AbstractImportExportModel; + +import com.franciaflex.faxtomail.persistence.entities.DemandType; +import com.franciaflex.faxtomail.persistence.entities.WaitingState; +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 ArchiveImportExportModel extends AbstractImportExportModel<ArchiveImportExportBean> { + + /** + * Parse date pattern : dd/MM/yyyy hh:mm:ss. + */ + protected ValueParserFormatter<Date> dateValueParserFormatter = new ValueParserFormatter<Date>() { + protected DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss"); + @Override + public Date parse(String value) throws ParseException { + return dateFormat.parse(value); + } + + @Override + public String format(Date value) { + return dateFormat.format(value); + } + }; + + public ArchiveImportExportModel(char separator, + final Map<String, WaitingState> waitingStates, + final Map<String, DemandType> demandTypes, + final Map<String, Priority> priorities) { + super(separator); + + newColumnForImportExport("receptionDate", ArchiveImportExportBean.PROPERTY_RECEPTION_DATE, dateValueParserFormatter); + newColumnForImportExport("projectReference", ArchiveImportExportBean.PROPERTY_PROJECT_REFERENCE); + newColumnForImportExport("sender", ArchiveImportExportBean.PROPERTY_SENDER, new ValueParserFormatter<Object>() { + @Override + public Object parse(String value) throws ParseException { + value = value.replaceFirst("^.*<(.*)>$", "$1"); + value = value.toLowerCase(); + return value; + } + + @Override + public String format(Object value) { + return value != null ? value.toString() : ""; + } + }); + newColumnForImportExport("fax", ArchiveImportExportBean.PROPERTY_FAX, Common.PRIMITIVE_BOOLEAN); + newColumnForImportExport("recipient", ArchiveImportExportBean.PROPERTY_RECIPIENT); + newColumnForImportExport("object", ArchiveImportExportBean.PROPERTY_OBJECT); + newColumnForImportExport("archiveDate", ArchiveImportExportBean.PROPERTY_ARCHIVE_DATE, dateValueParserFormatter); + newColumnForImportExport("companyReference", ArchiveImportExportBean.PROPERTY_COMPANY_REFERENCE); + newColumnForImportExport("originalEmail", ArchiveImportExportBean.PROPERTY_ORIGINAL_EMAIL); + newColumnForImportExport("comment", ArchiveImportExportBean.PROPERTY_COMMENT); + newColumnForImportExport("etatAttente", ArchiveImportExportBean.PROPERTY_WAITING_STATE, new HasLabelValueParserFormatter<WaitingState>() { + @Override + public WaitingState parse(String value) throws ParseException { + return waitingStates.get(value); + } + }); + newColumnForImportExport("demandType", ArchiveImportExportBean.PROPERTY_DEMAND_TYPE, new HasLabelValueParserFormatter<DemandType>() { + @Override + public DemandType parse(String value) throws ParseException { + return demandTypes.get(value); + } + }); + newColumnForImportExport("priority", ArchiveImportExportBean.PROPERTY_PRIORITY, new HasLabelValueParserFormatter<Priority>() { + @Override + public Priority parse(String value) throws ParseException { + return priorities.get(value); + } + }); +// newMandatoryColumn("mailFolder", ArchiveImportExportBean.PROPERTY_MAIL_FOLDER, new ValueParserFormatter<MailFolder>() { +// @Override +// public MailFolder parse(String value) throws ParseException { +// return mailFolderMap.get(value); +// } +// +// @Override +// public String format(MailFolder value) { +// return value != null ? FaxToMailServiceUtils.getFullMailFolderPath(value) : ""; +// } +// }); + newColumnForImportExport("mailFolder", ArchiveImportExportBean.PROPERTY_MAIL_FOLDER_PATHS); + newColumnForImportExport("client-code", ArchiveImportExportBean.PROPERTY_CLIENT_CODE); + newOptionalColumn("client-brand", ArchiveImportExportBean.PROPERTY_CLIENT_BRAND); + newColumnForExport("client-brand", ArchiveImportExportBean.PROPERTY_CLIENT_BRAND); + newColumnForImportExport("attachments", ArchiveImportExportBean.PROPERTY_ATTACHMENT_PATHS); + + newOptionalColumn("error", ArchiveImportExportBean.PROPERTY_ERROR); + newColumnForExport("error", ArchiveImportExportBean.PROPERTY_ERROR); + } + + @Override + public ArchiveImportExportBean newEmptyInstance() { + return new ArchiveImportExportBean(); + } + + protected abstract class HasLabelValueParserFormatter<E extends HasLabel> implements ValueParserFormatter<E> { + + @Override + public String format(E value) { + return value != null ? value.getLabel() : ""; + } + } +} Property changes on: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportExportModel.java ___________________________________________________________________ Added: svn:eol-style + native Added: svn:keywords + Author Date Id Revision HeadURL Deleted: 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 2014-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportModel.java 2014-10-17 12:29:12 UTC (rev 678) @@ -1,129 +0,0 @@ -package com.franciaflex.faxtomail.services.service.imports; - -/* - * #%L - * FaxToMail :: Service - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2014 Mac-Groupe, 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.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Map; - -import org.nuiton.csv.Common; -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.WaitingState; -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, WaitingState> waitingStates, 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, new ValueParser<Object>() { - @Override - public Object parse(String value) throws ParseException { - value = value.replaceFirst("^.*<(.*)>$", "$1"); - value = value.toLowerCase(); - return value; - } - }); - newMandatoryColumn("fax", Email.PROPERTY_FAX, Common.PRIMITIVE_BOOLEAN); - 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_WAITING_STATE, new ValueParser<WaitingState>() { - @Override - public WaitingState parse(String value) throws ParseException { - return waitingStates.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(); - } -} Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportResult.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportResult.java (rev 0) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/ArchiveImportResult.java 2014-10-17 12:29:12 UTC (rev 678) @@ -0,0 +1,38 @@ +package com.franciaflex.faxtomail.services.service.imports; + +import java.io.File; + +/** + * @author Kevin Morin (Code Lutin) + * @since 1.1 + */ +public class ArchiveImportResult { + + protected int nbImportedArchives = 0; + protected int nbImportErrors = 0; + protected File errorFile; + + public int getNbImportedArchives() { + return nbImportedArchives; + } + + public void addNbImportedArchives(int nbImportedArchives) { + this.nbImportedArchives += nbImportedArchives; + } + + public int getNbImportErrors() { + return nbImportErrors; + } + + public void addNbImportErrors(int nbImportErrors) { + this.nbImportErrors += nbImportErrors; + } + + public File getErrorFile() { + return errorFile; + } + + public void setErrorFile(File errorFile) { + this.errorFile = errorFile; + } +} Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/InvalidArchiveImportBeanException.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/InvalidArchiveImportBeanException.java (rev 0) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/imports/InvalidArchiveImportBeanException.java 2014-10-17 12:29:12 UTC (rev 678) @@ -0,0 +1,20 @@ +package com.franciaflex.faxtomail.services.service.imports; + +/** + * @author Kevin Morin (Code Lutin) + * @since 1.1 + */ +public class InvalidArchiveImportBeanException extends RuntimeException { + + protected ArchiveImportExportBean bean; + + public InvalidArchiveImportBeanException(String message, ArchiveImportExportBean bean) { + super(message); + this.bean = bean; + this.bean.setError(message); + } + + public ArchiveImportExportBean getBean() { + return bean; + } +} Modified: trunk/faxtomail-service/src/main/resources/i18n/faxtomail-service_fr_FR.properties =================================================================== --- trunk/faxtomail-service/src/main/resources/i18n/faxtomail-service_fr_FR.properties 2014-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-service/src/main/resources/i18n/faxtomail-service_fr_FR.properties 2014-10-17 12:29:12 UTC (rev 678) @@ -1,3 +1,7 @@ +faxtomail.archives.import.error.invalidAttachmentPath=%s n'est pas un fichier +faxtomail.archives.import.error.invalidFolder=Dossier %s non valide +faxtomail.archives.import.error.persistence=Erreur technique de persistence +faxtomail.archives.import.error.readingAttachmentFile=Erreur lors de la lecture de la PJ %s faxtomail.attachment.demand.filename=Détail de la demande faxtomail.email.projectReference.default=Votre demande du %s faxtomail.service.email.save.clientCode.error=Impossible de trouver le client %s \! 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-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GenerateAnnotatedAttachmentAction.java 2014-10-17 12:29:12 UTC (rev 678) @@ -240,11 +240,6 @@ pdfStamper.close(); pdfReader.close(); - Document document = new Document(); - PdfWriter writer = PdfWriter.getInstance(document, fos); - PdfAction action = new PdfAction(PdfAction.PRINTDIALOG); - writer.setOpenAction(action); - // convert content to blob InputStream is = new BufferedInputStream(new FileInputStream(target)); FaxToMailServiceContext serviceContext = getContext().newServiceContext(); 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-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java 2014-10-17 12:29:12 UTC (rev 678) @@ -68,6 +68,7 @@ import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; +import com.sun.pdfview.PDFPrintPage; import jaxx.runtime.JAXXObject; import jaxx.runtime.JAXXUtil; @@ -114,7 +115,7 @@ import com.sun.media.jai.codec.ImageDecoder; import com.sun.media.jai.codec.SeekableStream; import com.sun.pdfview.PDFFile; -import com.sun.pdfview.PDFPrintPage; +//import com.sun.pdfview.PDFPrintPage; /** * @author kmorin - morin@codelutin.com Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailApplicationListener.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailApplicationListener.java 2014-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/FaxToMailApplicationListener.java 2014-10-17 12:29:12 UTC (rev 678) @@ -141,7 +141,7 @@ log.info("Stopping quartz sheduler"); } } - + try { // wait for thread to complete scheduler.shutdown(); Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ImportArchiveAction.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ImportArchiveAction.java 2014-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/ImportArchiveAction.java 2014-10-17 12:29:12 UTC (rev 678) @@ -27,7 +27,9 @@ import java.io.File; import java.io.FileInputStream; import java.io.InputStream; +import java.nio.file.Files; +import com.franciaflex.faxtomail.services.service.imports.ArchiveImportResult; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -60,6 +62,12 @@ protected EmailService emailService; + protected ArchiveImportResult importResult; + + protected InputStream inputStream; + protected String fileName; + protected String contentType; + public void setEmailService(EmailService emailService) { this.emailService = emailService; } @@ -88,27 +96,24 @@ @Override public void validate() { - if (StringUtils.isNotBlank(attachmentBase) && !new File(attachmentBase).isDirectory()) { - addActionError("Le répertoire de base des pièces jointes n'est pas un répertoire lisible !"); + if (StringUtils.isBlank(fileName)) { + if (StringUtils.isNotBlank(attachmentBase) && !new File(attachmentBase).isDirectory()) { + addActionError("Le répertoire de base des pièces jointes n'est pas un répertoire lisible !"); + } + if (archiveFile == null) { + addActionError("Le fichier d'archive est obligatoire !"); + } } - if (archiveFile == null) { - addActionError("Le fichier d'archive est obligatoire !"); - } } @Override - @Action(results = {@Result(type = "redirectAction", params = {"actionName", "import-archive-input"})}) + @Action("import-archive") public String execute() throws Exception { String result = INPUT; try (InputStream is = new FileInputStream(archiveFile)) { File file = StringUtils.isNotBlank(attachmentBase) ? new File(attachmentBase) : null; - int imported = emailService.importArchive(is, file); + importResult = emailService.importArchive(is, file); - log.info(imported + " imported elements"); - addActionMessage(imported + " éléments ont été importés."); - - result = SUCCESS; - } catch (Exception ex) { if (log.isErrorEnabled()) { log.error("Can't import archive file", ex); @@ -118,4 +123,42 @@ return result; } + + @Action(value = "download-import-archive-errorfile", + results = {@Result(name = "success", + type = "stream", + params = { + "contentType", "${contentType}", + "inputName", "inputStream", + "contentDisposition", "attachment;filename=\"${fileName}\"", + "bufferSize", "1024" + }) + }) + public String downloadImportErrorFile() throws Exception { + File file = new File(getApplicationConfig().getDataDirectory(), fileName); + log.info(fileName + " exists : " + file.exists()); + contentType = Files.probeContentType(file.toPath()); + inputStream = new FileInputStream(file); + return SUCCESS; + } + + public ArchiveImportResult getImportResult() { + return importResult; + } + + public InputStream getInputStream() { + return inputStream; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getContentType() { + return contentType; + } } Modified: trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/import-archive-input.jsp =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/import-archive-input.jsp 2014-10-15 13:09:19 UTC (rev 677) +++ trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/import-archive-input.jsp 2014-10-17 12:29:12 UTC (rev 678) @@ -39,6 +39,26 @@ <s:form id="main_form" action="import-archive" method="post" enctype="multipart/form-data"> <s:actionmessage/> + + <s:if test="importResult != null"> + <div class="alert alert-success"> + <s:property value="importResult.nbImportedArchives"/> archives ont été importées. + </div> + + <s:if test="importResult.getNbImportErrors() > 0"> + <s:url id="downloadErrorFile" value="download-import-archive-errorfile.action"> + <s:param name="fileName" value="%{importResult.errorFile.name}" /> + </s:url> + <div class="alert alert-danger"> + <s:property value="importResult.nbImportErrors"/> archives n'ont pas pu été importées. + Pour télécharger le fichier contenant les archives non importées, + <s:a href="%{downloadErrorFile}" title="Télécharger le fichier contenant les archives non importées"> + cliquez ici + </s:a>. + </div> + </s:if> + </s:if> + <s:actionerror/> <div class="form-group">