View Javadoc
1   package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency;
2   
3   /*
4    * #%L
5    * Tutti :: UI
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2012 - 2016 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 fr.ifremer.tutti.persistence.entities.data.FishingOperation;
28  import fr.ifremer.tutti.persistence.entities.protocol.Zone;
29  import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
30  import fr.ifremer.tutti.persistence.entities.referential.Species;
31  import fr.ifremer.tutti.service.cruise.CruiseCache;
32  import fr.ifremer.tutti.service.sampling.CalcifiedPiecesSamplingAlgorithmEntryNotFoundException;
33  import fr.ifremer.tutti.service.sampling.CruiseSamplingCache;
34  import fr.ifremer.tutti.service.sampling.IndividualObservationSamplingCacheRequest;
35  import fr.ifremer.tutti.service.sampling.IndividualObservationSamplingStatus;
36  import fr.ifremer.tutti.service.sampling.SizeNotDefinedOnIndividualObservationException;
37  import fr.ifremer.tutti.service.sampling.ZoneNotDefinedOnFishingOperationException;
38  import org.apache.commons.logging.Log;
39  import org.apache.commons.logging.LogFactory;
40  
41  import java.io.Closeable;
42  import java.util.Collection;
43  import java.util.List;
44  import java.util.Objects;
45  import java.util.Optional;
46  
47  /**
48   * Cache des observations individuelles.
49   *
50   * Gère notamment le cache de prélèvement des pièces calcifiés, mais aussi le cache des codes de prélèvements.
51   *
52   * Created on 19/03/16.
53   *
54   * @author Tony Chemit - chemit@codelutin.com
55   */
56  public class IndividualObservationUICache implements Closeable {
57  
58      /** Logger. */
59      private static final Log log = LogFactory.getLog(IndividualObservationUICache.class);
60  
61      private final CruiseSamplingCache cruiseSamplingCache;
62      private final boolean useCruiseSamplingCache;
63      private final SpeciesFrequencyUIModel uiModel;
64  
65      private boolean speciesDefinedInCalcifiedPiecesSampling;
66      private Zone fishingOperationZone;
67  
68      public IndividualObservationUICache(CruiseCache cruiseCache, SpeciesFrequencyUIModel uiModel) {
69          this.useCruiseSamplingCache = cruiseCache.useSamplingCache();
70          this.cruiseSamplingCache = cruiseCache.getSamplingCruiseCache().orElse(null);
71          this.uiModel = uiModel;
72      }
73  
74      public boolean useCruiseSamplingCache() {
75          return useCruiseSamplingCache;
76      }
77  
78      public boolean isSpeciesDefinedInCalcifiedPiecesSampling() {
79          return speciesDefinedInCalcifiedPiecesSampling;
80      }
81  
82      public boolean isFishingOperationWithZone() {
83          return fishingOperationZone != null;
84      }
85  
86      public void initFishingOperation(FishingOperation fishingOperation) {
87  
88          Objects.requireNonNull(fishingOperation);
89          if (useCruiseSamplingCache) {
90  
91              // calcule de la zone associée à l'opération de pêche
92              Optional<Zone> optionalZone = cruiseSamplingCache.tryFindZone(fishingOperation);
93  
94              if (log.isInfoEnabled()) {
95                  log.info("Init fishing operation zone: " + optionalZone);
96              }
97  
98              fishingOperationZone = optionalZone.orElse(null);
99  
100         }
101 
102     }
103 
104     public void init(Species species, List<IndividualObservationBatchRowModel> individualObservations, boolean addToCache) {
105 
106         Objects.requireNonNull(species);
107         Objects.requireNonNull(individualObservations);
108 
109         if (useCruiseSamplingCache) {
110 
111             // est-ce que l'espèce du lot existe dans l'algortihme des pièces calcifiées
112             speciesDefinedInCalcifiedPiecesSampling = cruiseSamplingCache.isSpeciesDefined(species);
113 
114         }
115 
116         if (addToCache) {
117 
118             addIndividualObservations(individualObservations);
119 
120         }
121 
122     }
123 
124     @Override
125     public void close() {
126         this.fishingOperationZone = null;
127     }
128 
129     public IndividualObservationSamplingStatus getIndividualObservationSamplingStatus(IndividualObservationBatchRowModel row) throws CalcifiedPiecesSamplingAlgorithmEntryNotFoundException, SizeNotDefinedOnIndividualObservationException, ZoneNotDefinedOnFishingOperationException {
130 
131         Objects.requireNonNull(row);
132 
133         // on commence par prendre le status exact (tout est discreminé: sexe, maturité)
134         // comme ca on collecte des informations utiles pour la suite (maturity)
135         IndividualObservationSamplingCacheRequest samplingCacheRequest = uiModel.toSamplingCacheRequest(row);
136         IndividualObservationSamplingStatus result = cruiseSamplingCache.getIndividualObservationSamplingStatus(samplingCacheRequest);
137 
138         // fixes bug #8661: solution 2)
139         // on regarde s'il faut sommer sur les maturity et/ou les genres
140         Boolean protocolMaturity = result.getIndividualObservationSamplingContext().getCalcifiedPiecesSamplingDefinition().getMaturity();
141         boolean withSex = result.getIndividualObservationSamplingContext().getCalcifiedPiecesSamplingDefinition().isSex();
142 
143         // on merge si le boolean maturity est a null (pas de maturite)
144         boolean mergeMaturity = protocolMaturity == null;
145         // on merge si le boolean sex est a faux (pas de sex)
146         boolean mergeGender = !withSex;
147 
148         if (mergeMaturity && mergeGender) { // il faut sommer sur les deux
149             samplingCacheRequest.setForcedMaturity(null); // sans maturite
150             IndividualObservationSamplingStatus iossNullMature =
151                     getIndividualObservationSamplingStatusSumOverGenre(samplingCacheRequest);
152 
153             samplingCacheRequest.setForcedMaturity(true); // mature
154             IndividualObservationSamplingStatus iossMature =
155                     getIndividualObservationSamplingStatusSumOverGenre(samplingCacheRequest);
156 
157             samplingCacheRequest.setForcedMaturity(false); // immature
158             IndividualObservationSamplingStatus iossNoMature =
159                     getIndividualObservationSamplingStatusSumOverGenre(samplingCacheRequest);
160 
161             result = iossNullMature;
162             result.add(iossMature);
163             result.add(iossNoMature);
164         } else if (mergeMaturity) { // il faut sommer que sur la maturity
165             samplingCacheRequest.setForcedMaturity(null);
166             IndividualObservationSamplingStatus iossNullMature =
167                     cruiseSamplingCache.getIndividualObservationSamplingStatus(samplingCacheRequest);
168             samplingCacheRequest.setForcedMaturity(true);
169             IndividualObservationSamplingStatus iossMature =
170                     cruiseSamplingCache.getIndividualObservationSamplingStatus(samplingCacheRequest);
171             samplingCacheRequest.setForcedMaturity(false);
172             IndividualObservationSamplingStatus iossNoMature =
173                     cruiseSamplingCache.getIndividualObservationSamplingStatus(samplingCacheRequest);
174             result = iossNullMature;
175             result.add(iossMature);
176             result.add(iossNoMature);
177         } else if (mergeGender) { // il faut sommer que sur le genre
178             result = getIndividualObservationSamplingStatusSumOverGenre(samplingCacheRequest);
179         }
180 
181         return result;
182     }
183 
184     /**
185      * il faut bouclé sur tous les sexes possibles pour pouvoir faire
186      * la somme et retourne un nouvel object status contenant cette
187      * somme sur les sexes.
188      *
189      * @param samplingCacheRequest
190      * @return
191      * @throws SizeNotDefinedOnIndividualObservationException
192      * @throws ZoneNotDefinedOnFishingOperationException
193      * @throws CalcifiedPiecesSamplingAlgorithmEntryNotFoundException
194      */
195     private IndividualObservationSamplingStatus getIndividualObservationSamplingStatusSumOverGenre(
196             IndividualObservationSamplingCacheRequest samplingCacheRequest)
197             throws SizeNotDefinedOnIndividualObservationException, ZoneNotDefinedOnFishingOperationException, CalcifiedPiecesSamplingAlgorithmEntryNotFoundException {
198         // ne pas oublier le null comme valeur possible, qui n'est pas dans les getQualitativeValue
199         // elle devient la valeur par defaut pour qu'il n'y ait pas de sexe dans le resultat
200         samplingCacheRequest.setGender(null);
201         IndividualObservationSamplingStatus result =
202                 cruiseSamplingCache.getIndividualObservationSamplingStatus(
203                         samplingCacheRequest);
204 
205         for (CaracteristicQualitativeValue sex : uiModel.getIndividualObservationModel().getSexCaracteristic().getQualitativeValue()) {
206             samplingCacheRequest.setGender(sex);
207             result.add(
208                     cruiseSamplingCache.getIndividualObservationSamplingStatus(samplingCacheRequest)
209             );
210         }
211         return result;
212     }
213 
214     public void addIndividualObservations(Collection<IndividualObservationBatchRowModel> individualObservationRows) {
215 
216         Objects.requireNonNull(individualObservationRows);
217 
218         individualObservationRows.stream()
219                                  .filter(IndividualObservationBatchRowModel::withSize)
220                                  .forEach(row -> {
221 
222                                      IndividualObservationSamplingCacheRequest samplingCacheRequest = uiModel.toSamplingCacheRequest(row);
223                                      addIndividualObservation(samplingCacheRequest);
224 
225                                  });
226 
227     }
228 
229     public void removeIndividualObservations(Collection<IndividualObservationBatchRowModel> individualObservationRows) {
230 
231         Objects.requireNonNull(individualObservationRows);
232 
233         individualObservationRows.stream()
234                                  .filter(IndividualObservationBatchRowModel::withSize)
235                                  .forEach(row -> {
236 
237                                      IndividualObservationSamplingCacheRequest samplingCacheRequest = uiModel.toSamplingCacheRequest(row);
238 
239                                      try {
240                                          removeIndividualObservation(samplingCacheRequest);
241                                      } catch (Exception e) {
242                                          if (log.isErrorEnabled()) {
243                                              log.error("Could not remove individual observation", e);
244                                          }
245                                      }
246 
247                                  });
248 
249     }
250 
251     public void addIndividualObservation(IndividualObservationSamplingCacheRequest samplingCacheRequest) {
252 
253         Objects.requireNonNull(samplingCacheRequest);
254 
255         if (useCruiseSamplingCache && samplingCacheRequest.withLengthClass()) {
256 
257             cruiseSamplingCache.addIndividualObservation(samplingCacheRequest);
258 
259         }
260 
261     }
262 
263     public void removeIndividualObservation(IndividualObservationSamplingCacheRequest samplingCacheRequest) {
264 
265         Objects.requireNonNull(samplingCacheRequest);
266 
267         if (useCruiseSamplingCache && samplingCacheRequest.withLengthClass()) {
268 
269             cruiseSamplingCache.removeIndividualObservation(samplingCacheRequest);
270 
271         }
272 
273     }
274 
275     public void addSampling(IndividualObservationSamplingCacheRequest samplingCacheRequest) {
276 
277         Objects.requireNonNull(samplingCacheRequest);
278 
279         String samplingCode = samplingCacheRequest.getSamplingCode();
280         Objects.requireNonNull(samplingCode);
281 
282         if (useCruiseSamplingCache && samplingCacheRequest.withLengthClass()) {
283 
284             cruiseSamplingCache.addSampling(samplingCacheRequest);
285 
286         }
287 
288     }
289 
290     public void removeSampling(IndividualObservationSamplingCacheRequest samplingCacheRequest) {
291 
292         Objects.requireNonNull(samplingCacheRequest);
293 
294         String samplingCode = samplingCacheRequest.getSamplingCode();
295         Objects.requireNonNull(samplingCode);
296 
297         if (useCruiseSamplingCache && samplingCacheRequest.withLengthClass()) {
298 
299             cruiseSamplingCache.removeSampling(samplingCacheRequest);
300 
301         }
302 
303     }
304 
305 }