View Javadoc
1   package fr.ifremer.reefdb.ui.swing.content.manage.referential.taxon.local;
2   
3   /*
4    * #%L
5    * Reef DB :: UI
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2014 - 2015 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (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 Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
24   */
25  
26  import fr.ifremer.quadrige3.core.dao.referential.StatusCode;
27  import fr.ifremer.quadrige3.ui.swing.table.SwingTable;
28  import fr.ifremer.reefdb.dao.technical.Daos;
29  import fr.ifremer.reefdb.decorator.DecoratorService;
30  import fr.ifremer.reefdb.dto.ReefDbBeanFactory;
31  import fr.ifremer.reefdb.dto.ReefDbBeans;
32  import fr.ifremer.reefdb.dto.configuration.filter.taxon.TaxonCriteriaDTO;
33  import fr.ifremer.reefdb.dto.referential.TaxonDTO;
34  import fr.ifremer.reefdb.ui.swing.content.manage.referential.taxon.menu.TaxonMenuUIModel;
35  import fr.ifremer.reefdb.ui.swing.content.manage.referential.taxon.table.TaxonTableModel;
36  import fr.ifremer.reefdb.ui.swing.content.manage.referential.taxon.table.TaxonTableRowModel;
37  import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbTableModel;
38  import fr.ifremer.reefdb.ui.swing.util.table.AbstractReefDbTableUIHandler;
39  import org.apache.commons.collections4.CollectionUtils;
40  import org.apache.commons.lang3.StringUtils;
41  import org.apache.commons.logging.Log;
42  import org.apache.commons.logging.LogFactory;
43  import org.jdesktop.swingx.table.TableColumnExt;
44  
45  import java.util.List;
46  import java.util.Objects;
47  
48  import static org.nuiton.i18n.I18n.t;
49  
50  /**
51   * Controlleur pour l administration des taxons au niveau local
52   */
53  public class TaxonsLocalUIHandler extends AbstractReefDbTableUIHandler<TaxonTableRowModel, TaxonsLocalUIModel, TaxonsLocalUI> {
54  
55      /**
56       * Logger.
57       */
58      private static final Log LOG = LogFactory.getLog(TaxonsLocalUIHandler.class);
59  
60      /**
61       * {@inheritDoc}
62       */
63      @Override
64      public void beforeInit(final TaxonsLocalUI ui) {
65          super.beforeInit(ui);
66  
67          // create model and register to the JAXX context
68          final TaxonsLocalUIModel model = new TaxonsLocalUIModel();
69          ui.setContextValue(model);
70      }
71  
72      /**
73       * {@inheritDoc}
74       */
75      @Override
76      public void afterInit(final TaxonsLocalUI ui) {
77          initUI(ui);
78  
79          // hide context filter panel
80          ui.getTaxonsLocalMenuUI().getHandler().enableContextFilter(false);
81  
82          // force local
83          ui.getTaxonsLocalMenuUI().getHandler().forceLocal(true);
84  
85          TaxonMenuUIModel localMenuModel = ui.getTaxonsLocalMenuUI().getModel();
86  
87          // set full search mode
88          localMenuModel.setFullProperties(true);
89  
90          // listen to search results
91          localMenuModel.addPropertyChangeListener(TaxonMenuUIModel.PROPERTY_RESULTS, evt -> getModel().setBeans((List<TaxonDTO>) evt.getNewValue()));
92  
93          // Initialisation du tableau
94          initTable();
95      }
96  
97      /**
98       * Initialisation du tableau.
99       */
100     private void initTable() {
101 
102         // name
103         TableColumnExt nameCol = addColumn(TaxonTableModel.NAME);
104         nameCol.setSortable(true);
105 
106         // parent taxon
107         List<TaxonDTO> taxons = getContext().getReferentialService().getTaxons(null);
108         getContext().getReferentialService().fillReferentTaxons(taxons);
109         addColumn(
110                 newFilterableComboBoxCellEditor(taxons, TaxonDTO.class, DecoratorService.WITH_CITATION_AND_REFERENT, false),
111                 newTableCellRender(TaxonDTO.class, null, DecoratorService.WITH_CITATION_AND_REFERENT),
112                 TaxonTableModel.PARENT);
113 
114         // level
115         TableColumnExt levelCol = addFilterableComboDataColumnToModel(
116                 TaxonTableModel.LEVEL,
117                 getContext().getReferentialService().getTaxonomicLevels(),
118                 false);
119 
120         // comment
121         TableColumnExt commentCol = addCommentColumn(TaxonTableModel.COMMENT);
122         commentCol.setSortable(false);
123         TableColumnExt creationDateCol = addDatePickerColumnToModel(TaxonTableModel.CREATION_DATE, getConfig().getDateTimeFormat(), false);
124         fixColumnWidth(creationDateCol, 120);
125         TableColumnExt updateDateCol = addDatePickerColumnToModel(TaxonTableModel.UPDATE_DATE, getConfig().getDateTimeFormat(), false);
126         fixColumnWidth(updateDateCol, 120);
127 
128         // citation
129         TableColumnExt citationCol = addFilterableComboDataColumnToModel(
130                 TaxonTableModel.CITATION,
131                 getContext().getReferentialService().getCitations(),
132                 false);
133 
134         // obsolete
135         TableColumnExt obsoleteCol = addBooleanColumnToModel(TaxonTableModel.OBSOLETE, getTable());
136         obsoleteCol.setSortable(false);
137 
138         TaxonTableModel tableModel = new TaxonTableModel(getTable().getColumnModel(), true);
139         getTable().setModel(tableModel);
140 
141         // Add extraction action
142         addExportToCSVAction(t("reefdb.property.taxons.local"));
143 
144         // Initialisation du tableau
145         initTable(getTable());
146 
147         // optionnal columns are hidden
148         citationCol.setVisible(false);
149 
150         creationDateCol.setVisible(false);
151         updateDateCol.setVisible(false);
152 
153         getTable().setVisibleRowCount(5);
154     }
155 
156     /**
157      * {@inheritDoc}
158      */
159     @Override
160     public AbstractReefDbTableModel<TaxonTableRowModel> getTableModel() {
161         return (TaxonTableModel) getTable().getModel();
162     }
163 
164     /**
165      * {@inheritDoc}
166      */
167     @Override
168     public SwingTable getTable() {
169         return ui.getTaxonsLocalTable();
170     }
171 
172     /**
173      * {@inheritDoc}
174      */
175     @Override
176     protected void onRowsAdded(List<TaxonTableRowModel> addedRows) {
177         super.onRowsAdded(addedRows);
178 
179         if (addedRows.size() == 1) {
180             TaxonTableRowModel rowModel = addedRows.get(0);
181             // Set default status TODO taxonName n'a pas de status !!
182             rowModel.setStatus(Daos.getStatus(StatusCode.LOCAL_ENABLE));
183             setFocusOnCell(rowModel);
184         }
185     }
186 
187     /**
188      * {@inheritDoc}
189      */
190     @Override
191     protected void onRowModified(int rowIndex, TaxonTableRowModel row, String propertyName, Integer propertyIndex, Object oldValue, Object newValue) {
192         super.onRowModified(rowIndex, row, propertyName, propertyIndex, oldValue, newValue);
193         row.setDirty(true);
194         forceRevalidateModel();
195     }
196 
197     /**
198      * {@inheritDoc}
199      */
200     @Override
201     protected boolean isRowValid(TaxonTableRowModel row) {
202         row.getErrors().clear();
203         return super.isRowValid(row) && isUnique(row);
204     }
205 
206     private boolean isUnique(TaxonTableRowModel row) {
207 
208         if (StringUtils.isNotBlank(row.getName())) {
209             boolean duplicateFound = false;
210 
211             // check unicity in local table
212             for (TaxonTableRowModel otherRow : getModel().getRows()) {
213                 if (row == otherRow) continue;
214                 if (row.getName().equalsIgnoreCase(otherRow.getName())
215                         && Objects.equals(row.getCitation(), otherRow.getCitation())) {
216                     // duplicate found in table
217                     ReefDbBeans.addError(row,
218                             t("reefdb.error.alreadyExists.referential",
219                                     t("reefdb.property.taxon"), decorate(row, DecoratorService.WITH_CITATION), t("reefdb.property.referential.local")),
220                             TaxonDTO.PROPERTY_NAME,
221                             TaxonDTO.PROPERTY_CITATION);
222                     duplicateFound = true;
223                     break;
224                 }
225             }
226 
227             if (!duplicateFound) {
228                 // check unicity in database
229                 TaxonCriteriaDTO taxonCriteria = ReefDbBeanFactory.newTaxonCriteriaDTO();
230                 taxonCriteria.setName(row.getName());
231                 taxonCriteria.setStrictName(true);
232                 List<TaxonDTO> existingTaxons = getContext().getReferentialService().searchTaxons(taxonCriteria);
233                 if (CollectionUtils.isNotEmpty(existingTaxons)) {
234                     for (TaxonDTO taxon : existingTaxons) {
235                         if (!taxon.getId().equals(row.getId())
236                                 && Objects.equals(row.getCitation(), taxon.getCitation())) {
237                             // duplicate found in database
238                             ReefDbBeans.addError(row,
239                                     t("reefdb.error.alreadyExists.referential",
240                                             t("reefdb.property.pmfm"), decorate(row, DecoratorService.WITH_CITATION),
241                                             ReefDbBeans.isLocalStatus(taxon.getStatus()) ? t("reefdb.property.referential.local") : t("reefdb.property.referential.national")),
242                                     TaxonDTO.PROPERTY_NAME,
243                                     TaxonDTO.PROPERTY_CITATION);
244                             break;
245                         }
246                     }
247                 }
248             }
249         }
250 
251         return row.getErrors().isEmpty();
252 
253     }
254 
255 }