View Javadoc
1   package fr.ifremer.tutti.service.genericformat.importactions;
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 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   * Created on 3/3/15.
54   *
55   * @author Tony Chemit - chemit@codelutin.com
56   * @since 3.14
57   */
58  public class ImportSurveyAction extends ImportActionSupport {
59  
60      /** Logger. */
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                     // skip this cruise (not selected)
106                     skipCruise(cruise);
107 
108                 } else {
109 
110                     // process this cruise
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             // New cruise
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             // Existing cruise
155 
156             if (importContext.getImportRequest().isUpdateCruises()) {
157 
158                 // Update cruise
159                 importContext.increments(t("tutti.service.genericFormat.persist.update.cruise", cruiseStr));
160                 savedCruise = updateCruise(cruise, attachmentRows);
161 
162             } else {
163 
164                 // skip update cruise
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             // delete previous attachments
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 }