This is an automated email from the git hooks/post-receive script. New commit to branch feature/5954 in repository tutti. See http://git.codelutin.com/tutti.git commit e42f4ddba67331cf2fed27945e734fe6f01770a2 Author: Kevin Morin <morin@codelutin.com> Date: Thu Dec 11 12:09:26 2014 +0100 fix import of lists --- .../fr/ifremer/tutti/service/TuttiCsvUtil.java | 70 ++++++++++++++++++++++ .../swing/action/ImportFromColumnFileAction.java | 40 +++++++++---- .../operation/EditFishingOperationUIModel.java | 3 + .../resources/i18n/tutti-ui-swing_fr_FR.properties | 2 +- 4 files changed, 104 insertions(+), 11 deletions(-) diff --git a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java index 919db0d..3206ce0 100644 --- a/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java +++ b/tutti-service/src/main/java/fr/ifremer/tutti/service/TuttiCsvUtil.java @@ -57,6 +57,7 @@ import java.io.Serializable; import java.io.Writer; import java.lang.reflect.InvocationTargetException; import java.text.ParseException; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -278,6 +279,18 @@ public class TuttiCsvUtil extends Common { return new ForeignKeyValue<E>(type, propertyName, universe); } + public <E extends TuttiEntity> void newForeignKeyListColumn(String headerName, String propertyName, Class<E> entityType, String foreignKeyName, Map<String, E> universe) { + newMandatoryColumn(headerName, propertyName, newForeignKeyListValue(entityType, foreignKeyName, universe)); + } + + public <E extends TuttiEntity> void newForeignKeyListColumn(String propertyName, Class<E> entityType, String foreignKeyName, Map<String, E> universe) { + newMandatoryColumn(propertyName, propertyName, newForeignKeyListValue(entityType, foreignKeyName, universe)); + } + + public <E extends TuttiEntity> ForeignKeyListValue<E> newForeignKeyListValue(Class<E> type, String propertyName, Map<String, E> universe) { + return new ForeignKeyListValue<E>(type, propertyName, universe); + } + public void newNotExistingValueColumn(String propertyName, Set<String> universe) { newNotExistingValueColumn(propertyName, propertyName, universe); } @@ -479,6 +492,63 @@ public class TuttiCsvUtil extends Common { } } + /** + * @param <E> + * @author kmorin <morin@codelutin.com> + * @since 3.10 + */ + public static class ForeignKeyListValue<E extends TuttiEntity> implements ValueParserFormatter<List<E>> { + + public static final String LIST_SEPARATOR = ","; + + protected final String propertyName; + + protected final Class<E> entityType; + + protected final Map<String, E> universe; + + public ForeignKeyListValue(Class<E> entityType, + String propertyName, + Map<String, E> universe) { + this.entityType = entityType; + this.propertyName = propertyName; + this.universe = universe; + } + + @Override + public List<E> parse(String value) throws ParseException { + List<E> result = new ArrayList<E>(); + if (StringUtils.isNotBlank(value)) { + + String[] ids = value.split(LIST_SEPARATOR); + for (String id : ids) { + // get entity from universe + E entity = universe.get(id); + + if (entity == null) { + + // can not find entity this is a big problem for us... + throw new ImportRuntimeException(t("tutti.service.csv.parse.entityNotFound", entityType.getSimpleName(), propertyName, id)); + } + + result.add(entity); + } + } + return result; + } + + @Override + public String format(List<E> e) { + List<String> ids = new ArrayList<String>(); + for (E entity : e) { + if (entity != null) { + ids.add(entity.getId()); + } + } + return StringUtils.join(ids, LIST_SEPARATOR); + } + } + public static class BeanNullableGetter<E, T> implements ValueGetter<E, T> { protected String propertyName; diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java index 17c7b18..4a84e47 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/action/ImportFromColumnFileAction.java @@ -88,6 +88,8 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO @Override public void doAction() throws Exception { + final EditFishingOperationUIModel model = getModel(); + Set<String> headers = Sets.newHashSet(CsvReaders.getHeader(columnsFile, ';')); ImportFromColumnFileModel importModel = new ImportFromColumnFileModel(';', new HashSet<>(headers)); @@ -106,7 +108,7 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO } }); - // predicate to check if the row matches the model key defined by the protocol + // predicate to check if the row matches the model key defined by the protocol< Predicate<FishingOperation> predicate = new Predicate<FishingOperation>() { @Override public boolean apply(FishingOperation fishingOperation) { @@ -119,7 +121,6 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO String stationColumn = stationNumberRow != null ? stationNumberRow.getImportColumn() : null; String startDateColumn = startDateRow != null ? startDateRow.getImportColumn() : null; - EditFishingOperationUIModel model = getModel(); boolean sameStationNumber = Objects.equals(fishingOperation.getStationNumber(), model.getStationNumber()); boolean sameFishingOperationNumber = Objects.equals(fishingOperation.getFishingOperationNumber(), model.getFishingOperationNumber()); // check if the dates (not time) are equals, but push the time to the model @@ -147,9 +148,14 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO if (predicate.apply(fishingOperation)) { if (next.isValid()) { - getModel().fromEntity(fishingOperation); - getUI().getGearUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); - getUI().getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); + EditFishingOperationUI ui = getUI(); + model.fromEntity(fishingOperation); + //these 2 do not refresh correctly + ui.getRecorderPersonList().getHandler().setSelected(model.getRecorderPerson()); + ui.getSecondaryVesselList().getHandler().setSelected(model.getSecondaryVessel()); + + ui.getGearUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); + ui.getVesselUseFeatureTabContent().getHandler().mergeCaracteristics(fishingOperation); } else { error = ""; @@ -157,7 +163,7 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO if (log.isErrorEnabled()) { log.error(errorInfo.getCause().getLocalizedMessage()); } - error += "<li>" + errorInfo.getCause().getLocalizedMessage() + "</li>"; + error += "<li>" + errorInfo.getCause().getLocalizedMessage().replaceAll("\\s+", " ") + "</li>"; } } found = true; @@ -165,7 +171,7 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO } if (!found) { - error = t("tutti.editFishingOperation.action.importColumns.operationNotFound"); + error = "<li>" + t("tutti.editFishingOperation.action.importColumns.operationNotFound") + "</li>"; } } @@ -174,7 +180,9 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO super.postSuccessAction(); if (error != null) { displayErrorMessage(t("tutti.editFishingOperation.action.importColumns.error.title"), - t("tutti.editFishingOperation.action.importColumns.error", error)); + "<html><body>" + + t("tutti.editFishingOperation.action.importColumns.error", error) + + "</body></html>"); } else { sendMessage(t("tutti.editFishingOperation.action.importColumns.success")); } @@ -239,13 +247,19 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO break; case EditFishingOperationUIModel.PROPERTY_VESSEL: - case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: List<Vessel> vessels = new ArrayList<>(dataContext.getFishingVessels()); vessels.addAll(dataContext.getScientificVessels()); Map<String, Vessel> vesselUniverse = TuttiEntities.splitById(vessels); valueParser = newForeignKeyValue(Vessel.class, field, vesselUniverse); break; + case EditFishingOperationUIModel.PROPERTY_SECONDARY_VESSEL: + vessels = new ArrayList<>(dataContext.getFishingVessels()); + vessels.addAll(dataContext.getScientificVessels()); + vesselUniverse = TuttiEntities.splitById(vessels); + valueParser = newForeignKeyListValue(Vessel.class, field, vesselUniverse); + break; + case EditFishingOperationUIModel.PROPERTY_STRATA: Map<String, TuttiLocation> strataUniverse = TuttiEntities.splitById( persistenceService.getAllFishingOperationStrata(zoneId)); @@ -258,9 +272,15 @@ public class ImportFromColumnFileAction extends AbstractTuttiAction<EditFishingO valueParser = newForeignKeyValue(TuttiLocation.class, field, subStrataUniverse); break; + case EditFishingOperationUIModel.PROPERTY_LOCATION: + Map<String, TuttiLocation> locationUniverse = TuttiEntities.splitById( + persistenceService.getAllFishingOperationLocation(zoneId, null, null)); + valueParser = newForeignKeyValue(TuttiLocation.class, field, locationUniverse); + break; + case EditFishingOperationUIModel.PROPERTY_RECORDER_PERSON: Map<String, Person> personUniverse = TuttiEntities.splitById(dataContext.getPersons()); - valueParser = newForeignKeyValue(Person.class, field, personUniverse); + valueParser = newForeignKeyListValue(Person.class, field, personUniverse); break; default: diff --git a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java index 477c76a..b0911d2 100644 --- a/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java +++ b/tutti-ui-swing/src/main/java/fr/ifremer/tutti/ui/swing/content/operation/EditFishingOperationUIModel.java @@ -1236,6 +1236,7 @@ public class EditFishingOperationUIModel extends AbstractTuttiBeanUIModel<Fishin @Override public void setRecorderPerson(List<Person> recorderPerson) { + System.out.println("rec " + recorderPerson); Object oldValue = null; List<Person> oldRecorderPerson = getRecorderPerson(); if (oldRecorderPerson != null) { @@ -1302,6 +1303,7 @@ public class EditFishingOperationUIModel extends AbstractTuttiBeanUIModel<Fishin @Override public void addSecondaryVessel(Vessel secondaryVessel) { editObject.addSecondaryVessel(secondaryVessel); + System.out.println("sec vessel " + secondaryVessel.getId()); firePropertyChange(PROPERTY_SECONDARY_VESSEL, null, getSecondaryVessel()); } @@ -1342,6 +1344,7 @@ public class EditFishingOperationUIModel extends AbstractTuttiBeanUIModel<Fishin @Override public void setSecondaryVessel(List<Vessel> secondaryVessel) { + System.out.println("sec vessels " + secondaryVessel); editObject.setSecondaryVessel(secondaryVessel); firePropertyChange(PROPERTY_SECONDARY_VESSEL, null, getSecondaryVessel()); } diff --git a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties index cc9d217..de55a2e 100644 --- a/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties +++ b/tutti-ui-swing/src/main/resources/i18n/tutti-ui-swing_fr_FR.properties @@ -679,7 +679,7 @@ tutti.editFishingOperation.action.deleteFishingOperation.message=Vous êtes sur tutti.editFishingOperation.action.deleteFishingOperation.tip=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.deleteFishingOperation.title=Supprimer l'opération de pêche sélectionnée tutti.editFishingOperation.action.editFishingOperation.tip=Éditer l'opération de pêche -tutti.editFishingOperation.action.importColumns.error=<html><body>L'import des paramètres a échoué pour les raisons suivantes \:<ul>%s</ul></body></html> +tutti.editFishingOperation.action.importColumns.error=L'import des paramètres a échoué pour les raisons suivantes \:<ul>%s</ul> tutti.editFishingOperation.action.importColumns.error.title=Erreur lors de l'import des paramètres tutti.editFishingOperation.action.importColumns.missingHeader=Le fichier de paramètre ne contient pas la colonne '%s'. tutti.editFishingOperation.action.importColumns.operationNotFound=Le trait n'a pas été trouvé dans le fichier importé -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.