r687 - in trunk: . faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities faxtomail-persistence/src/main/resources/i18n faxtomail-persistence/src/main/xmi faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/con
Author: kmorin Date: 2014-11-17 07:21:06 +0000 (Mon, 17 Nov 2014) New Revision: 687 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/687 Log: fixes #5944 Erreur ?\195?\160 l'ouverture d'un ?\195?\169l?\195?\169ment fixes #6100 El?\195?\169ment du dossier Traitement/commandes/fse/ client P56789, si on veut visualiser la r?\195?\169ponse au mail, on plante syst?\195?\169matiquement. fixes #6102 Erreur lors de l'alimentation de la priorit?\195?\169 depuis la liste lorsqu'un ?\195?\169l?\195?\169ment a au moins une r?\195?\169ponse fixes #6110 Un historique de modification de PJ est ajout?\195?\169 m?\195?\170me si on ne sauvegarde pas l'email Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/HistoryType.java trunk/faxtomail-persistence/src/main/resources/i18n/faxtomail-persistence_fr_FR.properties trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GenerateAnnotatedAttachmentAction.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/LoadFolderEmailsAction.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentCellEditor.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/RepliesCellEditor.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchToGroupUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUIHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailDemandListHandler.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java trunk/pom.xml Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/HistoryType.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/HistoryType.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/persistence/entities/HistoryType.java 2014-11-17 07:21:06 UTC (rev 687) @@ -42,6 +42,7 @@ ARCHIVED(n("faxtomail.historyType.archive"), true), GROUP(n("faxtomail.historyType.group"), true), ATTACHMENT_OPENING(n("faxtomail.historyType.attachmentOpening"), false), + ATTACHMENT_ADDITION(n("faxtomail.historyType.attachmentAddition"), true), ATTACHMENT_MODIFICATION(n("faxtomail.historyType.attachmentModification"), true); protected String labelKey; Modified: trunk/faxtomail-persistence/src/main/resources/i18n/faxtomail-persistence_fr_FR.properties =================================================================== --- trunk/faxtomail-persistence/src/main/resources/i18n/faxtomail-persistence_fr_FR.properties 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-persistence/src/main/resources/i18n/faxtomail-persistence_fr_FR.properties 2014-11-17 07:21:06 UTC (rev 687) @@ -30,6 +30,7 @@ faxtomail.demandStatus.transmittedToEdi=Transmis à l'EDI faxtomail.demandStatus.untreated=Non traité faxtomail.historyType.archive=Archivage +faxtomail.historyType.attachmentAddition=Ajout de pièce jointe faxtomail.historyType.attachmentModification=Modification de pièce jointe faxtomail.historyType.attachmentOpening=Ouverture de pièce jointe faxtomail.historyType.creation=Création Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties =================================================================== --- trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties 2014-11-17 07:21:06 UTC (rev 687) @@ -58,7 +58,7 @@ com.franciaflex.faxtomail.persistence.entities.EmailAccount.attribute.login.tagvalue.naturalId=true -#�Configuration +#�Configuration com.franciaflex.faxtomail.persistence.entities.Configuration.attribute.searchDisplayColumns.tagvalue.hibernateAttributeType=com.franciaflex.faxtomail.persistence.hibernate.MailFieldEnumListUserType com.franciaflex.faxtomail.persistence.entities.Configuration.attribute.invalidFormDisabledActions.tagvalue.hibernateAttributeType=com.franciaflex.faxtomail.persistence.hibernate.MailActionEnumSetUserType @@ -87,7 +87,7 @@ # MailFilter com.franciaflex.faxtomail.persistence.entities.MailFilter.attribute.expression.tagvalue.naturalId=true com.franciaflex.faxtomail.persistence.entities.MailFilter.attribute.mailFolder.tagvalue.notNull=true -#�TODO echatellier 20141003 : wrong property, fix it with stereotype=unique +#�TODO echatellier 20141003 : wrong property, fix it with stereotype=unique com.franciaflex.faxtomail.persistence.entities.MailFilter.attribute.position.tagvalue.unique=true # Email @@ -101,7 +101,6 @@ com.franciaflex.faxtomail.persistence.entities.Reply.attribute.recipient.tagvalue.notNull=true com.franciaflex.faxtomail.persistence.entities.Reply.attribute.sentBy.tagvalue.notNull=true com.franciaflex.faxtomail.persistence.entities.Reply.attribute.replyContent.tagvalue.notNull=true -com.franciaflex.faxtomail.persistence.entities.Reply.attribute.replyContent.tagvalue.notNull=true # ReplyContent com.franciaflex.faxtomail.persistence.entities.ReplyContent.attribute.source.tagvalue.notNull=true @@ -128,5 +127,5 @@ # MailLock com.franciaflex.faxtomail.persistence.entities.MailLock.attribute.lockBy.tagvalue.notNull=true com.franciaflex.faxtomail.persistence.entities.MailLock.attribute.lockOn.tagvalue.notNull=true -#�TODO echatellier 20141003 : wrong property, fix it with stereotype=unique +#�TODO echatellier 20141003 : wrong property, fix it with stereotype=unique com.franciaflex.faxtomail.persistence.entities.MailLock.attribute.lockOn.tagvalue.unique=true 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-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-11-17 07:21:06 UTC (rev 687) @@ -43,6 +43,7 @@ import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -62,26 +63,26 @@ import javax.activation.FileDataSource; import javax.mail.MessagingException; +import com.franciaflex.faxtomail.persistence.entities.Email; 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.Collections2; import com.google.common.collect.Iterables; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.IteratorUtils; import org.apache.commons.collections4.Predicate; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.commons.mail.DefaultAuthenticator; -import org.apache.commons.mail.EmailConstants; -import org.apache.commons.mail.EmailException; -import org.apache.commons.mail.MultiPartEmail; +import org.apache.commons.mail.*; import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.StatelessSession; @@ -237,7 +238,7 @@ @Override public Email saveEmail(Email email, FaxToMailUser user, String... modifiedFields) throws InvalidClientException { Client client = email.getClient(); - return saveEmail(email, null, null, client != null ? client.getCode() : null, user, modifiedFields); + return saveEmail(email, null, email.getReplies(), client != null ? client.getCode() : null, user, modifiedFields); } @Override @@ -271,8 +272,9 @@ email.setClient(client); if (attachments != null) { - updateAttachments(email, attachments); + updateAttachments(email, attachments, user); } + if (replies != null) { updateReplies(email); } @@ -316,6 +318,15 @@ handleEdiTransmission(email, historyDao, fieldSet); } + if (email.getHistory() != null) { + historyDao.createAll(Collections2.filter(email.getHistory(), new com.google.common.base.Predicate<History>() { + @Override + public boolean apply(History history) { + return !history.isPersisted(); + } + })); + } + History history = null; if (fieldSet.contains(Email.PROPERTY_ARCHIVE_DATE)) { history = historyDao.create(History.PROPERTY_TYPE, HistoryType.ARCHIVED, @@ -377,9 +388,11 @@ * * @param email * @param attachments + * @param user */ - protected void updateAttachments(Email email, Collection<Attachment> attachments) { + protected void updateAttachments(Email email, Collection<Attachment> attachments, FaxToMailUser user) { AttachmentTopiaDao attachmentTopiaDao = getPersistenceContext().getAttachmentDao(); + HistoryTopiaDao historyTopiaDao = getPersistenceContext().getHistoryDao(); List<Attachment> currentAttachments = attachmentTopiaDao.forTopiaIdIn(email.getAttachmentTopiaIds()).findAll(); if (currentAttachments == null) { @@ -387,6 +400,8 @@ } Map<String, Attachment> currentAttachmentIndex = new HashMap<>(Maps.uniqueIndex(currentAttachments, TopiaEntities.getTopiaIdFunction())); + Set<String> newFiles = new HashSet<>(); + AttachmentFileTopiaDao attachementFileTopiaDao = getPersistenceContext().getAttachmentFileDao(); for (Attachment attachment : attachments) { @@ -433,6 +448,8 @@ if (!originalFile.isPersisted()) { attachementFileTopiaDao.create(originalFile); + newFiles.add(originalFile.getFilename()); + } else { attachementFileTopiaDao.update(originalFile); } @@ -440,6 +457,7 @@ if (editedFile != null) { if (!editedFile.isPersisted()) { attachementFileTopiaDao.create(editedFile); + } else { attachementFileTopiaDao.update(editedFile); } @@ -451,6 +469,14 @@ } } + if (!newFiles.isEmpty()) { + History history = historyTopiaDao.create(History.PROPERTY_TYPE, HistoryType.ATTACHMENT_ADDITION, + History.PROPERTY_FAX_TO_MAIL_USER, user, + History.PROPERTY_MODIFICATION_DATE, new Date()); + history.setFields(newFiles); + email.addHistory(history); + } + // delete not found attachments for (Attachment attachment : currentAttachmentIndex.values()) { currentAttachments.remove(attachment); @@ -1160,7 +1186,8 @@ History.PROPERTY_MODIFICATION_DATE, now); email.addHistory(history); - email = saveEmail(email, user); + Client client = email.getClient(); + email = saveEmail(email, null, null, client != null ? client.getCode() : null, user); return email; } 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-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/GenerateAnnotatedAttachmentAction.java 2014-11-17 07:21:06 UTC (rev 687) @@ -245,7 +245,7 @@ FaxToMailServiceContext serviceContext = getContext().newServiceContext(); AttachmentFile attachmentFileNew = serviceContext.getEmailService().getAttachmentFileFromStream(is); attachmentFileNew.setRotation(rotation); - String fileName = model.getNotNullFile().getFilename(); + String fileName = model.getOriginalFile().getFilename(); attachmentFileNew.setFilename(FaxToMailUIUtil.getEditedFileName(fileName)); model.setEditedFile(attachmentFileNew); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/LoadFolderEmailsAction.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/LoadFolderEmailsAction.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/actions/LoadFolderEmailsAction.java 2014-11-17 07:21:06 UTC (rev 687) @@ -34,6 +34,7 @@ import com.franciaflex.faxtomail.persistence.entities.WaitingState; import com.franciaflex.faxtomail.persistence.entities.MailField; +import com.franciaflex.faxtomail.ui.swing.util.DemandeTableModel; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import jaxx.runtime.JAXXUtil; @@ -42,7 +43,6 @@ import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTable; import org.nuiton.decorator.Decorator; -import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.topia.persistence.TopiaEntities; import org.nuiton.util.pagination.PaginationResult; @@ -169,8 +169,7 @@ if (currentEmail != null) { JXTable dataTable = getUI().getDataTable(); - AbstractApplicationTableModel<DemandeUIModel> dataTableModel = - (AbstractApplicationTableModel<DemandeUIModel>) dataTable.getModel(); + DemandeTableModel dataTableModel = (DemandeTableModel) dataTable.getModel(); int row = dataTableModel.getRowIndex(currentEmail); if (row > 0) { dataTable.setRowSelectionInterval(row, row); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentCellEditor.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentCellEditor.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/attachment/AttachmentCellEditor.java 2014-11-17 07:21:06 UTC (rev 687) @@ -31,13 +31,13 @@ import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailBeanUIModel; +import com.franciaflex.faxtomail.ui.swing.util.DemandeTableModel; import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUI; import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUIUtil; import com.google.common.base.Preconditions; import com.google.common.collect.Sets; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import javax.swing.*; import javax.swing.border.LineBorder; @@ -96,8 +96,7 @@ boolean isSelected, int row, int column) { - AbstractApplicationTableModel<AbstractFaxToMailBeanUIModel> tableModel = - (AbstractApplicationTableModel<AbstractFaxToMailBeanUIModel>) table.getModel(); + DemandeTableModel tableModel = (DemandeTableModel) table.getModel(); int modelRow = table.convertRowIndexToModel(row); final DemandeUIModel model = (DemandeUIModel) tableModel.getEntry(modelRow); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeListUIHandler.java 2014-11-17 07:21:06 UTC (rev 687) @@ -56,6 +56,7 @@ import com.franciaflex.faxtomail.services.service.EmailService; import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; import com.franciaflex.faxtomail.ui.swing.actions.OpenMailFolderChooserFromListAction; +import com.franciaflex.faxtomail.ui.swing.util.DemandeTableModel; import jaxx.runtime.JAXXUtil; import jaxx.runtime.swing.table.filter.TableFilter; import jaxx.runtime.swing.table.filter.TableRowFilterSupport; @@ -70,8 +71,6 @@ import org.jdesktop.swingx.decorator.HighlightPredicate; import org.nuiton.decorator.Decorator; import org.nuiton.jaxx.application.swing.action.ApplicationUIAction; -import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; -import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; import org.nuiton.jaxx.application.swing.util.CloseableUI; import com.franciaflex.faxtomail.persistence.entities.Attachment; @@ -183,7 +182,7 @@ model.setSelectedEmails(null); } else { List<DemandeUIModel> selectedRows = new ArrayList<DemandeUIModel>(); - AbstractApplicationTableModel<DemandeUIModel> dataTableModel = (AbstractApplicationTableModel<DemandeUIModel>) dataTable.getModel(); + DemandeTableModel dataTableModel = (DemandeTableModel) dataTable.getModel(); for (int i = source.getMinSelectionIndex(); i <= source.getMaxSelectionIndex(); i++) { if (source.isSelectedIndex(i)) { selectedRows.add(dataTableModel.getEntry(i)); @@ -198,7 +197,7 @@ @Override public void propertyChange(PropertyChangeEvent evt) { List<DemandeUIModel> emails = (List<DemandeUIModel>) evt.getNewValue(); - AbstractApplicationTableModel<DemandeUIModel> dataTableModel = (AbstractApplicationTableModel<DemandeUIModel>) dataTable.getModel(); + DemandeTableModel dataTableModel = (DemandeTableModel) dataTable.getModel(); dataTableModel.setRows(emails); int quotationNb = 0; @@ -382,7 +381,7 @@ public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { int viewRow = adapter.row; int modelRow = adapter.convertRowIndexToModel(viewRow); - DemandeUIModel row = ((AbstractApplicationTableModel<DemandeUIModel>) table.getModel()).getEntry(modelRow); + DemandeUIModel row = ((DemandeTableModel) table.getModel()).getEntry(modelRow); MailFolder folder = getModel().getSelectedFolder(); while (folder.getOpenAttachmentReportNoTaken() == null && folder.getParent() != null) { Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java 2014-11-17 07:21:06 UTC (rev 687) @@ -47,6 +47,9 @@ import javax.swing.event.ListSelectionListener; import javax.swing.table.TableCellEditor; +import com.franciaflex.faxtomail.persistence.entities.History; +import com.franciaflex.faxtomail.persistence.entities.HistoryImpl; +import com.google.common.collect.Sets; import jaxx.runtime.validator.swing.SwingValidator; import org.apache.commons.collections4.CollectionUtils; @@ -375,13 +378,21 @@ public void onAttachmentEdited(Attachment attachment) { String topiaId = getModel().getTopiaId(); if (topiaId != null && attachment.isPersisted()) { - FaxToMailServiceContext serviceContext = getContext().newServiceContext(); - Email email = serviceContext.getEmailService().addToHistory(topiaId, - HistoryType.ATTACHMENT_MODIFICATION, - getContext().getCurrentUser(), - new Date(), - FaxToMailUIUtil.getEditedFileName(attachment.getOriginalFileName())); - getModel().setHistory(email.getHistory()); + //TODO create a history manually and add it to the email, but do not save it +// FaxToMailServiceContext serviceContext = getContext().newServiceContext(); +// Email email = serviceContext.getEmailService().addToHistory(topiaId, +// HistoryType.ATTACHMENT_MODIFICATION, +// getContext().getCurrentUser(), +// new Date(), +// FaxToMailUIUtil.getEditedFileName(attachment.getOriginalFileName())); +// getModel().setHistory(email.getHistory()); + + History history = new HistoryImpl(); + history.setType(HistoryType.ATTACHMENT_MODIFICATION); + history.setFaxToMailUser(getContext().getCurrentUser()); + history.setModificationDate(new Date()); + history.setFields(Sets.newHashSet(attachment.getOriginalFileName())); + getModel().getHistory().add(history); } getModel().setModify(true); } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java 2014-11-17 07:21:06 UTC (rev 687) @@ -42,7 +42,10 @@ import javax.mail.Part; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; +import javax.mail.internet.MimeUtility; +import com.google.common.collect.Lists; +import com.sun.mail.util.MimeUtil; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -871,7 +874,7 @@ try { // ce code peut provoquer une NPE avec les données de test Message message = new MimeMessage(null, new ByteArrayInputStream(getOriginalEmail().getBytes(StandardCharsets.UTF_8))); - subject = message.getSubject(); + subject = MimeUtility.decodeText(message.getSubject()); toRecipients = new ArrayList<String>(); ccRecipients = new ArrayList<String>(); @@ -897,10 +900,12 @@ } } catch (Exception e) { - //TODO kmorin 20140516 do something when we use the real data - if (log.isErrorEnabled()) { - log.error("", e); + if (log.isWarnEnabled()) { + log.warn("error while parsing the original email content, may come from the imported archives", e); } + //may comes from the imported archives + plainContent = getOriginalEmail(); + toRecipients = Lists.newArrayList(getRecipient()); } } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/DemandRepliesUIHandler.java 2014-11-17 07:21:06 UTC (rev 687) @@ -41,6 +41,7 @@ import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMessage.RecipientType; import javax.mail.internet.MimeMultipart; +import javax.mail.internet.MimeUtility; import javax.swing.AbstractCellEditor; import javax.swing.JComponent; import javax.swing.JTable; @@ -303,7 +304,8 @@ // remove the guillemets between the id fileName = fileName.replaceFirst("^<(.*)>$", "$1"); } - log.debug("FileName : " + fileName); + fileName = MimeUtility.decodeText(fileName); + log.info("FileName : " + fileName); /*File dir = new File(FileUtils.getTempDirectory(), topiaId); if (!dir.exists()) { Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/RepliesCellEditor.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/RepliesCellEditor.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/replies/RepliesCellEditor.java 2014-11-17 07:21:06 UTC (rev 687) @@ -27,11 +27,11 @@ import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; import com.franciaflex.faxtomail.ui.swing.util.AbstractFaxToMailBeanUIModel; +import com.franciaflex.faxtomail.ui.swing.util.DemandeTableModel; import com.franciaflex.faxtomail.ui.swing.util.FaxToMailUI; import com.google.common.base.Preconditions; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import javax.swing.*; import javax.swing.border.LineBorder; @@ -86,8 +86,7 @@ boolean isSelected, int row, int column) { - AbstractApplicationTableModel<AbstractFaxToMailBeanUIModel> tableModel = - (AbstractApplicationTableModel<AbstractFaxToMailBeanUIModel>) table.getModel(); + DemandeTableModel tableModel = (DemandeTableModel) table.getModel(); int modelRow = table.convertRowIndexToModel(row); final DemandeUIModel model = (DemandeUIModel) tableModel.getEntry(modelRow); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchToGroupUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchToGroupUIHandler.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchToGroupUIHandler.java 2014-11-17 07:21:06 UTC (rev 687) @@ -51,6 +51,7 @@ import com.franciaflex.faxtomail.persistence.entities.HasLabel; import com.franciaflex.faxtomail.persistence.entities.SearchFilter; import com.franciaflex.faxtomail.ui.swing.FaxToMailUIContext; +import com.franciaflex.faxtomail.ui.swing.util.DemandeTableModel; import jaxx.runtime.swing.editor.bean.BeanFilterableComboBox; import jaxx.runtime.validator.swing.SwingValidator; @@ -61,7 +62,6 @@ import org.jdesktop.swingx.decorator.ColorHighlighter; import org.jdesktop.swingx.decorator.ComponentAdapter; import org.jdesktop.swingx.decorator.HighlightPredicate; -import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.util.Cancelable; import com.franciaflex.faxtomail.persistence.entities.DemandStatus; @@ -177,7 +177,7 @@ @Override public void propertyChange(PropertyChangeEvent evt) { List<DemandeUIModel> emails = (List<DemandeUIModel>) evt.getNewValue(); - AbstractApplicationTableModel<DemandeUIModel> dataTableModel = (AbstractApplicationTableModel<DemandeUIModel>) dataTable.getModel(); + DemandeTableModel dataTableModel = (DemandeTableModel) dataTable.getModel(); dataTableModel.setRows(emails); DemandeUIModel currentEmail = getContext().getCurrentEmail(); @@ -197,7 +197,7 @@ ListSelectionModel selectionModel = (ListSelectionModel) e.getSource(); SearchUIModel model = getModel(); int selectedIndex = selectionModel.getLeadSelectionIndex(); - AbstractApplicationTableModel<DemandeUIModel> dataTableModel = (AbstractApplicationTableModel<DemandeUIModel>) dataTable.getModel(); + DemandeTableModel dataTableModel = (DemandeTableModel) dataTable.getModel(); DemandeUIModel selectedModel = selectedIndex < 0 ? null : dataTableModel.getEntry(selectedIndex); model.setGroupEnabled(!selectionModel.isSelectionEmpty() && isDemandSelectable(selectedModel)); } @@ -209,7 +209,7 @@ public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { int viewRow = adapter.row; int modelRow = adapter.convertRowIndexToModel(viewRow); - AbstractApplicationTableModel<DemandeUIModel> dataTableModel = (AbstractApplicationTableModel<DemandeUIModel>) dataTable.getModel(); + DemandeTableModel dataTableModel = (DemandeTableModel) dataTable.getModel(); DemandeUIModel row = dataTableModel.getEntry(modelRow); return !isDemandSelectable(row); } Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUIHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUIHandler.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/search/SearchUIHandler.java 2014-11-17 07:21:06 UTC (rev 687) @@ -50,7 +50,6 @@ import org.jdesktop.swingx.JXDatePicker; import org.jdesktop.swingx.JXTable; import org.nuiton.jaxx.application.swing.action.ApplicationActionEngine; -import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.util.CloseableUI; import com.franciaflex.faxtomail.persistence.entities.DemandStatus; @@ -165,7 +164,7 @@ @Override public void propertyChange(PropertyChangeEvent evt) { List<DemandeUIModel> emails = (List<DemandeUIModel>) evt.getNewValue(); - AbstractApplicationTableModel<DemandeUIModel> dataTableModel = (AbstractApplicationTableModel<DemandeUIModel>) dataTable.getModel(); + DemandeTableModel dataTableModel = (DemandeTableModel) dataTable.getModel(); dataTableModel.setRows(emails); DemandeUIModel currentEmail = getContext().getCurrentEmail(); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailDemandListHandler.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailDemandListHandler.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/AbstractFaxToMailDemandListHandler.java 2014-11-17 07:21:06 UTC (rev 687) @@ -42,6 +42,7 @@ import javax.swing.event.ChangeListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableModel; import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.persistence.entities.EmailGroup; @@ -57,7 +58,6 @@ import org.jdesktop.swingx.table.DefaultTableColumnModelExt; import org.jdesktop.swingx.table.TableColumnModelExt; import org.nuiton.decorator.Decorator; -import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.validator.NuitonValidator; import org.nuiton.validator.NuitonValidatorFactory; import org.nuiton.validator.NuitonValidatorResult; @@ -101,7 +101,7 @@ public Component highlight(Component renderer, ComponentAdapter adapter) { int viewRow = adapter.row; int modelRow = adapter.convertRowIndexToModel(viewRow); - DemandeUIModel row = ((AbstractApplicationTableModel<DemandeUIModel>) table.getModel()).getEntry(modelRow); + DemandeUIModel row = ((DemandeTableModel) table.getModel()).getEntry(modelRow); boolean highlight = row.getTakenBy() == null; if (highlight) { Font font = renderer.getFont(); @@ -136,7 +136,7 @@ public boolean isHighlighted(Component renderer, ComponentAdapter adapter) { int viewRow = adapter.row; int modelRow = adapter.convertRowIndexToModel(viewRow); - DemandeUIModel row = ((AbstractApplicationTableModel<DemandeUIModel>) table.getModel()).getEntry(modelRow); + DemandeUIModel row = ((DemandeTableModel) table.getModel()).getEntry(modelRow); return !row.isValid() && row.getTakenBy() != null; } }; @@ -237,8 +237,7 @@ } } - final AbstractApplicationTableModel<DemandeUIModel> tableModel = new DemandeTableModel(columnModel, - getEditableTableProperties()); + TableModel tableModel = new DemandeTableModel(columnModel, getEditableTableProperties()); table.setModel(tableModel); table.setColumnModel(columnModel); @@ -256,8 +255,7 @@ } rowIndex = table.convertRowIndexToModel(rowIndex); - AbstractApplicationTableModel<DemandeUIModel> tableModel = - (AbstractApplicationTableModel<DemandeUIModel>) table.getModel(); + DemandeTableModel tableModel = (DemandeTableModel) table.getModel(); DemandeUIModel selectedEmail = tableModel.getEntry(rowIndex); onDoubleClickOnDemande(selectedEmail); @@ -321,7 +319,7 @@ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasfocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasfocus, row, column); - AbstractApplicationTableModel<DemandeUIModel> tableModel = (AbstractApplicationTableModel<DemandeUIModel>) table.getModel(); + DemandeTableModel tableModel = (DemandeTableModel) table.getModel(); int rowInModel = table.convertRowIndexToModel(row); DemandeUIModel demande = tableModel.getEntry(rowInModel); Modified: trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java =================================================================== --- trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/DemandeTableModel.java 2014-11-17 07:21:06 UTC (rev 687) @@ -25,14 +25,27 @@ import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.persistence.entities.MailField; import com.franciaflex.faxtomail.ui.swing.content.demande.DemandeUIModel; +import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import jaxx.runtime.SwingUtil; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.table.TableColumnModelExt; -import org.nuiton.jaxx.application.swing.table.AbstractApplicationTableModel; import org.nuiton.jaxx.application.swing.table.ColumnIdentifier; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableColumn; +import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import static org.nuiton.i18n.I18n.n; @@ -40,8 +53,12 @@ * @author kmorin - kmorin@codelutin.com * */ -public class DemandeTableModel extends AbstractApplicationTableModel<DemandeUIModel> { +public class DemandeTableModel extends AbstractTableModel { + /** Logger. */ + private static final Log log = + LogFactory.getLog(DemandeTableModel.class); + public static final Map<MailField, ColumnIdentifier<Email>> COLUMN_IDENTIFIERS = new HashMap<MailField, ColumnIdentifier<Email>>() {{ put(MailField.SENDER, ColumnIdentifier.<Email>newReadOnlyId( @@ -184,7 +201,12 @@ }}; public DemandeTableModel(TableColumnModelExt columnModel, MailField... editableProperties) { - super(columnModel, false, false); + + this.identifiers = Lists.newArrayListWithCapacity(columnModel.getColumnCount()); + for (TableColumn tc : columnModel.getColumns(true)) { + this.identifiers.add((ColumnIdentifier<DemandeUIModel>) tc.getIdentifier()); + } + List<ColumnIdentifier> nonEditableColumns = new ArrayList<ColumnIdentifier>(COLUMN_IDENTIFIERS.values()); for (MailField editableProperty : editableProperties) { nonEditableColumns.remove(COLUMN_IDENTIFIERS.get(editableProperty)); @@ -192,8 +214,282 @@ setNoneEditableCols(nonEditableColumns.toArray(new ColumnIdentifier[nonEditableColumns.size()])); } - @Override public DemandeUIModel createNewRow() { return new DemandeUIModel(); } + + /** + * Data in the model. + * + * @since 0.2 + */ + protected List<DemandeUIModel> rows; + + /** + * Set of non editable columns. + * + * @since 0.2 + */ + protected Set<ColumnIdentifier<?>> noneEditableCols; + + /** + * Identifiers of columns (in initial order). + * + * @since 1.1 + */ + protected final List<ColumnIdentifier<DemandeUIModel>> identifiers; + + public final List<DemandeUIModel> getRows() { + return rows; + } + + public final void setRows(List<DemandeUIModel> data) { + + // can't accept a empty data list + Preconditions.checkNotNull(data, "Data list can not be null."); + + this.rows = null; + if (log.isDebugEnabled()) { + log.debug("Set " + data.size() + " row(s) in table model " + this); + } + this.rows = data; + onRowsChanged(data); + fireTableDataChanged(); + } + + public final void addNewRow() { + DemandeUIModel newValue = createNewRow(); + addNewRow(newValue); + } + + public final void addNewRow(DemandeUIModel newValue) { + + addNewRow(getRowCount(), newValue); + } + + public final void addNewRow(int rowIndex, DemandeUIModel newValue) { + + Preconditions.checkNotNull(newValue, "Row can not be null."); + + List<DemandeUIModel> data = getRows(); + Preconditions.checkNotNull(data, "Data list can not be null."); + + data.add(rowIndex, newValue); + + onRowAdded(rowIndex, newValue); + fireTableRowsInserted(rowIndex, rowIndex); + } + + public final void fireTableRowsInserted(DemandeUIModel newValue) { + + Preconditions.checkNotNull(newValue, "Row can not be null."); + + int rowIndex = getRowIndex(newValue); + fireTableRowsInserted(rowIndex, rowIndex); + } + + public final int updateRow(DemandeUIModel row) { + Preconditions.checkNotNull(row, "Row can not be null."); + + List<DemandeUIModel> data = getRows(); + Preconditions.checkNotNull(data, "Data list can not be null."); + + int rowIndex = data.indexOf(row); + + fireTableRowsUpdated(rowIndex, rowIndex); + return rowIndex; + } + + public final DemandeUIModel removeRow(int rowIndex) { + SwingUtil.ensureRowIndex(this, rowIndex); + + List<DemandeUIModel> data = getRows(); + + DemandeUIModel result = data.remove(rowIndex); + + fireTableRowsDeleted(rowIndex, rowIndex); + return result; + } + + protected void onRowsChanged(List<DemandeUIModel> data) { + // by default do nothing + } + + protected void onRowAdded(int rowIndex, DemandeUIModel newValue) { + // by default do nothing + } + + public final int getRowIndex(DemandeUIModel row) { + int result = rows == null ? -1 : rows.indexOf(row); + return result; + } + + public final DemandeUIModel getEntry(int rowIndex) { + SwingUtil.ensureRowIndex(this, rowIndex); + int rowCount = getRowCount(); + if (rowIndex > rowCount) { + log.error("Error getting entry " + rowIndex + " int table model with " + rowCount + " items"); + return null; + } + List<DemandeUIModel> data = getRows(); + DemandeUIModel result = data == null ? null : data.get(rowIndex); + return result; + } + + public final void setNoneEditableCols(ColumnIdentifier<?>... noneEditableCols) { + this.noneEditableCols = Sets.newHashSet(noneEditableCols); + } + + @Override + public final int getRowCount() { + return rows == null ? 0 : rows.size(); + } + + @Override + public final int getColumnCount() { + return identifiers.size(); + } + + @Override + public final Object getValueAt(int rowIndex, int columnIndex) { + DemandeUIModel entry = getEntry(rowIndex); + ColumnIdentifier<DemandeUIModel> identifier = getIdentifier(columnIndex); + if (log.isDebugEnabled()) { + log.debug("columnIndex: " + columnIndex + " :: " + identifier.getPropertyName()); + } + Object result = identifier.getValue(entry); + return result; + } + + @Override + public final void setValueAt(Object aValue, int rowIndex, int columnIndex) { + if (log.isDebugEnabled()) { + log.debug("setValueAt " + aValue); + } + DemandeUIModel entry = getEntry(rowIndex); + ColumnIdentifier<DemandeUIModel> identifier = getIdentifier(columnIndex); + setValueAt(aValue, rowIndex, columnIndex, identifier, entry); + } + + @Override + public final boolean isCellEditable(int rowIndex, int columnIndex) { + ColumnIdentifier<DemandeUIModel> identifier = getIdentifier(columnIndex); + boolean result = isCellEditable(rowIndex, columnIndex, identifier); + return result; + } + + protected void setValueAt(Object aValue, + int rowIndex, + int columnIndex, + ColumnIdentifier<DemandeUIModel> propertyName, + DemandeUIModel entry) { + if (log.isDebugEnabled()) { + log.debug("setValueAt " + aValue); + } + propertyName.setValue(entry, aValue); + } + + protected boolean isCellEditable(int rowIndex, + int columnIndex, + ColumnIdentifier<DemandeUIModel> propertyName) { + boolean result = !noneEditableCols.contains(propertyName); + return result; + } + + public final void fireTableCellUpdated(int rowIndex, + ColumnIdentifier<DemandeUIModel>... identifiers) { + for (ColumnIdentifier<DemandeUIModel> identifier : identifiers) { + int columnIndex = this.identifiers.indexOf(identifier); + fireTableCellUpdated(rowIndex, columnIndex); + } + } + + public final void fireTableRowUpdatedShell(Set<DemandeUIModel> shell) { + + int minRowIndex1 = getColumnCount(); + int maxRowIndex1 = 0; + + for (DemandeUIModel r : shell) { + int rowIndex1 = getRowIndex(r); + minRowIndex1 = Math.min(minRowIndex1, rowIndex1); + maxRowIndex1 = Math.max(maxRowIndex1, rowIndex1); + } + fireTableRowsUpdated(minRowIndex1, maxRowIndex1); + } + + protected void collectShell(DemandeUIModel row, Set<DemandeUIModel> collectedRows) { + + // by default just add the incoming row + collectedRows.add(row); + } + + @Override + public String getColumnName(int columnIndex) { + return getIdentifier(columnIndex).getPropertyName(); + } + + protected ColumnIdentifier<DemandeUIModel> getIdentifier(int columnIndex) { + ColumnIdentifier<DemandeUIModel> identifier = identifiers.get(columnIndex); + return identifier; + } + + public int getColumnIndex(final String propertyName) { + return Iterables.indexOf(identifiers, new Predicate<ColumnIdentifier<DemandeUIModel>>() { + @Override + public boolean apply(ColumnIdentifier<DemandeUIModel> input) { + return ObjectUtils.equals(propertyName, input.getPropertyName()); + } + }); + } + + public Pair<Integer, Integer> getCell(DemandeUIModel row, final String propertyName) { + + int rowIndex = getRowIndex(row); + int columnIndex = getColumnIndex(propertyName); + + Pair<Integer, Integer> cell = Pair.of(rowIndex, columnIndex); + + return cell; + } + + public void moveUp(DemandeUIModel row) { + + int rowIndex = getRowIndex(row); + + if (log.isInfoEnabled()) { + log.info("Will move up row of index: " + rowIndex); + } + rows.remove(rowIndex); + rows.add(rowIndex - 1, row); + fireTableRowsUpdated(rowIndex - 1, rowIndex); + + } + + public void moveDown(DemandeUIModel row) { + + int rowIndex = getRowIndex(row); + + if (log.isInfoEnabled()) { + log.info("Will move down row of index: " + rowIndex); + } + rows.remove(rowIndex); + rows.add(rowIndex + 1, row); + fireTableRowsUpdated(rowIndex, rowIndex + 1); + + } + + public boolean isFirstRow(DemandeUIModel row) { + + int rowIndex = getRowIndex(row); + return rowIndex == 0; + + } + + public boolean isLastRow(DemandeUIModel row) { + + int rowIndex = getRowIndex(row); + return rowIndex == getRowCount() - 1; + + } + } 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-11-07 15:58:09 UTC (rev 686) +++ trunk/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java 2014-11-17 07:21:06 UTC (rev 687) @@ -633,7 +633,7 @@ public static String getEditedFileName(String originalFileName) { - return t("faxtomail.attachment.editedFile.name", originalFileName) + "-.pdf"; + return t("faxtomail.attachment.editedFile.name", originalFileName) + ".pdf"; } /** Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2014-11-07 15:58:09 UTC (rev 686) +++ trunk/pom.xml 2014-11-17 07:21:06 UTC (rev 687) @@ -111,7 +111,7 @@ <h2Version>1.3.176</h2Version> <guavaVersion>18.0</guavaVersion> - <jaxxVersion>2.14</jaxxVersion> + <jaxxVersion>2.17-SNAPSHOT</jaxxVersion> <!-- do not upgrade to 1.6.5-1 --> <swingXVersion>1.6.4</swingXVersion> <xworkVersion>2.3.16.3</xworkVersion>
participants (1)
-
kmorin@users.forge.codelutin.com