View Javadoc
1   package fr.ifremer.tutti.persistence.service;
2   
3   /*
4    * #%L
5    * Tutti :: Persistence
6    * %%
7    * Copyright (C) 2012 - 2014 Ifremer
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU General Public License as
11   * published by the Free Software Foundation, either version 3 of the 
12   * License, or (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU General Public 
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/gpl-3.0.html>.
22   * #L%
23   */
24  
25  import com.google.common.base.Preconditions;
26  import com.google.common.collect.Sets;
27  import fr.ifremer.adagio.core.dao.data.batch.Batch;
28  import fr.ifremer.adagio.core.dao.data.batch.CatchBatch;
29  import fr.ifremer.adagio.core.dao.data.batch.SortingBatch;
30  import fr.ifremer.adagio.core.dao.data.measure.SortingMeasurement;
31  import fr.ifremer.adagio.core.dao.referential.QualityFlagCode;
32  import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl;
33  import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValue;
34  import fr.ifremer.tutti.persistence.entities.TuttiEntities;
35  import fr.ifremer.tutti.persistence.entities.data.BatchContainer;
36  import fr.ifremer.tutti.persistence.entities.data.MarineLitterBatch;
37  import fr.ifremer.tutti.persistence.entities.data.MarineLitterBatchs;
38  import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
39  import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
40  import fr.ifremer.tutti.persistence.service.referential.CaracteristicPersistenceService;
41  import fr.ifremer.tutti.persistence.service.util.BatchPersistenceHelper;
42  import fr.ifremer.tutti.persistence.service.util.tree.BatchTreeHelper;
43  import fr.ifremer.tutti.persistence.service.util.MeasurementPersistenceHelper;
44  import org.apache.commons.logging.Log;
45  import org.apache.commons.logging.LogFactory;
46  import org.springframework.stereotype.Service;
47  
48  import javax.annotation.Resource;
49  import java.util.ArrayList;
50  import java.util.Collection;
51  import java.util.Map;
52  import java.util.Set;
53  
54  /**
55   * @author Tony Chemit - chemit@codelutin.com
56   * @since 0.3
57   */
58  @Service("marineLitterBatchPersistenceService")
59  public class MarineLitterBatchPersistenceServiceImpl extends AbstractPersistenceService implements MarineLitterBatchPersistenceService {
60  
61      /** Logger. */
62      private static final Log log =
63              LogFactory.getLog(MarineLitterBatchPersistenceServiceImpl.class);
64  
65      @Resource(name = "caracteristicPersistenceService")
66      private CaracteristicPersistenceService caracteristicService;
67  
68      @Resource(name = "batchPersistenceHelper")
69      protected BatchPersistenceHelper batchHelper;
70  
71      @Resource(name = "measurementPersistenceHelper")
72      protected MeasurementPersistenceHelper measurementPersistenceHelper;
73  
74      @Resource(name = "batchTreeHelper")
75      protected BatchTreeHelper batchTreeHelper;
76  
77      protected Integer marineLitterCategory;
78  
79      protected Integer marineLitterSizeCategory;
80  
81      protected Map<Integer, CaracteristicQualitativeValue> marineLitterCategoryCaracteristicValues;
82  
83      protected Map<Integer, CaracteristicQualitativeValue> marineLitterSizeCategoryCaracteristicValues;
84  
85      @Override
86      public void init() {
87          super.init();
88  
89          Caracteristic marineLitterCategoryCaracteristic = caracteristicService.getMarineLitterCategoryCaracteristic();
90          marineLitterCategory = marineLitterCategoryCaracteristic.getIdAsInt();
91          marineLitterCategoryCaracteristicValues = TuttiEntities.splitByIdAsInt(marineLitterCategoryCaracteristic.getQualitativeValue());
92  
93          Caracteristic marineLitterSizeCategoryCaracteristic = caracteristicService.getMarineLitterSizeCategoryCaracteristic();
94          marineLitterSizeCategory = marineLitterSizeCategoryCaracteristic.getIdAsInt();
95          marineLitterSizeCategoryCaracteristicValues = TuttiEntities.splitByIdAsInt(marineLitterSizeCategoryCaracteristic.getQualitativeValue());
96      }
97  
98      @Override
99      public BatchContainer<MarineLitterBatch> getRootMarineLitterBatch(Integer fishingOperationId) {
100         Preconditions.checkNotNull(fishingOperationId);
101 
102         CatchBatch catchBatch = batchHelper.getRootCatchBatchByFishingOperationId(fishingOperationId, false);
103 
104         // Get marine litter root batch
105         SortingBatch sortingBatch = batchTreeHelper.getMarineLitterRootBatch(catchBatch);
106 
107         BatchContainer<MarineLitterBatch> result = new BatchContainer<>();
108 
109         if (sortingBatch != null) {
110             result.setId(sortingBatch.getId());
111 
112             for (Batch batch1 : sortingBatch.getChildBatchs()) {
113                 SortingBatch source = (SortingBatch) batch1;
114 
115                 MarineLitterBatch target = MarineLitterBatchs.newMarineLitterBatch();
116                 entityToBean(source, target);
117                 result.addChildren(target);
118 
119                 if (log.isDebugEnabled()) {
120                     log.debug("Loaded CatchBatch Hors Vrac > MarineLetter > " +
121                               target.getMarineLitterCategory().getName() + " / " +
122                               target.getMarineLitterSizeCategory().getName() + ": " +
123                               target.getId());
124                 }
125             }
126         }
127 
128         return result;
129     }
130 
131     @Override
132     public MarineLitterBatch createMarineLitterBatch(MarineLitterBatch bean) {
133         Preconditions.checkNotNull(bean);
134         Preconditions.checkNotNull(bean.getFishingOperation());
135         Preconditions.checkNotNull(bean.getFishingOperation().getId());
136 
137         CatchBatch catchBatch = batchHelper.getRootCatchBatchByFishingOperationId(bean.getFishingOperation().getIdAsInt(), false);
138 
139         return createMarineLitterBatch(catchBatch, bean);
140 
141     }
142 
143     @Override
144     public Collection<MarineLitterBatch> createMarineLitterBatches(Integer fishingOperationId, Collection<MarineLitterBatch> beans) {
145 
146         Preconditions.checkNotNull(beans);
147 
148         CatchBatch catchBatch = batchHelper.getRootCatchBatchByFishingOperationId(fishingOperationId, false);
149 
150         Collection<MarineLitterBatch> result = new ArrayList<>(beans.size());
151 
152         for (MarineLitterBatch bean : beans) {
153 
154             MarineLitterBatch  created = createMarineLitterBatch(catchBatch, bean);
155             result.add(created);
156 
157         }
158         return result;
159     }
160 
161     protected MarineLitterBatch  createMarineLitterBatch(CatchBatch catchBatch, MarineLitterBatch bean) {
162 
163         Preconditions.checkNotNull(bean);
164         Preconditions.checkArgument(bean.getId() == null);
165         Preconditions.checkNotNull(bean.getMarineLitterCategory());
166         Preconditions.checkNotNull(bean.getMarineLitterSizeCategory());
167         Preconditions.checkNotNull(bean.getNumber());
168 
169         SortingBatch batch = SortingBatch.Factory.newInstance();
170         beanToEntity(bean, batch, catchBatch);
171         return batchHelper.createSortingBatch(bean, catchBatch, batch);
172 
173     }
174 
175     @Override
176     public MarineLitterBatch saveMarineLitterBatch(MarineLitterBatch bean) {
177         Preconditions.checkNotNull(bean);
178         Preconditions.checkNotNull(bean.getId());
179         Integer batchId = bean.getIdAsInt();
180         CatchBatch catchBatch = batchHelper.getRootCatchBatchByBatchId(batchId);
181         SortingBatch batch = batchHelper.getSortingBatchById(catchBatch, batchId);
182         beanToEntity(bean, batch, catchBatch);
183         batchHelper.updateSortingBatch(batch, catchBatch);
184 
185         return bean;
186     }
187 
188     @Override
189     public void deleteMarineLitterBatch(Integer id) {
190         Preconditions.checkNotNull(id);
191         batchHelper.deleteBatch(id);
192     }
193 
194     public MarineLitterBatch entityToBean(SortingBatch source, MarineLitterBatch target) {
195 
196         target.setId(source.getId().toString());
197 
198         // Rank order
199         target.setRankOrder(Integer.valueOf(source.getRankOrder()));
200 
201         // Individual count
202         target.setNumber(source.getIndividualCount());
203 
204         // Weight
205         target.setWeight(source.getWeight());
206 
207         // Comments
208         target.setComment(source.getComments());
209 
210         // Should have 2 quantification measurements
211 
212         for (SortingMeasurement measurement : source.getSortingMeasurements()) {
213             Integer pmfmId = measurement.getPmfm().getId();
214             if (marineLitterCategory.equals(pmfmId)) {
215                 QualitativeValue qualitativeValue = measurement.getQualitativeValue();
216                 Integer id = qualitativeValue.getId();
217                 CaracteristicQualitativeValue value = marineLitterCategoryCaracteristicValues.get(id);
218                 target.setMarineLitterCategory(value);
219             } else if (marineLitterSizeCategory.equals(pmfmId)) {
220                 QualitativeValue qualitativeValue = measurement.getQualitativeValue();
221                 Integer id = qualitativeValue.getId();
222                 CaracteristicQualitativeValue value = marineLitterSizeCategoryCaracteristicValues.get(id);
223                 target.setMarineLitterSizeCategory(value);
224             }
225         }
226         return target;
227     }
228 
229     protected void beanToEntity(MarineLitterBatch source,
230                                 SortingBatch target,
231                                 CatchBatch catchBatch) {
232 
233 //        Preconditions.checkNotNull(source.getFishingOperation());
234 //        Preconditions.checkNotNull(source.getFishingOperation().getId());
235 
236         // If parent and root need to be set
237         if (target.getId() == null || target.getRootBatch() == null) {
238             setMarineLitterBatchParents(target, catchBatch);
239         }
240 
241         // RankOrder (initialize once, at creation)
242         if (target.getRankOrder() == null) {
243 
244             short rankOrder = batchHelper.computeRankOrder(target);
245             target.setRankOrder(rankOrder);
246 
247         }
248 
249         // Force subgroup count to '1', as Allegro
250         target.setSubgroupCount(1f);
251 
252         // Sorting Measurements
253         {
254             Collection<SortingMeasurement> sortingMeasurements = target.getSortingMeasurements();
255 
256             Set<SortingMeasurement> notChangedSortingMeasurements = Sets.newHashSet();
257             if (sortingMeasurements != null) {
258                 notChangedSortingMeasurements.addAll(sortingMeasurements);
259             }
260 
261             // MarineLitterCategory
262             if (source.getMarineLitterCategory() != null) {
263 
264                 SortingMeasurement measurement = measurementPersistenceHelper.setSortingMeasurement(
265                         target,
266                         marineLitterCategory,
267                         source.getMarineLitterCategory().getIdAsInt()
268                 );
269                 notChangedSortingMeasurements.remove(measurement);
270             }
271 
272             // MarineLitterSizeCategory
273             if (source.getMarineLitterSizeCategory() != null) {
274 
275                 SortingMeasurement measurement = measurementPersistenceHelper.setSortingMeasurement(
276                         target,
277                         marineLitterSizeCategory,
278                         source.getMarineLitterSizeCategory().getIdAsInt()
279                 );
280                 notChangedSortingMeasurements.remove(measurement);
281             }
282 
283             if (sortingMeasurements != null) {
284                 sortingMeasurements.removeAll(notChangedSortingMeasurements);
285             }
286         }
287 
288         // Sampling Ratio + Weight
289         batchTreeHelper.setWeightAndSampleRatio(target, source.getWeight(), null);
290 
291         // Individual count
292         target.setIndividualCount(source.getNumber());
293 
294         // QualityFlag
295         QualityFlagImpl qualityFlag = load(QualityFlagImpl.class, QualityFlagCode.NOTQUALIFIED.getValue());
296         target.setQualityFlag(qualityFlag);
297 
298         // Comments
299         target.setComments(source.getComment());
300 
301         // Exhaustive inventory (always true under a marine litter batch)
302         target.setExhaustiveInventory(true);
303 
304     }
305 
306     private void setMarineLitterBatchParents(SortingBatch target, CatchBatch catchBatch) {
307 
308         Preconditions.checkNotNull(target);
309 
310         // -- Hors Vrac > Marine Litter
311         SortingBatch parentBatch = batchTreeHelper.getMarineLitterRootBatch(catchBatch);
312 
313         if (parentBatch == null) {
314 
315             // -- Hors Vrac
316             SortingBatch horsVracBatch = batchTreeHelper.getOrCreateHorsVracBatch(catchBatch);
317 
318             // -- Hors Vrac > Marine Litter
319             parentBatch = batchTreeHelper.getOrCreateMarineLitterRootBatch(catchBatch, horsVracBatch, null);
320         }
321 
322         target.setParentBatch(parentBatch);
323         target.setRootBatch(catchBatch);
324     }
325 }