View Javadoc
1   package fr.ifremer.tutti.service.genericformat.importactions;
2   
3   /*
4    * #%L
5    * Tutti :: Service
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2012 - 2015 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU General Public License as
13   * published by the Free Software Foundation, either version 3 of the
14   * License, or (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU General Public
22   * License along with this program.  If not, see
23   * <http://www.gnu.org/licenses/gpl-3.0.html>.
24   * #L%
25   */
26  
27  import com.google.common.collect.ImmutableList;
28  import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
29  import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode;
30  import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch;
31  import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
32  import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
33  import fr.ifremer.tutti.service.genericformat.GenericFormatContextSupport;
34  import fr.ifremer.tutti.service.genericformat.GenericFormatCsvFileResult;
35  import fr.ifremer.tutti.service.genericformat.GenericFormatImportOperationContext;
36  import fr.ifremer.tutti.service.genericformat.GenericformatImportPersistenceHelper;
37  import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForIndividualObservation;
38  import fr.ifremer.tutti.service.genericformat.csv.IndividualObservationRow;
39  import org.apache.commons.logging.Log;
40  import org.apache.commons.logging.LogFactory;
41  import org.nuiton.csv.ImportRow;
42  import org.nuiton.csv.ImportRuntimeException;
43  import org.nuiton.jaxx.application.ApplicationTechnicalException;
44  
45  import java.io.IOException;
46  import java.util.Objects;
47  
48  import static org.nuiton.i18n.I18n.t;
49  
50  /**
51   * Created on 3/3/15.
52   *
53   * @author Tony Chemit - chemit@codelutin.com
54   * @since 3.14
55   */
56  public class ValidateIndividualObservationAction extends ImportActionSupport {
57  
58      /** Logger. */
59      private static final Log log = LogFactory.getLog(ValidateIndividualObservationAction.class);
60  
61      private final GenericformatImportPersistenceHelper persitenceHelper;
62  
63      public ValidateIndividualObservationAction(GenericFormatContextSupport importContext,
64                                                 GenericformatImportPersistenceHelper persitenceHelper) {
65          super(importContext);
66          this.persitenceHelper = persitenceHelper;
67      }
68  
69      @Override
70      protected boolean canExecute() {
71          return importContext.isTechnicalFilesValid() && importContext.getOperationFileResult().isValid();
72      }
73  
74      @Override
75      protected void doExecute() {
76  
77          if (log.isInfoEnabled()) {
78              log.info("Validate individualObservation.csv file.");
79          }
80  
81          int maximumRowsInErrorPerFile = importContext.getImportRequest().getMaximumRowsInErrorPerFile();
82  
83          GenericFormatCsvFileResult importFileResult = importContext.getIndividualObservationFileResult();
84          try (CsvConsumerForIndividualObservation consumer = importContext.loadIndividualObservations(false)) {
85  
86              for (ImportRow<IndividualObservationRow> row : consumer) {
87  
88                  importContext.increments(t("tutti.service.genericFormat.validate.individualObservations", row.getLineNumber()));
89  
90                  GenericFormatImportOperationContext operationContext = consumer.validateRow(row, importContext);
91  
92                  if (operationContext != null) {
93                      consumer.prepareRowForPersist(operationContext, row);
94                  }
95  
96                  if (consumer.getNbRowsInErrors() > maximumRowsInErrorPerFile) {
97                      if (log.isWarnEnabled()) {
98                          log.warn("Too much errors, stop validating this file.");
99                      }
100                     break;
101                 }
102 
103             }
104 
105             flushConsumer(consumer, importFileResult);
106 
107         } catch (IOException e) {
108             throw new ApplicationTechnicalException("Could not close individualObservation.csv file", e);
109         } catch (ImportRuntimeException e) {
110 
111             importFileResult.addGlobalError(e.getMessage());
112 
113         }
114 
115         importContext.doActionOnCruiseContexts((cruiseContext, progressionModel) -> {
116 
117             for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext) {
118 
119                 String cruiseStr = cruiseContext.getCruiseLabel();
120                 String operationStr = fishingOperationContext.getFishingOperationLabel();
121 
122                 if (fishingOperationContext.withIndividualObservationBatches()) {
123 
124                     ImmutableList<IndividualObservationBatch> individualObservationBatches = fishingOperationContext.getIndividualObservationBatches();
125 
126                     if (log.isInfoEnabled()) {
127                         log.info("Check " + individualObservationBatches.size() + " individual observation(s) of " + operationStr + " for cruise: " + cruiseStr);
128                     }
129                     prepareIndividualObservationsForPersist(persitenceHelper, individualObservationBatches);
130 
131                 }
132 
133             }
134 
135         });
136 
137     }
138 
139     public static void prepareIndividualObservationsForPersist(GenericformatImportPersistenceHelper persistenceHelper,
140                                                                ImmutableList<IndividualObservationBatch> individualObservations) {
141 
142         for (IndividualObservationBatch individualObservation : individualObservations) {
143 
144             CaracteristicMap caracteristics = individualObservation.getCaracteristics();
145 
146             CaracteristicQualitativeValue copyModeCaracteristic = caracteristics.removeQualitativeValue(persistenceHelper.getCopyIndividualObservationModeCaracteristic());
147             Objects.requireNonNull(copyModeCaracteristic, "No copy mode found for individual observation: " + individualObservation.getId());
148             CopyIndividualObservationMode copyMode = CopyIndividualObservationMode.valueOf(copyModeCaracteristic.getIdAsInt());
149             individualObservation.setCopyIndividualObservationMode(copyMode);
150 
151             String lengthClassId = caracteristics.removeStringValue(persistenceHelper.getPmfmIdCaracteristic());
152             Objects.requireNonNull(lengthClassId, "No lengthClassId found for individual observation: " + individualObservation.getId());
153 
154             Caracteristic lengthStepCaracteristic = persistenceHelper.getCaracteristic(Integer.valueOf(lengthClassId));
155             Objects.requireNonNull(lengthStepCaracteristic, "lengthStepCaracteristic " + lengthClassId + " does not exist.");
156             individualObservation.setLengthStepCaracteristic(lengthStepCaracteristic);
157 
158             Float length = caracteristics.removeFloatValue(lengthStepCaracteristic);
159             individualObservation.setSize(length);
160 
161             Float weigth = caracteristics.removeFloatValue(persistenceHelper.getWeightMeasuredCaracteristic());
162             individualObservation.setWeight(weigth);
163 
164             String samplingCode = caracteristics.removeStringValue(persistenceHelper.getSampleCodeCaracteristic());
165             individualObservation.setSamplingCode(samplingCode);
166 
167         }
168 
169     }
170 
171 }