View Javadoc
1   package fr.ifremer.tutti.service.genericformat;
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.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   * Created on 2/5/15.
82   *
83   * @author Tony Chemit - chemit@codelutin.com
84   * @since 3.13
85   */
86  public class GenericFormatExportContext implements Closeable, Iterable<GenericFormatExportCruiseContext> {
87  
88      /** Logger. */
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 }