1 package fr.ifremer.tutti.service.genericformat.importactions;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
52
53
54
55
56 public class ValidateIndividualObservationAction extends ImportActionSupport {
57
58
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 }