This is an automated email from the git hooks/post-receive script. New commit to branch feature/6688 in repository tutti. See http://git.codelutin.com/tutti.git commit 5a199fa8fbb3ef24ede52c37b5be93001f8bf033 Author: Tony CHEMIT <chemit@codelutin.com> Date: Thu Feb 19 10:25:45 2015 +0100 improve API + persist cruises and gear caracteristics --- .../genericformat/GenericFormatImportContext.java | 96 +++++++++++++++++++- .../genericformat/GenericFormatImportService.java | 100 +++++++++++---------- .../resources/i18n/tutti-service_fr_FR.properties | 7 +- .../genericFormat/empty/gearCaracteristics.csv | 2 + .../test/resources/genericFormat/empty/survey.csv | 2 +- 5 files changed, 155 insertions(+), 52 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportContext.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportContext.java index a4f5266..a0bfceb 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportContext.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportContext.java @@ -1,8 +1,13 @@ package fr.ifremer.tutti.service.genericformat; +import fr.ifremer.tutti.persistence.ProgressionModel; import fr.ifremer.tutti.persistence.entities.data.Cruise; import fr.ifremer.tutti.persistence.entities.data.Cruises; +import fr.ifremer.tutti.persistence.entities.referential.Caracteristic; +import fr.ifremer.tutti.persistence.entities.referential.Gear; import fr.ifremer.tutti.service.PersistenceService; +import fr.ifremer.tutti.service.csv.CaracteristicValueParseException; +import fr.ifremer.tutti.service.csv.CaracteristicValueParserFormatter; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForAccidentalCatch; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForCatch; import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForGearCaracteristic; @@ -16,9 +21,13 @@ import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporaryGear import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporaryPerson; import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporarySpecies; import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporaryVessel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import java.io.Closeable; import java.io.IOException; +import java.io.Serializable; +import java.text.ParseException; /** * Created on 2/5/15. @@ -28,16 +37,25 @@ import java.io.IOException; */ public class GenericFormatImportContext implements Closeable { + /** Logger. */ + private static final Log log = LogFactory.getLog(GenericFormatImportContext.class); + private final GenericFormatImportRequest importRequest; private final GenericFormatImportResult importResult; + private final ProgressionModel progressionModel; + private final GenericFormatImportEntityParserFactory importEntityParserFactory; - public GenericFormatImportContext(GenericFormatImportRequest importRequest, PersistenceService persistenceService) { + private final GenericformatImportPersitenceHelper persitenceHelper; + + public GenericFormatImportContext(GenericFormatImportRequest importRequest, ProgressionModel progressionModel, PersistenceService persistenceService) { this.importRequest = importRequest; + this.progressionModel = progressionModel; this.importResult = new GenericFormatImportResult(importRequest); this.importEntityParserFactory = new GenericFormatImportEntityParserFactory(persistenceService, importRequest, importResult); + this.persitenceHelper = new GenericformatImportPersitenceHelper(this, persistenceService); } public GenericFormatImportRequest getImportRequest() { @@ -56,7 +74,7 @@ public class GenericFormatImportContext implements Closeable { } - public boolean isCruiseExists(Cruise cruise) { + public boolean isCruiseAlreadyExists(Cruise cruise) { boolean equals = false; for (Cruise existingCruise : importRequest.getExistingCruises()) { @@ -71,6 +89,54 @@ public class GenericFormatImportContext implements Closeable { } + public boolean isCruiseAlreadyImported(Cruise cruise) { + + boolean equals = false; + for (Cruise existingCruise : importResult.getImportedCruises()) { + + equals = Cruises.equals(cruise, existingCruise); + if (equals) { + break; + } + + } + return equals; + + } + + public Cruise getImportedCruise(Cruise importRowCruise) { + + Cruise result = null; + for (Cruise importedCruise : importResult.getImportedCruises()) { + + boolean equals = Cruises.equals(importRowCruise, importedCruise); + if (equals) { + result = importedCruise; + break; + } + + } + return result; + + } + + public Gear getGear(Cruise cruise, Gear gear, int rankOrder) { + + Gear result = null; + + int index = rankOrder - 1; + boolean gearExists = cruise.sizeGear() > index; + if (gearExists) { + Gear cruiseGear = cruise.getGear(index); + gearExists = cruiseGear.getId().equals(gear.getId()); + if (gearExists) { + result = cruiseGear; + } + } + return result; + + } + public CsvConsumerForSampleCategory loadSampleCategories() { CsvConsumerForSampleCategory consumer = new CsvConsumerForSampleCategory(importRequest.getArchive().getSampleCategoryModelPath(), importRequest.getCsvSeparator(), importEntityParserFactory); return consumer; @@ -136,4 +202,30 @@ public class GenericFormatImportContext implements Closeable { return consumer; } + public Serializable parseCaracteristicValue(Caracteristic caracteristic, String value) throws CaracteristicValueParseException { + + CaracteristicValueParserFormatter parser = CaracteristicValueParserFormatter.newParser(caracteristic); + try { + + Serializable caracteristicValue = parser.parse(value); + return caracteristicValue; + + } catch (ParseException e) { + throw new CaracteristicValueParseException(caracteristic, value, e.getMessage()); + } + + } + + public void increments(String message) { + if (progressionModel != null) { + progressionModel.increments(message); + } + if (log.isInfoEnabled()) { + log.info(message); + } + } + + public GenericformatImportPersitenceHelper getPersitenceHelper() { + return persitenceHelper; + } } diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java index f0d8d22..720a70e 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/genericformat/GenericFormatImportService.java @@ -147,25 +147,25 @@ public class GenericFormatImportService extends AbstractTuttiService { program, context.getSampleCategoryModel()); - try (GenericFormatImportContext importContext = new GenericFormatImportContext(request, persistenceService)) { + try (GenericFormatImportContext importContext = new GenericFormatImportContext(request, progressionModel, persistenceService)) { GenericFormatImportResult result = new GenericFormatImportResult(request); - checkSampleCategoryModel(importContext, progressionModel); - importTemporaryGears(importContext, progressionModel); - importTemporaryPersons(importContext, progressionModel); - importTemporarySpecies(importContext, progressionModel); - importTemporaryVessels(importContext, progressionModel); - importProtocol(importContext, progressionModel); - - importCruises(importContext, progressionModel); - importGearCaracteristics(importContext, progressionModel); - importOperations(importContext, progressionModel); - importParameters(importContext, progressionModel); - importCatches(importContext, progressionModel); - importMarineLitters(importContext, progressionModel); - importIndividualObservations(importContext, progressionModel); - importAccidentalCatches(importContext, progressionModel); + checkSampleCategoryModel(importContext); + importTemporaryGears(importContext); + importTemporaryPersons(importContext); + importTemporarySpecies(importContext); + importTemporaryVessels(importContext); + importProtocol(importContext); + + importCruises(importContext); + importGearCaracteristics(importContext); + importOperations(importContext); + importParameters(importContext); + importCatches(importContext); + importMarineLitters(importContext); + importIndividualObservations(importContext); + importAccidentalCatches(importContext); return result; @@ -175,13 +175,13 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void checkSampleCategoryModel(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void checkSampleCategoryModel(GenericFormatImportContext importContext) { if (log.isInfoEnabled()) { log.info("Import sample category model."); } - progressionModel.increments(t("tutti.genericFormat.import.sampleCategoryModel")); + importContext.increments(t("tutti.genericFormat.import.sampleCategoryModel")); try (CsvConsumerForSampleCategory consumer = importContext.loadSampleCategories()) { int nbCategories = 0; @@ -202,9 +202,9 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importTemporaryGears(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importTemporaryGears(GenericFormatImportContext importContext) { - progressionModel.increments(t("tutti.genericFormat.import.temporaryGears")); + importContext.increments(t("tutti.genericFormat.import.temporaryGears")); GenericFormatArchive archive = importContext.getImportRequest().getArchive(); if (archive.isTemporaryReferentialGearsPathExists()) { @@ -241,9 +241,9 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importTemporaryPersons(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importTemporaryPersons(GenericFormatImportContext importContext) { - progressionModel.increments(t("tutti.genericFormat.import.temporaryPersons")); + importContext.increments(t("tutti.genericFormat.import.temporaryPersons")); GenericFormatArchive archive = importContext.getImportRequest().getArchive(); if (archive.isTemporaryReferentialPersonsPathExists()) { @@ -280,9 +280,9 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importTemporarySpecies(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importTemporarySpecies(GenericFormatImportContext importContext) { - progressionModel.increments(t("tutti.genericFormat.import.temporarySpecies")); + importContext.increments(t("tutti.genericFormat.import.temporarySpecies")); GenericFormatArchive archive = importContext.getImportRequest().getArchive(); if (archive.isTemporaryReferentialSpeciesPathExists()) { @@ -319,9 +319,9 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importTemporaryVessels(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importTemporaryVessels(GenericFormatImportContext importContext) { - progressionModel.increments(t("tutti.genericFormat.import.temporaryVessels")); + importContext.increments(t("tutti.genericFormat.import.temporaryVessels")); GenericFormatArchive archive = importContext.getImportRequest().getArchive(); if (archive.isTemporaryReferentialVesselsPathExists()) { @@ -359,9 +359,9 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importProtocol(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importProtocol(GenericFormatImportContext importContext) { - progressionModel.increments(t("tutti.genericFormat.load.protocol")); + importContext.increments(t("tutti.genericFormat.load.protocol")); GenericFormatArchive archive = importContext.getImportRequest().getArchive(); if (archive.isProtocolExists()) { @@ -377,7 +377,7 @@ public class GenericFormatImportService extends AbstractTuttiService { String newName = persistenceService.getFirstAvailableName(tuttiProtocol.getName()); tuttiProtocol.setName(newName); - progressionModel.increments(t("tutti.genericFormat.import.protocol", tuttiProtocol.getName())); + importContext.increments(t("tutti.genericFormat.import.protocol", tuttiProtocol.getName())); tuttiProtocol = persistenceService.createProtocol(tuttiProtocol); persistenceService.setProtocol(tuttiProtocol); @@ -393,21 +393,21 @@ public class GenericFormatImportService extends AbstractTuttiService { } } - protected void importCruises(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importCruises(GenericFormatImportContext importContext) { if (log.isInfoEnabled()) { log.info("Import survey.csv file."); } - progressionModel.increments(t("tutti.genericFormat.import.cruises")); + importContext.increments(t("tutti.genericFormat.import.cruises")); try (CsvConsumerForSurvey consumer = importContext.loadSurveys()) { for (ImportRow<SurveyRow> row : consumer) { consumer.checkRow(row, importContext, validationService); - if (log.isInfoEnabled()) { - log.info("Will persist cruise: " + row.getBean().getName()); - } + consumer.prepareRowForPersist(row); + + importContext.getPersitenceHelper().persistCruise(row.getBean().getCruise()); } } catch (IOException e) { @@ -416,31 +416,35 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importGearCaracteristics(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importGearCaracteristics(GenericFormatImportContext importContext) { if (log.isInfoEnabled()) { log.info("Import gearCaracteristics.csv file."); } - progressionModel.increments(t("tutti.genericFormat.import.gearCaracteristics")); + importContext.increments(t("tutti.genericFormat.import.gearCaracteristics")); try (CsvConsumerForGearCaracteristic consumer = importContext.loadGearCaracteristics()) { for (ImportRow<GearCaracteristicRow> row : consumer) { consumer.checkRow(row, importContext); + consumer.prepareRowForPersist(row); + } } catch (IOException e) { throw new ApplicationTechnicalException("Could not close gearCaracteristic.csv file", e); } + importContext.getPersitenceHelper().persistGearCaracteristics(); + } - protected void importOperations(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importOperations(GenericFormatImportContext importContext) { if (log.isInfoEnabled()) { log.info("Import operation.csv file."); } - progressionModel.increments(t("tutti.genericFormat.import.operations")); + importContext.increments(t("tutti.genericFormat.import.operations")); try (CsvConsumerForOperation consumer = importContext.loadOperations()) { for (ImportRow<OperationRow> row : consumer) { @@ -454,12 +458,12 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importParameters(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importParameters(GenericFormatImportContext importContext) { if (log.isInfoEnabled()) { log.info("Import parameter.csv file."); } - progressionModel.increments(t("tutti.genericFormat.import.parameters")); + importContext.increments(t("tutti.genericFormat.import.parameters")); try (CsvConsumerForParameter consumer = importContext.loadParameters()) { for (ImportRow<ParameterRow> row : consumer) { @@ -473,12 +477,12 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importCatches(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importCatches(GenericFormatImportContext importContext) { if (log.isInfoEnabled()) { log.info("Import catch.csv file."); } - progressionModel.increments(t("tutti.genericFormat.import.catches")); + importContext.increments(t("tutti.genericFormat.import.catches")); try (CsvConsumerForCatch consumer = importContext.loadCatches()) { for (ImportRow<CatchRow> row : consumer) { @@ -492,12 +496,12 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importAccidentalCatches(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importAccidentalCatches(GenericFormatImportContext importContext) { if (log.isInfoEnabled()) { log.info("Import accidentalCatch.csv file."); } - progressionModel.increments(t("tutti.genericFormat.import.accidentalCatches")); + importContext.increments(t("tutti.genericFormat.import.accidentalCatches")); try (CsvConsumerForAccidentalCatch consumer = importContext.loadAccidentalCatches()) { for (ImportRow<AccidentalCatchRow> row : consumer) { @@ -511,12 +515,12 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importIndividualObservations(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importIndividualObservations(GenericFormatImportContext importContext) { if (log.isInfoEnabled()) { log.info("Import individualObservation.csv file."); } - progressionModel.increments(t("tutti.genericFormat.import.individualObservations")); + importContext.increments(t("tutti.genericFormat.import.individualObservations")); try (CsvConsumerForIndividualObservation consumer = importContext.loadIndividualObservations()) { for (ImportRow<IndividualObservationRow> row : consumer) { @@ -530,12 +534,12 @@ public class GenericFormatImportService extends AbstractTuttiService { } - protected void importMarineLitters(GenericFormatImportContext importContext, ProgressionModel progressionModel) { + protected void importMarineLitters(GenericFormatImportContext importContext) { if (log.isInfoEnabled()) { log.info("Import marineLitter.csv file."); } - progressionModel.increments(t("tutti.genericFormat.import.marineLitters")); + importContext.increments(t("tutti.genericFormat.import.marineLitters")); try (CsvConsumerForMarineLitter consumer = importContext.loadMarineLitters()) { for (ImportRow<MarineLitterRow> row : consumer) { 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 5763fbe..cb5c8ee 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 @@ -11,13 +11,18 @@ tutti.genericFormat.import.accidentalCatches=Import des captures accidentelles tutti.genericFormat.import.catches=Import des captures tutti.genericFormat.import.cruises=Import des campagnes tutti.genericFormat.import.error.cruiseAlreadyExist=Il existe déjà une campagne avec ce nom %s -tutti.genericFormat.import.error.cruiseNotValid=La camapgne n'est pas valide \:\n%s +tutti.genericFormat.import.error.cruiseAlreadyImported=La campagne avec ce nom %s a déjà été importée +tutti.genericFormat.import.error.cruiseNotFound=La campagne (année: %s, série: %s, série partielle %s) n'existe pas +tutti.genericFormat.import.error.gearNotFoundInCruise=L'engin %s (position %s) non trouvé dans la campagne (année: %s, série: %s, série partielle %s) +tutti.genericFormat.import.error.cruiseNotValid=La campagne n'est pas valide \:\n%s tutti.genericFormat.import.gearCaracteristics=Import des caractéristiques d'engin tutti.genericFormat.import.individualObservations=Import des observations individuelles tutti.genericFormat.import.marineLitters=Import des macro-déchets tutti.genericFormat.import.operations=Import des traits tutti.genericFormat.import.parameters=Import des paramètres de trait tutti.genericFormat.import.protocol=Import d'un nouveau protocol %s +tutti.service.csv.parse.qualitativeValueError=La valeur %s de la caractéristique %s n'est pas valide: %s +tutti.service.csv.caracteristic.qualitativeValue.notFound=La caractéristique qualitative %s n'a pas de value d'id %s tutti.genericFormat.import.sampleCategoryModel=Import du modèle de catégorisation tutti.genericFormat.import.sampleCategoryModel.error.caracteristicNotMatching=L'identifiant de la caractéristique devrait être %s, mais vaut %s tutti.genericFormat.import.sampleCategoryModel.error.codeNotMatching=Le code devrait être %s, mais vaut %s diff --git a/tutti-service/src/test/resources/genericFormat/empty/gearCaracteristics.csv b/tutti-service/src/test/resources/genericFormat/empty/gearCaracteristics.csv index 3256fe9..a150b41 100644 --- a/tutti-service/src/test/resources/genericFormat/empty/gearCaracteristics.csv +++ b/tutti-service/src/test/resources/genericFormat/empty/gearCaracteristics.csv @@ -1 +1,3 @@ Annee;Serie;Serie_Partielle;Engin;Rang_Engin;Code_PMFM;Libelle_PMFM;Valeur;Serie_Id;Engin_Id;Valeur_Id +2014;Campagne EVHOE;1;Dragues à main manoeuvrées à partir du bateau;3;1391;Accessibilité au poisson - enquête - totale - Observation par un observateur;Bonne;CAM-EVHOE;64;1752 +2014;Campagne EVHOE;1;Dragues à main manoeuvrées à partir du bateau;3;46;Algorithme de déterminaison - marée - totale - Estimation algorithme SACROIS;3a - N VMS - 1 LB (VMS validées);CAM-EVHOE;64;172 \ No newline at end of file diff --git a/tutti-service/src/test/resources/genericFormat/empty/survey.csv b/tutti-service/src/test/resources/genericFormat/empty/survey.csv index 7038273..5b15941 100644 --- a/tutti-service/src/test/resources/genericFormat/empty/survey.csv +++ b/tutti-service/src/test/resources/genericFormat/empty/survey.csv @@ -1,2 +1,2 @@ Annee;Serie;Serie_Partielle;Navire;Nombre_Poches;Pays;Zone_Etude;Campagne;Id_Sismer;Date_Deb_Campagne;Port_Deb_Campagne;Date_Fin_Campagne;Port_Fin_Campagne;Chef_Mission;Resp_Salle_Tri;Commentaire;Serie_Id;Navire_Id;Engin_Id;Port_Deb_Campagne_Id;Port_Fin_Campagne_Id;Chef_Mission_Id;Resp_Salle_Tri_Id -2014;Campagne EVHOE;1;868095;1;FRA;EVHOE - Golfe de Gascogne / Mer Celtique;Campagne EVHOE 2014;;17/10/2014 07:00:00;Brest;01/12/2014 07:00:00;Brest;Jean-Pierre LEAUTE|Michele SALAUN|Lionel PAWLOWSKI;Erwan DUHAMEL|Nicolas CAROFF;;CAM-CGFS;868095;1|4;530;530;143|70|2332;128|59 +2014;Campagne EVHOE;1;868095;1;FRA;EVHOE - Golfe de Gascogne / Mer Celtique;Campagne EVHOE 2014;;17/10/2014 07:00:00;Brest;01/12/2014 07:00:00;Brest;Jean-Pierre LEAUTE|Michele SALAUN|Lionel PAWLOWSKI;Erwan DUHAMEL|Nicolas CAROFF;;CAM-EVHOE;868095;379|381|64;530;530;143|70|2332;128|59 -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.