This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository tutti. See http://git.codelutin.com/tutti.git commit a0f8e0ae943a02fecd840df3dcf50e89e175a949 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Mar 26 09:08:33 2015 +0100 refs #6870 Gestion de la surcharge du protocol --- .../genericformat/GenericFormatContextSupport.java | 10 +++ .../GenericFormatImportConfiguration.java | 10 +++ .../genericformat/GenericFormatImportRequest.java | 4 ++ .../genericformat/GenericFormatResultSupport.java | 12 +++- .../importactions/ImportProtocolAction.java | 9 ++- .../importactions/RestoreAfterImportAction.java | 36 ++++++++++- .../resources/i18n/tutti-service_en_GB.properties | 2 + .../resources/i18n/tutti-service_fr_FR.properties | 4 +- .../actions/GenericFormatImportAction.java | 74 +++++++++++++++++++++- .../resources/i18n/tutti-ui-swing_en_GB.properties | 6 ++ .../resources/i18n/tutti-ui-swing_fr_FR.properties | 6 ++ 11 files changed, 165 insertions(+), 8 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatContextSupport.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatContextSupport.java index 6e32462..42cb74b 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatContextSupport.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatContextSupport.java @@ -125,6 +125,8 @@ public abstract class GenericFormatContextSupport implements Closeable { private final Map<String, GenericFormatImportCruiseContext> cruiseContexts; + private String protocolOriginalName; + protected abstract void onClose(); public GenericFormatContextSupport(GenericFormatImportRequest importRequest, @@ -524,6 +526,14 @@ public abstract class GenericFormatContextSupport implements Closeable { return isTechnicalFilesValid() && getOperationFileResult().isValid(); } + public String getProtocolOriginalName() { + return protocolOriginalName; + } + + public void setProtocolOriginalName(String protocolOriginalName) { + this.protocolOriginalName = protocolOriginalName; + } + public static interface CruiseContextAction { diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportConfiguration.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportConfiguration.java index cf930a8..ccb03cb 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportConfiguration.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportConfiguration.java @@ -49,6 +49,8 @@ public class GenericFormatImportConfiguration implements Serializable { private boolean overrideData; + private boolean overrideProtocol; + public String getProgramId() { return programId; } @@ -96,4 +98,12 @@ public class GenericFormatImportConfiguration implements Serializable { public void setOverrideData(boolean overrideData) { this.overrideData = overrideData; } + + public void setOverrideProtocol(boolean overrideProtocol) { + this.overrideProtocol = overrideProtocol; + } + + public boolean isOverrideProtocol() { + return overrideProtocol; + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportRequest.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportRequest.java index 1d56f7d..6fc9d1d 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportRequest.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportRequest.java @@ -139,6 +139,10 @@ public class GenericFormatImportRequest implements Serializable { return importConfiguration.isOverrideData(); } + public boolean isOverrideProtocol() { + return importConfiguration.isOverrideProtocol(); + } + public File getReportFile() { return importConfiguration.getReportFile(); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatResultSupport.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatResultSupport.java index 09d57b1..7a8ff84 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatResultSupport.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatResultSupport.java @@ -84,6 +84,8 @@ public abstract class GenericFormatResultSupport implements Serializable { private final GenericFormatCsvFileResult accidentalCatchFileResult; + private String protocolOriginalName; + protected GenericFormatResultSupport(GenericFormatContextSupport importContext) { this.importRequest = importContext.getImportRequest(); @@ -102,7 +104,7 @@ public abstract class GenericFormatResultSupport implements Serializable { this.marineLitterFileResult = importContext.getMarineLitterFileResult(); this.individualObservationFileResult = importContext.getIndividualObservationFileResult(); this.accidentalCatchFileResult = importContext.getAccidentalCatchFileResult(); - + this.protocolOriginalName = importContext.getProtocolOriginalName(); Set<String> archiveLayoutErrors1; if (importContext.isArchiveLayoutValid()) { archiveLayoutErrors1 = Collections.emptySet(); @@ -238,4 +240,12 @@ public abstract class GenericFormatResultSupport implements Serializable { return valid; } + public String getProtocolOriginalName() { + return protocolOriginalName; + } + + public void setProtocolOriginalName(String protocolOriginalName) { + this.protocolOriginalName = protocolOriginalName; + } + } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportProtocolAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportProtocolAction.java index 680b3b9..b3795f0 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportProtocolAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/ImportProtocolAction.java @@ -85,7 +85,9 @@ public class ImportProtocolAction extends ImportActionSupport { Map<String, String> idTranslationMap = importContext.getReferentialTemporarySpeciesFileResult().getIdTranslationMap(); TuttiProtocols.translateReferenceTaxonIds(tuttiProtocol, idTranslationMap); - String newName = persistenceService.getFirstAvailableName(tuttiProtocol.getName()); + String protocolOriginalName = tuttiProtocol.getName(); + + String newName = persistenceService.getFirstAvailableName(protocolOriginalName); tuttiProtocol.setName(newName); List<Species> referentSpecies = persistenceService.getAllReferentSpecies(); @@ -111,16 +113,17 @@ public class ImportProtocolAction extends ImportActionSupport { if (fileResult.isValid()) { - importContext.increments(t("tutti.service.genericFormat.import.protocol", tuttiProtocol.getName())); + importContext.increments(t("tutti.service.genericFormat.import.protocol", protocolOriginalName)); tuttiProtocol = persistenceService.createProtocol(tuttiProtocol); persistenceService.setProtocol(tuttiProtocol); importContext.setImportedProtocol(tuttiProtocol); + importContext.setProtocolOriginalName(protocolOriginalName); } else { - importContext.increments(t("tutti.service.genericFormat.import.protocol.notValid", tuttiProtocol.getName())); + importContext.increments(t("tutti.service.genericFormat.import.protocol.notValid", protocolOriginalName)); } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/RestoreAfterImportAction.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/RestoreAfterImportAction.java index 8965ba9..dbb076b 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/RestoreAfterImportAction.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/importactions/RestoreAfterImportAction.java @@ -1,6 +1,7 @@ package fr.ifremer.tutti.service.genericformat.importactions; import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel; +import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol; import fr.ifremer.tutti.service.PersistenceService; import fr.ifremer.tutti.service.genericformat.GenericFormatContextSupport; import fr.ifremer.tutti.service.genericformat.GenericFormatImportRequest; @@ -35,7 +36,13 @@ public class RestoreAfterImportAction extends ImportActionSupport { GenericFormatImportRequest importRequest = importContext.getImportRequest(); - rollbackSampleCategoryModel(importRequest); + try { + rollbackSampleCategoryModel(importRequest); + } finally { + + rollbackProtocol(importRequest); + + } } @@ -50,4 +57,31 @@ public class RestoreAfterImportAction extends ImportActionSupport { } + protected void rollbackProtocol(GenericFormatImportRequest importRequest) { + + if (importRequest.isOverrideProtocol()) { + + String protocolOriginalName = importContext.getProtocolOriginalName(); + + TuttiProtocol toDelete = persistenceService.getProtocolByName(protocolOriginalName); + + if (log.isInfoEnabled()) { + log.info("Delete previous protocol: " + toDelete.getId() + " - " + toDelete.getName()); + } + + // delete previous protocol + persistenceService.deleteProtocol(toDelete.getId()); + + TuttiProtocol importedProtocol = importContext.getImportedProtocol(); + importedProtocol.setName(protocolOriginalName); + if (log.isInfoEnabled()) { + log.info("Save imported protocol: " + importedProtocol.getId() + " - " + importedProtocol.getName()); + } + + persistenceService.saveProtocol(importedProtocol); + + } + + } + } diff --git a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties index ed06934..f44c1fe 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_en_GB.properties @@ -192,6 +192,8 @@ tutti.service.genericFormat.import.parameters= tutti.service.genericFormat.import.protocol= tutti.service.genericFormat.import.protocol.notValid= tutti.service.genericFormat.import.sampleCategoryModel= +tutti.service.genericFormat.import.sampleCategoryModel.error.alreadyUsedCaracteristic= +tutti.service.genericFormat.import.sampleCategoryModel.error.alreadyUsedCode= tutti.service.genericFormat.import.sampleCategoryModel.error.caracteristicNotMatching= tutti.service.genericFormat.import.sampleCategoryModel.error.codeNotMatching= tutti.service.genericFormat.import.sampleCategoryModel.error.missingCategories= diff --git a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties index 3ae7a58..cdf4a1b 100644 --- a/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties +++ b/tutti-service/src/main/resources/i18n/tutti-service_fr_FR.properties @@ -155,10 +155,10 @@ tutti.service.genericFormat.import.parameters=Import des paramètres de trait tutti.service.genericFormat.import.protocol=Import d'un nouveau protocol %s tutti.service.genericFormat.import.protocol.notValid=Import d'un nouveau protocol %s annulé (protocol non valide) tutti.service.genericFormat.import.sampleCategoryModel=Import du modèle de catégorisation -tutti.service.genericFormat.import.sampleCategoryModel.error.noCaracteristic=La catactéristique est obligatoire tutti.service.genericFormat.import.sampleCategoryModel.error.alreadyUsedCaracteristic=La catactéristique %s est déja utilisée -tutti.service.genericFormat.import.sampleCategoryModel.error.noCode=Le code est obligatoire tutti.service.genericFormat.import.sampleCategoryModel.error.alreadyUsedCode=Le code %s est déja utilisé +tutti.service.genericFormat.import.sampleCategoryModel.error.noCaracteristic=La catactéristique est obligatoire +tutti.service.genericFormat.import.sampleCategoryModel.error.noCode=Le code est obligatoire tutti.service.genericFormat.import.temporaryGears=Import des références temporaires d'engins tutti.service.genericFormat.import.temporaryPersons=Import des références temporaires de personnes tutti.service.genericFormat.import.temporarySpecies=Import des références temporaires de Taxons diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/GenericFormatImportAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/GenericFormatImportAction.java index bb50b1d..63e16ba 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/GenericFormatImportAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/genericformat/actions/GenericFormatImportAction.java @@ -28,20 +28,25 @@ import fr.ifremer.tutti.persistence.entities.data.Program; import fr.ifremer.tutti.service.genericformat.GenericFormatImportConfiguration; import fr.ifremer.tutti.service.genericformat.GenericFormatImportResult; import fr.ifremer.tutti.service.genericformat.GenericFormatImportService; -import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; +import fr.ifremer.tutti.service.genericformat.GenericFormatValidateFileResult; import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatImportUI; import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatImportUIHandler; import fr.ifremer.tutti.ui.swing.content.genericformat.GenericFormatImportUIModel; +import fr.ifremer.tutti.ui.swing.util.actions.LongActionSupport; import jaxx.runtime.SwingUtil; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.jaxx.application.swing.AbstractApplicationUIHandler; import javax.swing.Icon; import javax.swing.JLabel; +import javax.swing.JOptionPane; +import java.awt.Component; import java.io.File; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; import static org.nuiton.i18n.I18n.t; @@ -77,6 +82,9 @@ public class GenericFormatImportAction extends LongActionSupport<GenericFormatIm } + // Check if protocol already exist with same name + doAction &= acceptProtocol(); + // Do a backup before import if (doAction && !getConfig().isGenericFormatImportSkipBackup()) { @@ -120,6 +128,8 @@ public class GenericFormatImportAction extends LongActionSupport<GenericFormatIm GenericFormatImportConfiguration configuration = getModel().toImportConfiguration(); + configuration.setOverrideProtocol(overrideProtocol); + GenericFormatImportService service = getContext().getGenericFormatImportService(); boolean doBackup = !getConfig().isGenericFormatImportSkipBackup() && backupFile != null; @@ -176,6 +186,7 @@ public class GenericFormatImportAction extends LongActionSupport<GenericFormatIm public void releaseAction() { backupFile = null; importResult = null; + overrideProtocol = false; super.releaseAction(); } @@ -210,4 +221,65 @@ public class GenericFormatImportAction extends LongActionSupport<GenericFormatIm } } + + protected boolean acceptProtocol() { + + GenericFormatValidateFileResult validateResult = getModel().getValidateResult(); + + boolean withProtocolToImport = validateResult.getProtocolFileResult().isImported(); + + boolean doAction = true; + if (withProtocolToImport) { + + List<String> allProtocolNames = getContext().getPersistenceService().getAllProtocolNames(); + + String protocolOriginalName = validateResult.getProtocolOriginalName(); + + if (allProtocolNames.contains(protocolOriginalName)) { + + // Ask user what to do ? + // - generate a new name + // - delete previous protocol + // - Cancel + + String cancel = t("tutti.genericformat.protocol.action.cancel"); + String override = t("tutti.genericformat.protocol.action.override"); + String add = t("tutti.genericformat.protocol.action.add"); + + String htmlMessage = String.format( + AbstractApplicationUIHandler.CONFIRMATION_FORMAT, + t("tutti.genericformat.protocolName.conflict.message", protocolOriginalName), + t("tutti.genericformat.protocolName.conflict.help", validateResult.getProtocol().getName())); + Component ui = getDialogParentComponent(); + int response = JOptionPane.showOptionDialog( + ui, + htmlMessage, + t("tutti.genericformat.protocolName.conflict.title"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE, + null, + new String[]{add, override, cancel}, + add); + + switch (response) { + case 2: + // cancel + doAction = false; + break; + case 1: + // override + doAction = true; + overrideProtocol = true; + break; + case 0: + // add + doAction = true; + break; + } + } + } + return doAction; + } + + protected boolean overrideProtocol; } \ No newline at end of file diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties index 5cb2587..be193c4 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_en_GB.properties @@ -1496,6 +1496,12 @@ tutti.genericFormatImport.validateImport.legend= tutti.genericFormatImport.validationResult.description= tutti.genericFormatImport.validationResult.description.tip= tutti.genericFormatImport.validationResult.legend= +tutti.genericformat.protocol.action.add= +tutti.genericformat.protocol.action.cancel= +tutti.genericformat.protocol.action.override= +tutti.genericformat.protocolName.conflict.help= +tutti.genericformat.protocolName.conflict.message= +tutti.genericformat.protocolName.conflict.title= tutti.help.mkDir.error= tutti.i18n.deleteCache.error= tutti.i18n.mkDir.error= diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index c1ec889..f68ad71 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -1431,6 +1431,12 @@ tutti.genericFormatImport.validateReportFile.extension=pdf tutti.genericFormatImport.validateReportFile.extension.description=Rapport de validation (.pdf) tutti.genericFormatImport.validationResult.description=Résultat de la validation tutti.genericFormatImport.validationResult.description.tip=Résultat de la validation +tutti.genericformat.protocol.action.add=Ajouter +tutti.genericformat.protocol.action.cancel=Annuler +tutti.genericformat.protocol.action.override=Remplacer +tutti.genericformat.protocolName.conflict.help=Que voulez-vous faire ?<ul><li><strong>Annuler</strong> pour annuler l'import</li><li><strong>Remplacer</strong> pour supprimer le protocol et le remplacer par le protocole à importer</li><li><strong>Ajouter</strong> pour importer le protocole en le renommant en <i>%s</i></li></ul> +tutti.genericformat.protocolName.conflict.message=Le protocole à importer existe déjà avec le même nom (<i>%s</i>) +tutti.genericformat.protocolName.conflict.title=Conflit sur le nom du protocole à importer tutti.help.mkDir.error=Erreur à la création du dossier d'aide tutti.i18n.deleteCache.error=Erreur à la suppression du cache de l'internationalisation tutti.i18n.mkDir.error=Erreur à la création du dossier d'internationalisation -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.