1 package fr.ifremer.tutti.persistence.service.util;
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.collect.Sets;
26 import fr.ifremer.adagio.core.dao.data.measure.SampleMeasurement;
27 import fr.ifremer.adagio.core.dao.data.sample.Sample;
28 import fr.ifremer.adagio.core.dao.data.sample.SampleDao;
29 import fr.ifremer.adagio.core.dao.referential.ObjectTypeCode;
30 import fr.ifremer.adagio.core.dao.referential.QualityFlagCode;
31 import fr.ifremer.adagio.core.dao.referential.QualityFlagImpl;
32 import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmId;
33 import fr.ifremer.adagio.core.dao.referential.pmfm.PmfmImpl;
34 import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
35 import fr.ifremer.tutti.persistence.entities.data.SampleEntity;
36 import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
37 import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValues;
38 import fr.ifremer.tutti.persistence.service.AbstractPersistenceService;
39 import fr.ifremer.tutti.persistence.service.AttachmentPersistenceService;
40 import fr.ifremer.tutti.persistence.service.referential.CaracteristicPersistenceService;
41 import org.apache.commons.logging.Log;
42 import org.apache.commons.logging.LogFactory;
43 import org.hibernate.type.IntegerType;
44 import org.springframework.dao.DataRetrievalFailureException;
45 import org.springframework.stereotype.Component;
46
47 import javax.annotation.Resource;
48 import java.io.Serializable;
49 import java.util.Iterator;
50 import java.util.Set;
51
52
53
54
55
56
57
58 @Component("samplePersistenceHelper")
59 public class SamplePersistenceHelper extends AbstractPersistenceService {
60
61
62 private static final Log log = LogFactory.getLog(SamplePersistenceHelper.class);
63
64 @Resource(name = "caracteristicPersistenceService")
65 private CaracteristicPersistenceService caracteristicService;
66
67 @Resource(name = "measurementPersistenceHelper")
68 protected MeasurementPersistenceHelper measurementPersistenceHelper;
69
70 @Resource(name = "attachmentPersistenceService")
71 protected AttachmentPersistenceService attachmentPersistenceService;
72
73 @Resource(name = "synchronizationStatusHelper")
74 protected SynchronizationStatusHelper synchronizationStatusHelper;
75
76 @Resource(name = "sampleDao")
77 protected SampleDao sampleDao;
78
79 public Sample create(Sample sample) {
80
81
82 synchronizationStatusHelper.setDirty(sample);
83
84 return sampleDao.create(sample);
85 }
86
87 public void update(Sample sample) {
88
89
90 synchronizationStatusHelper.setDirty(sample);
91
92 sampleDao.update(sample);
93 }
94
95 public Sample load(Integer id) {
96 Sample sample = sampleDao.load(id);
97 if (sample == null) {
98 throw new DataRetrievalFailureException("Could not retrieve sample id=" + id);
99 }
100 return sample;
101 }
102
103 public void deleteSample(Integer sampleId) {
104
105 if (log.isDebugEnabled()) {
106 log.debug("Delete sample: " + sampleId);
107 }
108 Sample sample = load(sampleId);
109
110
111 synchronizationStatusHelper.setDirty(sample);
112
113 sample.getSampleMeasurements().clear();
114 sampleDao.remove(sample);
115 attachmentPersistenceService.deleteAllAttachment(ObjectTypeCode.SAMPLE, sampleId);
116 }
117
118 public void setSampleMeasurements(Sample target, CaracteristicMap caracteristics) {
119
120 Set<SampleMeasurement> notChangedSampleMeasurements = Sets.newHashSet();
121 if (target.getSampleMeasurements() != null) {
122 notChangedSampleMeasurements.addAll(target.getSampleMeasurements());
123 }
124
125 for (Caracteristic caracteristic : caracteristics.keySet()) {
126 SampleMeasurement vum = setSampleMeasurement(target, caracteristic, caracteristics.get(caracteristic));
127 notChangedSampleMeasurements.remove(vum);
128 }
129
130 if (target.getSampleMeasurements() != null && notChangedSampleMeasurements.size() > 0) {
131 target.getSampleMeasurements().removeAll(notChangedSampleMeasurements);
132 }
133 }
134
135 public <S extends SampleEntity> void loadSampleMeasurements(S sample) {
136
137 Integer sampleId = sample.getIdAsInt();
138 Iterator<Object[]> list = queryList("sampleMeasurements", "sampleId", IntegerType.INSTANCE, sampleId);
139
140 CaracteristicMap caracteristicMap = sample.getCaracteristics();
141
142 while (list.hasNext()) {
143
144 Object[] source = list.next();
145 Integer pmfmId = (Integer) source[0];
146 Caracteristic caracteristic = caracteristicService.getCaracteristic(pmfmId);
147 Serializable value = getMeasurementValue(caracteristic, source);
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167 caracteristicMap.put(caracteristic, value);
168 }
169
170 Float weight = caracteristicMap.removeFloatValue(caracteristicService.getCaracteristic(PmfmId.WEIGHT_MEASURED.getValue()));
171 if (weight != null) {
172 sample.setWeight(weight);
173 }
174
175 String lengthClassId = caracteristicMap.removeStringValue(caracteristicService.getCaracteristic(PmfmId.ID_PMFM.getValue()));
176 if (lengthClassId != null) {
177 Caracteristic lengthStepCaracteristic = caracteristicService.getCaracteristic(Integer.valueOf(lengthClassId));
178 sample.setLengthStepCaracteristic(lengthStepCaracteristic);
179
180 Float length = caracteristicMap.removeFloatValue(lengthStepCaracteristic);
181 sample.setSize(length);
182 }
183
184 }
185
186 public <S extends SampleEntity> Serializable getSampleMeasurementValue(Integer sampleId, Caracteristic caracteristic) {
187
188 Object[] source = queryUnique("sampleMeasurement",
189 "sampleId", IntegerType.INSTANCE, sampleId,
190 "pmfmId", IntegerType.INSTANCE, caracteristic.getIdAsInt());
191
192 Serializable value = null;
193 if (source != null) {
194 value = getMeasurementValue(caracteristic, source);
195 }
196
197 return value;
198 }
199
200 public <S extends SampleEntity> CaracteristicMap extractCommonSampleCaracteristics(S sample) {
201
202 CaracteristicMap caracteristics = CaracteristicMap.copy(sample.getCaracteristics());
203
204 if (sample.getWeight() != null) {
205
206 Caracteristic caracteristic = caracteristicService.getWeightMeasuredCaracteristic();
207 caracteristics.put(caracteristic, sample.getWeight());
208 }
209
210 if (sample.getLengthStepCaracteristic() != null) {
211
212 Caracteristic caracteristic = caracteristicService.getCaracteristic(PmfmId.ID_PMFM.getValue());
213 caracteristics.put(caracteristic, sample.getLengthStepCaracteristic().getId());
214
215 caracteristics.put(sample.getLengthStepCaracteristic(), sample.getSize());
216 }
217
218 return caracteristics;
219
220 }
221
222 protected SampleMeasurement setSampleMeasurement(Sample sample, Caracteristic caracteristic, Serializable value) {
223
224 Integer pmfmId = caracteristic.getIdAsInt();
225
226 SampleMeasurement result = null;
227 if (sample.getSampleMeasurements() != null) {
228 for (SampleMeasurement vum : sample.getSampleMeasurements()) {
229 if (pmfmId.equals(vum.getPmfm().getId())) {
230 result = vum;
231 break;
232 }
233 }
234 }
235 if (result == null) {
236
237 result = SampleMeasurement.Factory.newInstance();
238
239 result.setSample(sample);
240 if (sample.getSampleMeasurements() == null) {
241 sample.setSampleMeasurements(Sets.newHashSet(result));
242 } else {
243 sample.getSampleMeasurements().add(result);
244 }
245 result.setQualityFlag(load(QualityFlagImpl.class, QualityFlagCode.NOTQUALIFIED.getValue()));
246 result.setDepartment(sample.getRecorderDepartment());
247 result.setPmfm(load(PmfmImpl.class, pmfmId));
248 }
249 measurementPersistenceHelper.setMeasurement(result, caracteristic, value);
250 return result;
251 }
252
253 protected Serializable getMeasurementValue(Caracteristic caracteristic, Object[] source) {
254
255 Serializable value;
256
257 int colIndex = 1;
258
259 Float numericalValue = (Float) source[colIndex++];
260 String alphanumericalValue = (String) source[colIndex++];
261 Integer qualitativeValueId = (Integer) source[colIndex];
262
263 switch (caracteristic.getCaracteristicType()) {
264
265 case NUMBER:
266 value = numericalValue;
267 break;
268 case QUALITATIVE:
269 value = CaracteristicQualitativeValues.getQualitativeValue(caracteristic, qualitativeValueId);
270 break;
271 case TEXT:
272 value = alphanumericalValue;
273 break;
274 default:
275 throw new IllegalStateException("Can't deal with caracteristicType: " + caracteristic.getCaracteristicType());
276 }
277 return value;
278 }
279
280 }