View Javadoc
1   package fr.ifremer.tutti.ui.swing.content.protocol;
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.base.Preconditions;
26  import com.google.common.collect.ImmutableMap;
27  import com.google.common.collect.Lists;
28  import com.google.common.collect.Maps;
29  import com.google.common.collect.Multimap;
30  import com.google.common.collect.Multimaps;
31  import fr.ifremer.tutti.persistence.entities.TuttiEntities;
32  import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel;
33  import fr.ifremer.tutti.persistence.entities.protocol.CaracteristicMappingRow;
34  import fr.ifremer.tutti.persistence.entities.protocol.MaturityCaracteristic;
35  import fr.ifremer.tutti.persistence.entities.protocol.MaturityCaracteristics;
36  import fr.ifremer.tutti.persistence.entities.protocol.OperationFieldMappingRow;
37  import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol;
38  import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
39  import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols;
40  import fr.ifremer.tutti.persistence.entities.protocol.Zone;
41  import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
42  import fr.ifremer.tutti.persistence.entities.referential.Species;
43  import fr.ifremer.tutti.ui.swing.content.protocol.calcifiedpiecessampling.CalcifiedPiecesSamplingEditorRowModel;
44  import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.AvailableStratasTreeModel;
45  import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.ZonesTreeModel;
46  import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.node.StrataNode;
47  import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.node.SubStrataNode;
48  import fr.ifremer.tutti.ui.swing.content.protocol.zones.tree.node.ZoneNode;
49  import fr.ifremer.tutti.ui.swing.util.AbstractTuttiBeanUIModel;
50  import org.apache.commons.collections4.CollectionUtils;
51  import org.apache.commons.lang3.StringUtils;
52  import org.apache.commons.lang3.mutable.MutableInt;
53  import org.nuiton.util.beans.Binder;
54  import org.nuiton.util.beans.BinderFactory;
55  
56  import java.beans.PropertyChangeEvent;
57  import java.beans.PropertyChangeListener;
58  import java.util.ArrayList;
59  import java.util.Collection;
60  import java.util.HashMap;
61  import java.util.LinkedHashMap;
62  import java.util.LinkedList;
63  import java.util.List;
64  import java.util.Map;
65  import java.util.Objects;
66  import java.util.Optional;
67  import java.util.Set;
68  import java.util.stream.Collectors;
69  
70  /**
71   * @author Tony Chemit - chemit@codelutin.com
72   * @since 0.3
73   */
74  public class EditProtocolUIModel extends AbstractTuttiBeanUIModel<TuttiProtocol, EditProtocolUIModel> implements TuttiProtocol {
75  
76      private static final long serialVersionUID = 1L;
77  
78      public static final String PROPERTY_CARACTERISTIC_MAPPING_ROWS = "caracteristicMappingRows";
79  
80      public static final String PROPERTY_OPERATION_FIELD_MAPPING_ROWS = "operationFieldMappingRows";
81  
82      public static final String PROPERTY_SPECIES_ROW = "speciesRow";
83  
84      public static final String PROPERTY_BENTHOS_ROW = "benthosRow";
85  
86      public static final String PROPERTY_REMOVE_SPECIES_ENABLED = "removeSpeciesEnabled";
87  
88      public static final String PROPERTY_REMOVE_BENTHOS_ENABLED = "removeBenthosEnabled";
89  
90      public static final String PROPERTY_REMOVE_CARACTERISTIC_MAPPING_ENABLED = "removeCaracteristicMappingEnabled";
91  
92      public static final String PROPERTY_MOVE_UP_CARACTERISTIC_MAPPING_ENABLED = "moveUpCaracteristicMappingEnabled";
93  
94      public static final String PROPERTY_MOVE_DOWN_CARACTERISTIC_MAPPING_ENABLED = "moveDownCaracteristicMappingEnabled";
95  
96      public static final String PROPERTY_IMPORTED = "imported";
97  
98      public static final String PROPERTY_CLONED = "cloned";
99  
100     public static final String PROPERTY_CLEANED = "cleaned";
101 
102     public static final String PROPERTY_CPS_ROWS = "cpsRows";
103 
104     public static final String PROPERTY_MODIFYING_ZONES = "modifyingZones";
105 
106     public static final String PROPERTY_MATURITY_PMFM_ID = "maturityPmfmId";
107 
108     /**
109      * Delegate edit object.
110      *
111      * @since 1.3
112      */
113     protected final TuttiProtocol editObject = TuttiProtocols.newTuttiProtocol();
114     private final SampleCategoryModel sampleCategoryModel;
115 
116     /**
117      * Flag when a incoming protocol is imported.
118      *
119      * @since 1.0
120      */
121     protected boolean imported;
122 
123     /**
124      * Flag when a incoming protocol is cloned.
125      *
126      * @since 1.0
127      */
128     protected boolean cloned;
129 
130     /**
131      * Flag when a incoming protocol is cleaned.
132      *
133      * @since 2.4
134      */
135     protected boolean cleaned;
136 
137     /**
138      * Can user remove a selected species?
139      *
140      * @since 0.3
141      */
142     protected boolean removeSpeciesEnabled;
143 
144     /**
145      * Can user remove a selected benthos?
146      *
147      * @since 0.3
148      */
149     protected boolean removeBenthosEnabled;
150 
151     protected boolean removeCaracteristicMappingEnabled;
152 
153     protected boolean moveUpCaracteristicMappingEnabled;
154 
155     protected boolean moveDownCaracteristicMappingEnabled;
156 
157     protected List<Species> allSpecies;
158 
159     protected List<Species> allSynonyms;
160 
161     protected Multimap<String, Species> allSpeciesByTaxonId;
162 
163     protected Map<String, Species> allReferentSpeciesByTaxonId;
164 
165     protected List<Caracteristic> caracteristics;
166 
167     protected Map<String, Caracteristic> allCaracteristic;
168 
169     /**
170      * List of the maturity pmfm ids
171      *
172      * @since 4.5
173      */
174     protected List<String> maturityPmfmId;
175 
176     /**
177      * Map of the maturity caracteristic by id. This is what is being edited.
178      * We do not push the maturity caracteristics directly into the editobject, this is done only when the user saves the protocol
179      *
180      * @since 4.5
181      */
182     protected final LinkedHashMap<String, MaturityCaracteristic> maturityCaracteristicsById = new LinkedHashMap<>();
183 
184     protected LinkedHashMap<Caracteristic, EditProtocolCaracteristicsRowModel> caracteristicMappingRows =
185             new LinkedHashMap<>();
186 
187     protected List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows =
188             new ArrayList<>();
189 
190     /**
191      * Number of rows for each column
192      *
193      * @since 3.10
194      */
195     protected Map<String, MutableInt> numberOfRowsByColumn = new HashMap<>();
196 
197     protected List<EditProtocolSpeciesRowModel> speciesRow;
198 
199     protected List<EditProtocolSpeciesRowModel> benthosRow;
200 
201     protected List<CalcifiedPiecesSamplingEditorRowModel> cpsRows;
202 
203     protected final ZonesTreeModel zonesTreeModel = new ZonesTreeModel();
204 
205     protected final AvailableStratasTreeModel availableStratasTreeModel = new AvailableStratasTreeModel();
206 
207     protected static Binder<EditProtocolUIModel, TuttiProtocol> toBeanBinder =
208             BinderFactory.newBinder(EditProtocolUIModel.class,
209                                     TuttiProtocol.class);
210 
211     protected static Binder<TuttiProtocol, EditProtocolUIModel> fromBeanBinder =
212             BinderFactory.newBinder(TuttiProtocol.class, EditProtocolUIModel.class);
213 
214     private boolean modifyingZones;
215 
216     /**
217      * Le compteur de méthode de mensuration utilisées par les espèces et benthos.
218      */
219     private final CaracteristicsCount lengthStepPmfmUsed = new CaracteristicsCount();
220 
221     /**
222      * Le compteur de méthode de maturité utilisées par les espèces et benthos.
223      */
224     private final CaracteristicsCount maturityPmfmUsed = new CaracteristicsCount();
225 
226     public EditProtocolUIModel(SampleCategoryModel sampleCategoryModel) {
227         super(fromBeanBinder, toBeanBinder);
228         this.sampleCategoryModel = sampleCategoryModel;
229 
230         // reset the list of maturity pmfm id when the list of maturity caracteristic changes
231         addPropertyChangeListener(PROPERTY_MATURITY_CARACTERISTICS, new PropertyChangeListener() {
232 
233             @Override
234             public void propertyChange(PropertyChangeEvent evt) {
235                 List<MaturityCaracteristic> newValue = (List<MaturityCaracteristic>) evt.getNewValue();
236 
237                 EditProtocolUIModel.this.setMaturityPmfmId(newValue.stream().map(MaturityCaracteristic::getId).collect(Collectors.toList()));
238 
239                 LinkedHashMap<String, MaturityCaracteristic> newMap = new LinkedHashMap<>();
240                 newValue.forEach(maturityCaracteristic -> newMap.put(maturityCaracteristic.getId(), maturityCaracteristic));
241                 EditProtocolUIModel.this.setMaturityCaracteristicsById(newMap);
242             }
243         });
244 
245         // when the maturity psmf list changes, then remove the removed caracteristic or add the new caracteristic from the maturity caracteristics
246         addPropertyChangeListener(PROPERTY_MATURITY_PMFM_ID, new PropertyChangeListener() {
247 
248             @Override
249             public void propertyChange(PropertyChangeEvent evt) {
250                 List<String> newValue = (List<String>) evt.getNewValue();
251                 LinkedHashMap<String, MaturityCaracteristic> newMap = new LinkedHashMap<>();
252                 newValue.forEach(maturityPmfmId -> newMap.put(maturityPmfmId,
253                                                               maturityCaracteristicsById.getOrDefault(maturityPmfmId,
254                                                                                                       MaturityCaracteristics.newMaturityCaracteristic(maturityPmfmId))));
255                 EditProtocolUIModel.this.setMaturityCaracteristicsById(newMap);
256             }
257         });
258     }
259 
260     public CaracteristicsCount getLengthStepPmfmUsed() {
261         return lengthStepPmfmUsed;
262     }
263 
264     public CaracteristicsCount getMaturityPmfmUsed() {
265         return maturityPmfmUsed;
266     }
267 
268     public EditProtocolSpeciesRowModel newRow() {
269         EditProtocolSpeciesRowModel result = new EditProtocolSpeciesRowModel();
270 
271         List<Integer> mandatoryIds = Lists.newArrayList(sampleCategoryModel.getSamplingOrder());
272         // always remove the first category (V/HV)
273         mandatoryIds.remove(0);
274         result.setMandatorySampleCategoryId(mandatoryIds);
275 
276         result.setWeightEnabled(true);
277         result.setValid(true);
278 
279         result.addPropertyChangeListener(EditProtocolSpeciesRowModel.PROPERTY_LENGTH_STEP_PMFM,
280                                          evt -> {
281                                              // update the used lengthstep caracteristic
282                                              if (evt.getOldValue() != null) {
283                                                  lengthStepPmfmUsed.removeCaracteristic((Caracteristic) evt.getOldValue());
284                                              }
285                                              if (evt.getNewValue() == null) {
286 
287                                                  EditProtocolSpeciesRowModel rowModel = (EditProtocolSpeciesRowModel) evt.getSource();
288                                                  rowModel.setRtpMale(null);
289                                                  rowModel.setRtpFemale(null);
290                                                  rowModel.setRtpUndefined(null);
291 
292                                              } else {
293                                                  lengthStepPmfmUsed.addCaracteristic((Caracteristic) evt.getNewValue());
294                                              }
295 
296                                          });
297 
298         result.addPropertyChangeListener(EditProtocolSpeciesRowModel.PROPERTY_MATURITY_PMFM,
299                                          evt -> {
300                                              // update the used maturities
301                                              if (evt.getOldValue() != null) {
302                                                  maturityPmfmUsed.removeCaracteristic((Caracteristic) evt.getOldValue());
303                                              }
304                                              if (evt.getNewValue() != null) {
305                                                  maturityPmfmUsed.addCaracteristic((Caracteristic) evt.getNewValue());
306                                              }
307                                          });
308 
309         return result;
310     }
311 
312     @Override
313     protected TuttiProtocol newEntity() {
314         return TuttiProtocols.newTuttiProtocol();
315     }
316 
317     protected List<Zone> incomingZones = new LinkedList<>();
318 
319     @Override
320     public void fromEntity(TuttiProtocol entity) {
321         fromBeanBinder.copyExcluding(entity, this, PROPERTY_ZONE);
322 
323         // on conserve les zones entrantes (elles seront ensuites transformées en modèle d'arbre)
324         incomingZones.clear();
325         if (!entity.isZoneEmpty()) {
326             incomingZones.addAll(entity.getZone());
327         }
328     }
329 
330     public List<Zone> getIncomingZones() {
331         return incomingZones;
332     }
333 
334     @Override
335     public TuttiProtocol toEntity() {
336         TuttiProtocol result = TuttiProtocols.newTuttiProtocol();
337         toBeanBinder.copyExcluding(this, result, PROPERTY_ZONE, PROPERTY_MATURITY_CARACTERISTICS);
338 
339         // tree to model
340         Set<Zone> zones = zonesTreeModel.getZones();
341         result.setZone(zones);
342 
343         Collection<EditProtocolCaracteristicsRowModel> protocolCaracteristicMappingRows = getCaracteristicMappingRows();
344         List<CaracteristicMappingRow> caracteristicMappingRows = new ArrayList<>();
345         for (EditProtocolCaracteristicsRowModel row : protocolCaracteristicMappingRows) {
346             if (row.isValid()) {
347                 caracteristicMappingRows.add(row.toEntity());
348             }
349         }
350         result.setCaracteristicMapping(caracteristicMappingRows);
351 
352         List<EditProtocolOperationFieldsRowModel> protocolOperationFieldMappingRows = getOperationFieldMappingRows();
353         List<OperationFieldMappingRow> operationFieldMappingRows = new ArrayList<>();
354         for (EditProtocolOperationFieldsRowModel row : protocolOperationFieldMappingRows) {
355             if (StringUtils.isNotBlank(row.getField()) && StringUtils.isNotBlank(row.getImportColumn())
356                     && row.isValid()) {
357                 operationFieldMappingRows.add(row.toEntity());
358             }
359         }
360         result.setOperationFieldMapping(operationFieldMappingRows);
361 
362         // map the cps rows by species row
363         Multimap<EditProtocolSpeciesRowModel, CalcifiedPiecesSamplingEditorRowModel> cpsRowsBySpecies =
364                 Multimaps.index(getCpsRows(), CalcifiedPiecesSamplingEditorRowModel::getProtocolSpecies);
365 
366         // get the species protocols from the table
367         List<SpeciesProtocol> speciesProtocols = Lists.newArrayList();
368 
369         for (EditProtocolSpeciesRowModel row : getSpeciesRow()) {
370             if (row.isValid()) {
371                 SpeciesProtocol protocol = row.toEntity();
372                 speciesProtocols.add(protocol);
373 
374                 Collection<CalcifiedPiecesSamplingEditorRowModel> cpsRows = cpsRowsBySpecies.get(row);
375                 protocol.setCalcifiedPiecesSamplingDefinition(cpsRows.stream()
376                                                                      .map(CalcifiedPiecesSamplingEditorRowModel::toEntity)
377                                                                      .collect(Collectors.toList()));
378             }
379         }
380         result.setSpecies(speciesProtocols);
381 
382         List<SpeciesProtocol> benthosProtocols = Lists.newArrayList();
383 
384         for (EditProtocolSpeciesRowModel row : getBenthosRow()) {
385             if (row.isValid()) {
386                 SpeciesProtocol protocol = row.toEntity();
387                 benthosProtocols.add(protocol);
388 
389                 Collection<CalcifiedPiecesSamplingEditorRowModel> cpsRows = cpsRowsBySpecies.get(row);
390                 protocol.setCalcifiedPiecesSamplingDefinition(cpsRows.stream()
391                                                                      .map(CalcifiedPiecesSamplingEditorRowModel::toEntity)
392                                                                      .collect(Collectors.toList()));
393             }
394         }
395         result.setBenthos(benthosProtocols);
396 
397         result.setMaturityCaracteristics(new ArrayList<>(maturityCaracteristicsById.values()));
398 
399         return result;
400     }
401 
402     public ZonesTreeModel getZonesTreeModel() {
403         return zonesTreeModel;
404     }
405 
406     public AvailableStratasTreeModel getAvailableStratasTreeModel() {
407         return availableStratasTreeModel;
408     }
409 
410     public void setLengthClassesPmfm(List<Caracteristic> lengthClassesPmfm) {
411         List<String> ids = Lists.newArrayList(TuttiEntities.collecIds(lengthClassesPmfm));
412         setLengthClassesPmfmId(ids);
413     }
414 
415     public void setIndividualObservationPmfm(List<Caracteristic> individualObservationPmfm) {
416         List<String> ids = TuttiEntities.collecIds(individualObservationPmfm);
417         setIndividualObservationPmfmId(ids);
418     }
419 
420     public void setMaturityPmfm(List<Caracteristic> maturityPmfm) {
421         List<String> ids = Lists.newArrayList(TuttiEntities.collecIds(maturityPmfm));
422         setMaturityPmfmId(ids);
423     }
424 
425     public Collection<EditProtocolCaracteristicsRowModel> getCaracteristicMappingRows() {
426         return caracteristicMappingRows.values();
427     }
428 
429     public void addCaracteristicMappingRow(EditProtocolCaracteristicsRowModel newRow) {
430         caracteristicMappingRows.put(newRow.getPsfm(), newRow);
431         firePropertyChange(PROPERTY_CARACTERISTIC_MAPPING_ROWS, null, getCaracteristicMappingRows());
432     }
433 
434     public void removeCaracteristicMappingRows(Collection<EditProtocolCaracteristicsRowModel> rowsToRemove) {
435         for (EditProtocolCaracteristicsRowModel row : rowsToRemove) {
436             caracteristicMappingRows.remove(row.getPsfm());
437         }
438         firePropertyChange(PROPERTY_CARACTERISTIC_MAPPING_ROWS, null, getCaracteristicMappingRows());
439     }
440 
441     public void setCaracteristicMappingRows(List<EditProtocolCaracteristicsRowModel> caracteristicMappingRows) {
442         this.caracteristicMappingRows = new LinkedHashMap<>(
443                 Maps.uniqueIndex(caracteristicMappingRows, EditProtocolCaracteristicsRowModel::getPsfm)
444         );
445         firePropertyChange(PROPERTY_CARACTERISTIC_MAPPING_ROWS, null, caracteristicMappingRows);
446     }
447 
448     public boolean isCaracteristicUsedInMapping(Caracteristic caracteristic) {
449         return caracteristicMappingRows.containsKey(caracteristic);
450     }
451 
452     public Collection<Caracteristic> getUsedCaracteristics() {
453         return caracteristicMappingRows.keySet();
454     }
455 
456     public List<EditProtocolOperationFieldsRowModel> getOperationFieldMappingRows() {
457         return operationFieldMappingRows;
458     }
459 
460     public void setOperationFieldMappingRows(List<EditProtocolOperationFieldsRowModel> operationFieldMappingRows) {
461         Object oldValue = getOperationFieldMappingRows();
462         this.operationFieldMappingRows = operationFieldMappingRows;
463         firePropertyChange(PROPERTY_OPERATION_FIELD_MAPPING_ROWS, oldValue, operationFieldMappingRows);
464     }
465 
466     public List<EditProtocolSpeciesRowModel> getSpeciesRow() {
467         return speciesRow;
468     }
469 
470     public void setSpeciesRow(List<EditProtocolSpeciesRowModel> speciesRow) {
471         Object oldValue = getSpeciesRow();
472         this.speciesRow = speciesRow;
473         firePropertyChange(PROPERTY_SPECIES_ROW, oldValue, speciesRow);
474     }
475 
476     public List<EditProtocolSpeciesRowModel> getBenthosRow() {
477         return benthosRow;
478     }
479 
480     public void setBenthosRow(List<EditProtocolSpeciesRowModel> benthosRow) {
481         Object oldValue = getBenthosRow();
482         this.benthosRow = benthosRow;
483         firePropertyChange(PROPERTY_BENTHOS_ROW, oldValue, benthosRow);
484     }
485 
486     public Optional<EditProtocolSpeciesRowModel> getProtocolSpeciesRowForSpecies(Species species) {
487         List<EditProtocolSpeciesRowModel> allRows = new ArrayList<>();
488         if (speciesRow != null) {
489             allRows.addAll(speciesRow);
490         }
491         if (benthosRow != null) {
492             allRows.addAll(benthosRow);
493         }
494         return allRows.stream().filter(row -> row.getSpecies().equals(species)).findFirst();
495     }
496 
497     public List<CalcifiedPiecesSamplingEditorRowModel> getCpsRows() {
498         return cpsRows;
499     }
500 
501     public void setCpsRows(List<CalcifiedPiecesSamplingEditorRowModel> cpsRows) {
502         Object oldValue = getCpsRows();
503         this.cpsRows = cpsRows;
504         firePropertyChange(PROPERTY_CPS_ROWS, oldValue, cpsRows);
505     }
506 
507     public boolean isRemoveSpeciesEnabled() {
508         return removeSpeciesEnabled;
509     }
510 
511     public void setRemoveSpeciesEnabled(boolean removeSpeciesEnabled) {
512         this.removeSpeciesEnabled = removeSpeciesEnabled;
513         firePropertyChange(PROPERTY_REMOVE_SPECIES_ENABLED, null, removeSpeciesEnabled);
514     }
515 
516     public boolean isRemoveBenthosEnabled() {
517         return removeBenthosEnabled;
518     }
519 
520     public void setRemoveBenthosEnabled(boolean removeBenthosEnabled) {
521         this.removeBenthosEnabled = removeBenthosEnabled;
522         firePropertyChange(PROPERTY_REMOVE_BENTHOS_ENABLED, null, removeBenthosEnabled);
523     }
524 
525     public boolean isRemoveCaracteristicMappingEnabled() {
526         return removeCaracteristicMappingEnabled;
527     }
528 
529     public void setRemoveCaracteristicMappingEnabled(boolean removeCaracteristicMappingEnabled) {
530         this.removeCaracteristicMappingEnabled = removeCaracteristicMappingEnabled;
531         firePropertyChange(PROPERTY_REMOVE_CARACTERISTIC_MAPPING_ENABLED, null, removeCaracteristicMappingEnabled);
532     }
533 
534     public boolean isMoveUpCaracteristicMappingEnabled() {
535         return moveUpCaracteristicMappingEnabled;
536     }
537 
538     public void setMoveUpCaracteristicMappingEnabled(boolean moveUpCaracteristicMappingEnabled) {
539         this.moveUpCaracteristicMappingEnabled = moveUpCaracteristicMappingEnabled;
540         firePropertyChange(PROPERTY_MOVE_UP_CARACTERISTIC_MAPPING_ENABLED, null, moveUpCaracteristicMappingEnabled);
541     }
542 
543     public boolean isMoveDownCaracteristicMappingEnabled() {
544         return moveDownCaracteristicMappingEnabled;
545     }
546 
547     public void setMoveDownCaracteristicMappingEnabled(boolean moveDownCaracteristicMappingEnabled) {
548         this.moveDownCaracteristicMappingEnabled = moveDownCaracteristicMappingEnabled;
549         firePropertyChange(PROPERTY_MOVE_DOWN_CARACTERISTIC_MAPPING_ENABLED, null, moveDownCaracteristicMappingEnabled);
550     }
551 
552     public boolean isImported() {
553         return imported;
554     }
555 
556     public void setImported(boolean imported) {
557         Object oldValue = isImported();
558         this.imported = imported;
559         firePropertyChange(PROPERTY_IMPORTED, oldValue, imported);
560     }
561 
562     public boolean isCloned() {
563         return cloned;
564     }
565 
566     public void setCloned(boolean cloned) {
567         Object oldValue = isCloned();
568         this.cloned = cloned;
569         firePropertyChange(PROPERTY_CLONED, oldValue, cloned);
570     }
571 
572     public boolean isCleaned() {
573         return cleaned;
574     }
575 
576     public void setCleaned(boolean cleaned) {
577         Object oldValue = isCleaned();
578         this.cleaned = cleaned;
579         firePropertyChange(PROPERTY_CLEANED, oldValue, cleaned);
580     }
581 
582     public List<Species> getAllSpecies() {
583         return allSpecies;
584     }
585 
586     public void setAllSpecies(List<Species> allSpecies) {
587         this.allSpecies = allSpecies;
588         if (allReferentSpeciesByTaxonId != null && allSpecies != null) {
589             allSynonyms = Lists.newArrayList(allSpecies);
590             allSynonyms.removeAll(allReferentSpeciesByTaxonId.values());
591         }
592     }
593 
594     public Multimap<String, Species> getAllSpeciesByTaxonId() {
595         return allSpeciesByTaxonId;
596     }
597 
598     public Collection<Species> getAllSynonyms(String taxonId) {
599         return allSpeciesByTaxonId.get(taxonId);
600     }
601 
602     public void setAllSpeciesByTaxonId(Multimap<String, Species> allSpeciesByTaxonId) {
603         this.allSpeciesByTaxonId = allSpeciesByTaxonId;
604     }
605 
606     public List<Species> getAllSynonyms() {
607         return allSynonyms;
608     }
609 
610     public Map<String, Species> getAllReferentSpeciesByTaxonId() {
611         return allReferentSpeciesByTaxonId;
612     }
613 
614     public void setAllReferentSpeciesByTaxonId(Map<String, Species> allReferentSpeciesByTaxonId) {
615         this.allReferentSpeciesByTaxonId = allReferentSpeciesByTaxonId;
616         if (allReferentSpeciesByTaxonId != null && allSpecies != null) {
617             allSynonyms = Lists.newArrayList(allSpecies);
618             // tchemit-2013-10-04 Do not do a removeAll (bad performance)
619             for (Species species : allReferentSpeciesByTaxonId.values()) {
620                 allSynonyms.remove(species);
621             }
622         }
623     }
624 
625     public List<Caracteristic> getCaracteristics() {
626         return caracteristics;
627     }
628 
629     public void setCaracteristics(List<Caracteristic> caracteristics) {
630         this.caracteristics = caracteristics;
631     }
632 
633     public Map<String, Caracteristic> getAllCaracteristic() {
634         return allCaracteristic;
635     }
636 
637     public void setAllCaracteristic(Map<String, Caracteristic> allCaracteristic) {
638         this.allCaracteristic = allCaracteristic;
639     }
640 
641     //------------------------------------------------------------------------//
642     //-- TuttiProtocol methods                                              --//
643     //------------------------------------------------------------------------//
644 
645     @Override
646     public String getName() {
647         return editObject.getName();
648     }
649 
650     @Override
651     public void setName(String name) {
652         Object oldValue = getName();
653         editObject.setName(name);
654         firePropertyChange(PROPERTY_NAME, oldValue, name);
655     }
656 
657     @Override
658     public String getComment() {
659         return editObject.getComment();
660     }
661 
662     @Override
663     public void setComment(String comment) {
664         Object oldValue = getComment();
665         editObject.setComment(comment);
666         firePropertyChange(PROPERTY_COMMENT, oldValue, comment);
667     }
668 
669     @Override
670     public String getProgramId() {
671         return editObject.getProgramId();
672     }
673 
674     @Override
675     public void setProgramId(String programId) {
676         Object oldValue = getProgramId();
677         editObject.setProgramId(programId);
678         firePropertyChange(PROPERTY_PROGRAM_ID, oldValue, programId);
679     }
680 
681     @Override
682     public List<String> getLengthClassesPmfmId() {
683         return editObject.getLengthClassesPmfmId();
684     }
685 
686     @Override
687     public void setLengthClassesPmfmId(List<String> lengthClassesPmfmId) {
688         editObject.setLengthClassesPmfmId(lengthClassesPmfmId);
689         // force to always propagates (need to recompte data of combobox in species table)
690         firePropertyChange(PROPERTY_LENGTH_CLASSES_PMFM_ID, null, lengthClassesPmfmId);
691     }
692 
693     @Override
694     public List<String> getIndividualObservationPmfmId() {
695         return editObject.getIndividualObservationPmfmId();
696     }
697 
698     @Override
699     public void setIndividualObservationPmfmId(List<String> individualObservationPmfmId) {
700         editObject.setIndividualObservationPmfmId(individualObservationPmfmId);
701         firePropertyChange(PROPERTY_INDIVIDUAL_OBSERVATION_PMFM_ID, null, individualObservationPmfmId);
702     }
703 
704     public List<String> getMaturityPmfmId() {
705         return maturityPmfmId;
706     }
707 
708     public void setMaturityPmfmId(List<String> maturityPmfmId) {
709         this.maturityPmfmId = maturityPmfmId;
710         firePropertyChange(PROPERTY_MATURITY_PMFM_ID, null, maturityPmfmId);
711     }
712 
713     @Override
714     public List<CaracteristicMappingRow> getCaracteristicMapping() {
715         return editObject.getCaracteristicMapping();
716     }
717 
718     @Override
719     public void setCaracteristicMapping(List<CaracteristicMappingRow> caracteristicMapping) {
720         editObject.setCaracteristicMapping(caracteristicMapping);
721         firePropertyChange(PROPERTY_CARACTERISTIC_MAPPING, null, caracteristicMapping);
722     }
723 
724     @Override
725     public CaracteristicMappingRow getCaracteristicMapping(int index) {
726         return editObject.getCaracteristicMapping(index);
727     }
728 
729     @Override
730     public boolean isCaracteristicMappingEmpty() {
731         return editObject.isCaracteristicMappingEmpty();
732     }
733 
734     @Override
735     public int sizeCaracteristicMapping() {
736         return editObject.sizeCaracteristicMapping();
737     }
738 
739     @Override
740     public void addCaracteristicMapping(CaracteristicMappingRow caracteristicMapping) {
741         editObject.addCaracteristicMapping(caracteristicMapping);
742     }
743 
744     @Override
745     public void addAllCaracteristicMapping(Collection<CaracteristicMappingRow> caracteristicMapping) {
746         editObject.addAllCaracteristicMapping(caracteristicMapping);
747     }
748 
749     @Override
750     public boolean removeCaracteristicMapping(CaracteristicMappingRow caracteristicMapping) {
751         return editObject.removeCaracteristicMapping(caracteristicMapping);
752     }
753 
754     @Override
755     public boolean removeAllCaracteristicMapping(Collection<CaracteristicMappingRow> caracteristicMapping) {
756         return editObject.removeAllCaracteristicMapping(caracteristicMapping);
757     }
758 
759     @Override
760     public boolean containsCaracteristicMapping(CaracteristicMappingRow caracteristicMapping) {
761         return editObject.containsCaracteristicMapping(caracteristicMapping);
762     }
763 
764     @Override
765     public boolean containsAllCaracteristicMapping(Collection<CaracteristicMappingRow> caracteristicMapping) {
766         return editObject.containsAllCaracteristicMapping(caracteristicMapping);
767     }
768 
769     @Override
770     public String getIndividualObservationPmfmId(int index) {
771         return editObject.getIndividualObservationPmfmId(index);
772     }
773 
774     @Override
775     public boolean isIndividualObservationPmfmIdEmpty() {
776         return editObject.isIndividualObservationPmfmIdEmpty();
777     }
778 
779     @Override
780     public int sizeIndividualObservationPmfmId() {
781         return editObject.sizeIndividualObservationPmfmId();
782     }
783 
784     @Override
785     public void addIndividualObservationPmfmId(String individualObservationPmfmId) {
786         editObject.addIndividualObservationPmfmId(individualObservationPmfmId);
787     }
788 
789     @Override
790     public void addAllIndividualObservationPmfmId(Collection<String> individualObservationPmfmId) {
791         editObject.addAllIndividualObservationPmfmId(individualObservationPmfmId);
792     }
793 
794     @Override
795     public boolean removeIndividualObservationPmfmId(String individualObservationPmfmId) {
796         return editObject.removeIndividualObservationPmfmId(individualObservationPmfmId);
797     }
798 
799     @Override
800     public boolean removeAllIndividualObservationPmfmId(Collection<String> individualObservationPmfmId) {
801         return editObject.removeAllIndividualObservationPmfmId(individualObservationPmfmId);
802     }
803 
804     @Override
805     public boolean containsIndividualObservationPmfmId(String individualObservationPmfmId) {
806         return editObject.containsIndividualObservationPmfmId(individualObservationPmfmId);
807     }
808 
809     @Override
810     public boolean containsAllIndividualObservationPmfmId(Collection<String> individualObservationPmfmId) {
811         return editObject.containsAllIndividualObservationPmfmId(individualObservationPmfmId);
812     }
813 
814     @Override
815     public String getLengthClassesPmfmId(int index) {
816         return editObject.getLengthClassesPmfmId(index);
817     }
818 
819     @Override
820     public boolean isLengthClassesPmfmIdEmpty() {
821         return editObject.isLengthClassesPmfmIdEmpty();
822     }
823 
824     @Override
825     public int sizeLengthClassesPmfmId() {
826         return editObject.sizeLengthClassesPmfmId();
827     }
828 
829     @Override
830     public void addLengthClassesPmfmId(String lengthClassesPmfmId) {
831         editObject.addLengthClassesPmfmId(lengthClassesPmfmId);
832         // force to always propagates (need to recompte data of combobox in species table)
833         firePropertyChange(PROPERTY_LENGTH_CLASSES_PMFM_ID, null, getLengthClassesPmfmId());
834     }
835 
836     @Override
837     public void addAllLengthClassesPmfmId(Collection<String> lengthClassesPmfmId) {
838         editObject.addAllLengthClassesPmfmId(lengthClassesPmfmId);
839         // force to always propagates (need to recompte data of combobox in species table)
840         firePropertyChange(PROPERTY_LENGTH_CLASSES_PMFM_ID, null, getLengthClassesPmfmId());
841     }
842 
843     @Override
844     public boolean removeLengthClassesPmfmId(String lengthClassesPmfmId) {
845         boolean result = editObject.removeLengthClassesPmfmId(lengthClassesPmfmId);
846         // force to always propagates (need to recompte data of combobox in species table)
847         firePropertyChange(PROPERTY_LENGTH_CLASSES_PMFM_ID, null, getLengthClassesPmfmId());
848         return result;
849     }
850 
851     @Override
852     public boolean removeAllLengthClassesPmfmId(Collection<String> lengthClassesPmfmId) {
853         boolean result = editObject.removeAllLengthClassesPmfmId(lengthClassesPmfmId);
854         // force to always propagates (need to recompte data of combobox in species table)
855         firePropertyChange(PROPERTY_LENGTH_CLASSES_PMFM_ID, null, getLengthClassesPmfmId());
856         return result;
857     }
858 
859     @Override
860     public boolean containsLengthClassesPmfmId(String lengthClassesPmfmId) {
861         return editObject.containsLengthClassesPmfmId(lengthClassesPmfmId);
862     }
863 
864     @Override
865     public boolean containsAllLengthClassesPmfmId(Collection<String> lengthClassesPmfmId) {
866         return editObject.containsAllLengthClassesPmfmId(lengthClassesPmfmId);
867     }
868 
869     @Override
870     public void addAllMaturityCaracteristics(Collection<MaturityCaracteristic> maturityCaracteristics) {
871         editObject.addAllMaturityCaracteristics(maturityCaracteristics);
872         firePropertyChanged(PROPERTY_MATURITY_CARACTERISTICS, null, getMaturityCaracteristics());
873     }
874 
875     @Override
876     public MaturityCaracteristic getMaturityCaracteristics(int index) {
877         return editObject.getMaturityCaracteristics(index);
878     }
879 
880     @Override
881     public boolean isMaturityCaracteristicsEmpty() {
882         return editObject.isMaturityCaracteristicsEmpty();
883     }
884 
885     @Override
886     public int sizeMaturityCaracteristics() {
887         return editObject.sizeMaturityCaracteristics();
888     }
889 
890     @Override
891     public void addMaturityCaracteristics(MaturityCaracteristic maturityCaracteristics) {
892         editObject.addMaturityCaracteristics(maturityCaracteristics);
893         firePropertyChanged(PROPERTY_MATURITY_CARACTERISTICS, null, getMaturityCaracteristics());
894     }
895 
896     @Override
897     public boolean removeMaturityCaracteristics(MaturityCaracteristic maturityCaracteristics) {
898         boolean result = editObject.removeMaturityCaracteristics(maturityCaracteristics);
899         firePropertyChanged(PROPERTY_MATURITY_CARACTERISTICS, null, getMaturityCaracteristics());
900         return result;
901     }
902 
903     @Override
904     public boolean removeAllMaturityCaracteristics(Collection<MaturityCaracteristic> maturityCaracteristics) {
905         boolean result = editObject.removeAllMaturityCaracteristics(maturityCaracteristics);
906         firePropertyChanged(PROPERTY_MATURITY_CARACTERISTICS, null, getMaturityCaracteristics());
907         return result;
908     }
909 
910     @Override
911     public boolean containsMaturityCaracteristics(MaturityCaracteristic maturityCaracteristics) {
912         return editObject.containsMaturityCaracteristics(maturityCaracteristics);
913     }
914 
915     @Override
916     public boolean containsAllMaturityCaracteristics(Collection<MaturityCaracteristic> maturityCaracteristics) {
917         return editObject.containsAllMaturityCaracteristics(maturityCaracteristics);
918     }
919 
920     @Override
921     public List<MaturityCaracteristic> getMaturityCaracteristics() {
922         return editObject.getMaturityCaracteristics();
923     }
924 
925     @Override
926     public void setMaturityCaracteristics(List<MaturityCaracteristic> maturityCaracteristics) {
927         editObject.setMaturityCaracteristics(maturityCaracteristics);
928         firePropertyChanged(PROPERTY_MATURITY_CARACTERISTICS, null, maturityCaracteristics);
929     }
930 
931     @Override
932     public SpeciesProtocol getSpecies(int index) {
933         return editObject.getSpecies(index);
934     }
935 
936     @Override
937     public boolean isSpeciesEmpty() {
938         return editObject.isSpeciesEmpty();
939     }
940 
941     @Override
942     public int sizeSpecies() {
943         return editObject.sizeSpecies();
944     }
945 
946     @Override
947     public void addSpecies(SpeciesProtocol species) {
948         editObject.addSpecies(species);
949     }
950 
951     @Override
952     public void addAllSpecies(Collection<SpeciesProtocol> species) {
953         editObject.addAllSpecies(species);
954     }
955 
956     @Override
957     public boolean removeSpecies(SpeciesProtocol species) {
958         return editObject.removeSpecies(species);
959     }
960 
961     @Override
962     public boolean removeAllSpecies(Collection<SpeciesProtocol> species) {
963         return editObject.removeAllSpecies(species);
964     }
965 
966     @Override
967     public boolean containsSpecies(SpeciesProtocol species) {
968         return editObject.containsSpecies(species);
969     }
970 
971     @Override
972     public boolean containsAllSpecies(Collection<SpeciesProtocol> species) {
973         return editObject.containsAllSpecies(species);
974     }
975 
976     @Override
977     public List<SpeciesProtocol> getSpecies() {
978         return editObject.getSpecies();
979     }
980 
981     @Override
982     public void setSpecies(List<SpeciesProtocol> species) {
983         editObject.setSpecies(species);
984     }
985 
986     @Override
987     public SpeciesProtocol getBenthos(int index) {
988         return editObject.getBenthos(index);
989     }
990 
991     @Override
992     public boolean isBenthosEmpty() {
993         return editObject.isBenthosEmpty();
994     }
995 
996     @Override
997     public int sizeBenthos() {
998         return editObject.sizeBenthos();
999     }
1000 
1001     @Override
1002     public void addBenthos(SpeciesProtocol benthos) {
1003         editObject.addBenthos(benthos);
1004     }
1005 
1006     @Override
1007     public void addAllBenthos(Collection<SpeciesProtocol> benthos) {
1008         editObject.addAllBenthos(benthos);
1009     }
1010 
1011     @Override
1012     public boolean removeBenthos(SpeciesProtocol benthos) {
1013         return editObject.removeBenthos(benthos);
1014     }
1015 
1016     @Override
1017     public boolean removeAllBenthos(Collection<SpeciesProtocol> benthos) {
1018         return editObject.removeAllBenthos(benthos);
1019     }
1020 
1021     @Override
1022     public boolean containsBenthos(SpeciesProtocol benthos) {
1023         return editObject.containsBenthos(benthos);
1024     }
1025 
1026     @Override
1027     public boolean containsAllBenthos(Collection<SpeciesProtocol> benthos) {
1028         return editObject.containsAllBenthos(benthos);
1029     }
1030 
1031     @Override
1032     public List<SpeciesProtocol> getBenthos() {
1033         return editObject.getBenthos();
1034     }
1035 
1036     @Override
1037     public void setBenthos(List<SpeciesProtocol> benthos) {
1038         editObject.setBenthos(benthos);
1039     }
1040 
1041     @Override
1042     public Integer getVersion() {
1043         return editObject.getVersion();
1044     }
1045 
1046     @Override
1047     public void setVersion(Integer version) {
1048         editObject.setVersion(version);
1049     }
1050 
1051     @Override
1052     public String getImportColumns(int index) {
1053         return editObject.getImportColumns(index);
1054     }
1055 
1056     @Override
1057     public boolean isImportColumnsEmpty() {
1058         return editObject.isImportColumnsEmpty();
1059     }
1060 
1061     @Override
1062     public int sizeImportColumns() {
1063         return editObject.sizeImportColumns();
1064     }
1065 
1066     @Override
1067     public void addImportColumns(String importColumns) {
1068         editObject.addImportColumns(importColumns);
1069         firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns());
1070     }
1071 
1072     @Override
1073     public void addAllImportColumns(Collection<String> importColumns) {
1074         editObject.addAllImportColumns(importColumns);
1075         firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns());
1076     }
1077 
1078     @Override
1079     public boolean removeImportColumns(String importColumns) {
1080         boolean removeImportColumns = editObject.removeImportColumns(importColumns);
1081         firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns());
1082         return removeImportColumns;
1083     }
1084 
1085     @Override
1086     public boolean removeAllImportColumns(Collection<String> importColumns) {
1087         boolean removeAllImportColumns = editObject.removeAllImportColumns(importColumns);
1088         firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns());
1089         return removeAllImportColumns;
1090     }
1091 
1092     @Override
1093     public boolean containsImportColumns(String importColumns) {
1094         return editObject.containsImportColumns(importColumns);
1095     }
1096 
1097     @Override
1098     public boolean containsAllImportColumns(Collection<String> importColumns) {
1099         return editObject.containsAllImportColumns(importColumns);
1100     }
1101 
1102     @Override
1103     public Collection<String> getImportColumns() {
1104         return editObject.getImportColumns();
1105     }
1106 
1107     @Override
1108     public void setImportColumns(Collection<String> importColumns) {
1109         editObject.setImportColumns(importColumns);
1110         firePropertyChanged(TuttiProtocol.PROPERTY_IMPORT_COLUMNS, null, getImportColumns());
1111     }
1112 
1113     @Override
1114     public void setOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) {
1115         editObject.setOperationFieldMapping(operationFieldMapping);
1116         firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping());
1117     }
1118 
1119     public boolean isAvailableStratas() {
1120         return getAvailableStratasTreeModel().isAvailableStratas();
1121     }
1122 
1123     public void setAvailableStratas(boolean availableStratas) {
1124     }
1125 
1126     @Override
1127     public Collection<Zone> getZone() {
1128         // Not used
1129         return null;
1130     }
1131 
1132     @Override
1133     public void setZone(Collection<Zone> zones) {
1134         // Not used
1135     }
1136 
1137     @Override
1138     public Zone getZone(int index) {
1139         // Not used
1140         return null;
1141     }
1142 
1143     @Override
1144     public boolean isZoneEmpty() {
1145 
1146         // Not used
1147         return true;
1148     }
1149 
1150     @Override
1151     public int sizeZone() {
1152         // Not used
1153         return 0;
1154     }
1155 
1156     @Override
1157     public void addZone(Zone zone) {
1158         // Not used
1159     }
1160 
1161     @Override
1162     public void addAllZone(Collection<Zone> zones) {
1163         // Not used
1164     }
1165 
1166     @Override
1167     public boolean removeZone(Zone zone) {
1168         // Not used
1169         return false;
1170     }
1171 
1172     @Override
1173     public boolean removeAllZone(Collection<Zone> zones) {
1174         // Not used
1175         return false;
1176     }
1177 
1178     @Override
1179     public boolean containsZone(Zone zone) {
1180         // Not used
1181         return false;
1182     }
1183 
1184     @Override
1185     public boolean containsAllZone(Collection<Zone> zones) {
1186         // Not used
1187         return false;
1188     }
1189 
1190     @Override
1191     public Collection<OperationFieldMappingRow> getOperationFieldMapping() {
1192         return editObject.getOperationFieldMapping();
1193     }
1194 
1195     @Override
1196     public boolean containsAllOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) {
1197         return editObject.containsAllOperationFieldMapping(operationFieldMapping);
1198     }
1199 
1200     @Override
1201     public boolean containsOperationFieldMapping(OperationFieldMappingRow operationFieldMapping) {
1202         return editObject.containsOperationFieldMapping(operationFieldMapping);
1203     }
1204 
1205     @Override
1206     public boolean removeAllOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) {
1207         boolean removeAllOperationFieldMapping = editObject.removeAllOperationFieldMapping(operationFieldMapping);
1208         firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping());
1209         return removeAllOperationFieldMapping;
1210     }
1211 
1212     @Override
1213     public boolean removeOperationFieldMapping(OperationFieldMappingRow operationFieldMapping) {
1214         boolean removeOperationFieldMapping = editObject.removeOperationFieldMapping(operationFieldMapping);
1215         firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping());
1216         return removeOperationFieldMapping;
1217     }
1218 
1219     @Override
1220     public void addAllOperationFieldMapping(Collection<OperationFieldMappingRow> operationFieldMapping) {
1221         editObject.addAllOperationFieldMapping(operationFieldMapping);
1222         firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping());
1223     }
1224 
1225     @Override
1226     public void addOperationFieldMapping(OperationFieldMappingRow operationFieldMapping) {
1227         editObject.addOperationFieldMapping(operationFieldMapping);
1228         firePropertyChanged(TuttiProtocol.PROPERTY_OPERATION_FIELD_MAPPING, null, getOperationFieldMapping());
1229     }
1230 
1231     @Override
1232     public int sizeOperationFieldMapping() {
1233         return editObject.sizeOperationFieldMapping();
1234     }
1235 
1236     @Override
1237     public boolean isOperationFieldMappingEmpty() {
1238         return editObject.isOperationFieldMappingEmpty();
1239     }
1240 
1241     @Override
1242     public OperationFieldMappingRow getOperationFieldMapping(int index) {
1243         return editObject.getOperationFieldMapping(index);
1244     }
1245 
1246     @Override
1247     public boolean isUseCalcifiedPieceSampling() {
1248         return editObject.isUseCalcifiedPieceSampling();
1249     }
1250 
1251     @Override
1252     public void setUseCalcifiedPieceSampling(boolean useCalcifiedPieceSampling) {
1253         boolean oldValue = isUseCalcifiedPieceSampling();
1254         editObject.setUseCalcifiedPieceSampling(useCalcifiedPieceSampling);
1255         firePropertyChanged(TuttiProtocol.PROPERTY_USE_CALCIFIED_PIECE_SAMPLING, oldValue, useCalcifiedPieceSampling);
1256     }
1257 
1258     public int numberOfRows(String column) {
1259         int result = 0;
1260         MutableInt mutableInt = numberOfRowsByColumn.get(column);
1261         if (mutableInt != null) {
1262             result = mutableInt.intValue();
1263         }
1264         return result;
1265     }
1266 
1267     public void resetNumbersOfRows() {
1268         numberOfRowsByColumn = new HashMap<>();
1269     }
1270 
1271     public int incNumberOfRows(String column) {
1272         MutableInt mutableInt = numberOfRowsByColumn.get(column);
1273         if (mutableInt == null) {
1274             mutableInt = new MutableInt(1);
1275             numberOfRowsByColumn.put(column, mutableInt);
1276         } else {
1277             mutableInt.increment();
1278         }
1279         return mutableInt.intValue();
1280 
1281     }
1282 
1283     public int decNumberOfRows(String column) {
1284         MutableInt mutableInt = numberOfRowsByColumn.get(column);
1285         Preconditions.checkNotNull(mutableInt);
1286         Preconditions.checkArgument(mutableInt.intValue() > 0);
1287         mutableInt.decrement();
1288         return mutableInt.intValue();
1289     }
1290 
1291 
1292     public void selectStrataNodes(ZoneNode selectedZoneNode, StrataNode sourceStrataNode) {
1293 
1294         // suppression de l'arbre des disponibles
1295         availableStratasTreeModel.removeNodeFromParent(sourceStrataNode);
1296 
1297         String sourceStrataId = sourceStrataNode.getId();
1298 
1299         // récupération ou création du nœud de la strate dans la zone choisie
1300         StrataNode targetStrataNode = zonesTreeModel.getOrCreateStrataNode(selectedZoneNode, sourceStrataId);
1301 
1302         // déplacement des nœuds de toutes les sous-strates sur la strate cible
1303         zonesTreeModel.moveSubStratas(sourceStrataNode, targetStrataNode);
1304 
1305         setModify(true);
1306 
1307     }
1308 
1309     public void selectedSubStraNodes(ZoneNode selectedZoneNode, SubStrataNode sourceSubStrataNode) {
1310 
1311         StrataNode sourceStrataNode = sourceSubStrataNode.getParent();
1312 
1313         // suppression de l'arbre des disponibles
1314         availableStratasTreeModel.removeNodeFromParent(sourceSubStrataNode);
1315 
1316         if (sourceStrataNode.isLeaf()) {
1317 
1318             // la strate d'origine est vide, on peut la supprimer
1319             availableStratasTreeModel.removeNodeFromParent(sourceStrataNode);
1320 
1321         }
1322 
1323         // récupération ou création de la strate dans la zone choisie
1324         StrataNode targetStrataNode = zonesTreeModel.getOrCreateStrataNode(selectedZoneNode, sourceStrataNode.getId());
1325 
1326         // ajout de la sous-strate sur la strate cible
1327         zonesTreeModel.addNode(targetStrataNode, sourceSubStrataNode);
1328 
1329         setModify(true);
1330 
1331     }
1332 
1333 
1334     public void unselectStrataNode(StrataNode sourceStrataNode) {
1335 
1336         // Suppression de la strate de la zone
1337         zonesTreeModel.removeNodeFromParent(sourceStrataNode);
1338 
1339         // récupération ou création du nœud de la strate dans la zone choisie
1340         StrataNode targetStrataNode = availableStratasTreeModel.getOrCreateStrataNode(sourceStrataNode.getId());
1341 
1342         // déplacement des nœuds de toutes les sous-strates sur la strate cible
1343         availableStratasTreeModel.moveSubStratas(sourceStrataNode, targetStrataNode);
1344 
1345         setModify(true);
1346 
1347     }
1348 
1349     public void unselectSubStrataNode(SubStrataNode sourceSubStrataNode) {
1350 
1351         StrataNode sourceStrataNode = sourceSubStrataNode.getParent();
1352 
1353         // Suppression de la sous-strate
1354         zonesTreeModel.removeNodeFromParent(sourceSubStrataNode);
1355 
1356         if (sourceStrataNode.isLeaf()) {
1357 
1358             // plus de sous-strate, on peut supprimer la strate de la zone sélectionnée
1359             zonesTreeModel.removeNodeFromParent(sourceStrataNode);
1360 
1361         }
1362 
1363         // récupération ou création du nœud de la strate dans la zone choisie
1364         StrataNode targetStrataNode = availableStratasTreeModel.getOrCreateStrataNode(sourceStrataNode.getId());
1365 
1366         // ajout de la sous-strate
1367         availableStratasTreeModel.addNode(targetStrataNode, sourceSubStrataNode);
1368 
1369         setModify(true);
1370 
1371     }
1372 
1373     public boolean isModifyingZones() {
1374         return modifyingZones;
1375     }
1376 
1377     public void setModifyingZones(boolean modifyingZones) {
1378         Object oldValue = isModifyingZones();
1379         this.modifyingZones = modifyingZones;
1380         firePropertyChange(PROPERTY_MODIFYING_ZONES, oldValue, modifyingZones);
1381     }
1382 
1383     public void setLocationLabelCache(ImmutableMap<String, String> locationLabelCache) {
1384         this.zonesTreeModel.setLocationLabelCache(locationLabelCache);
1385         this.availableStratasTreeModel.setLocationLabelCache(locationLabelCache);
1386     }
1387 
1388     public Map<String, MaturityCaracteristic> getMaturityCaracteristicsById() {
1389         return maturityCaracteristicsById;
1390     }
1391 
1392     public void setMaturityCaracteristicsById(LinkedHashMap<String, MaturityCaracteristic> maturityCaracteristicsById) {
1393         this.maturityCaracteristicsById.clear();
1394         if (maturityCaracteristicsById != null) {
1395             this.maturityCaracteristicsById.putAll(maturityCaracteristicsById);
1396         }
1397     }
1398 
1399     public MaturityCaracteristic getMaturityCaracteristic(String id) {
1400         return maturityCaracteristicsById.get(id);
1401     }
1402 
1403     public boolean isMaturityValid(Caracteristic maturityCaracteristic) {
1404         Objects.requireNonNull(maturityCaracteristic);
1405         return isMaturityValid(maturityCaracteristic.getId());
1406     }
1407 
1408     public boolean isMaturityValid(String maturityCaracteristicId) {
1409         MaturityCaracteristic maturityCaracteristic = maturityCaracteristicsById.get(maturityCaracteristicId);
1410         return maturityCaracteristic != null && CollectionUtils.isNotEmpty(maturityCaracteristic.getMatureStateIds());
1411     }
1412 
1413     public boolean areAllMaturitiesValid() {
1414         return maturityPmfmId == null || maturityPmfmId.stream().allMatch(this::isMaturityValid);
1415     }
1416 }