View Javadoc
1   package fr.ifremer.tutti.persistence.service.referential;
2   
3   /*
4    * #%L
5    * Tutti :: Persistence
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2012 - 2014 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU General Public License as
13   * published by the Free Software Foundation, either version 3 of the
14   * License, or (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU General Public
22   * License along with this program.  If not, see
23   * <http://www.gnu.org/licenses/gpl-3.0.html>.
24   * #L%
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   * Created on 11/3/14.
56   *
57   * @author Tony Chemit - chemit@codelutin.com
58   * @since 3.8
59   */
60  @Service("caracteristicPersistenceService")
61  public class CaracteristicPersistenceServiceImpl extends ReferentialPersistenceServiceSupport implements CaracteristicPersistenceService {
62  
63      /** Logger. */
64      private static final Log log = LogFactory.getLog(CaracteristicPersistenceServiceImpl.class);
65  
66      //TODO-TC We should prefer AOP thant Proxy stuff to avoid this.
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          // init protected pmfm ids
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             // Skip some protected PSFM
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         // Search the qualitative value to skip
165         //FIXME-TC How can this works with cache ? result is the cached instance, so we are modifing cache
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             // load qualitative values
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      * @param pmfmId id of pmfm to test
330      * @return {@code true} if the pmfm should NOT be used for caracteristics lists
331      * (i.e. because used somewhere when storing some properties into the database)
332      */
333     protected boolean isProtectedCaracteristic(Integer pmfmId) {
334         return propertedPmfmIds.contains(pmfmId);
335     }
336 
337 }