View Javadoc
1   package fr.ifremer.tutti.persistence.service.util;
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.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   * Helper around {@link Sample}.
54   *
55   * @author Tony Chemit - chemit@codelutin.com
56   * @since 1.6
57   */
58  @Component("samplePersistenceHelper")
59  public class SamplePersistenceHelper extends AbstractPersistenceService {
60  
61      /** Logger. */
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          // Synchronization Status
82          synchronizationStatusHelper.setDirty(sample);
83  
84          return sampleDao.create(sample);
85      }
86  
87      public void update(Sample sample) {
88  
89          // Synchronization Status
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         // Synchronization Status
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 //            int colIndex = 0;
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 //            Float numericalValue = (Float) source[colIndex++];
150 //            String alphanumericalValue = (String) source[colIndex++];
151 //            Integer qualitativeValueId = (Integer) source[colIndex];
152 //
153 //
154 //            Serializable value = null;
155 //            switch (caracteristic.getCaracteristicType()) {
156 //
157 //                case NUMBER:
158 //                    value = numericalValue;
159 //                    break;
160 //                case QUALITATIVE:
161 //                    value = CaracteristicQualitativeValues.getQualitativeValue(caracteristic, qualitativeValueId);
162 //                    break;
163 //                case TEXT:
164 //                    value = alphanumericalValue;
165 //                    break;
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         // On commence à 1 car à 0 il y a le pmfmId
257         int colIndex = 1;
258 //        Integer pmfmId = (Integer) source[colIndex++];
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 }