Author: sletellier Date: 2011-05-03 14:29:24 +0200 (Tue, 03 May 2011) New Revision: 10 Url: http://chorem.org/repositories/revision/vradi/10 Log: #321 Add an autoSend configuration option - Move some method from VradiStorageService to managers - Fix client validation error - Fix upload template upload file name verification Added: trunk/vradi-services/src/main/java/org/chorem/vradi/services/tasks/AutoSendTasks.java Modified: trunk/vradi-services/src/main/java/org/chorem/vradi/VradiServiceConfiguration.java trunk/vradi-services/src/main/java/org/chorem/vradi/VradiServiceConfigurationHelper.java trunk/vradi-services/src/main/java/org/chorem/vradi/services/VradiStorageServiceImpl.java trunk/vradi-services/src/main/java/org/chorem/vradi/services/managers/MailingManager.java trunk/vradi-services/src/main/java/org/chorem/vradi/services/tasks/TasksManager.java trunk/vradi-services/src/main/resources/i18n/vradi-services_fr_FR.properties trunk/vradi-services/src/test/java/org/chorem/vradi/services/VradiStorageServiceTest.java trunk/vradi-services/src/test/java/org/chorem/vradi/services/managers/MailingManagerTest.java trunk/vradi-swing/src/main/java/org/chorem/vradi/ui/admin/AdminHandler.java trunk/vradi-swing/src/main/resources/org/chorem/vradi/entities/Client-error-validation.xml Modified: trunk/vradi-services/src/main/java/org/chorem/vradi/VradiServiceConfiguration.java =================================================================== --- trunk/vradi-services/src/main/java/org/chorem/vradi/VradiServiceConfiguration.java 2011-05-02 16:09:43 UTC (rev 9) +++ trunk/vradi-services/src/main/java/org/chorem/vradi/VradiServiceConfiguration.java 2011-05-03 12:29:24 UTC (rev 10) @@ -316,6 +316,12 @@ "vradi.WebHarvestPreview.dir", _("vradi.service.config.migration.skip.description"), getDefaultDir(WEB_HARVERT_SCRIPT_PREVIEW_DEFAULT_DIR_NAME), + String.class, false, false), + + AUTO_SEND_HOUR( + "vradi.autoSend.hour", + _("vradi.autoSend.hour.description"), + null, String.class, false, false); public String key; Modified: trunk/vradi-services/src/main/java/org/chorem/vradi/VradiServiceConfigurationHelper.java =================================================================== --- trunk/vradi-services/src/main/java/org/chorem/vradi/VradiServiceConfigurationHelper.java 2011-05-02 16:09:43 UTC (rev 9) +++ trunk/vradi-services/src/main/java/org/chorem/vradi/VradiServiceConfigurationHelper.java 2011-05-03 12:29:24 UTC (rev 10) @@ -194,6 +194,10 @@ return config.getOptionAsBoolean(VradiServiceOption.SKIP_MIGRATION.key); } + public static String getSendTaskHour(ApplicationConfig config) { + return config.getOption(VradiServiceOption.AUTO_SEND_HOUR.key); + } + public static List<String> getOptionAsList(ApplicationConfig config, String key) { List<String> result = new ArrayList<String>(); Modified: trunk/vradi-services/src/main/java/org/chorem/vradi/services/VradiStorageServiceImpl.java =================================================================== --- trunk/vradi-services/src/main/java/org/chorem/vradi/services/VradiStorageServiceImpl.java 2011-05-02 16:09:43 UTC (rev 9) +++ trunk/vradi-services/src/main/java/org/chorem/vradi/services/VradiStorageServiceImpl.java 2011-05-03 12:29:24 UTC (rev 10) @@ -133,7 +133,7 @@ thesaurusManager = new ThesaurusManager(wikittyProxy); clientManager = new ClientManager(config, wikittyProxy); formTypeManager = new FormTypeManager(config, wikittyProxy); - mailingManager = new MailingManager(config, wikittyProxy); + mailingManager = new MailingManager(config, wikittyProxy, formTypeManager); fileService = new FileServiceImpl(config); searchManager = new SearchManager(wikittyProxy, thesaurusManager); @@ -408,47 +408,7 @@ @Override public String generatePDF(String formId, boolean force) throws VradiException { - - String uri = null; - - String extensionName = null; - Form form = wikittyProxy.restore(Form.class, formId); - for (String ext : form.getExtensionNames()) { - if (!ext.equals(Infogene.EXT_INFOGENE) - && !ext.equals(Form.EXT_FORM)) { - extensionName = ext; - break; - } - - } - WikittyExtension extension = formTypeManager.getFormType(extensionName); - // VradiHelper.getFormTypeTemplate(extension); - String template = extension.getTagValue(VradiConstants.FormTypeTemplateEnum.FIELD_TEMPLATE_ATTRIBUTE.getValue()); - File templateFile = formTypeManager.getTemplate(extensionName, template); - Map<String, String> fieldMap = getAssociatedFields(extension.getName(), template); - - if (log.isDebugEnabled()) { - log.debug("Generating PDF file for form " + form.getWikittyId() + - " (template = " + template + ")"); - } - - try { - // but only those associated with current templates ! - List<Form> currentForms = Collections.singletonList(form); - List<File> filesToAdd = generateFilledDocumentInPDF( - templateFile, currentForms, fieldMap, force); - - if (filesToAdd != null && !filesToAdd.isEmpty()) { - uri = filesToAdd.get(0).getName(); - } - } catch (Exception ex) { - if (log.isErrorEnabled()) { - log.error("Can't generate pdf", ex); - } - throw new VradiException("Can't generate pdf", ex); - } - - return uri; + return mailingManager.generatePDF(formId, force); } @@ -485,182 +445,10 @@ return documentsFields; } - /** - * Generate offer PDF form given forms with specified template. - * - * @param template template to use to generate PDF - * @param forms to to generate - * @param fieldBindings map between template field name and form fields names - * @param replace replace already existing generated forms - * @return generated pdf files - * @throws VradiException for various possible errors - */ - protected List<File> generateFilledDocumentInPDF(File template, List<Form> forms, - Map<String, String> fieldBindings, - boolean replace) - throws VradiException { - - List<File> generatedPDFList = null; - - if (template == null) { - if (log.isWarnEnabled()) { - log.warn("Try to generate form pdf without template"); - } - } else if (fieldBindings == null) { - if (log.isWarnEnabled()) { - log.warn("No association field found, abording"); - } - } else { - TemplateManager templateManager = new TemplateManager(config, template); - - // split fqn form field name in an array - // composed of extension name, and extension field - // TODO EC20100510 set in commun with same function in - // {@link generateFilledDocumentInPDF(TemplateManager, Form form, Map<String, String[]>, boolean) - Map<String, String[]> map = new HashMap<String, String[]>(); - for (Map.Entry<String, String> binding : fieldBindings.entrySet()) { - String fieldFQName = binding.getValue(); - if (fieldFQName != null && fieldFQName.indexOf(".") > 0) { - int dot = fieldFQName.indexOf("."); - String[] fqField = new String[2]; - fqField[0] = fieldFQName.substring(0, dot); - fqField[1] = fieldFQName.substring(dot + 1); - map.put(binding.getKey(), fqField); - } - } - - generatedPDFList = new ArrayList<File>(); - for (Form form : forms) { - File f = generateFilledDocumentInPDF(templateManager, form, map, replace); - generatedPDFList.add(f); - } - } - - return generatedPDFList; - } - - /** - * Generate a single pdf file for specified form. - * - * @param templateManager pdf template manager - * @param form form to get pdf - * @param fieldBindings association between field name and form fields (couple extension name, extension field) - * @param replace replace already existing pdf - * @return the pdf file associated with pdf - * @throws VradiException for various possible errors - */ - protected File generateFilledDocumentInPDF(TemplateManager templateManager, - Form form, Map<String, String[]> fieldBindings, - boolean replace) throws VradiException { - - // generated pdf are cached - File result = mailingManager.getGeneratedPdfFile(form); - if (!replace && result.exists()) { - return result; - } - - Map<String, Object> fieldValues = new HashMap<String, Object>(); - for (Map.Entry<String, String[]> binding : fieldBindings.entrySet()) { - String[] fqField = binding.getValue(); - Object value = form.getField(fqField[0], fqField[1]); - fieldValues.put(binding.getKey(), - value != null ? value.toString() : null); - } - - // Extract files - List<String> formUrls = new ArrayList<String>(); - if (form.getFiles() != null) { - for (String file : form.getFiles()) { - String formUrl = fileService.getFormEmbeddedUrl(file, form.getWikittyId()); - formUrls.add(formUrl); - } - } - - templateManager.generateDoc(result.getPath(), fieldValues, - formUrls.toArray(new String[formUrls.size()])); - - return result; - } - @Override public String sendMessages(String sessionId) throws VradiException { - Session session = wikittyProxy.restore(Session.class, sessionId); - - if (SessionStatus.isSent(session)) { - return StringUtils.EMPTY; - } - - // Pass to active for session in error or stopped - if (SessionStatus.isToRestart(session)) { - - log.info("Session was stopped or in error, resume sending"); - - session.setStatus(SessionStatus.ACTIVE.getValue()); - session.setSessionLogs(StringUtils.EMPTY); - session = wikittyProxy.store(session); - } - - // Get all files to attach - Set<String> filesNames = session.getFiles(); - List<File> files = new ArrayList<File>(); - if (filesNames != null) { - for (String fileName : filesNames) { - File file = fileService.downloadSessionAttachment(fileName, sessionId); - files.add(file); - log.info("Files founds for session : " + session.getSessionDate() + " : " + (file == null ? "not found" : file.getName())); - } - } - - // Init logger to keep exception - List<String> sessionLogger = new ArrayList<String>(); - - Set<String> sendingIds = session.getSending(); - if (sendingIds != null) { - - for (String sendingId : sendingIds) { - - // Flag to detect if it's canceled by user - session = wikittyProxy.restore(Session.class, session.getWikittyId()); - if (SessionStatus.isStopped(session)) { - log.warn("Sending stopped by user"); - sessionLogger.add(_("vradi.error.session.stopped", session.getNum(), - DateUtil.formatDate(session.getSessionDate(), DateUtil.DEFAULT_PATTERN))); - } - - Sending sending = wikittyProxy.restore(Sending.class, sendingId); - if (sending != null) { - if (SendingStatus.isSent(sending)) { - if (log.isDebugEnabled()) { - log.debug("Sending " + sendingId + " already sent, skip"); - } - } else if (SendingStatus.isToSend(sending)) { - - // Send - String log = sendMessage(sendingId, session.getParagraph(), files); - if (log != null) { - sessionLogger.add(log); - } - } - } - } - } - - // Get logs - String formatedLogs = formatSessionLog(sessionLogger); - - // Set session to sent or error - if (sessionLogger.isEmpty()) { - session.setStatus(SessionStatus.SENT.getValue()); - session.setSessionLogs(StringUtils.EMPTY); - } else { - session.setStatus(SessionStatus.ERROR.getValue()); - session.setSessionLogs(formatedLogs); - } - session.setSessionDate(new Date()); - wikittyProxy.store(session); - - return formatedLogs; + return mailingManager.sendMessages(sessionId); } @Override @@ -674,105 +462,9 @@ } public String sendMessage(String sendingId, String sessionParagraph, String email, boolean reSend, Collection<File> filesToAttach) throws VradiException { - - Sending sending = wikittyProxy.restore(Sending.class, sendingId); - User user = clientManager.getUser(sending.getUser()); - - // Will resend sending already sent - if (!reSend) { - // Do nothing - if (!SendingStatus.isToSend(sending)) { - return null; - } - } - - // If its client or group sending : do nothing - // Never append -// if (sending.getUser() == null) { -// sending.setStatus(VradiConstants.SendingStatus.SENT.getValue()); -// return wikittyProxy.store(sending); -// } - - Set<String> formsIds = SendingHelper.extractForms(wikittyProxy, sending.getGroupForms()); - - // If no forms founds - if (formsIds.isEmpty()) { - - // Set session in error - sending.setStatus(SendingStatus.DELETED.getValue()); - wikittyProxy.store(sending); - - // Do nothing - return null; - } - - // Get email address - // si aucune n'est specifiée, on utilise celle du client - if (StringUtils.isBlank(email)) { - email = user.getEmail(); - - // il peut arriver qu'un user n'est pas d'email et que l'admin - // souhaite quand meme faire l'envoie d'une session. - // dans ce cas on ne traite pas l'envoi de mail courant. - if (StringUtils.isBlank(email)) { - - if (log.isWarnEnabled()) { - log.warn("User " + user.getName() + " has not valid email (skip current mail sending)"); - } - // Set session in error - sending.setStatus(SendingStatus.ERROR.getValue()); - wikittyProxy.store(sending); - - return _("vradi.error.sending.emailIsBlank", user.getName()); - } - } - - if (log.isDebugEnabled()) { - log.debug("Sending message to " + email); - } - - String subject = VradiServiceConfigurationHelper.getOfferMailSubject(config); - - // Set message - String message = sessionParagraph + "\n\n" + sending.getParagraph(); - - List<Form> forms = wikittyProxy.restore(Form.class, new ArrayList<String>(formsIds)); - - boolean receptionProof = sending.getReceptionProof(); - - // Post mail and save msg id - String messageId; - try { - messageId = mailingManager.postMail( - email, subject, message, forms, receptionProof, filesToAttach); - - } catch (VradiException eee) { - - log.error("Failed to send sending for email : " + email, eee); - - // Set sending in error - sending.setStatus(SendingStatus.ERROR.getValue()); - wikittyProxy.store(sending); - - return _("vradi.error.sending.failedToSend", user.getName(), eee.getMessage()); - } - sending.setMessageId(messageId); - - // Set sending status - sending.setStatus(receptionProof ? - SendingStatus.WAITING_RECEPTION_PROOF.getValue() : - SendingStatus.SENT.getValue()); - - // Update sending - wikittyProxy.store(sending); - - return null; + return mailingManager.sendMessage(sendingId, sessionParagraph, email, reSend, filesToAttach); } - protected String formatSessionLog(List<String> logs) { - return StringUtils.join(logs, ",\n"); - } - @Override public void receiveMessages() throws VradiException { mailingManager.receiveMails(); @@ -797,41 +489,7 @@ */ @Override public void generatePDFForSession(String sessionId) throws VradiException { - List<String> formsIdsToGenerate = new ArrayList<String>(); - - Session session = wikittyProxy.restore(Session.class, sessionId); - - Set<String> sendingIds = session.getSending(); - - if (sendingIds == null) { - return; - } - - for (String id : sendingIds) { - Sending sending = wikittyProxy.restore(Sending.class, id); - - if (sending != null) { - Set<String> formsIds = SendingHelper.extractForms(wikittyProxy, sending.getGroupForms()); - - if (formsIds != null) { - for (String formId : formsIds) { - - if (!formsIdsToGenerate.contains(formId)) { - formsIdsToGenerate.add(formId); - } - } - } - } - } - - for (String formId : formsIdsToGenerate) { - try { - generatePDF(formId, true); - } catch (VradiException eee) { - throw new VradiException("An error occurred while generating PDF file for " + - "form : " + formId, eee); - } - } + mailingManager.generatePDFForSession(sessionId); } /** Modified: trunk/vradi-services/src/main/java/org/chorem/vradi/services/managers/MailingManager.java =================================================================== --- trunk/vradi-services/src/main/java/org/chorem/vradi/services/managers/MailingManager.java 2011-05-02 16:09:43 UTC (rev 9) +++ trunk/vradi-services/src/main/java/org/chorem/vradi/services/managers/MailingManager.java 2011-05-03 12:29:24 UTC (rev 10) @@ -32,13 +32,20 @@ import org.apache.tika.metadata.Metadata; import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.sax.BodyContentHandler; +import org.chorem.vradi.VradiConstants; import org.chorem.vradi.VradiServiceConfigurationHelper; +import org.chorem.vradi.beans.SendingHelper; import org.chorem.vradi.entities.Form; +import org.chorem.vradi.entities.Infogene; import org.chorem.vradi.entities.Sending; import org.chorem.vradi.entities.User; +import org.chorem.vradi.services.FileService; +import org.chorem.vradi.services.FileServiceImpl; import org.chorem.vradi.services.VradiException; import org.nuiton.util.ApplicationConfig; +import org.nuiton.util.DateUtil; import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.entities.WikittyExtension; import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.PagedResult; import org.nuiton.wikitty.search.Search; @@ -73,11 +80,16 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Properties; +import java.util.Set; import static org.chorem.vradi.VradiConstants.SendingStatus; import static org.nuiton.i18n.I18n._; @@ -102,9 +114,15 @@ protected WikittyProxy wikittyProxy; - public MailingManager(ApplicationConfig config, WikittyProxy wikittyProxy) { + protected FileService fileService; + + protected FormTypeManager formTypeManager; + + public MailingManager(ApplicationConfig config, WikittyProxy wikittyProxy, FormTypeManager formTypeManager) { this.config = config; this.wikittyProxy = wikittyProxy; + this.fileService = new FileServiceImpl(config); + this.formTypeManager = formTypeManager; } /** @@ -602,4 +620,370 @@ log.info("Mine type of " + file.getName() + " is : " + result); return result; } + + /** + * Generate all the PDFs needed to send a session. + * + * @param sessionId the session wikitty id + */ + public void generatePDFForSession(String sessionId) throws VradiException { + List<String> formsIdsToGenerate = new ArrayList<String>(); + + org.chorem.vradi.entities.Session session = wikittyProxy.restore(org.chorem.vradi.entities.Session.class, sessionId); + + Set<String> sendingIds = session.getSending(); + + if (sendingIds == null) { + return; + } + + for (String id : sendingIds) { + Sending sending = wikittyProxy.restore(Sending.class, id); + + if (sending != null) { + Set<String> formsIds = SendingHelper.extractForms(wikittyProxy, sending.getGroupForms()); + + if (formsIds != null) { + for (String formId : formsIds) { + + if (!formsIdsToGenerate.contains(formId)) { + formsIdsToGenerate.add(formId); + } + } + } + } + } + + for (String formId : formsIdsToGenerate) { + try { + generatePDF(formId, true); + } catch (VradiException eee) { + throw new VradiException("An error occurred while generating PDF file for " + + "form : " + formId, eee); + } + } + } + + public String generatePDF(String formId, boolean force) throws VradiException { + + String uri = null; + + String extensionName = null; + Form form = wikittyProxy.restore(Form.class, formId); + for (String ext : form.getExtensionNames()) { + if (!ext.equals(Infogene.EXT_INFOGENE) + && !ext.equals(Form.EXT_FORM)) { + extensionName = ext; + break; + } + + } + WikittyExtension extension = formTypeManager.getFormType(extensionName); + // VradiHelper.getFormTypeTemplate(extension); + String template = extension.getTagValue(VradiConstants.FormTypeTemplateEnum.FIELD_TEMPLATE_ATTRIBUTE.getValue()); + File templateFile = formTypeManager.getTemplate(extensionName, template); + Map<String, String> fieldMap = formTypeManager.getAssociatedFields(extension.getName(), template); + + if (log.isDebugEnabled()) { + log.debug("Generating PDF file for form " + form.getWikittyId() + + " (template = " + template + ")"); + } + + try { + // but only those associated with current templates ! + List<Form> currentForms = Collections.singletonList(form); + List<File> filesToAdd = generateFilledDocumentInPDF( + templateFile, currentForms, fieldMap, force); + + if (filesToAdd != null && !filesToAdd.isEmpty()) { + uri = filesToAdd.get(0).getName(); + } + } catch (Exception ex) { + if (log.isErrorEnabled()) { + log.error("Can't generate pdf", ex); + } + throw new VradiException("Can't generate pdf", ex); + } + + return uri; + } + + + /** + * Generate offer PDF form given forms with specified template. + * + * @param template template to use to generate PDF + * @param forms to to generate + * @param fieldBindings map between template field name and form fields names + * @param replace replace already existing generated forms + * @return generated pdf files + * @throws VradiException for various possible errors + */ + protected List<File> generateFilledDocumentInPDF(File template, List<Form> forms, + Map<String, String> fieldBindings, + boolean replace) + throws VradiException { + + List<File> generatedPDFList = null; + + if (template == null) { + if (log.isWarnEnabled()) { + log.warn("Try to generate form pdf without template"); + } + } else if (fieldBindings == null) { + if (log.isWarnEnabled()) { + log.warn("No association field found, abording"); + } + } else { + TemplateManager templateManager = new TemplateManager(config, template); + + // split fqn form field name in an array + // composed of extension name, and extension field + // TODO EC20100510 set in commun with same function in + // {@link generateFilledDocumentInPDF(TemplateManager, Form form, Map<String, String[]>, boolean) + Map<String, String[]> map = new HashMap<String, String[]>(); + for (Map.Entry<String, String> binding : fieldBindings.entrySet()) { + String fieldFQName = binding.getValue(); + if (fieldFQName != null && fieldFQName.indexOf(".") > 0) { + int dot = fieldFQName.indexOf("."); + String[] fqField = new String[2]; + fqField[0] = fieldFQName.substring(0, dot); + fqField[1] = fieldFQName.substring(dot + 1); + map.put(binding.getKey(), fqField); + } + } + + generatedPDFList = new ArrayList<File>(); + for (Form form : forms) { + File f = generateFilledDocumentInPDF(templateManager, form, map, replace); + generatedPDFList.add(f); + } + } + + return generatedPDFList; + } + + /** + * Generate a single pdf file for specified form. + * + * @param templateManager pdf template manager + * @param form form to get pdf + * @param fieldBindings association between field name and form fields (couple extension name, extension field) + * @param replace replace already existing pdf + * @return the pdf file associated with pdf + * @throws VradiException for various possible errors + */ + protected File generateFilledDocumentInPDF(TemplateManager templateManager, + Form form, Map<String, String[]> fieldBindings, + boolean replace) throws VradiException { + + // generated pdf are cached + File result = getGeneratedPdfFile(form); + if (!replace && result.exists()) { + return result; + } + + Map<String, Object> fieldValues = new HashMap<String, Object>(); + for (Map.Entry<String, String[]> binding : fieldBindings.entrySet()) { + String[] fqField = binding.getValue(); + Object value = form.getField(fqField[0], fqField[1]); + fieldValues.put(binding.getKey(), + value != null ? value.toString() : null); + } + + // Extract files + List<String> formUrls = new ArrayList<String>(); + if (form.getFiles() != null) { + for (String file : form.getFiles()) { + String formUrl = fileService.getFormEmbeddedUrl(file, form.getWikittyId()); + formUrls.add(formUrl); + } + } + + templateManager.generateDoc(result.getPath(), fieldValues, + formUrls.toArray(new String[formUrls.size()])); + + return result; + } + + public String sendMessages(String sessionId) throws VradiException { + + org.chorem.vradi.entities.Session session = wikittyProxy.restore(org.chorem.vradi.entities.Session.class, sessionId); + + if (VradiConstants.SessionStatus.isSent(session)) { + return StringUtils.EMPTY; + } + + // Pass to active for session in error or stopped + if (VradiConstants.SessionStatus.isToRestart(session)) { + + log.info("Session was stopped or in error, resume sending"); + + session.setStatus(VradiConstants.SessionStatus.ACTIVE.getValue()); + session.setSessionLogs(StringUtils.EMPTY); + session = wikittyProxy.store(session); + } + + // Get all files to attach + Set<String> filesNames = session.getFiles(); + List<File> files = new ArrayList<File>(); + if (filesNames != null) { + for (String fileName : filesNames) { + File file = fileService.downloadSessionAttachment(fileName, sessionId); + files.add(file); + log.info("Files founds for session : " + session.getSessionDate() + " : " + (file == null ? "not found" : file.getName())); + } + } + + // Init logger to keep exception + List<String> sessionLogger = new ArrayList<String>(); + + Set<String> sendingIds = session.getSending(); + if (sendingIds != null) { + + for (String sendingId : sendingIds) { + + // Flag to detect if it's canceled by user + session = wikittyProxy.restore(org.chorem.vradi.entities.Session.class, session.getWikittyId()); + if (VradiConstants.SessionStatus.isStopped(session)) { + log.warn("Sending stopped by user"); + sessionLogger.add(_("vradi.error.session.stopped", session.getNum(), + DateUtil.formatDate(session.getSessionDate(), DateUtil.DEFAULT_PATTERN))); + } + + Sending sending = wikittyProxy.restore(Sending.class, sendingId); + if (sending != null) { + if (SendingStatus.isSent(sending)) { + if (log.isDebugEnabled()) { + log.debug("Sending " + sendingId + " already sent, skip"); + } + } else if (SendingStatus.isToSend(sending)) { + + // Send + String log = sendMessage(sendingId, session.getParagraph(), null, false, files); + if (log != null) { + sessionLogger.add(log); + } + } + } + } + } + + // Get logs + String formatedLogs = formatSessionLog(sessionLogger); + + // Set session to sent or error + if (sessionLogger.isEmpty()) { + session.setStatus(VradiConstants.SessionStatus.SENT.getValue()); + session.setSessionLogs(StringUtils.EMPTY); + } else { + session.setStatus(VradiConstants.SessionStatus.ERROR.getValue()); + session.setSessionLogs(formatedLogs); + } + session.setSessionDate(new Date()); + wikittyProxy.store(session); + + return formatedLogs; + } + + protected String formatSessionLog(List<String> logs) { + return StringUtils.join(logs, ",\n"); + } + + public String sendMessage(String sendingId, String sessionParagraph, String email, boolean reSend, Collection<File> filesToAttach) throws VradiException { + + Sending sending = wikittyProxy.restore(Sending.class, sendingId); + User user = wikittyProxy.restore(User.class, sending.getUser()); + + // Will resend sending already sent + if (!reSend) { + // Do nothing + if (!SendingStatus.isToSend(sending)) { + return null; + } + } + + // If its client or group sending : do nothing + // Never append +// if (sending.getUser() == null) { +// sending.setStatus(VradiConstants.SendingStatus.SENT.getValue()); +// return wikittyProxy.store(sending); +// } + + Set<String> formsIds = SendingHelper.extractForms(wikittyProxy, sending.getGroupForms()); + + // If no forms founds + if (formsIds.isEmpty()) { + + // Set session in error + sending.setStatus(SendingStatus.DELETED.getValue()); + wikittyProxy.store(sending); + + // Do nothing + return null; + } + + // Get email address + // si aucune n'est specifiée, on utilise celle du client + if (StringUtils.isBlank(email)) { + email = user.getEmail(); + + // il peut arriver qu'un user n'est pas d'email et que l'admin + // souhaite quand meme faire l'envoie d'une session. + // dans ce cas on ne traite pas l'envoi de mail courant. + if (StringUtils.isBlank(email)) { + + if (log.isWarnEnabled()) { + log.warn("User " + user.getName() + " has not valid email (skip current mail sending)"); + } + // Set session in error + sending.setStatus(SendingStatus.ERROR.getValue()); + wikittyProxy.store(sending); + + return _("vradi.error.sending.emailIsBlank", user.getName()); + } + } + + if (log.isDebugEnabled()) { + log.debug("Sending message to " + email); + } + + String subject = VradiServiceConfigurationHelper.getOfferMailSubject(config); + + // Set message + String message = sessionParagraph + "\n\n" + sending.getParagraph(); + + List<Form> forms = wikittyProxy.restore(Form.class, new ArrayList<String>(formsIds)); + + boolean receptionProof = sending.getReceptionProof(); + + // Post mail and save msg id + String messageId; + try { + messageId = postMail( + email, subject, message, forms, receptionProof, filesToAttach); + + } catch (VradiException eee) { + + log.error("Failed to send sending for email : " + email, eee); + + // Set sending in error + sending.setStatus(SendingStatus.ERROR.getValue()); + wikittyProxy.store(sending); + + return _("vradi.error.sending.failedToSend", user.getName(), eee.getMessage()); + } + sending.setMessageId(messageId); + + // Set sending status + sending.setStatus(receptionProof ? + SendingStatus.WAITING_RECEPTION_PROOF.getValue() : + SendingStatus.SENT.getValue()); + + // Update sending + wikittyProxy.store(sending); + + return null; + } + } Added: trunk/vradi-services/src/main/java/org/chorem/vradi/services/tasks/AutoSendTasks.java =================================================================== --- trunk/vradi-services/src/main/java/org/chorem/vradi/services/tasks/AutoSendTasks.java (rev 0) +++ trunk/vradi-services/src/main/java/org/chorem/vradi/services/tasks/AutoSendTasks.java 2011-05-03 12:29:24 UTC (rev 10) @@ -0,0 +1,57 @@ +package org.chorem.vradi.services.tasks; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.vradi.entities.Session; +import org.chorem.vradi.services.VradiException; +import org.chorem.vradi.services.managers.FormManager; +import org.chorem.vradi.services.managers.MailingManager; + +import java.util.TimerTask; + +/** + * @author sletellier + */ +public class AutoSendTasks extends TimerTask { + + private static final Log log = LogFactory.getLog(AutoSendTasks.class); + + + protected FormManager formManager; + protected MailingManager mailingManager; + + public AutoSendTasks(FormManager formManager, MailingManager mailingManager) { + this.formManager = formManager; + this.mailingManager = mailingManager; + } + + @Override + public void run() { + + try { + // Get open session of open + Session session = formManager.getLastOpenSession(); + + // If no session is opened, creating new one + if (session == null) { + session = formManager.createNewSession(); + } + + // Bind all forms + session= formManager.bindForms(session); + + String sessionId = session.getWikittyId(); + + // Generate pdf for session + mailingManager.generatePDFForSession(sessionId); + + // Send email for session + String logs = mailingManager.sendMessages(sessionId); + + log.info("Send email is finished : " + logs); + + } catch (VradiException e) { + log.error("Failled to auto send session"); + } + } +} Modified: trunk/vradi-services/src/main/java/org/chorem/vradi/services/tasks/TasksManager.java =================================================================== --- trunk/vradi-services/src/main/java/org/chorem/vradi/services/tasks/TasksManager.java 2011-05-02 16:09:43 UTC (rev 9) +++ trunk/vradi-services/src/main/java/org/chorem/vradi/services/tasks/TasksManager.java 2011-05-03 12:29:24 UTC (rev 10) @@ -29,6 +29,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.chorem.vradi.VradiConstants; +import org.chorem.vradi.VradiServiceConfigurationHelper; import org.chorem.vradi.entities.XmlStream; import org.chorem.vradi.services.managers.BindingManager; import org.chorem.vradi.services.managers.FormManager; @@ -76,6 +77,11 @@ /** Cron task to import streams. */ protected ScheduledExecutorService xmlStreamScheduler; + /** Cron task to enable auto send task. */ + protected ScheduledExecutorService autoSendScheduler; + + protected ScheduledFuture<?> autoSendTask; + protected ReceiveMailTasks receiveMailTasks; /** Map entre les id des flux, et les taches gérant. */ @@ -111,8 +117,26 @@ public void initTasks() { initMailTask(); initXmlStreamTasks(); + + // If hour is fill in properties + String sendTaskHour = VradiServiceConfigurationHelper.getSendTaskHour(config); + if (!StringUtils.isEmpty(sendTaskHour)) { + + // Create autoSend task + initAutoSendTask(sendTaskHour); + } } + protected void initAutoSendTask(String sendTaskHour) { + + // les imports sont fait sequentiellement + autoSendScheduler = Executors.newScheduledThreadPool(1); + + TimerTask task = new AutoSendTasks(formManager, mailingManager); + + autoSendTask = initDaylyTask(autoSendScheduler, task, sendTaskHour); + } + /** Init and start mail tasks (check every 10 minutes) */ protected void initMailTask() { mailCronTimer = new Timer("vradi-mail-task"); @@ -148,7 +172,24 @@ streamImportTime = "0:0"; } - Matcher matchImportTime = VradiConstants.XML_STREAM_IMPORT_TIME.matcher(streamImportTime); + // TODO EC20100921 prevoir le cas où une tâche dure plus d'une journée + TimerTask autoImportTask; + if (xmlStream.getAutoAssign()) { + autoImportTask = new AssignXmlStreamTasks(config, wikittyProxy, bindingManager, thesaurusManager, formManager, xmlStream.getWikittyId()); + } else { + autoImportTask = new ImportXmlStreamTasks(config, wikittyProxy, bindingManager, xmlStream.getWikittyId()); + } + ScheduledFuture<?> sheduledImportTask = initDaylyTask(xmlStreamScheduler, autoImportTask, streamImportTime); + + if (log.isInfoEnabled()) { + log.info("Starting import of xml stream " + xmlStream.getName() + " at " + streamImportTime); + } + xmlStreamImportTasks.put(xmlStream.getWikittyId(), sheduledImportTask); + } + + public ScheduledFuture<?> initDaylyTask(ScheduledExecutorService scheduledExecutorService, TimerTask task, String hour) { + + Matcher matchImportTime = VradiConstants.XML_STREAM_IMPORT_TIME.matcher(hour); if (matchImportTime.find()) { String hours = matchImportTime.group(1); String minutes = matchImportTime.group(2); @@ -166,27 +207,16 @@ if (delayInMinute < 0) { delayInMinute += 24 * 60; } - - // TODO EC20100921 prevoir le cas où une tâche dure plus d'une journée - - TimerTask task; - if (xmlStream.getAutoAssign()) { - task = new AssignXmlStreamTasks(config, wikittyProxy, bindingManager, thesaurusManager, formManager, xmlStream.getWikittyId()); - } else { - task = new ImportXmlStreamTasks(config, wikittyProxy, bindingManager, xmlStream.getWikittyId()); + if (log.isInfoEnabled()) { + log.info(task.getClass().getName() + " - in scheduler, delai : " + delayInMinute + "min, period " + 24 * 60 + "min"); } - ScheduledFuture<?> sheduledImportTask = xmlStreamScheduler.scheduleAtFixedRate(task, delayInMinute, 24 * 60, TimeUnit.MINUTES); + return scheduledExecutorService.scheduleAtFixedRate(task, delayInMinute, 24 * 60, TimeUnit.MINUTES); - if (log.isInfoEnabled()) { - log.info("Starting import of xml stream " + xmlStream.getName() + " at " + streamImportTime); - log.info(" - in scheduler, delai : " + delayInMinute + "min, period " + 24 * 60 + "min"); - } - xmlStreamImportTasks.put(xmlStream.getWikittyId(), sheduledImportTask); - } else { - if (log.isWarnEnabled()) { - log.warn("Can't parse " + streamImportTime + " for stream " + xmlStream.getWikittyId()); - } } + if (log.isWarnEnabled()) { + log.warn("Can't parse " + hour); + } + return null; } /** Modified: trunk/vradi-services/src/main/resources/i18n/vradi-services_fr_FR.properties =================================================================== --- trunk/vradi-services/src/main/resources/i18n/vradi-services_fr_FR.properties 2011-05-02 16:09:43 UTC (rev 9) +++ trunk/vradi-services/src/main/resources/i18n/vradi-services_fr_FR.properties 2011-05-03 12:29:24 UTC (rev 10) @@ -8,6 +8,7 @@ vradi.adminXmlStream.config.interval.days=jours vradi.adminXmlStream.config.interval.hours=heures vradi.adminXmlStream.config.interval.minutes=minutes +vradi.autoSend.hour.description= vradi.email.status.deleted=Supprim\u00E9e vradi.email.status.error=Erreur vradi.email.status.received=Re\u00E7u Modified: trunk/vradi-services/src/test/java/org/chorem/vradi/services/VradiStorageServiceTest.java =================================================================== --- trunk/vradi-services/src/test/java/org/chorem/vradi/services/VradiStorageServiceTest.java 2011-05-02 16:09:43 UTC (rev 9) +++ trunk/vradi-services/src/test/java/org/chorem/vradi/services/VradiStorageServiceTest.java 2011-05-03 12:29:24 UTC (rev 10) @@ -60,6 +60,7 @@ import org.chorem.vradi.entities.UserImpl; import org.chorem.vradi.entities.XmlFieldBinding; import org.chorem.vradi.entities.XmlStream; +import org.chorem.vradi.services.managers.FormTypeManager; import org.chorem.vradi.services.managers.MailingManager; import org.junit.Assert; import org.junit.Ignore; @@ -1032,7 +1033,7 @@ * @throws VradiException when an error occurred during test */ public void testPostMessage() throws VradiException { - MailingManager mailingManager = new MailingManager(config, null); + MailingManager mailingManager = new MailingManager(config, null, null); mailingManager.postMail("toto@codelutin.com", "test", "ceci est un test", null, true, null); } Modified: trunk/vradi-services/src/test/java/org/chorem/vradi/services/managers/MailingManagerTest.java =================================================================== --- trunk/vradi-services/src/test/java/org/chorem/vradi/services/managers/MailingManagerTest.java 2011-05-02 16:09:43 UTC (rev 9) +++ trunk/vradi-services/src/test/java/org/chorem/vradi/services/managers/MailingManagerTest.java 2011-05-03 12:29:24 UTC (rev 10) @@ -49,7 +49,7 @@ @Before public void initMailingManager() { - mailingManager = new MailingManager(config, wikittyProxy); + mailingManager = new MailingManager(config, wikittyProxy, null); } /** Test get header parsing in mail content. */ Modified: trunk/vradi-swing/src/main/java/org/chorem/vradi/ui/admin/AdminHandler.java =================================================================== --- trunk/vradi-swing/src/main/java/org/chorem/vradi/ui/admin/AdminHandler.java 2011-05-02 16:09:43 UTC (rev 9) +++ trunk/vradi-swing/src/main/java/org/chorem/vradi/ui/admin/AdminHandler.java 2011-05-03 12:29:24 UTC (rev 10) @@ -263,7 +263,7 @@ // Invoke instance creation ui = constructor.newInstance(navUI); } catch (Exception eee) { - log.error(eee); + log.error(eee.getMessage(), eee); ErrorDialogUI.showError(eee); } @@ -396,8 +396,8 @@ helper.createAndSelectClientNode(client.getWikittyId()); - } catch (Exception e) { - log.error("Cant save client : ", e); + } catch (Exception eee) { + log.error("Cant save client : ", eee); } return client; @@ -426,8 +426,8 @@ saveGroups(parentUI, helper, new ArrayList<Group>(groups)); } - } catch (Exception e) { - log.error("Cant save user : ", e); + } catch (Exception eee) { + log.error("Cant save user : ", eee); } return user; @@ -435,8 +435,6 @@ /** * Export all clients database (with groups, users, clients) as CSV. - * <p/> - * Used in {@link org.chorem.vradi.ui.admin.AdminClientNavUI}. * * @param adminNavUI parent ui */ @@ -1836,8 +1834,8 @@ // interdiction des characteres spéciaux dans les noms de fichier // bug hessian et pas top d'avoir des accents String filename = template.getName(); - if (!filename.matches("[a-zA-Z0-9_]+")) { - JOptionPane.showMessageDialog(adminFormTypeUI, _("vradi.file.template.wrongFileNamePattern")); + if (!filename.matches("[a-zA-Z0-9_\\.]+")) { + JOptionPane.showMessageDialog(adminFormTypeUI, _("vradi.file.template.wrongFileNamePattern", filename)); } else { String extensionName = adminFormTypeUI.getBean().getName(); String uri = VradiService.getFileService().uploadTemplate(template, extensionName); Modified: trunk/vradi-swing/src/main/resources/org/chorem/vradi/entities/Client-error-validation.xml =================================================================== --- trunk/vradi-swing/src/main/resources/org/chorem/vradi/entities/Client-error-validation.xml 2011-05-02 16:09:43 UTC (rev 9) +++ trunk/vradi-swing/src/main/resources/org/chorem/vradi/entities/Client-error-validation.xml 2011-05-03 12:29:24 UTC (rev 10) @@ -33,10 +33,4 @@ </field-validator> </field> - <field name="email"> - <field-validator type="email"> - <message>vradi.adminUi.invalid.email</message> - </field-validator> - </field> - </validators> \ No newline at end of file