1 package fr.ifremer.tutti.persistence.service;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
56
57
58 @Service("marineLitterBatchPersistenceService")
59 public class MarineLitterBatchPersistenceServiceImpl extends AbstractPersistenceService implements MarineLitterBatchPersistenceService {
60
61
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
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
199 target.setRankOrder(Integer.valueOf(source.getRankOrder()));
200
201
202 target.setNumber(source.getIndividualCount());
203
204
205 target.setWeight(source.getWeight());
206
207
208 target.setComment(source.getComments());
209
210
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
234
235
236
237 if (target.getId() == null || target.getRootBatch() == null) {
238 setMarineLitterBatchParents(target, catchBatch);
239 }
240
241
242 if (target.getRankOrder() == null) {
243
244 short rankOrder = batchHelper.computeRankOrder(target);
245 target.setRankOrder(rankOrder);
246
247 }
248
249
250 target.setSubgroupCount(1f);
251
252
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
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
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
289 batchTreeHelper.setWeightAndSampleRatio(target, source.getWeight(), null);
290
291
292 target.setIndividualCount(source.getNumber());
293
294
295 QualityFlagImpl qualityFlag = load(QualityFlagImpl.class, QualityFlagCode.NOTQUALIFIED.getValue());
296 target.setQualityFlag(qualityFlag);
297
298
299 target.setComments(source.getComment());
300
301
302 target.setExhaustiveInventory(true);
303
304 }
305
306 private void setMarineLitterBatchParents(SortingBatch target, CatchBatch catchBatch) {
307
308 Preconditions.checkNotNull(target);
309
310
311 SortingBatch parentBatch = batchTreeHelper.getMarineLitterRootBatch(catchBatch);
312
313 if (parentBatch == null) {
314
315
316 SortingBatch horsVracBatch = batchTreeHelper.getOrCreateHorsVracBatch(catchBatch);
317
318
319 parentBatch = batchTreeHelper.getOrCreateMarineLitterRootBatch(catchBatch, horsVracBatch, null);
320 }
321
322 target.setParentBatch(parentBatch);
323 target.setRootBatch(catchBatch);
324 }
325 }