This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See http://git.codelutin.com/observe.git commit 0b850cdbdeac51acb0b722dc3e4bebad2d16cc81 Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Apr 11 08:18:16 2015 +0200 refs #6938 simplification et amélioration du code d'export de marées --- .../entities/longline/TripLonglineDAOImpl.java | 6 +- .../observe/entities/seine/TripSeineDAOImpl.java | 6 +- .../java/fr/ird/observe/ui/admin/AdminUIModel.java | 33 +---- .../ird/observe/ui/admin/export/ExportModel.java | 76 +++++++--- .../observe/ui/admin/export/ExportUIHandler.java | 164 +++++---------------- .../fr/ird/observe/ui/admin/export/TripEntry.java | 49 +----- .../ui/admin/export/TripToExportTableModel.java | 28 +--- .../resources/i18n/observe-swing_fr_FR.properties | 2 +- 8 files changed, 114 insertions(+), 250 deletions(-) diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/longline/TripLonglineDAOImpl.java b/observe-entities/src/main/java/fr/ird/observe/entities/longline/TripLonglineDAOImpl.java index 525361b..b5bc612 100644 --- a/observe-entities/src/main/java/fr/ird/observe/entities/longline/TripLonglineDAOImpl.java +++ b/observe-entities/src/main/java/fr/ird/observe/entities/longline/TripLonglineDAOImpl.java @@ -90,6 +90,7 @@ public class TripLonglineDAOImpl<E extends TripLongline> extends TripLonglineDAO " t.open," + " p.lastName," + " p.firstName," + + " v.topiaId," + " v." + referenceLocale.getColumnName() + " FROM observe_longline.trip t, observe_common.person p, observe_common.vessel v" + " WHERE " + @@ -112,6 +113,7 @@ public class TripLonglineDAOImpl<E extends TripLongline> extends TripLonglineDAO " t.open," + " p.lastName," + " p.firstName," + + " v.topiaId," + " v." + referenceLocale.getColumnName() + " FROM observe_longline.trip t, observe_common.person p, observe_common.vessel v" + " WHERE " + @@ -149,7 +151,9 @@ public class TripLonglineDAOImpl<E extends TripLongline> extends TripLonglineDAO trip.setObserver(observer); Vessel vessel = new VesselImpl(); - String label = set.getString(7); + String vesselId = set.getString(7); + vessel.setTopiaId(vesselId); + String label = set.getString(8); referenceLocale.setLabel(label, vessel); trip.setVessel(vessel); diff --git a/observe-entities/src/main/java/fr/ird/observe/entities/seine/TripSeineDAOImpl.java b/observe-entities/src/main/java/fr/ird/observe/entities/seine/TripSeineDAOImpl.java index 08a63a9..bb185d6 100644 --- a/observe-entities/src/main/java/fr/ird/observe/entities/seine/TripSeineDAOImpl.java +++ b/observe-entities/src/main/java/fr/ird/observe/entities/seine/TripSeineDAOImpl.java @@ -89,6 +89,7 @@ public class TripSeineDAOImpl<E extends TripSeine> extends TripSeineDAOAbstract< " t.open," + " p.lastName," + " p.firstName," + + " v.topiaId, " + " v." + referenceLocale.getColumnName() + " FROM observe_seine.trip t, observe_common.person p, observe_common.vessel v" + " WHERE " + @@ -111,6 +112,7 @@ public class TripSeineDAOImpl<E extends TripSeine> extends TripSeineDAOAbstract< " t.open," + " p.lastName," + " p.firstName," + + " v.topiaId," + " v." + referenceLocale.getColumnName() + " FROM observe_seine.trip t, observe_common.person p, observe_common.vessel v" + " WHERE " + @@ -155,7 +157,9 @@ public class TripSeineDAOImpl<E extends TripSeine> extends TripSeineDAOAbstract< trip.setObserver(observer); Vessel vessel = new VesselImpl(); - String label = set.getString(7); + String vesselId = set.getString(7); + vessel.setTopiaId(vesselId); + String label = set.getString(8); referenceLocale.setLabel(label, vessel); trip.setVessel(vessel); diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java b/observe-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java index e196a24..ebbe452 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/admin/AdminUIModel.java @@ -32,7 +32,7 @@ import fr.ird.observe.db.impl.H2DataSource; import fr.ird.observe.db.impl.PGDataSource; import fr.ird.observe.db.model.DataSelectionModel; import fr.ird.observe.entities.Trip; -import fr.ird.observe.entities.seine.TripSeine; +import fr.ird.observe.entities.Trips; import fr.ird.observe.report.model.Report; import fr.ird.observe.ui.admin.consolidate.ConsolidateModel; import fr.ird.observe.ui.admin.export.ExportModel; @@ -286,18 +286,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { } }; - PropertyChangeListener listenAccessModified = new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (log.isDebugEnabled()) { - log.debug("access import model has changed [" + - evt.getPropertyName() + "] = " + - evt.getNewValue()); - } - validate(); - } - }; - PropertyChangeListener listenSaveLocalChanged = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { @@ -432,7 +420,7 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { return null; } String id = data.iterator().next(); - if (id.startsWith(TripSeine.class.getName())) { + if (Trips.isTripId(id)) { return id; } @@ -445,10 +433,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { return (AdminActionModel) super.getStepModel(operation); } - public StorageUIHandler getStorageHandler() { - return storageHandler; - } - public DataService getDataService() { return dataService; } @@ -517,10 +501,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { return result; } - public EnumSet<DbMode> getAvailableIncomingModes() { - return availableIncomingModes; - } - public void start(AdminUI ui) { availableIncomingModes.clear(); @@ -1237,7 +1217,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { if (containsOperation(AdminStep.REPORT)) { -// universe.add(AdminStep.CONSOLIDATE); universe.add(AdminStep.REPORT); // pas de page de resume @@ -1286,13 +1265,6 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { } } - public void removeTmpSource() { - if (tmpSource != null) { - doCloseSource(tmpSource, false); - tmpSource = null; - } - } - public void populateSelectionModel(DataService dataService, DataSource source) { try { DataSelectionModel.populate(getSelectionDataModel(), dataService, source); @@ -1311,6 +1283,7 @@ public class AdminUIModel extends WizardExtModel<AdminStep> { protected void computeExistingTrips(DataService dataService, DataSource source) { DataSelectionModel selectionModel = new DataSelectionModel(); + selectionModel.setUseOpenData(true); try { DataSelectionModel.populate(selectionModel, dataService, source); } catch (Exception e) { diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportModel.java b/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportModel.java index 490af49..97e2ca6 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportModel.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportModel.java @@ -21,15 +21,20 @@ */ package fr.ird.observe.ui.admin.export; +import com.google.common.collect.ImmutableList; import fr.ird.observe.db.DataSource; +import fr.ird.observe.db.model.DataSelectionModel; import fr.ird.observe.entities.Trip; import fr.ird.observe.entities.longline.TripLongline; import fr.ird.observe.entities.referentiel.Program; import fr.ird.observe.entities.seine.TripSeine; import fr.ird.observe.ui.admin.AdminActionModel; import fr.ird.observe.ui.admin.AdminStep; +import fr.ird.observe.ui.admin.AdminUIModel; +import org.apache.commons.collections4.CollectionUtils; import org.nuiton.decorator.Decorator; +import java.util.ArrayList; import java.util.List; /** @@ -40,7 +45,7 @@ import java.util.List; */ public class ExportModel extends AdminActionModel { - /** les index des maréées à exporter. */ + /** les index des marées à exporter. */ protected int[] exportDataSelectedIndex; /** les ids des marées déjà existante sur la base distante lors d'un export */ @@ -63,11 +68,7 @@ public class ExportModel extends AdminActionModel { super(AdminStep.EXPORT_DATA); } - public int[] getExportDataSelectedIndex() { - return exportDataSelectedIndex; - } - - public void setExportDataSelectedIndex(int[] exportDataSelectedIndex) { + public void setExportDataSelectedIndex(int... exportDataSelectedIndex) { this.exportDataSelectedIndex = exportDataSelectedIndex; } @@ -75,8 +76,8 @@ public class ExportModel extends AdminActionModel { return existingTripIds; } - public void setExistingTripIds(List<String> existingMareeIds) { - this.existingTripIds = existingMareeIds; + public void setExistingTripIds(List<String> existingTripIds) { + this.existingTripIds = existingTripIds; } @Override @@ -87,7 +88,6 @@ public class ExportModel extends AdminActionModel { existingTripIds = null; } exportDataSelectedIndex = null; - programDecorator = null; tripSeineDecorator = null; data = null; centralSource = null; @@ -98,8 +98,32 @@ public class ExportModel extends AdminActionModel { return data; } - public void setData(List<TripEntry> data) { - this.data = data; + public void setData(DataSelectionModel selectionModel) { + + List<TripEntry> tripEntries = new ArrayList<TripEntry>(); + + for (List<String> tripIds : selectionModel.getSelectedDataByProgram().values()) { + + if (CollectionUtils.isNotEmpty(tripIds)) { + + for (String tripId : tripIds) { + + Trip trip = (Trip) selectionModel.getEntityCache(tripId); + + String tripKey = AdminUIModel.getTripKey(trip); + boolean exists = existingTripIds.contains(tripKey); + + TripEntry entry = new TripEntry(trip, exists); + tripEntries.add(entry); + + } + + } + + } + + this.data = ImmutableList.copyOf(tripEntries); + } public DataSource getSource() { @@ -118,31 +142,35 @@ public class ExportModel extends AdminActionModel { this.centralSource = centralSource; } - public Decorator<Program> getProgramDecorator() { - return programDecorator; - } - public void setProgramDecorator(Decorator<Program> programDecorator) { this.programDecorator = programDecorator; } - public Decorator<TripSeine> getTripSeineDecorator() { - return tripSeineDecorator; - } - public void setTripSeineDecorator(Decorator<TripSeine> mareeDecorator) { this.tripSeineDecorator = mareeDecorator; } - public Decorator<TripLongline> getTripLonglineDecorator() { - return tripLonglineDecorator; - } - public void setTripLonglineDecorator(Decorator<TripLongline> tripLonglineDecorator) { this.tripLonglineDecorator = tripLonglineDecorator; } public String decorate(Trip trip) { - return trip instanceof TripSeine ? tripSeineDecorator.toString(trip): tripLonglineDecorator.toString(trip); + return trip instanceof TripSeine ? tripSeineDecorator.toString(trip) : tripLonglineDecorator.toString(trip); + } + + public String decorate(Program program) { + return programDecorator.toString(program); } + + public List<TripEntry> getSelectedTrips() { + + List<TripEntry> entries = new ArrayList<TripEntry>(); + + for (int index : exportDataSelectedIndex) { + entries.add(data.get(index)); + } + return entries; + + } + } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportUIHandler.java b/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportUIHandler.java index 87466f9..7f76253 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportUIHandler.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/ExportUIHandler.java @@ -22,7 +22,6 @@ package fr.ird.observe.ui.admin.export; import fr.ird.observe.DecoratorService; -import fr.ird.observe.ObserveDAOHelper; import fr.ird.observe.db.DataSource; import fr.ird.observe.db.model.DataSelectionModel; import fr.ird.observe.entities.Trip; @@ -41,8 +40,6 @@ import jaxx.runtime.swing.wizard.ext.WizardState; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; -import org.nuiton.topia.TopiaContext; -import org.nuiton.topia.persistence.TopiaDAO; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; @@ -50,10 +47,8 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Map; import java.util.concurrent.Callable; import static org.nuiton.i18n.I18n.n; @@ -231,48 +226,11 @@ public class ExportUIHandler extends AdminTabUIHandler { sendMessage(t("observe.message.exportData.prepare.data")); - String txName = "prepareData"; - - // récupération de la liste des ids de marées sur la base distante - List<String> existingTrips = stepModel.getExistingTripIds(); - - // construction du modèle des marées à exporter - List<TripEntry> entries = new ArrayList<TripEntry>(); - - DataSelectionModel selectionModel = model.getSelectionDataModel(); - // récupération des couples (program, marees) sur la base temporaire - Map<String, List<String>> datas = - selectionModel.getSelectedDataByProgram(); - - TopiaContext tx = beginTransaction(source, txName); - try { - - for (String p : datas.keySet()) { - - List<String> tripIds = datas.get(p); - if (tripIds == null || tripIds.isEmpty()) { - // pas de maree sur ce program - continue; - } - for (String tripId : tripIds) { - - TripEntry entry = new TripEntry(); - Trip trip = (Trip) tx.findByTopiaId(tripId); - entry.setTrip(trip); - stepModel.decorate(trip); - String tripKey = AdminUIModel.getTripKey(trip); - entry.setExist(existingTrips.contains(tripKey)); - entries.add(entry); - - } - } - } finally { - closeTransaction(source, tx, txName); - } + DataSelectionModel selectionModel = model.getSelectionDataModel(); + stepModel.setData(selectionModel); - // on peut garder les données, l'export est possible - stepModel.setData(entries); + List<TripEntry> entries = stepModel.getData(); if (entries.isEmpty()) { // pas de données possible à exporter @@ -283,8 +241,7 @@ public class ExportUIHandler extends AdminTabUIHandler { sendMessage(t("observe.message.exportData.operation.needFix", new Date())); - // on rend la main à l'ui pour que l'utilisateur selectionne les marees - // a exporter + // on rend la main à l'ui pour que l'utilisateur selectionne les marees a exporter return WizardState.NEED_FIX; } @@ -292,102 +249,54 @@ public class ExportUIHandler extends AdminTabUIHandler { ExportModel stepModel = model.getExportModel(); - Decorator<Program> pDecorator = stepModel.getProgramDecorator(); - // on filtre les marées sélectionnées pour export - List<TripEntry> entries = new ArrayList<TripEntry>(); - int[] selectedIndex = stepModel.getExportDataSelectedIndex(); + List<TripEntry> tripEntries = stepModel.getSelectedTrips(); - List<TripEntry> data = stepModel.getData(); - DataSource centralSource = stepModel.getCentralSource(); - DataSource source = stepModel.getSource(); + for (TripEntry tripEntry : tripEntries) { - for (int index : selectedIndex) { - entries.add(data.get(index)); - } + processTrip(stepModel, tripEntry); - //TODO afficher un message de confirmation pour l'écrasement des marées - //TODO sur la base distante - - // on supprime les marées à écraser de la base distante - -// List<String> existingTripIds = stepModel.getExistingMareeIds(); - - String txName = "deleteTrips"; - - // on supprime les marées à écraser de la base distante - TopiaContext tx = beginTransaction(centralSource, txName); - try { - TopiaDAO<TripSeine> tripSeineDao = ObserveDAOHelper.getTripSeineDAO(tx); - TopiaDAO<TripLongline> tripLonglineDao = ObserveDAOHelper.getTripLonglineDAO(tx); - - for (TripEntry entry : entries) { - String tripId = entry.getTripId(); - String programId = entry.getProgramId(); - boolean seine = entry.isSeine(); - if (!entry.isExist()) { - // pas concerné par cette phase - continue; - } + } - Trip trip; + sendMessage(t("observe.message.synchro.operation.done", new Date())); - if (seine) { + return WizardState.SUCCESSED; + } - trip = tripSeineDao.findByTopiaId(tripId); - } else { - trip = tripLonglineDao.findByTopiaId(tripId); + protected void processTrip(ExportModel stepModel, TripEntry tripEntry) throws Exception { - } - if (trip == null) { + DataSource centralSource = stepModel.getCentralSource(); + DataSource source = stepModel.getSource(); - // ne devrait jamais arrivé... - continue; - } - Program p = trip.getProgram(); + Trip trip = tripEntry.getTrip(); + String tripId = trip.getTopiaId(); - String tripDecorated = stepModel.decorate(trip); + String tripDecorated = stepModel.decorate(trip); + String programDecorated = stepModel.decorate(trip.getProgram()); - sendMessage(t("observe.message.exportData.delete.remote.maree", tripDecorated, pDecorator.toString(p))); - if (log.isInfoEnabled()) { - log.info(t("observe.message.exportData.delete.remote.maree", tripId, programId)); - } + if (tripEntry.isExist()) { - if (seine) { - tripSeineDao.delete((TripSeine) trip); - } else { - tripLonglineDao.delete((TripLongline) trip); + //TODO afficher un message de confirmation pour l'écrasement des marées sur la base distante + // on supprime les marées à écraser de la base distante - } + if (log.isInfoEnabled()) { + log.info(tripId + " -- " + t("observe.message.exportData.delete.remote.maree", tripDecorated, programDecorated)); } + sendMessage(t("observe.message.exportData.delete.remote.maree", tripDecorated, programDecorated)); - commitTransaction(centralSource, tx, txName); + getDataService().deleteTrip(centralSource, tripId); - } catch (Exception e) { - rollbackTransaction(centralSource, tx, txName); - throw e; - } finally { - closeTransaction(centralSource, tx, txName); } - // seconde passe, on duplique les marées vers la base distante et - // on rattache les marees a leur program - for (TripEntry entry : entries) { - String tripId = entry.getTripId(); - String programId = entry.getProgramId(); - Trip trip = entry.getTrip(); - Program program = trip.getProgram(); - - String tripDecorated = stepModel.decorate(trip); - sendMessage(t("observe.message.exportData.replicate.maree", tripDecorated, pDecorator.toString(program))); - if (log.isInfoEnabled()) { - log.info(t("observe.message.exportData.replicate.maree", tripId, programId)); - } + if (log.isInfoEnabled()) { + log.info(tripId + " -- " + t("observe.message.exportData.replicate.maree", tripDecorated, programDecorated)); + } + sendMessage(t("observe.message.exportData.replicate.maree", tripDecorated, programDecorated)); - try { - replicateData(source, centralSource, tripId); - } catch (Exception e) { - //FIXME 20100726 : il faut supprimer tous les objets crées pour cette marée + try { + replicateData(source, centralSource, tripId); + } catch (Exception e) { + //FIXME 20100726 : il faut supprimer tous les objets crées pour cette marée // tx = beginTransaction(centralSource, txName); // @@ -401,13 +310,10 @@ public class ExportUIHandler extends AdminTabUIHandler { // } finally { // closeTransaction(centralSource, tx, txName); // } - throw e; - } - } - sendMessage(t("observe.message.synchro.operation.done", new Date())); + throw e; + } - return WizardState.SUCCESSED; } } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/TripEntry.java b/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/TripEntry.java index 4a30745..b49ff82 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/TripEntry.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/TripEntry.java @@ -21,65 +21,30 @@ */ package fr.ird.observe.ui.admin.export; -import fr.ird.observe.entities.Entities; import fr.ird.observe.entities.Trip; -import fr.ird.observe.entities.referentiel.Program; import java.io.Serializable; /** Une classe qui représente une entrée dans le modèle (sans la sélection) */ -public class TripEntry implements Serializable{ +public class TripEntry implements Serializable { private static final long serialVersionUID = 1L; - Program program; + protected final Trip trip; - String programId; + protected final boolean exist; - Trip trip; - - String tripId; - - Boolean exist; - - public Boolean isExist() { - return exist; - } - - public void setExist(Boolean exist) { + public TripEntry(Trip trip, boolean exist) { + this.trip = trip; this.exist = exist; } - public String getProgramId() { - return programId; - } - - public String getTripId() { - return tripId; - } - public Trip getTrip() { return trip; } - public void setTrip(Trip trip) { - this.trip = trip; - if (trip == null) { - tripId = null; - program = null; - programId = null; - } else { - tripId = trip.getTopiaId(); - program = trip.getProgram(); - programId = program == null ? null : program.getTopiaId(); - } - } - - public Program getProgram() { - return trip == null ? null : trip.getProgram(); + public boolean isExist() { + return exist; } - public boolean isSeine() { - return Entities.isSeineId(tripId); - } } diff --git a/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/TripToExportTableModel.java b/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/TripToExportTableModel.java index a9769ce..1612302 100644 --- a/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/TripToExportTableModel.java +++ b/observe-swing/src/main/java/fr/ird/observe/ui/admin/export/TripToExportTableModel.java @@ -23,8 +23,6 @@ package fr.ird.observe.ui.admin.export; import fr.ird.observe.entities.Trip; import fr.ird.observe.entities.referentiel.Program; -import fr.ird.observe.entities.seine.TripSeine; -import org.nuiton.i18n.I18n; import javax.swing.table.AbstractTableModel; import java.util.HashSet; @@ -40,16 +38,10 @@ import java.util.Set; */ public class TripToExportTableModel extends AbstractTableModel { - protected static final String[] COLUMN_NAMES = { - I18n.n("observe.synchro.common.selected"), - I18n.n("observe.synchro.common.program"), - I18n.n("observe.synchro.common.maree"), - I18n.n("observe.synchro.common.exist")}; - protected static final Class<?>[] COLUMN_CLASSES = { Boolean.class, Program.class, - TripSeine.class, + Trip.class, Boolean.class }; @@ -116,20 +108,20 @@ public class TripToExportTableModel extends AbstractTableModel { @Override public Object getValueAt(int rowIndex, int columnIndex) { Object value = null; - TripEntry p = data == null ? null : data[rowIndex]; - if (p != null) { + TripEntry tripEntry = data == null ? null : data[rowIndex]; + if (tripEntry != null) { switch (columnIndex) { case 0: value = selected.contains(rowIndex); break; case 1: - value = p.getProgram(); + value = tripEntry.getTrip().getProgram(); break; case 2: - value = p.getTrip(); + value = tripEntry.getTrip(); break; case 3: - value = p.isExist(); + value = tripEntry.isExist(); break; default: throw new IllegalStateException( @@ -140,14 +132,6 @@ public class TripToExportTableModel extends AbstractTableModel { return value; } - public Program getProgramAt(int rowIndex) { - return data[rowIndex].getTrip().getProgram(); - } - - public Trip getTripAt(int rowIndex) { - return data[rowIndex].getTrip(); - } - public boolean isSelectAll() { return selectAll; } diff --git a/observe-swing/src/main/resources/i18n/observe-swing_fr_FR.properties b/observe-swing/src/main/resources/i18n/observe-swing_fr_FR.properties index 5f540dc..92b3836 100644 --- a/observe-swing/src/main/resources/i18n/observe-swing_fr_FR.properties +++ b/observe-swing/src/main/resources/i18n/observe-swing_fr_FR.properties @@ -1721,7 +1721,7 @@ observe.synchro.step.validate=Validation observe.synchro.step.validate.description=Validation des données d'une source de données observe.synchro.table.exportData.exist.label=E observe.synchro.table.exportData.exist.label.tip=Marée déjà présente sur la base distante -observe.synchro.table.exportData.program.label=Program +observe.synchro.table.exportData.program.label=Programme observe.synchro.table.exportData.program.label.tip=Libellé du programme de la maréee observe.synchro.table.exportData.selected=... observe.synchro.table.exportData.selected.tip=Sélectionner - Désélectionner toutes les marées à exporter -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.