1 package fr.ifremer.tutti.persistence.service.referential;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 import com.google.common.base.Predicate;
28 import com.google.common.collect.Iterables;
29 import com.google.common.collect.Lists;
30 import com.google.common.collect.Sets;
31 import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId;
32 import fr.ifremer.adagio.core.dao.referential.pmfm.QualitativeValueId;
33 import fr.ifremer.adagio.core.dao.referential.pmfm.UnitId;
34 import fr.ifremer.tutti.persistence.dao.referential.pmfm.PmfmId2;
35 import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch;
36 import fr.ifremer.tutti.persistence.entities.data.SpeciesBatchs;
37 import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
38 import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
39 import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValues;
40 import fr.ifremer.tutti.persistence.entities.referential.CaracteristicType;
41 import fr.ifremer.tutti.persistence.entities.referential.Caracteristics;
42 import org.apache.commons.logging.Log;
43 import org.apache.commons.logging.LogFactory;
44 import org.hibernate.type.IntegerType;
45 import org.springframework.cache.Cache;
46 import org.springframework.stereotype.Service;
47
48 import javax.annotation.Resource;
49 import java.util.Collections;
50 import java.util.Iterator;
51 import java.util.List;
52 import java.util.Set;
53
54
55
56
57
58
59
60 @Service("caracteristicPersistenceService")
61 public class CaracteristicPersistenceServiceImpl extends ReferentialPersistenceServiceSupport implements CaracteristicPersistenceService {
62
63
64 private static final Log log = LogFactory.getLog(CaracteristicPersistenceServiceImpl.class);
65
66
67 @Resource(name = "caracteristicPersistenceService")
68 protected CaracteristicPersistenceService thisService;
69
70 protected Set<Integer> propertedPmfmIds;
71
72 protected Predicate<SpeciesBatch> batchVracPredicate;
73
74 @Override
75 public void init() {
76 super.init();
77
78 batchVracPredicate = SpeciesBatchs.newSpeciesAbleBatchCategoryPredicate(
79 PmfmId.SORTED_UNSORTED.getValue(),
80 QualitativeValueId.SORTED_VRAC.getValue());
81
82
83 propertedPmfmIds = Sets.newHashSet(
84 PmfmId.MULTIRIG_AGGREGATION.getValue(),
85 PmfmId.MULTIRIG_NUMBER.getValue(),
86 PmfmId.STATION_NUMBER.getValue(),
87 PmfmId.RECTILINEAR_OPERATION.getValue(),
88 PmfmId.HAUL_VALID.getValue(),
89 PmfmId.TRAWL_DISTANCE.getValue(),
90 PmfmId.SURVEY_PART.getValue(),
91 PmfmId.SORTED_UNSORTED.getValue(),
92 PmfmId.ID_PMFM.getValue(),
93 PmfmId2.COPY_METHOD.getValue(),
94 PmfmId2.CALCIFIED_STRUCTURE.getValue()
95 );
96
97 }
98
99 @Override
100 public List<Caracteristic> getAllCaracteristic() {
101 return getAllCaracteristics(false);
102 }
103
104 @Override
105 public List<Caracteristic> getAllCaracteristicWithProtected() {
106 return getAllCaracteristics(true);
107 }
108
109 @Override
110 public List<Caracteristic> getAllCaracteristicForSampleCategory() {
111 List<Caracteristic> allCaracteristicWithProtected = thisService.getAllCaracteristicWithProtected();
112 return Lists.newArrayList(
113 Iterables.filter(allCaracteristicWithProtected, Caracteristics.newSampleCategoryModelPredicate()));
114 }
115
116 protected List<Caracteristic> getAllCaracteristics(boolean withProtected) {
117 Iterator<Object[]> sources = queryListWithStatus(
118 "allPmfm",
119 "unitIdNone", IntegerType.INSTANCE, UnitId.NONE.getValue());
120 List<Caracteristic> result = Lists.newArrayList();
121 Cache pmfmByIdCache = cacheService.getCache("pmfmById");
122 while (sources.hasNext()) {
123 Object[] source = sources.next();
124 Integer pmfmId = (Integer) source[0];
125 Caracteristic target = loadCaracteristic(source);
126
127 if (withProtected || !isProtectedCaracteristic(pmfmId)) {
128 result.add(target);
129 }
130 pmfmByIdCache.put(pmfmId, target);
131 }
132 return Collections.unmodifiableList(result);
133 }
134
135 @Override
136 public List<Caracteristic> getAllNumericCaracteristic() {
137 List<Caracteristic> result = Lists.newArrayList();
138
139 for (Caracteristic caracteristic : getAllCaracteristic()) {
140 if (caracteristic.isNumericType()) {
141 result.add(caracteristic);
142 }
143 }
144 return Collections.unmodifiableList(result);
145 }
146
147 @Override
148 public Caracteristic getSizeCategoryCaracteristic() {
149 Integer pmfmId = PmfmId.SIZE_CATEGORY.getValue();
150 return getCaracteristic(pmfmId);
151 }
152
153 @Override
154 public Caracteristic getSexCaracteristic() {
155 Integer pmfmId = PmfmId.SEX.getValue();
156 return getCaracteristic(pmfmId);
157 }
158
159 @Override
160 public Caracteristic getSortedUnsortedCaracteristic() {
161 Integer pmfmId = PmfmId.SORTED_UNSORTED.getValue();
162 Caracteristic result = thisService.getCaracteristic(pmfmId);
163
164
165
166 List<CaracteristicQualitativeValue> qualitativeValue =
167 Lists.newArrayList(result.getQualitativeValue());
168 Iterator<CaracteristicQualitativeValue> iterator = qualitativeValue.iterator();
169 while (iterator.hasNext()) {
170 CaracteristicQualitativeValue qv = iterator.next();
171 if (QualitativeValueId.UNSORTED.getValue().equals(Integer.valueOf(qv.getId()))) {
172 iterator.remove();
173 break;
174 }
175 }
176 result.setQualitativeValue(Collections.unmodifiableList(qualitativeValue));
177 return result;
178 }
179
180 @Override
181 public Caracteristic getMaturityCaracteristic() {
182 Integer pmfmId = PmfmId.MATURITY.getValue();
183 return thisService.getCaracteristic(pmfmId);
184 }
185
186 @Override
187 public Caracteristic getAgeCaracteristic() {
188 Integer pmfmId = PmfmId.AGE.getValue();
189 return thisService.getCaracteristic(pmfmId);
190 }
191
192 @Override
193 public Caracteristic getMarineLitterCategoryCaracteristic() {
194 Integer pmfmId = PmfmId.MARINE_LITTER_TYPE.getValue();
195 return thisService.getCaracteristic(pmfmId);
196 }
197
198 @Override
199 public Caracteristic getMarineLitterSizeCategoryCaracteristic() {
200 Integer pmfmId = PmfmId.MARINE_LITTER_SIZE_CATEGORY.getValue();
201 return thisService.getCaracteristic(pmfmId);
202 }
203
204 @Override
205 public Caracteristic getVerticalOpeningCaracteristic() {
206 Integer pmfmId = PmfmId.VERTICAL_OPENING.getValue();
207 return thisService.getCaracteristic(pmfmId);
208 }
209
210 @Override
211 public Caracteristic getHorizontalOpeningWingsCaracteristic() {
212 Integer pmfmId = PmfmId.HORIZONTAL_OPENING_WINGS.getValue();
213 return thisService.getCaracteristic(pmfmId);
214 }
215
216 @Override
217 public Caracteristic getHorizontalOpeningDoorCaracteristic() {
218 Integer pmfmId = PmfmId.HORIZONTAL_OPENING_DOOR.getValue();
219 return thisService.getCaracteristic(pmfmId);
220 }
221
222 @Override
223 public Caracteristic getDeadOrAliveCaracteristic() {
224 Integer pmfmId = PmfmId.DEAD_OR_ALIVE.getValue();
225 return thisService.getCaracteristic(pmfmId);
226 }
227
228 @Override
229 public Caracteristic getCalcifiedStructureCaracteristic() {
230 Integer pmfmId = PmfmId2.CALCIFIED_STRUCTURE.getValue();
231 return thisService.getCaracteristic(pmfmId);
232 }
233
234 @Override
235 public Caracteristic getPmfmIdCaracteristic() {
236 Integer pmfmId = PmfmId.ID_PMFM.getValue();
237 return thisService.getCaracteristic(pmfmId);
238 }
239
240 @Override
241 public Caracteristic getWeightMeasuredCaracteristic() {
242 Integer pmfmId = PmfmId.WEIGHT_MEASURED.getValue();
243 return thisService.getCaracteristic(pmfmId);
244 }
245
246 @Override
247 public Caracteristic getCopyIndividualObservationModeCaracteristic() {
248 Integer pmfmId = PmfmId2.COPY_METHOD.getValue();
249 return thisService.getCaracteristic(pmfmId);
250 }
251
252 @Override
253 public Caracteristic getSampleCodeCaracteristic() {
254 Integer pmfmId = PmfmId2.SAMPLE_ID.getValue();
255 return thisService.getCaracteristic(pmfmId);
256 }
257
258 @Override
259 public Caracteristic getCaracteristic(Integer pmfmId) {
260 if (log.isInfoEnabled()) {
261 log.info("Loading caracteristic: " + pmfmId);
262 }
263 Object[] source = queryUniqueWithStatus("pmfmById",
264 "pmfmId", IntegerType.INSTANCE, pmfmId,
265 "unitIdNone", IntegerType.INSTANCE, UnitId.NONE.getValue());
266 return loadCaracteristic(source);
267 }
268
269 @Override
270 public boolean isVracBatch(SpeciesBatch speciesBatch) {
271 return batchVracPredicate.apply(speciesBatch);
272 }
273
274 @Override
275 public boolean isHorsVracBatch(SpeciesBatch speciesBatch) {
276 return !batchVracPredicate.apply(speciesBatch);
277 }
278
279 @Override
280 public Predicate<SpeciesBatch> getVracBatchPredicate() {
281 return batchVracPredicate;
282 }
283
284 protected Caracteristic loadCaracteristic(Object[] source) {
285
286 Integer pmfmId = (Integer) source[0];
287
288 Caracteristic result = Caracteristics.newCaracteristic();
289 result.setId(pmfmId);
290 result.setParameterName((String) source[1]);
291 result.setMatrixName((String) source[2]);
292 result.setFractionName((String) source[3]);
293 result.setMethodName((String) source[4]);
294 CaracteristicType type = Caracteristics.getType((Boolean) source[5],
295 (Boolean) source[6]);
296 result.setCaracteristicType(type);
297 result.setNumericType(Caracteristics.isNumberCaracteristic(result));
298
299 result.setSignifFiguresNumber((Integer) source[7]);
300 result.setMaximumNumberDecimals((Integer) source[8]);
301 result.setPrecision((Float) source[9]);
302 result.setUnit((String) source[10]);
303 setStatus((String) source[11], result);
304
305 if (Caracteristics.isQualitativeCaracteristic(result)) {
306
307
308
309 Iterator<Object[]> sources = queryListWithStatus(
310 "pmfmQualitativeValues",
311 "pmfmId", IntegerType.INSTANCE, pmfmId);
312
313 List<CaracteristicQualitativeValue> values = Lists.newArrayList();
314 while (sources.hasNext()) {
315 Object[] source2 = sources.next();
316 CaracteristicQualitativeValue target2 = CaracteristicQualitativeValues.newCaracteristicQualitativeValue();
317 target2.setId(String.valueOf(source2[0]));
318 target2.setName(String.valueOf(source2[1]));
319 target2.setDescription(String.valueOf(source2[2]));
320 setStatus((String) source2[3], target2);
321 values.add(target2);
322 }
323 result.setQualitativeValue(Collections.unmodifiableList(values));
324 }
325 return result;
326 }
327
328
329
330
331
332
333 protected boolean isProtectedCaracteristic(Integer pmfmId) {
334 return propertedPmfmIds.contains(pmfmId);
335 }
336
337 }