View Javadoc
1   package fr.ifremer.tutti.service.operationimport;
2   
3   /*
4    * #%L
5    * Tutti :: Service
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2012 - 2014 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 fr.ifremer.tutti.persistence.entities.CaracteristicMap;
28  import fr.ifremer.tutti.persistence.entities.TuttiEntities;
29  import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
30  import fr.ifremer.tutti.persistence.entities.data.FishingOperations;
31  import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow;
32  import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicType;
33  import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow;
34  import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
35  import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
36  import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
37  import fr.ifremer.tutti.persistence.entities.referential.Gear;
38  import fr.ifremer.tutti.persistence.entities.referential.Person;
39  import fr.ifremer.tutti.persistence.entities.referential.TuttiLocation;
40  import fr.ifremer.tutti.persistence.entities.referential.Vessel;
41  import fr.ifremer.tutti.service.PersistenceService;
42  import fr.ifremer.tutti.service.csv.TuttiCsvUtil;
43  import fr.ifremer.tutti.service.TuttiDataContext;
44  import fr.ifremer.tutti.service.csv.AbstractTuttiImportModel;
45  import org.apache.commons.lang3.StringUtils;
46  import org.nuiton.csv.ValueParser;
47  import org.nuiton.csv.ValueSetter;
48  import org.nuiton.util.DateUtil;
49  
50  import java.io.Serializable;
51  import java.util.ArrayList;
52  import java.util.Collection;
53  import java.util.Date;
54  import java.util.List;
55  import java.util.Map;
56  import java.util.Set;
57  
58  /**
59   * Created on 12/11/14.
60   *
61   * @author Kevin Morin - morin@codelutin.com
62   * @since 3.10
63   */
64  public class ImportFromColumnFileModel extends AbstractTuttiImportModel<FishingOperation> {
65  
66      private final FishingOperation fishingOperation;
67  
68      public ImportFromColumnFileModel(char separator, Set<String> headers,
69                                       PersistenceService persistenceService,
70                                       TuttiDataContext dataContext,
71                                       FishingOperation fishingOperation) throws ImportFromColumnFileMissingHeaderException {
72          super(separator);
73          this.fishingOperation = fishingOperation;
74  
75          TuttiProtocol protocol = dataContext.getProtocol();
76          Collection<OperationFieldMappingRow> operationFieldMapping = protocol.getOperationFieldMapping();
77  
78          String zoneId = dataContext.getProgram().getZone().getId();
79  
80          for (OperationFieldMappingRow mappingRow : operationFieldMapping) {
81              String importColumn = mappingRow.getImportColumn();
82              boolean importColumnsInHeaders = headers.remove(importColumn);
83              if (StringUtils.isNotBlank(importColumn) && importColumnsInHeaders) {
84  
85                  String field = mappingRow.getField();
86                  ValueSetter valueSetter = null;
87                  ValueParser valueParser;
88                  switch (field) {
89                      case FishingOperation.PROPERTY_FISHING_OPERATION_NUMBER:
90                      case FishingOperation.PROPERTY_TRAWL_DISTANCE:
91                          valueParser = TuttiCsvUtil.INTEGER;
92                          break;
93  
94                      case FishingOperation.PROPERTY_GEAR_SHOOTING_START_LATITUDE:
95                      case FishingOperation.PROPERTY_GEAR_SHOOTING_START_LONGITUDE:
96                      case FishingOperation.PROPERTY_GEAR_SHOOTING_END_LATITUDE:
97                      case FishingOperation.PROPERTY_GEAR_SHOOTING_END_LONGITUDE:
98                          valueParser = TuttiCsvUtil.FLOAT;
99                          break;
100 
101                     case FishingOperations.PROPERTY_GEAR_SHOOTING_START_DAY:
102                         valueParser = TuttiCsvUtil.DAY;
103                         valueSetter = new ValueSetter<FishingOperation, Date>() {
104                             @Override
105                             public void set(FishingOperation bean, Date value) throws Exception {
106                                 Date date = bean.getGearShootingStartDate();
107                                 if (date == null) {
108                                     date = value;
109 
110                                 } else {
111                                     date = DateUtil.getDateAndTime(value, date, false, false);
112                                 }
113                                 bean.setGearShootingStartDate(date);
114                             }
115                         };
116                         break;
117                     case FishingOperations.PROPERTY_GEAR_SHOOTING_END_DAY:
118                         valueParser = TuttiCsvUtil.DAY;
119                         valueSetter = new ValueSetter<FishingOperation, Date>() {
120                             @Override
121                             public void set(FishingOperation bean, Date value) throws Exception {
122                                 Date date = bean.getGearShootingEndDate();
123                                 if (date == null) {
124                                     date = value;
125 
126                                 } else {
127                                     date = DateUtil.getDateAndTime(value, date, false, false);
128                                 }
129                                 bean.setGearShootingEndDate(date);
130                             }
131                         };
132                         break;
133 
134                     case FishingOperations.PROPERTY_GEAR_SHOOTING_START_TIME:
135                         valueParser = TuttiCsvUtil.TIME;
136                         valueSetter = new ValueSetter<FishingOperation, Date>() {
137                             @Override
138                             public void set(FishingOperation bean, Date value) throws Exception {
139                                 Date date = bean.getGearShootingStartDate();
140                                 if (date == null) {
141                                     date = value;
142 
143                                 } else {
144                                     date = DateUtil.getDateAndTime(date, value, false, false);
145                                 }
146                                 bean.setGearShootingStartDate(date);
147                             }
148                         };
149                         break;
150                     case FishingOperations.PROPERTY_GEAR_SHOOTING_END_TIME:
151                         valueParser = TuttiCsvUtil.TIME;
152                         valueSetter = new ValueSetter<FishingOperation, Date>() {
153                             @Override
154                             public void set(FishingOperation bean, Date value) throws Exception {
155                                 Date date = bean.getGearShootingEndDate();
156                                 if (date == null) {
157                                     date = value;
158 
159                                 } else {
160                                     date = DateUtil.getDateAndTime(date, value, false, false);
161                                 }
162                                 bean.setGearShootingEndDate(date);
163                             }
164                         };
165                         break;
166 
167                     case FishingOperation.PROPERTY_FISHING_OPERATION_RECTILIGNE:
168                         valueParser = TuttiCsvUtil.PRIMITIVE_BOOLEAN;
169                         break;
170 
171                     case FishingOperation.PROPERTY_FISHING_OPERATION_VALID:
172                         valueParser = TuttiCsvUtil.BOOLEAN;
173                         break;
174 
175                     case FishingOperation.PROPERTY_GEAR:
176                         List<Gear> gears = new ArrayList<>(dataContext.getFishingGears());
177                         gears.addAll(dataContext.getScientificGears());
178                         Map<String, Gear> gearUniverse = TuttiEntities.splitById(gears);
179                         valueParser = newForeignKeyParserFormatter(Gear.class, field, gearUniverse);
180                         break;
181 
182                     case FishingOperation.PROPERTY_VESSEL:
183                         List<Vessel> vessels = new ArrayList<>(dataContext.getFishingVessels());
184                         vessels.addAll(dataContext.getScientificVessels());
185                         Map<String, Vessel> vesselUniverse = TuttiEntities.splitById(vessels);
186                         valueParser = newForeignKeyParserFormatter(Vessel.class, field, vesselUniverse);
187                         break;
188 
189                     case FishingOperation.PROPERTY_SECONDARY_VESSEL:
190                         vessels = new ArrayList<>(dataContext.getFishingVessels());
191                         vessels.addAll(dataContext.getScientificVessels());
192                         vesselUniverse = TuttiEntities.splitById(vessels);
193                         valueParser = newForeignKeyListParserFormatter(Vessel.class, field, vesselUniverse);
194                         break;
195 
196                     case FishingOperation.PROPERTY_STRATA:
197                         Map<String, TuttiLocation> strataUniverse = TuttiEntities.splitById(
198                                 persistenceService.getAllFishingOperationStrata(zoneId));
199                         valueParser = newForeignKeyParserFormatter(TuttiLocation.class, field, strataUniverse);
200                         break;
201 
202                     case FishingOperation.PROPERTY_SUB_STRATA:
203                         Map<String, TuttiLocation> subStrataUniverse = TuttiEntities.splitById(
204                                 persistenceService.getAllFishingOperationSubStrata(zoneId, null));
205                         valueParser = newForeignKeyParserFormatter(TuttiLocation.class, field, subStrataUniverse);
206                         break;
207 
208                     case FishingOperation.PROPERTY_LOCATION:
209                         Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById(
210                                 persistenceService.getAllFishingOperationLocation(zoneId, null, null));
211                         valueParser = newForeignKeyParserFormatter(TuttiLocation.class, field, locationUniverse);
212                         break;
213 
214                     case FishingOperation.PROPERTY_RECORDER_PERSON:
215                         Map<String, Person> personUniverse = TuttiEntities.splitById(dataContext.getPersons());
216                         valueParser = newForeignKeyListParserFormatter(Person.class, field, personUniverse);
217                         break;
218 
219                     default:
220                         valueParser = TuttiCsvUtil.STRING;
221 
222                 }
223 
224                 if (valueSetter == null) {
225                     newMandatoryColumn(importColumn, field, valueParser);
226 
227                 } else {
228                     newMandatoryColumn(importColumn, valueParser, valueSetter);
229                 }
230 
231             } else if (!importColumnsInHeaders) {
232                 throw new ImportFromColumnFileMissingHeaderException(importColumn);
233             }
234         }
235 
236         Collection<CaracteristicMappingRow> caracteristicMappingRows = protocol.getCaracteristicMapping();
237         for (final CaracteristicMappingRow mappingRow : caracteristicMappingRows) {
238             String importColumn = mappingRow.getImportColumn();
239             if (StringUtils.isNotBlank(importColumn) && headers.remove(importColumn)) {
240 
241                 int pmfmId = Integer.parseInt(mappingRow.getPmfmId());
242                 final Caracteristic caracteristic = persistenceService.getCaracteristic(pmfmId);
243 
244                 ValueSetter<FishingOperation, String> setter = (fishingOperation1, value) -> {
245 
246                     Serializable realValue = null;
247                     if (StringUtils.isNotBlank(value)) {
248                         switch (caracteristic.getCaracteristicType()) {
249                             case QUALITATIVE:
250                                 for (CaracteristicQualitativeValue cqv : caracteristic.getQualitativeValue()) {
251                                     if (value.equals(cqv.getId())) {
252                                         realValue = cqv;
253                                         break;
254                                     }
255                                 }
256                                 break;
257 
258                             case NUMBER:
259                                 realValue = Float.parseFloat(value);
260                                 break;
261 
262                             default:
263                                 realValue = value;
264                         }
265                     }
266 
267                     CaracteristicMap caracteristicMap;
268                     if (CaracteristicType.GEAR_USE_FEATURE.toString().equals(mappingRow.getTab())) {
269                         caracteristicMap = fishingOperation1.getGearUseFeatures();
270                         if (caracteristicMap == null) {
271                             caracteristicMap = new CaracteristicMap();
272                             fishingOperation1.setGearUseFeatures(caracteristicMap);
273                         }
274 
275                     } else {
276                         caracteristicMap = fishingOperation1.getVesselUseFeatures();
277                         if (caracteristicMap == null) {
278                             caracteristicMap = new CaracteristicMap();
279                             fishingOperation1.setVesselUseFeatures(caracteristicMap);
280                         }
281                     }
282                     caracteristicMap.put(caracteristic, realValue);
283 
284                 };
285                 newMandatoryColumn(importColumn, setter);
286 
287             }
288         }
289 
290 
291         for (String header : headers) {
292             newIgnoredColumn(header);
293         }
294     }
295 
296     @Override
297     public FishingOperation newEmptyInstance() {
298 //            FishingOperation fishingOperation = FishingOperations.newFishingOperation();
299 //            EditFishingOperationUIModel model = getModel();
300 //            toBeanBinder.copy(model, fishingOperation);
301         return fishingOperation;
302     }
303 }