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.base.Preconditions;
28 import fr.ifremer.adagio.core.dao.referential.ObjectTypeCode;
29 import fr.ifremer.tutti.persistence.entities.TuttiEntities;
30 import fr.ifremer.tutti.persistence.entities.data.Cruise;
31 import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
32 import fr.ifremer.tutti.persistence.model.CruiseDataModel;
33 import fr.ifremer.tutti.service.genericformat.GenericFormatCsvFileResult;
34 import fr.ifremer.tutti.service.genericformat.GenericFormatImportContext;
35 import fr.ifremer.tutti.service.genericformat.GenericformatImportPersistenceHelper;
36 import fr.ifremer.tutti.service.genericformat.consumer.CsvConsumerForSurvey;
37 import fr.ifremer.tutti.service.genericformat.csv.AttachmentRow;
38 import fr.ifremer.tutti.service.genericformat.csv.SurveyRow;
39 import org.apache.commons.collections4.CollectionUtils;
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.Set;
49
50 import static org.nuiton.i18n.I18n.t;
51
52
53
54
55
56
57
58 public class ImportSurveyAction extends ImportActionSupport {
59
60
61 private static final Log log = LogFactory.getLog(ImportSurveyAction.class);
62
63 private final GenericformatImportPersistenceHelper persistenceHelper;
64
65 public ImportSurveyAction(GenericFormatImportContext importContext, GenericformatImportPersistenceHelper persistenceHelper) {
66 super(importContext);
67 this.persistenceHelper = persistenceHelper;
68 }
69
70 @Override
71 protected boolean canExecute() {
72 return importContext.isTechnicalFilesValid();
73 }
74
75 @Override
76 protected void skipExecute() {
77 importContext.increments(t("tutti.service.genericFormat.skip.import.cruises"));
78 }
79
80 @Override
81 protected void doExecute() {
82
83 if (log.isInfoEnabled()) {
84 log.info("Import survey.csv file.");
85 }
86 importContext.increments(t("tutti.service.genericFormat.import.cruises"));
87
88 GenericFormatCsvFileResult importFileResult = importContext.getSurveyFileResult();
89 try (CsvConsumerForSurvey consumer = importContext.loadSurveys(true)) {
90 for (ImportRow<SurveyRow> row : consumer) {
91
92 consumer.validateRow(row, importContext);
93
94 consumer.prepareRowForPersist(row);
95
96 SurveyRow bean = row.getBean();
97 Cruise cruise = bean.getCruise();
98
99 Collection<AttachmentRow> attachmentRows = importContext.popAttachmentRows(ObjectTypeCode.SCIENTIFIC_CRUISE, bean.getObjectId());
100
101 CruiseDataModel selectionCruiseData = importContext.getImportRequest().getSelectedCruise(cruise);
102
103 if (selectionCruiseData == null) {
104
105
106 skipCruise(cruise);
107
108 } else {
109
110
111 processCruise(cruise, attachmentRows, selectionCruiseData);
112
113 }
114
115 }
116 } catch (IOException e) {
117 throw new ApplicationTechnicalException("Could not close survey.csv file", e);
118 } catch (ImportRuntimeException e) {
119
120 importFileResult.addGlobalError(e.getMessage());
121
122 }
123
124 }
125
126 protected void skipCruise(Cruise cruise) {
127
128 String cruiseStr = importContext.decorate(cruise);
129 importContext.increments(t("tutti.service.genericFormat.persist.skipNotSelected.cruise", cruiseStr));
130 importContext.addSkippedCruise(cruise);
131
132 }
133
134 protected void processCruise(Cruise cruise, Collection<AttachmentRow> attachmentRows, CruiseDataModel selectionCruiseData) {
135
136 String cruiseStr = importContext.decorate(cruise);
137
138 CruiseDataModel existingCruiseData = importContext.getImportRequest().getExistingCruiseData(cruise);
139
140 Set<FishingOperation> existingFishingOperations;
141
142 Cruise savedCruise;
143
144 if (existingCruiseData == null) {
145
146
147 importContext.increments(t("tutti.service.genericFormat.persist.create.cruise", cruiseStr));
148 savedCruise = addCruise(cruise, attachmentRows);
149
150 existingFishingOperations = null;
151
152 } else {
153
154
155
156 if (importContext.getImportRequest().isUpdateCruises()) {
157
158
159 importContext.increments(t("tutti.service.genericFormat.persist.update.cruise", cruiseStr));
160 savedCruise = updateCruise(cruise, attachmentRows);
161
162 } else {
163
164
165 importContext.increments(t("tutti.service.genericFormat.persist.skip.cruise", cruiseStr));
166 savedCruise = cruise;
167
168 }
169
170 existingFishingOperations = persistenceHelper.getFishingOperations(existingCruiseData.getIdAsInt());
171
172 }
173
174 importContext.addImportedCruise(savedCruise, selectionCruiseData, existingCruiseData, existingFishingOperations);
175
176 }
177
178 public Cruise addCruise(Cruise cruise, Collection<AttachmentRow> attachmentRows) {
179
180 String cruiseStr = importContext.decorate(cruise);
181
182 boolean createCruise = TuttiEntities.isNew(cruise);
183 Preconditions.checkState(createCruise, "In addCruise method, can't update existing cruise: " + cruiseStr);
184
185 if (log.isInfoEnabled()) {
186 log.info("Create cruise: " + cruiseStr);
187 }
188
189
190 Cruise savedCruise = persistenceHelper.createCruise(cruise);
191
192 boolean importAttachments = importContext.getImportRequest().isImportAttachments();
193
194 if (importAttachments) {
195
196 if (CollectionUtils.isNotEmpty(attachmentRows)) {
197 persistenceHelper. persistAttachments(savedCruise.getIdAsInt(), attachmentRows);
198 }
199
200 }
201
202 return savedCruise;
203
204 }
205
206 public Cruise updateCruise(Cruise cruise, Collection<AttachmentRow> attachmentRows) {
207
208 String cruiseStr = importContext.decorate(cruise);
209
210 boolean createCruise = TuttiEntities.isNew(cruise);
211 Preconditions.checkState(!createCruise, "In updateCruise method, can't create new cruise: " + cruiseStr);
212 Preconditions.checkState(importContext.getImportRequest().isUpdateCruises(), "In updateCruise method, must be allowed to update cruise: " + cruiseStr);
213
214 if (log.isInfoEnabled()) {
215 log.info("Update existing cruise: " + cruiseStr);
216 }
217
218 Cruise savedCruise = persistenceHelper.saveCruise(cruise);
219
220 boolean importAttachments = importContext.getImportRequest().isImportAttachments();
221
222 if (importAttachments) {
223
224
225 persistenceHelper.deleteAllAttachments(ObjectTypeCode.SCIENTIFIC_CRUISE, cruise.getIdAsInt());
226
227 persistenceHelper.persistAttachments(savedCruise.getIdAsInt(), attachmentRows);
228
229 }
230
231 return savedCruise;
232
233 }
234
235 }