1 package fr.ifremer.tutti.service.genericformat;
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 com.google.common.collect.Sets;
29 import fr.ifremer.tutti.persistence.ProgressionModel;
30 import fr.ifremer.tutti.persistence.entities.data.Cruise;
31 import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
32 import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel;
33 import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
34 import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
35 import fr.ifremer.tutti.persistence.entities.referential.Species;
36 import fr.ifremer.tutti.persistence.entities.referential.Speciess;
37 import fr.ifremer.tutti.persistence.model.ProgramDataModel;
38 import fr.ifremer.tutti.service.PersistenceService;
39 import fr.ifremer.tutti.service.catches.WeightComputingService;
40 import fr.ifremer.tutti.service.csv.CsvProducer;
41 import fr.ifremer.tutti.service.genericformat.csv.AccidentalCatchModel;
42 import fr.ifremer.tutti.service.genericformat.csv.AttachmentModel;
43 import fr.ifremer.tutti.service.genericformat.csv.CatchModel;
44 import fr.ifremer.tutti.service.genericformat.csv.GearCaracteristicModel;
45 import fr.ifremer.tutti.service.genericformat.csv.IndividualObservationModel;
46 import fr.ifremer.tutti.service.genericformat.csv.MarineLitterModel;
47 import fr.ifremer.tutti.service.genericformat.csv.OperationModel;
48 import fr.ifremer.tutti.service.genericformat.csv.ParameterModel;
49 import fr.ifremer.tutti.service.genericformat.csv.SpeciesExportModel;
50 import fr.ifremer.tutti.service.genericformat.csv.SurveyModel;
51 import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForAccidentalCatch;
52 import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForAttachment;
53 import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForCatch;
54 import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForGearCaracteristics;
55 import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForIndividualObservation;
56 import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForMarineLitter;
57 import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForOperation;
58 import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForParameter;
59 import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForSampleCategory;
60 import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForSpecies;
61 import fr.ifremer.tutti.service.genericformat.producer.CsvProducerForSurvey;
62 import fr.ifremer.tutti.service.referential.producer.CsvProducerForTemporaryGear;
63 import fr.ifremer.tutti.service.referential.producer.CsvProducerForTemporaryPerson;
64 import fr.ifremer.tutti.service.referential.producer.CsvProducerForTemporarySpecies;
65 import fr.ifremer.tutti.service.referential.producer.CsvProducerForTemporaryVessel;
66 import org.apache.commons.logging.Log;
67 import org.apache.commons.logging.LogFactory;
68 import org.nuiton.decorator.Decorator;
69
70 import java.io.Closeable;
71 import java.io.File;
72 import java.io.IOException;
73 import java.nio.file.Path;
74 import java.util.Iterator;
75 import java.util.LinkedHashSet;
76 import java.util.List;
77 import java.util.Map;
78 import java.util.Set;
79
80
81
82
83
84
85
86 public class GenericFormatExportContext implements Closeable, Iterable<GenericFormatExportCruiseContext> {
87
88
89 private static final Log log = LogFactory.getLog(GenericFormatExportContext.class);
90
91 private final GenericFormatExportRequest exportRequest;
92
93 private final Decorator<FishingOperation> fishingOperationDecorator;
94
95 private final Caracteristic deadOrAliveCaracteristic;
96
97 private final Caracteristic genderCaracteristic;
98
99 private final Caracteristic copyIndividualObservationModeCaracteristic;
100
101 private final Caracteristic sampleCodeCaracteristic ;
102
103 private final Caracteristic weightMeasuredCaracteristic;
104
105 private final Caracteristic pmfmIdCaracteristic;
106
107 private final CsvProducerForSurvey producerForSurvey;
108
109 private final CsvProducerForGearCaracteristics producerForGearCaracteristics;
110
111 private final CsvProducerForOperation producerForOperation;
112
113 private final CsvProducerForParameter producerForParameter;
114
115 private final CsvProducerForIndividualObservation producerForIndividualObservation;
116
117 private final CsvProducerForAccidentalCatch producerForAccidentalCatch;
118
119 private final CsvProducerForCatch producerForCatch;
120
121 private final CsvProducerForSpecies producerForSpecies;
122
123 private final CsvProducerForMarineLitter producerForMarineLitter;
124
125 private final CsvProducerForTemporaryGear producerForTemporaryGear;
126
127 private final CsvProducerForTemporaryPerson producerForTemporaryPerson;
128
129 private final CsvProducerForTemporarySpecies producerForTemporarySpecies;
130
131 private final CsvProducerForTemporaryVessel producerForTemporaryVessel;
132
133 private final CsvProducerForSampleCategory producerForSampleCategory;
134
135 private final CsvProducerForAttachment producerForAttachment;
136
137 private final ProgressionModel progressionModel;
138
139 private final Set<GenericFormatExportCruiseContext> cruiseContexts;
140
141 GenericFormatExportContext(ProgressionModel progressionModel,
142 GenericFormatExportRequest exportRequest,
143 PersistenceService persistenceService,
144 Decorator<FishingOperation> fishingOperationDecorator) {
145
146 Preconditions.checkNotNull(progressionModel);
147 this.progressionModel = progressionModel;
148
149 Preconditions.checkNotNull(exportRequest);
150 this.exportRequest = exportRequest;
151
152 Preconditions.checkNotNull(fishingOperationDecorator);
153 this.fishingOperationDecorator = fishingOperationDecorator;
154
155 Preconditions.checkNotNull(persistenceService);
156
157 this.weightMeasuredCaracteristic = persistenceService.getWeightMeasuredCaracteristic();
158 this.pmfmIdCaracteristic = persistenceService.getPmfmIdCaracteristic();
159 this.deadOrAliveCaracteristic = persistenceService.getDeadOrAliveCaracteristic();
160 this.genderCaracteristic = persistenceService.getSexCaracteristic();
161 this.copyIndividualObservationModeCaracteristic = persistenceService.getCopyIndividualObservationModeCaracteristic();
162 this.sampleCodeCaracteristic = persistenceService.getSampleCodeCaracteristic();
163 this.cruiseContexts = new LinkedHashSet<>();
164
165 List<Species> allReferentSpecies = persistenceService.getAllReferentSpecies();
166 Map<String, Species> speciesByReferenceTaxonId = Speciess.splitReferenceSpeciesByReferenceTaxonId(allReferentSpecies);
167
168 GenericFormatArchive archive = exportRequest.getArchive();
169
170 char csvSeparator = exportRequest.getCsvSeparator();
171
172 SampleCategoryModel sampleCategoryModel = exportRequest.getSampleCategoryModel();
173
174 Path attachmentsSourcePath = exportRequest.getAttachmentsSourcePath();
175
176 this.producerForSurvey = new CsvProducerForSurvey(archive.getSurveyPath(), SurveyModel.forExport(csvSeparator));
177 this.producerForGearCaracteristics = new CsvProducerForGearCaracteristics(archive.getGearCaracteristicsPath(), GearCaracteristicModel.forExport(csvSeparator));
178 this.producerForOperation = new CsvProducerForOperation(archive.getOperationPath(), OperationModel.forExport(csvSeparator));
179 this.producerForIndividualObservation = new CsvProducerForIndividualObservation(archive.getIndividualObservationPath(), IndividualObservationModel.forExport(csvSeparator));
180 this.producerForSpecies = new CsvProducerForSpecies(archive.getSpeciesPath(), SpeciesExportModel.forExport(csvSeparator), speciesByReferenceTaxonId);
181 this.producerForCatch = new CsvProducerForCatch(archive.getCatchPath(), CatchModel.forExport(csvSeparator, sampleCategoryModel));
182 this.producerForAccidentalCatch = new CsvProducerForAccidentalCatch(archive.getAccidentalCatchPath(), AccidentalCatchModel.forExport(csvSeparator));
183 this.producerForParameter = new CsvProducerForParameter(archive.getParameterPath(), ParameterModel.forExport(csvSeparator));
184 this.producerForMarineLitter = new CsvProducerForMarineLitter(archive.getMarineLitterPath(), MarineLitterModel.forExport(csvSeparator));
185 this.producerForSampleCategory = new CsvProducerForSampleCategory(archive.getSampleCategoryModelPath(), fr.ifremer.tutti.service.genericformat.csv.SampleCategoryModel.forExport(csvSeparator));
186 this.producerForAttachment = new CsvProducerForAttachment(archive.getAttachmentFilePath(), AttachmentModel.forExport(csvSeparator), attachmentsSourcePath, archive.getAttachmentDataPath());
187
188 this.producerForTemporaryGear = new CsvProducerForTemporaryGear(archive.getTemporaryReferentialGearsPath(), csvSeparator);
189 this.producerForTemporaryPerson = new CsvProducerForTemporaryPerson(archive.getTemporaryReferentialPersonsPath(), csvSeparator);
190 this.producerForTemporarySpecies = new CsvProducerForTemporarySpecies(archive.getTemporaryReferentialSpeciesPath(), csvSeparator, true);
191 this.producerForTemporaryVessel = new CsvProducerForTemporaryVessel(archive.getTemporaryReferentialVesselsPath(), csvSeparator);
192
193 }
194
195 public TuttiProtocol getProtocol() {
196 return exportRequest.getProtocol();
197 }
198
199 public File getExportFile() {
200 return getExportConfiguration().getExportFile();
201 }
202
203 public ProgramDataModel getDataToExport() {
204 return getExportConfiguration().getDataToExport();
205 }
206
207 public boolean isExportAttachments() {
208 return getExportConfiguration().isExportAttachments();
209 }
210
211 public boolean isExportSpecies() {
212 return getExportConfiguration().isExportSpecies();
213 }
214
215 public boolean isExportBenthos() {
216 return getExportConfiguration().isExportBenthos();
217 }
218
219 public boolean isExportMarineLitter() {
220 return getExportConfiguration().isExportMarineLitter();
221 }
222
223 public boolean isExportAccidentalCatch() {
224 return getExportConfiguration().isExportAccidentalCatch();
225 }
226
227 public boolean isExportIndividualObservation() {
228 return getExportConfiguration().isExportIndividualObservation();
229 }
230
231 public GenericFormatArchive getArchive() {
232 return exportRequest.getArchive();
233 }
234
235 public SampleCategoryModel getSampleCategoryModel() {
236 return exportRequest.getSampleCategoryModel();
237 }
238
239 public File getProtocolFile() {
240 return getArchive().getProtocolPath().toFile();
241 }
242
243 public ProgressionModel getProgressionModel() {
244 return progressionModel;
245 }
246
247 public CsvProducerForSurvey getProducerForSurvey() {
248 return producerForSurvey;
249 }
250
251 public CsvProducerForGearCaracteristics getProducerForGearCaracteristics() {
252 return producerForGearCaracteristics;
253 }
254
255 public CsvProducerForOperation getProducerForOperation() {
256 return producerForOperation;
257 }
258
259 public CsvProducerForParameter getProducerForParameter() {
260 return producerForParameter;
261 }
262
263 public CsvProducerForIndividualObservation getProducerForIndividualObservation() {
264 return producerForIndividualObservation;
265 }
266
267 public CsvProducerForAccidentalCatch getProducerForAccidentalCatch() {
268 return producerForAccidentalCatch;
269 }
270
271 public CsvProducerForCatch getProducerForCatch() {
272 return producerForCatch;
273 }
274
275 public CsvProducerForSpecies getProducerForSpecies() {
276 return producerForSpecies;
277 }
278
279 public CsvProducerForMarineLitter getProducerForMarineLitter() {
280 return producerForMarineLitter;
281 }
282
283 public CsvProducerForTemporaryGear getProducerForTemporaryGear() {
284 return producerForTemporaryGear;
285 }
286
287 public CsvProducerForTemporaryPerson getProducerForTemporaryPerson() {
288 return producerForTemporaryPerson;
289 }
290
291 public CsvProducerForTemporarySpecies getProducerForTemporarySpecies() {
292 return producerForTemporarySpecies;
293 }
294
295 public CsvProducerForTemporaryVessel getProducerForTemporaryVessel() {
296 return producerForTemporaryVessel;
297 }
298
299 public CsvProducerForSampleCategory getProducerForSampleCategory() {
300 return producerForSampleCategory;
301 }
302
303 public CsvProducerForAttachment getProducerForAttachment() {
304 return producerForAttachment;
305 }
306
307 public void increments(String message) {
308 progressionModel.increments(message);
309 }
310
311 public void addCruiseContext(Cruise cruise, Set<FishingOperation> operations) {
312
313 GenericFormatExportCruiseContext cruiseContext = new GenericFormatExportCruiseContext(cruise, operations);
314 cruiseContexts.add(cruiseContext);
315
316 }
317
318 public GenericFormatExportOperationContext newOperationContext(PersistenceService persistenceService,
319 WeightComputingService weightComputingService,
320 Cruise cruise, FishingOperation operation) {
321
322 String operationLabel = fishingOperationDecorator.toString(operation);
323 return new GenericFormatExportOperationContext(cruise,
324 operation,
325 operationLabel,
326 persistenceService,
327 weightComputingService,
328 getSampleCategoryModel(),
329 weightMeasuredCaracteristic,
330 pmfmIdCaracteristic,
331 deadOrAliveCaracteristic,
332 genderCaracteristic,
333 copyIndividualObservationModeCaracteristic,
334 sampleCodeCaracteristic);
335
336 }
337
338 @Override
339 public void close() {
340
341 for (CsvProducer csvProducer : producers()) {
342
343 try {
344 csvProducer.close();
345 } catch (IOException e) {
346 if (log.isErrorEnabled()) {
347 log.error("Could not close producer: " + csvProducer.getClass().getSimpleName(), e);
348 }
349 }
350
351 }
352
353 }
354
355 @Override
356 public Iterator<GenericFormatExportCruiseContext> iterator() {
357 return cruiseContexts.iterator();
358 }
359
360 public Set<CsvProducer<?, ?>> producers() {
361 return Sets.newHashSet(
362 producerForSurvey,
363 producerForSpecies,
364 producerForGearCaracteristics,
365 producerForOperation,
366 producerForParameter,
367 producerForAccidentalCatch,
368 producerForIndividualObservation,
369 producerForCatch,
370 producerForMarineLitter,
371 producerForTemporaryGear,
372 producerForTemporaryPerson,
373 producerForTemporarySpecies,
374 producerForTemporaryVessel,
375 producerForSampleCategory,
376 producerForAttachment);
377 }
378
379 protected GenericFormatExportConfiguration getExportConfiguration() {
380 return exportRequest.getExportConfiguration();
381 }
382
383 }