1 package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency;
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 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
49
50
51
52
53
54
55
56 public class IndividualObservationUICache implements Closeable {
57
58
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
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
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
134
135 IndividualObservationSamplingCacheRequest samplingCacheRequest = uiModel.toSamplingCacheRequest(row);
136 IndividualObservationSamplingStatus result = cruiseSamplingCache.getIndividualObservationSamplingStatus(samplingCacheRequest);
137
138
139
140 Boolean protocolMaturity = result.getIndividualObservationSamplingContext().getCalcifiedPiecesSamplingDefinition().getMaturity();
141 boolean withSex = result.getIndividualObservationSamplingContext().getCalcifiedPiecesSamplingDefinition().isSex();
142
143
144 boolean mergeMaturity = protocolMaturity == null;
145
146 boolean mergeGender = !withSex;
147
148 if (mergeMaturity && mergeGender) {
149 samplingCacheRequest.setForcedMaturity(null);
150 IndividualObservationSamplingStatus iossNullMature =
151 getIndividualObservationSamplingStatusSumOverGenre(samplingCacheRequest);
152
153 samplingCacheRequest.setForcedMaturity(true);
154 IndividualObservationSamplingStatus iossMature =
155 getIndividualObservationSamplingStatusSumOverGenre(samplingCacheRequest);
156
157 samplingCacheRequest.setForcedMaturity(false);
158 IndividualObservationSamplingStatus iossNoMature =
159 getIndividualObservationSamplingStatusSumOverGenre(samplingCacheRequest);
160
161 result = iossNullMature;
162 result.add(iossMature);
163 result.add(iossNoMature);
164 } else if (mergeMaturity) {
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) {
178 result = getIndividualObservationSamplingStatusSumOverGenre(samplingCacheRequest);
179 }
180
181 return result;
182 }
183
184
185
186
187
188
189
190
191
192
193
194
195 private IndividualObservationSamplingStatus getIndividualObservationSamplingStatusSumOverGenre(
196 IndividualObservationSamplingCacheRequest samplingCacheRequest)
197 throws SizeNotDefinedOnIndividualObservationException, ZoneNotDefinedOnFishingOperationException, CalcifiedPiecesSamplingAlgorithmEntryNotFoundException {
198
199
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 }