Author: chatellier Date: 2010-11-18 15:06:25 +0000 (Thu, 18 Nov 2010) New Revision: 237 Log: Am?\195?\169lioration de la fonction find& replace. Sauvegarde des commandes lors de la modification d'une ligne. Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java trunk/coser-business/src/main/java/fr/ifremer/coser/data/AbstractDataEntity.java trunk/coser-business/src/main/java/fr/ifremer/coser/data/Catch.java trunk/coser-business/src/main/java/fr/ifremer/coser/data/Haul.java trunk/coser-business/src/main/java/fr/ifremer/coser/data/Length.java trunk/coser-business/src/main/java/fr/ifremer/coser/data/Strata.java trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlFindReplaceDialog.jaxx trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java 2010-11-18 12:16:11 UTC (rev 236) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/command/ModifyFieldCommand.java 2010-11-18 15:06:25 UTC (rev 237) @@ -28,7 +28,6 @@ import static org.nuiton.i18n.I18n._; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.apache.commons.beanutils.PropertyUtils; @@ -135,27 +134,22 @@ break; } - Iterator<String[]> itData = dataStorage.iterator(); - itData.next(); // header - while (itData.hasNext()) { - String[] data = itData.next(); - String dataLineNumber = data[AbstractDataEntity.INDEX_LINE]; - - if (dataLineNumber.equals(lineNumber)) { - beanData.setData(data); - try { - String dataValue = (String)PropertyUtils.getProperty(beanData, fieldName); - if (dataValue.equals(currentValue)) { - PropertyUtils.setProperty(beanData, fieldName, newValue); - } - else { - throw new CoserBusinessException(_("Can't replace data value. Expected %s but was %s", currentValue, dataValue)); - } - break; - } catch (Exception ex) { - throw new CoserBusinessException("Can't replace data field value", ex); - } + int lineIndex = dataStorage.indexOf(lineNumber); + String[] data = dataStorage.get(lineIndex); + beanData.setData(data); + try { + String stringFieldProperty = fieldName + "AsString"; + String dataValue = (String)PropertyUtils.getProperty(beanData, stringFieldProperty); + if (dataValue.equals(currentValue)) { + PropertyUtils.setProperty(beanData, stringFieldProperty, newValue); + + dataStorage.set(lineIndex, beanData.getData()); } + else { + throw new CoserBusinessException(_("Can't replace data value. Expected %s but was %s", currentValue, dataValue)); + } + } catch (Exception ex) { + throw new CoserBusinessException("Can't replace data field value", ex); } } @@ -182,27 +176,22 @@ break; } - Iterator<String[]> itData = dataStorage.iterator(); - itData.next(); // header - while (itData.hasNext()) { - String[] data = itData.next(); - String dataLineNumber = data[AbstractDataEntity.INDEX_LINE]; - - if (dataLineNumber.equals(lineNumber)) { - beanData.setData(data); - try { - String dataValue = (String)PropertyUtils.getProperty(beanData, fieldName); - if (dataValue.equals(newValue)) { - PropertyUtils.setProperty(data, fieldName, currentValue); - } - else { - throw new CoserBusinessException(_("Can't replace data value. Expected %s but was %s", newValue, dataValue)); - } - break; - } catch (Exception ex) { - throw new CoserBusinessException("Can't replace data field value", ex); - } + int lineIndex = dataStorage.indexOf(lineNumber); + String[] data = dataStorage.get(lineIndex); + beanData.setData(data); + try { + String stringFieldProperty = fieldName + "AsString"; + String dataValue = (String)PropertyUtils.getProperty(beanData, stringFieldProperty); + if (dataValue.equals(newValue)) { + PropertyUtils.setProperty(data, stringFieldProperty, currentValue); + + dataStorage.set(lineIndex, beanData.getData()); } + else { + throw new CoserBusinessException(_("Can't replace data value. Expected %s but was %s", newValue, dataValue)); + } + } catch (Exception ex) { + throw new CoserBusinessException("Can't replace data field value", ex); } } Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/data/AbstractDataEntity.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/data/AbstractDataEntity.java 2010-11-18 12:16:11 UTC (rev 236) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/data/AbstractDataEntity.java 2010-11-18 15:06:25 UTC (rev 237) @@ -64,4 +64,11 @@ public String getLine() { return data[INDEX_LINE]; } + + /** + * Return CSV header according to properties names. + * + * @return header array + */ + public abstract String[] getHeaders(); } Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/data/Catch.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/data/Catch.java 2010-11-18 12:16:11 UTC (rev 236) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/data/Catch.java 2010-11-18 15:06:25 UTC (rev 237) @@ -57,6 +57,10 @@ public static final int INDEX_NUMBER = 5; public static final int INDEX_WEIGHT = 6; + public String[] getHeaders() { + return EN_HEADERS; + } + public void setSurvey(String value) { String oldValue = data[INDEX_SURVEY]; data[INDEX_SURVEY] = value; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/data/Haul.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/data/Haul.java 2010-11-18 12:16:11 UTC (rev 236) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/data/Haul.java 2010-11-18 15:06:25 UTC (rev 237) @@ -60,6 +60,10 @@ public static final int INDEX_LONG = 8; public static final int INDEX_DEPTH = 9; + public String[] getHeaders() { + return EN_HEADERS; + } + public void setSurvey(String value) { String oldValue = data[INDEX_SURVEY]; data[INDEX_SURVEY] = value; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/data/Length.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/data/Length.java 2010-11-18 12:16:11 UTC (rev 236) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/data/Length.java 2010-11-18 15:06:25 UTC (rev 237) @@ -60,7 +60,11 @@ public static final int INDEX_NUMBER = 8; public static final int INDEX_WEIGHT = 9; public static final int INDEX_AGE = 10; - + + public String[] getHeaders() { + return EN_HEADERS; + } + public void setSurvey(String value) { String oldValue = data[INDEX_SURVEY]; data[INDEX_SURVEY] = value; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/data/Strata.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/data/Strata.java 2010-11-18 12:16:11 UTC (rev 236) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/data/Strata.java 2010-11-18 15:06:25 UTC (rev 237) @@ -54,6 +54,10 @@ public static final int INDEX_STRATUM = 2; public static final int INDEX_SURFACE = 3; + public String[] getHeaders() { + return EN_HEADERS; + } + public void setSurvey(String value) { String oldValue = data[INDEX_SURVEY]; data[INDEX_SURVEY] = value; Modified: trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java =================================================================== --- trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-11-18 12:16:11 UTC (rev 236) +++ trunk/coser-business/src/main/java/fr/ifremer/coser/services/ProjectService.java 2010-11-18 15:06:25 UTC (rev 237) @@ -27,12 +27,14 @@ import static org.nuiton.i18n.I18n._; +import java.beans.Introspector; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -1012,14 +1014,15 @@ * @param data current data * @param isRegex is regex * @param commandUUID commandUUID - * @return modified data + * @return modification flag * @throws CoserBusinessException */ - public String[] replaceFieldValue(Project project, Category category, String fieldName, + public boolean replaceFieldValue(Project project, Category category, String fieldName, String searchString, String replaceString, String[] data, boolean isRegex, String commandUUID) throws CoserBusinessException { + boolean result = false; + AbstractDataEntity beanData = null; - switch (category) { case CATCH: beanData = new Catch(); @@ -1034,12 +1037,12 @@ beanData = new Strata(); break; } - beanData.setData(data); // get current data value try { - String currentValue = (String)PropertyUtils.getProperty(beanData, fieldName); + String stringFieldProperty = fieldName + "AsString"; + String currentValue = (String)PropertyUtils.getProperty(beanData, stringFieldProperty); String escapeSearchString = searchString; if (!isRegex) { @@ -1059,15 +1062,89 @@ command.setCategory(category); commandService.doAction(command, project, project.getControl()); + + result = true; } } catch (Exception ex) { throw new CoserBusinessException("Can't replace inner field value", ex); } - return beanData.getData(); + return result; } /** + * Replace all bean data. Compare current and new value, and build command + * for each diff. + * + * @param project project + * @param control control + * @param category category + * @param data new data to set + * @throws CoserBusinessException + */ + public void replaceData(Project project, Control control, Category category, String[] data) throws CoserBusinessException { + + // build bean for current and new data + String lineNumber = data[AbstractDataEntity.INDEX_LINE]; + int lineIndex = -1; + AbstractDataEntity currentBeanData = null; + AbstractDataEntity newBeanData = null; + switch (category) { + case CATCH: + currentBeanData = new Catch(); + newBeanData = new Catch(); + lineIndex = control.getCatch().indexOf(lineNumber); + currentBeanData.setData(control.getCatch().get(lineIndex)); + break; + case HAUL: + currentBeanData = new Haul(); + newBeanData = new Catch(); + lineIndex = control.getHaul().indexOf(lineNumber); + currentBeanData.setData(control.getHaul().get(lineIndex)); + break; + case LENGTH: + currentBeanData = new Length(); + newBeanData = new Length(); + lineIndex = control.getLength().indexOf(lineNumber); + currentBeanData.setData(control.getLength().get(lineIndex)); + break; + case STRATA: + currentBeanData = new Strata(); + newBeanData = new Strata(); + lineIndex = control.getStrata().indexOf(lineNumber); + currentBeanData.setData(control.getStrata().get(lineIndex)); + break; + } + newBeanData.setData(data); + + String commandUUID = commandService.getUniqueCommandUUID(); + + // inspect beans + for (String propertyHeader : currentBeanData.getHeaders()) { + String propertyName = Introspector.decapitalize(propertyHeader); + String stringFieldProperty = propertyName + "AsString"; + try { + String currentValue = (String)PropertyUtils.getProperty(currentBeanData, stringFieldProperty); + String newValue = (String)PropertyUtils.getProperty(newBeanData, stringFieldProperty); + + if (!currentValue.equals(newValue)) { + ModifyFieldCommand command = new ModifyFieldCommand(); + command.setCommandUUID(commandUUID); + command.setFieldName(propertyName); + command.setLineNumber(lineNumber); + command.setCurrentValue(currentValue); + command.setNewValue(newValue); + command.setCategory(category); + + commandService.doAction(command, project, control); + } + } catch (Exception ex) { + throw new CoserBusinessException("Can't get bean value", ex); + } + } + } + + /** * Get zones name in project with data in [{@code beginYear}-{@code endYear}]. * * Used in selection ui. Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlFindReplaceDialog.jaxx =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlFindReplaceDialog.jaxx 2010-11-18 12:16:11 UTC (rev 236) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlFindReplaceDialog.jaxx 2010-11-18 15:06:25 UTC (rev 237) @@ -25,6 +25,7 @@ <JDialog title="coser.ui.control.replace.title" modal="true"> <ControlHandler id="handler" javaBean="null" /> <Integer id="columnIndex" javaBean="-1" /> + <Boolean id="replaceInSelection" javaBean="false" /> <Table> <row> <cell fill="horizontal"> Modified: trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java =================================================================== --- trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-11-18 12:16:11 UTC (rev 236) +++ trunk/coser-ui/src/main/java/fr/ifremer/coser/ui/control/ControlHandler.java 2010-11-18 15:06:25 UTC (rev 237) @@ -132,6 +132,7 @@ ControlFindReplaceDialog viewDialog = new ControlFindReplaceDialog(controlView); viewDialog.setHandler(ControlHandler.this); viewDialog.setColumnIndex(columnIndex); + viewDialog.setReplaceInSelection(true); viewDialog.getReplaceFieldNameLabel().setText(columnName); viewDialog.getReplaceFindField().setText(firstValue); viewDialog.setLocationRelativeTo(controlView); @@ -262,39 +263,40 @@ String commandUUID = UUID.randomUUID().toString(); try { - // on suppose que la fenetre est modale, et - // que la selection ne peut pas avoir changée + int replaceCount = 0; - int[] dataSelectedRows = controlView.getControlDataTable().getSelectedRows(); - for (int dataSelectedRow : dataSelectedRows) { - String[] data = controlDataModel.getDataAt(dataSelectedRow); - String[] newData = projectService.replaceFieldValue(project, category, field, find, replace, data, false, commandUUID); - - if (Arrays.equals(data, newData)) { - controlDataModel.fireTableRowsUpdated(dataSelectedRow, dataSelectedRow); + + if (replaceView.isReplaceInSelection()) { + // on suppose que la fenetre est modale, et + // que la selection ne peut pas avoir changée + int[] dataSelectedRows = controlView.getControlDataTable().getSelectedRows(); + for (int dataSelectedRow : dataSelectedRows) { + String[] data = controlDataModel.getDataAt(dataSelectedRow); + boolean replaced = projectService.replaceFieldValue(project, category, field, find, replace, data, false, commandUUID); - switch (category) { - case CATCH: - project.getControl().getCatch().set(dataSelectedRow + 1, newData); // csv header + if (replaced) { controlDataModel.fireTableRowsUpdated(dataSelectedRow, dataSelectedRow); - break; - case HAUL: - project.getControl().getHaul().set(dataSelectedRow + 1, newData); // csv header - controlDataModel.fireTableRowsUpdated(dataSelectedRow, dataSelectedRow); - break; - case LENGTH: - project.getControl().getLength().set(dataSelectedRow + 1, newData); // csv header - controlDataModel.fireTableRowsUpdated(dataSelectedRow, dataSelectedRow); - break; - case STRATA: - project.getControl().getStrata().set(dataSelectedRow + 1, newData); // csv header - controlDataModel.fireTableRowsUpdated(dataSelectedRow, dataSelectedRow); - break; + replaceCount++; } + } + } + else { + int rowCount = controlView.getControlDataTableModel().getRowCount(); + for (int rowIndex = 0 ; rowIndex < rowCount ; ++rowIndex) { + String[] data = controlDataModel.getDataAt(rowIndex); + boolean replaced = projectService.replaceFieldValue(project, category, field, find, replace, data, false, commandUUID); - replaceCount++; + if (replaced) { + controlDataModel.fireTableRowsUpdated(rowIndex, rowIndex); + replaceCount++; + } } } + + // message de confirmation + JOptionPane.showMessageDialog(replaceView, _("coser.ui.control.replace.replacedCount", replaceCount), + _("coser.ui.control.replace.title"), JOptionPane.INFORMATION_MESSAGE); + } catch (CoserBusinessException ex) { throw new CoserException("Can't replace field value", ex); } @@ -557,35 +559,30 @@ Length beanLength = null; Strata beanStrata = null; AbstractDataEntity bean = null; - String[] enHeaders = null; SwingValidator<?> validator = null; switch (category) { case CATCH: beanCatch = new Catch(); beanCatch.setData(line); bean = beanCatch; - enHeaders = Catch.EN_HEADERS; validator = view.getValidatorCatch(); break; case HAUL: beanHaul = new Haul(); beanHaul.setData(line); bean = beanHaul; - enHeaders = Haul.EN_HEADERS; validator = view.getValidatorHaul(); break; case LENGTH: beanLength = new Length(); beanLength.setData(line); bean = beanLength; - enHeaders = Length.EN_HEADERS; validator = view.getValidatorLength(); break; case STRATA: beanStrata = new Strata(); beanStrata.setData(line); bean = beanStrata; - enHeaders = Strata.EN_HEADERS; validator = view.getValidatorStrata(); break; } @@ -603,7 +600,7 @@ String headerValue = header[fieldIndex]; String fieldValue = line[fieldIndex]; - String beanFieldName = Introspector.decapitalize(enHeaders[fieldIndex - 1]); + String beanFieldName = Introspector.decapitalize(bean.getHeaders()[fieldIndex - 1]); // l'ui ne peut utiliser les getter/setter que sur les champs // xxxAsString @@ -757,39 +754,41 @@ disableValidAction(view); Project project = view.getContextValue(Project.class); + ProjectService projectService = view.getContextValue(ProjectService.class); JTable controlDataTable = view.getControlDataTable(); ControlDataTableModel model = (ControlDataTableModel)controlDataTable.getModel(); int selectedLine = controlDataTable.getSelectedRow(); Category category = (Category)view.getCategoryComboBox().getSelectedItem(); - + // get data - String[] data; + String[] newData = null; switch (category) { case CATCH: Catch beanCatch = view.getValidatorCatch().getBean(); - data = beanCatch.getData(); - project.getControl().getCatch().set(selectedLine + 1, data); // csv header - model.fireTableRowsUpdated(selectedLine, selectedLine); + newData = beanCatch.getData(); break; case HAUL: Haul beanHaul = view.getValidatorHaul().getBean(); - data = beanHaul.getData(); - project.getControl().getHaul().set(selectedLine + 1, data); // csv header - model.fireTableRowsUpdated(selectedLine, selectedLine); + newData = beanHaul.getData(); break; case LENGTH: Length beanLength = view.getValidatorLength().getBean(); - data = beanLength.getData(); - project.getControl().getLength().set(selectedLine + 1, data); // csv header - model.fireTableRowsUpdated(selectedLine, selectedLine); + newData = beanLength.getData(); break; case STRATA: Strata beanStrata = view.getValidatorStrata().getBean(); - data = beanStrata.getData(); - project.getControl().getStrata().set(selectedLine + 1, data); // csv header - model.fireTableRowsUpdated(selectedLine, selectedLine); + newData = beanStrata.getData(); break; } + + // remplace les nouvelle données (utilise le numero de ligne pour trouver les anciennes) + try { + projectService.replaceData(project, project.getControl(), category, newData); + model.fireTableRowsUpdated(selectedLine, selectedLine); + } + catch (CoserBusinessException ex) { + throw new CoserException("Can't replace data", ex); + } } /** Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties =================================================================== --- trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties 2010-11-18 12:16:11 UTC (rev 236) +++ trunk/coser-ui/src/main/resources/i18n/coser-ui_en_GB.properties 2010-11-18 15:06:25 UTC (rev 237) @@ -42,6 +42,7 @@ coser.ui.control.replace.find=Find \: coser.ui.control.replace.inField=In field \: coser.ui.control.replace.replace=Replace \: +coser.ui.control.replace.replacedCount= coser.ui.control.replace.title=Find and replace coser.ui.control.save=Save coser.ui.control.validcontrol= Modified: trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties =================================================================== --- trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties 2010-11-18 12:16:11 UTC (rev 236) +++ trunk/coser-ui/src/main/resources/i18n/coser-ui_fr_FR.properties 2010-11-18 15:06:25 UTC (rev 237) @@ -42,6 +42,7 @@ coser.ui.control.replace.find=Chercher \: coser.ui.control.replace.inField=Dans le champ \: coser.ui.control.replace.replace=Remplacer \: +coser.ui.control.replace.replacedCount=%d lignes remplac\u00E9es coser.ui.control.replace.title=Chercher et remplacer coser.ui.control.save=Sauvegarder coser.ui.control.validcontrol=Valider le contr\u00F4le