View Javadoc
1   package fr.ifremer.tutti.ui.swing.content.operation.catches.species.frequency;
2   
3   /*
4    * #%L
5    * Tutti :: UI
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.Lists;
26  import fr.ifremer.adagio.core.dao.referential.ObjectTypeCode;
27  import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
28  import fr.ifremer.tutti.persistence.entities.data.Attachment;
29  import fr.ifremer.tutti.persistence.entities.data.CopyIndividualObservationMode;
30  import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
31  import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatch;
32  import fr.ifremer.tutti.persistence.entities.data.IndividualObservationBatchs;
33  import fr.ifremer.tutti.persistence.entities.data.SpeciesBatch;
34  import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
35  import fr.ifremer.tutti.persistence.entities.referential.CaracteristicQualitativeValue;
36  import fr.ifremer.tutti.persistence.entities.referential.Species;
37  import fr.ifremer.tutti.service.sampling.SamplingCodePrefix;
38  import fr.ifremer.tutti.type.WeightUnit;
39  import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel;
40  import fr.ifremer.tutti.ui.swing.util.attachment.AttachmentModelAware;
41  import fr.ifremer.tutti.ui.swing.util.caracteristics.CaracteristicMapColumnRowModel;
42  import org.apache.commons.lang3.StringUtils;
43  import org.nuiton.util.beans.Binder;
44  import org.nuiton.util.beans.BinderFactory;
45  
46  import java.io.Serializable;
47  import java.util.Collection;
48  import java.util.Collections;
49  import java.util.List;
50  import java.util.Map;
51  
52  /**
53   * @author Kevin Morin - kmorin@codelutin.com
54   * @since 1.4
55   */
56  public class IndividualObservationBatchRowModel extends AbstractTuttiBeanUIModel<IndividualObservationBatch, IndividualObservationBatchRowModel>
57          implements AttachmentModelAware, IndividualObservationBatch, CaracteristicMapColumnRowModel {
58  
59      private static final long serialVersionUID = 1L;
60  
61      public static final String PROPERTY_DEFAULT_CARACTERISTICS = "defaultCaracteristics";
62  
63      /**
64       * Delegate edit object.
65       *
66       * @since 1.3
67       */
68      protected final IndividualObservationBatch editObject = IndividualObservationBatchs.newIndividualObservationBatch();
69  
70      /**
71       * Attachments (should never be null).
72       *
73       * @since 0.2
74       */
75      protected final List<Attachment> attachment = Lists.newArrayList();
76  
77      /**
78       * Map of default caracteristics (used if filled in the protocol.
79       *
80       * @since 2.5
81       */
82      protected CaracteristicMap defaultCaracteristics = new CaracteristicMap();
83  
84      /**
85       * Weight unit.
86       *
87       * @since 2.5
88       */
89      protected final WeightUnit weightUnit;
90  
91  //    /**
92  //     * @since 4.5
93  //     */
94  //    protected SamplingCodePrefix samplingCodePrefix;
95  
96      protected static final Binder<IndividualObservationBatch, IndividualObservationBatchRowModel> fromBeanBinder =
97              BinderFactory.newBinder(IndividualObservationBatch.class,
98                                      IndividualObservationBatchRowModel.class);
99  
100     protected static final Binder<IndividualObservationBatchRowModel, IndividualObservationBatch> toBeanBinder =
101             BinderFactory.newBinder(IndividualObservationBatchRowModel.class,
102                                     IndividualObservationBatch.class);
103 
104     public IndividualObservationBatchRowModel(WeightUnit weightUnit,
105                                               CaracteristicMap defaultCaracteristicMap) {
106         super(fromBeanBinder, toBeanBinder);
107         this.weightUnit = weightUnit;
108         if (getCaracteristics() == null) {
109             setCaracteristics(new CaracteristicMap());
110         }
111         setDefaultCaracteristics(CaracteristicMap.copy(defaultCaracteristicMap));
112     }
113 
114     public IndividualObservationBatchRowModel(WeightUnit weightUnit,
115                                               Collection<Caracteristic> defaultCaracteristicsSet,
116                                               IndividualObservationBatch entity) {
117 
118         this(weightUnit, CaracteristicMap.fromCollection(defaultCaracteristicsSet));
119 
120         fromEntity(entity);
121     }
122 
123     //------------------------------------------------------------------------//
124     //-- Public methods                                                     --//
125     //------------------------------------------------------------------------//
126 
127     public CaracteristicMap getDefaultCaracteristics() {
128         return defaultCaracteristics;
129     }
130 
131     public void setDefaultCaracteristics(CaracteristicMap defaultCaracteristics) {
132         Object oldValue = CaracteristicMap.copy(getDefaultCaracteristics());
133         this.defaultCaracteristics = defaultCaracteristics;
134         firePropertyChange(PROPERTY_DEFAULT_CARACTERISTICS, oldValue, defaultCaracteristics);
135     }
136 
137     //------------------------------------------------------------------------//
138     //-- AbstractTuttiBeanUIModel                                           --//
139     //------------------------------------------------------------------------//
140 
141     @Override
142     public void fromEntity(IndividualObservationBatch entity) {
143         super.fromEntity(entity);
144 
145         // convert weight
146         setWeight(weightUnit.fromEntity(getWeight()));
147 
148         CaracteristicMap caracteristics = getCaracteristics();
149         if (caracteristics == null) {
150             setCaracteristics(new CaracteristicMap());
151 
152         } else {
153             // move default caracteristics from caracteristic map
154             for (Caracteristic caracteristic : getDefaultCaracteristics().keySet()) {
155                 if (caracteristics.containsKey(caracteristic)) {
156                     Serializable value = caracteristics.remove(caracteristic);
157                     defaultCaracteristics.put(caracteristic, value);
158                 }
159             }
160         }
161     }
162 
163     public static List<IndividualObservationBatchRowModel> fromEntity(WeightUnit weightUnit,
164                                                                       Collection<Caracteristic> defaultCaracteristicsSet,
165                                                                       List<IndividualObservationBatch> entities) {
166         List<IndividualObservationBatchRowModel> result = Lists.newArrayList();
167         for (IndividualObservationBatch entity : entities) {
168 
169             IndividualObservationBatchRowModel row =
170                     new IndividualObservationBatchRowModel(weightUnit, defaultCaracteristicsSet, entity);
171             result.add(row);
172         }
173         return result;
174     }
175 
176     @Override
177     public IndividualObservationBatch toEntity() {
178         IndividualObservationBatch result = super.toEntity();
179 
180         // convert weight
181         result.setWeight(weightUnit.toEntity(getWeight()));
182 
183         CaracteristicMap caracteristics = new CaracteristicMap();
184         result.setCaracteristics(caracteristics);
185 
186         // push back not null extra caracteristics
187         for (Map.Entry<Caracteristic, Serializable> entry : getCaracteristics().entrySet()) {
188             Serializable value = entry.getValue();
189             if (value != null) {
190                 caracteristics.put(entry.getKey(), value);
191             }
192         }
193 
194         // push back not null default caracteristics
195         for (Map.Entry<Caracteristic, Serializable> entry : getDefaultCaracteristics().entrySet()) {
196             Serializable value = entry.getValue();
197             if (value != null) {
198                 caracteristics.put(entry.getKey(), value);
199             }
200         }
201 
202         return result;
203     }
204 
205     public static List<IndividualObservationBatch> toEntity(List<IndividualObservationBatchRowModel> rows,
206                                                             SpeciesBatch batch) {
207         List<IndividualObservationBatch> result = Lists.newArrayList();
208         for (IndividualObservationBatchRowModel row : rows) {
209 
210             IndividualObservationBatch entity = row.toEntity();
211             entity.setBatchId(batch.getIdAsInt());
212             entity.setFishingOperation(batch.getFishingOperation());
213             entity.setSpecies(batch.getSpecies());
214             result.add(entity);
215         }
216         return result;
217     }
218 
219     @Override
220     protected IndividualObservationBatch newEntity() {
221         return IndividualObservationBatchs.newIndividualObservationBatch();
222     }
223 
224     //------------------------------------------------------------------------//
225     //-- IndividualObservationBatch                                         --//
226     //------------------------------------------------------------------------//
227 
228     @Override
229     public Integer getBatchId() {
230         return editObject.getBatchId();
231     }
232 
233     @Override
234     public void setBatchId(Integer batchId) {
235         editObject.setBatchId(batchId);
236     }
237 
238     @Override
239     public FishingOperation getFishingOperation() {
240         return editObject.getFishingOperation();
241     }
242 
243     @Override
244     public void setFishingOperation(FishingOperation fishingOperation) {
245         editObject.setFishingOperation(fishingOperation);
246     }
247 
248     @Override
249     public Float getWeight() {
250         return editObject.getWeight();
251     }
252 
253     @Override
254     public void setWeight(Float weight) {
255         Float oldValue = getWeight();
256         editObject.setWeight(weight);
257         firePropertyChange(PROPERTY_WEIGHT, oldValue, weight);
258     }
259 
260     public boolean withWeight() {
261         return getWeight() != null;
262     }
263 
264     @Override
265     public Species getSpecies() {
266         return editObject.getSpecies();
267     }
268 
269     @Override
270     public void setSpecies(Species species) {
271         Object oldValue = getSpecies();
272         editObject.setSpecies(species);
273         firePropertyChange(PROPERTY_SPECIES, oldValue, species);
274     }
275 
276     @Override
277     public Float getSize() {
278         return editObject.getSize();
279     }
280 
281     @Override
282     public void setSize(Float size) {
283         Float oldValue = getSize();
284         editObject.setSize(size);
285         firePropertyChange(PROPERTY_SIZE, oldValue, size);
286     }
287 
288     public boolean withSize() {
289         return getSize() != null;
290     }
291 
292     @Override
293     public Caracteristic getLengthStepCaracteristic() {
294         return editObject.getLengthStepCaracteristic();
295     }
296 
297     @Override
298     public void setLengthStepCaracteristic(Caracteristic lengthStepCaracteristic) {
299         Object oldValue = getLengthStepCaracteristic();
300         editObject.setLengthStepCaracteristic(lengthStepCaracteristic);
301         firePropertyChange(PROPERTY_LENGTH_STEP_CARACTERISTIC, oldValue, lengthStepCaracteristic);
302     }
303 
304     @Override
305     public CaracteristicMap getCaracteristics() {
306         return editObject.getCaracteristics();
307     }
308 
309     @Override
310     public void setCaracteristics(CaracteristicMap caracteristics) {
311         Object oldValue = getCaracteristics();
312         editObject.setCaracteristics(caracteristics);
313         firePropertyChange(PROPERTY_CARACTERISTICS, oldValue, caracteristics);
314     }
315 
316     @Override
317     public String getComment() {
318         return editObject.getComment();
319     }
320 
321     @Override
322     public void setComment(String comment) {
323         Object oldValue = getComment();
324         editObject.setComment(comment);
325         firePropertyChange(PROPERTY_COMMENT, oldValue, comment);
326     }
327 
328     @Override
329     public Integer getRankOrder() {
330         return editObject.getRankOrder();
331     }
332 
333     @Override
334     public void setRankOrder(Integer rankOrder) {
335         editObject.setRankOrder(rankOrder);
336     }
337 
338     @Override
339     public String getSynchronizationStatus() {
340         return editObject.getSynchronizationStatus();
341     }
342 
343     @Override
344     public void setSynchronizationStatus(String synchronizationStatus) {
345         String oldValue = getSynchronizationStatus();
346         editObject.setSynchronizationStatus(synchronizationStatus);
347         firePropertyChange(PROPERTY_SYNCHRONIZATION_STATUS, oldValue, synchronizationStatus);
348     }
349 
350     @Override
351     public CopyIndividualObservationMode getCopyIndividualObservationMode() {
352         return editObject.getCopyIndividualObservationMode();
353     }
354 
355     @Override
356     public void setCopyIndividualObservationMode(CopyIndividualObservationMode copyIndividualObservationMode) {
357         editObject.setCopyIndividualObservationMode(copyIndividualObservationMode);
358     }
359 
360     @Override
361     public String getSamplingCode() {
362         return editObject.getSamplingCode();
363     }
364 
365     @Override
366     public void setSamplingCode(String samplingCode) {
367         Object oldValue = getSamplingCode();
368         editObject.setSamplingCode(samplingCode);
369         firePropertyChange(PROPERTY_SAMPLING_CODE, oldValue, samplingCode);
370     }
371 
372     public Integer getSamplingCodeId() {
373         return SamplingCodePrefix.extractSamplingCodeIdFromSamplingCode(getSamplingCode());
374     }
375 
376 //    public SamplingCodePrefix getSamplingCodePrefix() {
377 //        return samplingCodePrefix;
378 //    }
379 //
380 //    public void setSamplingCodePrefix(SamplingCodePrefix samplingCodePrefix) {
381 //        this.samplingCodePrefix = samplingCodePrefix;
382 //    }
383 
384     public boolean withSamplingCode() {
385         return StringUtils.isNotBlank(getSamplingCode());
386     }
387 
388 //    public boolean withSamplingCodePrefix() {
389 //        return samplingCodePrefix != null;
390 //    }
391 
392     //------------------------------------------------------------------------//
393     //-- AttachmentModelAware                                               --//
394     //------------------------------------------------------------------------//
395 
396     @Override
397     public ObjectTypeCode getObjectType() {
398         return ObjectTypeCode.SAMPLE;
399     }
400 
401     @Override
402     public Integer getObjectId() {
403         return getIdAsInt();
404     }
405 
406     @Override
407     public List<Attachment> getAttachment() {
408         return attachment;
409     }
410 
411     @Override
412     public void addAllAttachment(Collection<Attachment> attachments) {
413         this.attachment.addAll(attachments);
414         firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment());
415     }
416 
417     @Override
418     public void addAttachment(Attachment attachment) {
419         this.attachment.add(attachment);
420         firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment());
421     }
422 
423     @Override
424     public void removeAllAttachment(Collection<Attachment> attachments) {
425         this.attachment.removeAll(attachments);
426         firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment());
427     }
428 
429     @Override
430     public void removeAttachment(Attachment attachment) {
431         this.attachment.remove(attachment);
432         firePropertyChange(PROPERTY_ATTACHMENT, null, getAttachment());
433     }
434 
435     public boolean isEmpty() {
436         return isEmpty(Collections.emptySet());
437     }
438 
439     public boolean isEmpty(Collection<Caracteristic> caracteristicsToIgnore) {
440         return getSize() == null
441                 && getWeight() == null
442                 && (getCaracteristics() == null || !getCaracteristics().hasNonNullValues(caracteristicsToIgnore))
443                 && (getDefaultCaracteristics() == null || !getDefaultCaracteristics().hasNonNullValues(caracteristicsToIgnore))
444                 && StringUtils.isBlank(getSamplingCode())
445                 && getComment() == null
446                 && (getAttachment() == null || getAttachment().isEmpty());
447     }
448 
449     public void copy(IndividualObservationBatchRowModel source) {
450         setId(source.getId());
451         setLengthStepCaracteristic(source.getLengthStepCaracteristic());
452         setSize(source.getSize());
453         setWeight(source.getWeight());
454         setBatchId(source.getBatchId());
455         setCaracteristics(source.getCaracteristics());
456         setDefaultCaracteristics(source.getDefaultCaracteristics());
457         setComment(source.getComment());
458         setSamplingCode(source.getSamplingCode());
459         setCopyIndividualObservationMode(source.getCopyIndividualObservationMode());
460         addAllAttachment(source.getAttachment());
461     }
462 
463     public CaracteristicQualitativeValue getCaracteristicQualitativeValue(Caracteristic caracteristic) {
464         CaracteristicQualitativeValue result = null;
465         if (caracteristic != null) {
466             result = getCaracteristics().getQualitativeValue(caracteristic);
467             if (result == null) {
468                 result = defaultCaracteristics.getQualitativeValue(caracteristic);
469             }
470         }
471         return result;
472     }
473 
474     public boolean computeValid() {
475         return computeValid(withSize(), withWeight());
476     }
477 
478     public boolean computeValid(boolean withSize, boolean withWeight) {
479         CopyIndividualObservationMode copyIndividualObservationMode = getCopyIndividualObservationMode();
480         return copyIndividualObservationMode == CopyIndividualObservationMode.NOTHING
481                 || (copyIndividualObservationMode == CopyIndividualObservationMode.SIZE && withSize)
482                 || (copyIndividualObservationMode == CopyIndividualObservationMode.ALL && withSize && withWeight);
483     }
484 
485 }