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.CaracteristicMap;
28  import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode;
29  import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
30  import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
31  import fr.ifremer.tutti.service.sampling.SamplingCodePrefix;
32  import fr.ifremer.tutti.ui.swing.content.operation.catches.species.edit.SpeciesBatchRowModel;
33  import fr.ifremer.tutti.ui.swing.util.table.AbstractTuttiTableUIModel;
34  import org.apache.commons.logging.Log;
35  import org.apache.commons.logging.LogFactory;
36  import org.nuiton.jaxx.application.bean.JavaBeanObject;
37  
38  import java.io.Serializable;
39  import java.util.ArrayList;
40  import java.util.Collection;
41  import java.util.List;
42  
43  /**
44   * Created on 16/04/16.
45   *
46   * @author Tony Chemit - chemit@codelutin.com
47   */
48  public class IndividualObservationBatchUIModel extends AbstractTuttiTableUIModel<SpeciesBatchRowModel, IndividualObservationBatchRowModel, IndividualObservationBatchUIModel> implements JavaBeanObject {
49  
50      private static final long serialVersionUID = 1L;
51  
52      /** Logger. */
53      private static final Log log = LogFactory.getLog(IndividualObservationBatchUIModel.class);
54  
55      /**
56       * Global screen model.
57       *
58       * @since 4.5
59       */
60      private final SpeciesFrequencyUIModel parentModel;
61  
62      /**
63       * Samping notification model.
64       *
65       * @since 4.5
66       */
67      private final SamplingNotificationZoneModel samplingNotificationZoneModel;
68  
69      /**
70       * Sexe caracteristic.
71       *
72       * @since 4.5
73       */
74      private final Caracteristic sexCaracteristic;
75  
76      /**
77       * Default caracteristics coming from protocol.
78       *
79       * @since 4.5
80       */
81      private final List<Caracteristic> protocolIndividualObservationCaracteristics;
82  
83      /**
84       * Caracteristique de maturité du protocole
85       */
86      private Caracteristic maturityCaracteristic;
87  
88      /**
89       * Caracteristiques non éditables, car caractéristiques de catégorisation du lot (sexe, maturité, etc)
90       *
91       * @since 4.5
92       */
93      private Collection<Caracteristic> notEditableCaracteristic;
94  
95      /**
96       * Le préfixe du code de prélèvement.
97       *
98       * @since 4.5
99       */
100     protected SamplingCodePrefix samplingCodePrefix;
101 
102     /**
103      * Table model.
104      *
105      * @since 4.5
106      */
107     private IndividualObservationBatchTableModel individualObservationTableModel;
108 
109     @Override
110     protected SpeciesBatchRowModel newEntity() {
111         return null; // Jamais utilisé!
112     }
113 
114     public IndividualObservationBatchUIModel(SpeciesFrequencyUIModel parentModel,
115                                              Caracteristic sexCaracteristic,
116                                              List<Caracteristic> protocolIndividualObservationCaracteristics) {
117         super(SpeciesBatchRowModel.class, null, null);
118         this.parentModel = parentModel;
119         this.sexCaracteristic = sexCaracteristic;
120         this.protocolIndividualObservationCaracteristics = protocolIndividualObservationCaracteristics == null ?
121                                                            new ArrayList<>() : new ArrayList<>(protocolIndividualObservationCaracteristics);
122         this.samplingNotificationZoneModel = new SamplingNotificationZoneModel();
123     }
124 
125     public SamplingNotificationZoneModel getSamplingNotificationZoneModel() {
126         return samplingNotificationZoneModel;
127     }
128 
129     public SamplingCodePrefix getSamplingCodePrefix() {
130         return samplingCodePrefix;
131     }
132 
133     public void setSamplingCodePrefix(SamplingCodePrefix samplingCodePrefix) {
134         this.samplingCodePrefix = samplingCodePrefix;
135     }
136 
137     public List<Caracteristic> getProtocolIndividualObservationCaracteristics() {
138         return protocolIndividualObservationCaracteristics;
139     }
140 
141     public boolean withMaturityCaracteristic() {
142         return maturityCaracteristic != null;
143     }
144 
145     public Caracteristic getMaturityCaracteristic() {
146         return maturityCaracteristic;
147     }
148 
149     public void setMaturityCaracteristic(Caracteristic maturityCaracteristic) {
150         this.maturityCaracteristic = maturityCaracteristic;
151     }
152 
153     public CaracteristicQualitativeValue getMaturityValue(IndividualObservationBatchRowModel row) {
154 
155         CaracteristicQualitativeValue caracteristicValue = null;
156         if (withMaturityCaracteristic()) {
157             caracteristicValue = row.getCaracteristicQualitativeValue(maturityCaracteristic);
158         }
159         return caracteristicValue;
160 
161     }
162 
163     public CaracteristicQualitativeValue getMaturityValue(CaracteristicMap caracteristicMap) {
164 
165         CaracteristicQualitativeValue caracteristicValue = null;
166         if (withMaturityCaracteristic()) {
167             caracteristicValue = caracteristicMap.getQualitativeValue(maturityCaracteristic);
168         }
169         return caracteristicValue;
170 
171     }
172 
173     public void moveMaturityValueFromCaracteristicsToDefaultCaracteristics(IndividualObservationBatchRowModel newRow) {
174 
175         if (withMaturityCaracteristic()) {
176 
177             Serializable caracteristicValue = newRow.getCaracteristics().remove(maturityCaracteristic);
178             newRow.getDefaultCaracteristics().putIfAbsent(maturityCaracteristic, caracteristicValue);
179 
180         }
181     }
182 
183     public void setMaturityValueToDefaultCaracterictis(IndividualObservationBatchRowModel result, CaracteristicQualitativeValue maturityState) {
184         result.getDefaultCaracteristics().put(maturityCaracteristic, maturityState);
185     }
186 
187     public Caracteristic getSexCaracteristic() {
188         return sexCaracteristic;
189     }
190 
191     public CaracteristicQualitativeValue getGender(IndividualObservationBatchRowModel row) {
192         return row.getCaracteristicQualitativeValue(sexCaracteristic);
193     }
194 
195     public CaracteristicQualitativeValue getGender(CaracteristicMap caracteristicMap) {
196         return caracteristicMap.getQualitativeValue(sexCaracteristic);
197     }
198 
199     public void setGenderValueToDefaultCaracterictis(IndividualObservationBatchRowModel result, CaracteristicQualitativeValue gender) {
200         result.getDefaultCaracteristics().put(sexCaracteristic, gender);
201     }
202 
203     public void moveGenderValueFromCaracteristicsToDefaultCaracteristics(IndividualObservationBatchRowModel newRow) {
204         Serializable caracteristicValue = newRow.getCaracteristics().remove(sexCaracteristic);
205         if (caracteristicValue != null) {
206             newRow.getDefaultCaracteristics().putIfAbsent(sexCaracteristic, caracteristicValue);
207         }
208     }
209 
210     public void setNotEditableCaracteristic(Collection<Caracteristic> notEditableCaracteristic) {
211         this.notEditableCaracteristic = notEditableCaracteristic;
212     }
213 
214     /**
215      * TODO Voir si c'est vraiment nécessaire de vérifier que les lignes ne sont pas vides ?
216      *
217      * @return {@code true} s'il existe au moins une ligne en erreur avec des caractéristiques remplies
218      */
219     public boolean isNonEmptyRowInError() {
220         return rowsInError.stream().anyMatch(row -> !row.isEmpty(notEditableCaracteristic));
221     }
222 
223     public void recomputeRowsValidateState() {
224 
225         if (log.isInfoEnabled()) {
226             log.info("Revalidate all individual observation rows");
227         }
228 
229         rowsInError.clear();
230 
231         rows.forEach(row -> {
232             // recompute row valid state
233             boolean valid = row.computeValid();
234 
235             // apply it to row
236             row.setValid(valid);
237             if (!valid) {
238                 rowsInError.add(row);
239             }
240 
241         });
242 
243         firePropertyChange(PROPERTY_ROWS_IN_ERROR, null, rowsInError);
244 
245     }
246 
247     public boolean recomputeCanEditLengthStep() {
248         boolean result = true;
249         if (rows != null) {
250             for (IndividualObservationBatchRowModel row : rows) {
251 
252                 if (row.isEmpty(notEditableCaracteristic)) {
253                     // la ligne est vide
254                     continue;
255                 }
256 
257                 // une ligne non vide et complete a ete trouvee
258                 // on ne peut plus editer
259                 result = false;
260                 break;
261             }
262         }
263         return result;
264     }
265 
266     @Override
267     public void firePropertyChanged(String propertyName, Object oldValue, Object newValue) {
268         super.firePropertyChange(propertyName, oldValue, newValue);
269     }
270 
271     public void recomputeRowValidState(IndividualObservationBatchRowModel row) {
272 
273         // recompute row valid state
274         boolean valid = row.computeValid();
275 
276         // apply it to row
277         row.setValid(valid);
278 
279         if (valid) {
280             removeRowInError(row);
281         } else {
282             addRowInError(row);
283         }
284 
285     }
286 
287     public void setCopyIndividualObservationMode(CopyIndividualObservationMode newCopyMode) {
288 
289         getRows().forEach(row -> row.setCopyIndividualObservationMode(newCopyMode));
290         recomputeRowsValidateState();
291 
292         individualObservationTableModel.fireTableDataChanged();
293 
294     }
295 
296     public void removeIndividualObservations(Collection<IndividualObservationBatchRowModel> rows) {
297 
298         // on supprime les observations individuelles des caches
299         parentModel.getIndividualObservationUICache().removeIndividualObservations(rows);
300         parentModel.getSamplingCodeUICache().removeIndividualObservations(rows);
301 
302         List<IndividualObservationBatchRowModel> newRows = new ArrayList<>(getRows());
303         newRows.removeAll(rows);
304 
305         setRows(newRows);
306 
307     }
308 
309     public void setIndividualObservationTableModel(IndividualObservationBatchTableModel individualObservationTableModel) {
310         this.individualObservationTableModel = individualObservationTableModel;
311     }
312 
313     public void clear() {
314 
315         removeIndividualObservations(rows);
316 
317     }
318 }