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.adagio.core.dao.referential.ObjectTypeCode;
29 import fr.ifremer.tutti.persistence.ProgressionModel;
30 import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
31 import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch;
32 import fr.ifremer.tutti.service.genericformat.GenericFormatCsvFileResult;
33 import fr.ifremer.tutti.service.genericformat.GenericFormatImportContext;
34 import fr.ifremer.tutti.service.genericformat.GenericFormatImportCruiseContext;
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.AttachmentRow;
39 import fr.ifremer.tutti.service.genericformat.csv.IndividualObservationRow;
40 import org.apache.commons.logging.Log;
41 import org.apache.commons.logging.LogFactory;
42 import org.nuiton.csv.ImportRow;
43 import org.nuiton.csv.ImportRuntimeException;
44 import org.nuiton.jaxx.application.ApplicationTechnicalException;
45
46 import java.io.IOException;
47 import java.util.Collection;
48 import java.util.List;
49 import java.util.Objects;
50
51 import static org.nuiton.i18n.I18n.t;
52
53
54
55
56
57
58
59 public class ImportIndividualObservationAction extends ImportActionSupport {
60
61
62 private static final Log log = LogFactory.getLog(ImportIndividualObservationAction.class);
63
64 private final GenericformatImportPersistenceHelper persistenceHelper;
65
66 public ImportIndividualObservationAction(GenericFormatImportContext importContext, GenericformatImportPersistenceHelper persistenceHelper) {
67 super(importContext);
68 this.persistenceHelper = persistenceHelper;
69 }
70
71 @Override
72 protected boolean canExecute() {
73 return importContext.isTechnicalFilesValid()
74 && importContext.getSurveyFileResult().isValid()
75 && importContext.getOperationFileResult().isValid()
76 && importContext.getImportRequest().isImportIndividualObservation();
77 }
78
79 @Override
80 protected void skipExecute() {
81
82 importContext.increments(t("tutti.service.genericFormat.skip.import.individualObservations"));
83
84 if (!importContext.getImportRequest().isImportIndividualObservation()) {
85 GenericFormatCsvFileResult importFileResult = importContext.getIndividualObservationFileResult();
86 importFileResult.setSkipped(true);
87 }
88
89 }
90
91 @Override
92 protected void doExecute() {
93
94 if (log.isInfoEnabled()) {
95 log.info("Import individualObservation.csv file.");
96 }
97 importContext.increments(t("tutti.service.genericFormat.import.individualObservations"));
98 GenericFormatCsvFileResult importFileResult = importContext.getIndividualObservationFileResult();
99 try (CsvConsumerForIndividualObservation consumer = importContext.loadIndividualObservations(true)) {
100
101 for (ImportRow<IndividualObservationRow> row : consumer) {
102
103 GenericFormatImportOperationContext operationContext = consumer.validateRow(row, importContext);
104 if (operationContext != null) {
105 consumer.prepareRowForPersist(operationContext, row);
106 }
107
108 }
109
110 } catch (IOException e) {
111 throw new ApplicationTechnicalException("Could not close individualObservation.csv file", e);
112 } catch (ImportRuntimeException e) {
113
114 importFileResult.addGlobalError(e.getMessage());
115
116 }
117
118 persistIndividualObservationBatches();
119
120 }
121
122 private void persistIndividualObservationBatches() {
123
124 importContext.doActionOnCruiseContexts(new GenericFormatImportContext.CruiseContextAction() {
125
126 @Override
127 public void onCruise(GenericFormatImportCruiseContext cruiseContext, ProgressionModel progressionModel) {
128
129 for (GenericFormatImportOperationContext fishingOperationContext : cruiseContext) {
130
131 boolean override = fishingOperationContext.isOverride();
132
133 if (override) {
134
135 deleteIndividualObservationBatches(fishingOperationContext);
136
137 }
138
139 String cruiseStr = cruiseContext.getCruiseLabel();
140 String operationStr = fishingOperationContext.getFishingOperationLabel();
141
142 importContext.increments(t("tutti.service.genericFormat.persist.operation.individualObservations", cruiseStr, operationStr));
143
144 if (fishingOperationContext.withIndividualObservationBatches()) {
145
146 ImmutableList<IndividualObservationBatch> individualObservationBatches = fishingOperationContext.getIndividualObservationBatches();
147
148 if (log.isInfoEnabled()) {
149 log.info("Check " + individualObservationBatches.size() + " individual observation(s) of " + operationStr + " for cruise: " + cruiseStr);
150 }
151 ValidateIndividualObservationAction.prepareIndividualObservationsForPersist(persistenceHelper, individualObservationBatches);
152
153 if (log.isInfoEnabled()) {
154 log.info("Persist " + individualObservationBatches.size() + " individual observation(s) of " + operationStr + " for cruise: " + cruiseStr);
155 }
156 persistIndividualObservationBatches(fishingOperationContext, individualObservationBatches);
157
158 }
159
160 }
161
162 }
163
164 private void deleteIndividualObservationBatches(GenericFormatImportOperationContext fishingOperationContext) {
165
166 FishingOperation fishingOperation = fishingOperationContext.getFishingOperation();
167 persistenceHelper.deleteIndividualObservationBatchForFishingOperation(fishingOperation.getIdAsInt());
168
169 }
170
171 private void persistIndividualObservationBatches(GenericFormatImportOperationContext fishingOperationContext, ImmutableList<IndividualObservationBatch> batches) {
172
173 for (IndividualObservationBatch individualObservation : batches) {
174
175 Integer batchId = individualObservation.getBatchId();
176 Integer speciesBatchId = fishingOperationContext.getSpeciesBatchId(batchId);
177 Objects.requireNonNull(speciesBatchId, "Persisted Species batch id not found for import species batch id: " + batchId);
178 individualObservation.setBatchId(speciesBatchId);
179
180 }
181
182
183
184 ImmutableList.Builder<Integer> idsBuilder = ImmutableList.builder();
185 batches.forEach(batch -> idsBuilder.add(batch.getIdAsInt()));
186 ImmutableList<Integer> importIds = idsBuilder.build();
187
188
189 batches.forEach(batch -> batch.setId((String) null));
190
191 FishingOperation fishingOperation = fishingOperationContext.getFishingOperation();
192
193 List<IndividualObservationBatch> savedBatches = persistenceHelper.createIndividualObservationBatch(fishingOperation, batches);
194
195
196 int index = 0;
197 for (IndividualObservationBatch savedBatch : savedBatches) {
198 Integer importId = importIds.get(index++);
199
200 Collection<AttachmentRow> attachmentRows = importContext.popAttachmentRows(ObjectTypeCode.SAMPLE, importId);
201 persistenceHelper.persistAttachments(savedBatch.getIdAsInt(), attachmentRows);
202 }
203
204 }
205
206 });
207
208 }
209
210 }