Author: tchemit Date: 2012-08-18 10:08:55 +0200 (Sat, 18 Aug 2012) New Revision: 430 Url: http://forge.codelutin.com/repositories/revision/sammoa/430 Log: improve export (add success dialog message + ask confirmation when file to export already exist) Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapModel.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationService.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/map/ExportMapUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUI.css trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIModel.java trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapModel.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapModel.java 2012-08-18 08:05:22 UTC (rev 429) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapModel.java 2012-08-18 08:08:55 UTC (rev 430) @@ -34,7 +34,7 @@ import java.util.List; /** - * Model of export map. + * Model of export map operation. * * @author tchemit <chemit@codelutin.com> * @since 0.5 @@ -81,8 +81,8 @@ return exportDirectory; } - public String getExportFilename() { - return exportFilename; + public File getExportFileWithoutExtension(String extension) { + return new File(getExportDirectory(), exportFilename + extension); } public Campaign getCampaign() { Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-08-18 08:05:22 UTC (rev 429) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/map/ExportMapService.java 2012-08-18 08:08:55 UTC (rev 430) @@ -55,7 +55,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -78,19 +77,19 @@ protected final DateFormat timeFormat = new SimpleDateFormat("HHmmss"); - public void exportEffortsMap(ExportMapModel dataModel) { + public int exportEffortsMap(ExportMapModel dataModel) { Preconditions.checkNotNull(dataModel.getCampaign()); Preconditions.checkNotNull(dataModel.getBeginDate()); Preconditions.checkNotNull(dataModel.getEndDate()); if (logger.isInfoEnabled()) { - logger.info("Start EffortsMap export to {} :: {}", - dataModel.getExportDirectory(), - dataModel.getExportFilename()); + logger.info("Start EffortsMap export to {}", + dataModel.getExportFileWithoutExtension("")); } long startTime = TimeLog.getTime(); + int nbRow = 0; // * uniquement pour un parcours de type LEG, sinon la cellule sera vide // ** uniquement pour un parcours de type CIRCLE_BACK, sinon la cellule sera vide @@ -175,7 +174,8 @@ List<Route> routes = flightService.getRoutes(tx, flight); // get all geo points for this flight - List<GeoPoint> geoPoints = flightService.getFlightGeoPoints(tx, flight); + List<GeoPoint> geoPoints = + flightService.getFlightGeoPoints(tx, flight); // get best geo points for each route Iterable<GeoPoint> routeGeoPoints = @@ -225,6 +225,7 @@ record, builder, graphicList); + nbRow++; } // reset effort group @@ -275,6 +276,7 @@ record, builder, graphicList); + nbRow++; } // keep current route as previousroute @@ -289,24 +291,27 @@ flushExport(builder, dataModel, graphicList); - timeLog.log(startTime, "exportEffortsMap", "after EsriShapeExport execution"); + timeLog.log(startTime, "exportEffortsMap", + "after EsriShapeExport execution"); + return nbRow; } finally { endTransaction(tx); } } - public void exportObservationsMap(ExportMapModel dataModel) { + public int exportObservationsMap(ExportMapModel dataModel) { Preconditions.checkNotNull(dataModel.getCampaign()); Preconditions.checkNotNull(dataModel.getBeginDate()); Preconditions.checkNotNull(dataModel.getEndDate()); if (logger.isInfoEnabled()) { - logger.info("Start ObservationsMap export to {} :: {}", - dataModel.getExportDirectory(), - dataModel.getExportFilename()); + logger.info("Start ObservationsMap export to {}", + dataModel.getExportFileWithoutExtension("")); } long startTime = TimeLog.getTime(); + int nbRow = 0; + // * uniquement pour un parcours de type LEG, sinon la cellule sera vide DbfTableModelBuilder builder = new DbfTableModelBuilder() .stringColumn("REGION") // (campaign.region.code) @@ -524,6 +529,7 @@ record, builder, graphicList); + nbRow++; } } @@ -534,25 +540,27 @@ flushExport(builder, dataModel, graphicList); timeLog.log(startTime, "exportObservationsMap", "after EsriShapeExport execution"); + return nbRow; } finally { endTransaction(tx); } } - public void exportGeoPointsMap(ExportMapModel dataModel) { + public int exportGeoPointsMap(ExportMapModel dataModel) { Preconditions.checkNotNull(dataModel.getCampaign()); Preconditions.checkNotNull(dataModel.getBeginDate()); Preconditions.checkNotNull(dataModel.getEndDate()); if (logger.isInfoEnabled()) { - logger.info("Start GeoPointsMap export to {} :: {}", - dataModel.getExportDirectory(), - dataModel.getExportFilename()); + logger.info("Start GeoPointsMap export to {}", + dataModel.getExportFileWithoutExtension("")); } long startTime = TimeLog.getTime(); + int nbRow = 0; + DbfTableModelBuilder builder = new DbfTableModelBuilder() .stringColumn("REGION") .stringColumn("CAMPAIGN") @@ -610,6 +618,7 @@ record, builder, graphicList); + nbRow++; } } @@ -620,6 +629,7 @@ timeLog.log(startTime, "exportGeoPointsMap", "after EsriShapeExport execution"); + return nbRow; } protected void flushExport(DbfTableModelBuilder builder, @@ -627,12 +637,13 @@ EsriGraphicList graphicList) { DbfTableModel tableModel = builder.getModel(); - String pathFile = new File(dataModel.getExportDirectory(), - dataModel.getExportFilename()).getAbsolutePath(); + String pathFile = dataModel.getExportFileWithoutExtension("").getAbsolutePath(); EsriShapeExport shapeExport = new EsriShapeExport(graphicList, tableModel, pathFile); shapeExport.export(); } + + protected void fillDateRecord(Date date, Map<String, Object> record) { record.put("DATE", date); record.put("HHMMSS", timeFormat.format(date)); Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationService.java 2012-08-18 08:05:22 UTC (rev 429) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/sammoa/ExportApplicationService.java 2012-08-18 08:08:55 UTC (rev 430) @@ -31,7 +31,6 @@ import fr.ulr.sammoa.persistence.SammoaDAOHelper; import fr.ulr.sammoa.persistence.SammoaDbMetas; import fr.ulr.sammoa.persistence.SammoaEntityEnum; -import fr.ulr.sammoa.persistence.SammoaPersistence; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.nuiton.topia.TopiaContext; @@ -107,14 +106,14 @@ File csvDirectory = targetStorage.getCsvDirectory(); - TopiaContext tx = persistence.beginTransaction(); + TopiaContext tx = beginTransaction(); try { exportReferential(tx, csvDirectory); exportData(tx, csvDirectory, campaignId, flightIds); } finally { - persistence.endTransaction(tx); + endTransaction(tx); } compressZipFile(model.getExportFile(), @@ -138,15 +137,15 @@ } TIME_LOG.log(startTime, "exportApplication", "after Callback execution"); - } protected void exportReferential(TopiaContext tx, File csvDirectory) { + DbMeta<SammoaEntityEnum> dbMetas = persistence.getDbMetas(); + SammoaEntityEnumPrepareDataForExport prepareDataForExport = - new SammoaEntityEnumPrepareDataForExport(persistence, tx); + new SammoaEntityEnumPrepareDataForExport(dbMetas, tx); - DbMeta<SammoaEntityEnum> dbMetas = persistence.getDbMetas(); MetaFilenameAware<SammoaEntityEnum>[] referencialEntries = SammoaDbMetas.getReferencialEntries(dbMetas); @@ -232,12 +231,10 @@ } }; - public static void compressZipFile(File zipFile, File directory) throws IOException { - compressZipFile(zipFile, directory, true); - } + protected void compressZipFile(File zipFile, + File directory, + boolean delete) throws IOException { - public static void compressZipFile(File zipFile, File directory, boolean delete) throws IOException { - FileUtils.forceMkdir(zipFile.getParentFile()); try { @@ -249,15 +246,15 @@ } } - protected class SammoaEntityEnumPrepareDataForExport implements PrepareDataForExport<SammoaEntityEnum> { + protected static class SammoaEntityEnumPrepareDataForExport implements PrepareDataForExport<SammoaEntityEnum> { - protected final SammoaPersistence persistence; + protected final DbMeta<SammoaEntityEnum> dbMetas; protected final TopiaContext tx; - public SammoaEntityEnumPrepareDataForExport(SammoaPersistence persistence, TopiaContext tx) { + public SammoaEntityEnumPrepareDataForExport(DbMeta<SammoaEntityEnum> dbMetas, TopiaContext tx) { - this.persistence = persistence; + this.dbMetas = dbMetas; this.tx = tx; } @@ -269,7 +266,7 @@ @Override public <E extends TopiaEntity> List<E> prepareData(AssociationMeta<SammoaEntityEnum> associationMeta) { - TableMeta<SammoaEntityEnum> tableMeta = persistence.getDbMetas().getTable(associationMeta.getSource()); + TableMeta<SammoaEntityEnum> tableMeta = dbMetas.getTable(associationMeta.getSource()); return getEntities(tx, tableMeta, "size(e." + associationMeta.getName() + ") > 0"); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/map/ExportMapUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/map/ExportMapUIHandler.java 2012-08-18 08:05:22 UTC (rev 429) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/map/ExportMapUIHandler.java 2012-08-18 08:08:55 UTC (rev 430) @@ -42,6 +42,7 @@ import fr.ulr.sammoa.ui.swing.SammoaUIHandler; import fr.ulr.sammoa.ui.swing.util.SammoaUtil; import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.ErrorDialogUI; import jaxx.runtime.swing.OneClicListSelectionModel; import jaxx.runtime.swing.editor.bean.BeanListHeader; import org.nuiton.util.FileUtil; @@ -286,9 +287,21 @@ ExportMapModel dataModel = model.toModel(model.getExportEffortsFilename()); - // launch export - exportService.exportEffortsMap(dataModel); + boolean doExport = checkFileToExport(dataModel); + if (doExport) { + + // launch export + int nbRow = exportService.exportEffortsMap(dataModel); + + SammoaUtil.showSuccessMessage( + fileChooserUI, + _("sammoa.messageDialog.map.export.success", + nbRow, dataModel.getExportDirectory())); + } + + } catch (Exception eee) { + ErrorDialogUI.showError(eee); } finally { SwingUtil.getParentContainer( @@ -304,6 +317,20 @@ startAction); } + private boolean checkFileToExport(ExportMapModel dataModel) { + boolean doExport = true; + File dbf = dataModel.getExportFileWithoutExtension(".dbf"); + File shp = dataModel.getExportFileWithoutExtension(".shp"); + if (dbf.exists() || + shp.exists()) { + doExport = SammoaUtil.askQuestion( + ui, + _("sammoa.messageDialog.mapOrDbf.exportFile.alreadyExists", + dbf, shp)); + } + return doExport; + } + public void exportObservations() { Action startAction = new AbstractAction( @@ -330,9 +357,20 @@ ExportMapModel dataModel = model.toModel(model.getExportObservationsFilename()); - // launch export - exportService.exportObservationsMap(dataModel); + boolean doExport = checkFileToExport(dataModel); + if (doExport) { + // launch export + int nbRow = exportService.exportObservationsMap(dataModel); + + SammoaUtil.showSuccessMessage( + fileChooserUI, + _("sammoa.messageDialog.map.export.success", + nbRow, dataModel.getExportDirectory())); + } + + } catch (Exception eee) { + ErrorDialogUI.showError(eee); } finally { SwingUtil.getParentContainer( @@ -376,9 +414,19 @@ ExportMapModel dataModel = model.toModel(model.getExportGeoPointsFilename()); - // launch export - exportService.exportGeoPointsMap(dataModel); + boolean doExport = checkFileToExport(dataModel); + if (doExport) {// launch export + int nbRow = exportService.exportGeoPointsMap(dataModel); + + SammoaUtil.showSuccessMessage( + fileChooserUI, + _("sammoa.messageDialog.map.export.success", + nbRow, dataModel.getExportDirectory())); + } + + } catch (Exception eee) { + ErrorDialogUI.showError(eee); } finally { SwingUtil.getParentContainer( Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUI.css =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUI.css 2012-08-18 08:05:22 UTC (rev 429) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUI.css 2012-08-18 08:08:55 UTC (rev 430) @@ -44,6 +44,7 @@ #exportButton { text:"sammoa.action.exportApplication"; + enabled:{model.isValid()}; } #exportDirectoryFileChooseAction { Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIHandler.java 2012-08-18 08:05:22 UTC (rev 429) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIHandler.java 2012-08-18 08:08:55 UTC (rev 430) @@ -47,7 +47,6 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; -import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -132,16 +131,24 @@ @Override public void propertyChange(PropertyChangeEvent evt) { - if (ExportApplicationUIModel.PROPERTY_SELECTED_CAMPAIGN.equals(evt.getPropertyName())) { + String propertyName = evt.getPropertyName(); + + if (ExportApplicationUIModel.PROPERTY_SELECTED_CAMPAIGN.equals(propertyName)) { Campaign newValue = (Campaign) evt.getNewValue(); onSelectedCampaignChanged(newValue); - } else if (ExportApplicationUIModel.PROPERTY_FLIGHTS.equals(evt.getPropertyName())) { + } else if (ExportApplicationUIModel.PROPERTY_FLIGHTS.equals(propertyName)) { Collection<Flight> newValue = (Collection<Flight>) evt.getNewValue(); onFlightsChanged(newValue); - } else if (ExportApplicationUIModel.PROPERTY_SELECTED_FLIGHT.equals(evt.getPropertyName())) { + } else if (ExportApplicationUIModel.PROPERTY_SELECTED_FLIGHT.equals(propertyName)) { Flight newValue = (Flight) evt.getNewValue(); onSelectedFlightChanged(newValue); } + + if (!ExportApplicationUIModel.PROPERTY_VALID.equals(propertyName)) { + + // validate model + validateModel(); + } } }); } @@ -182,15 +189,59 @@ try { ExportApplicationModel dataModel = getModel().toModel(); - exportService.exportApplication(dataModel); - } catch (IOException e) { + boolean doExport = checkFileToExport(dataModel); + + if (doExport) { + + exportService.exportApplication(dataModel); + + SammoaUtil.showSuccessMessage( + frame, + _("sammoa.messageDialog.sammoa.export.success", + dataModel.getExportFile())); + } + + } catch (Exception e) { ErrorDialogUI.showError(e); } finally { SammoaUtil.updateBusyState(frame, false); } } + protected void validateModel() { + boolean valid = true; + + ExportApplicationUIModel model = getModel(); + + if (model.getSelectedCampaign() == null) { + + // no campaign selected + valid = false; + } else { + + if (!model.getExportDirectory().exists()) { + + // export directory does not exists + valid = false; + } + } + + model.setValid(valid); + } + + protected boolean checkFileToExport(ExportApplicationModel dataModel) { + boolean doExport = true; + + if (dataModel.getExportFile().exists()) { + doExport = SammoaUtil.askQuestion( + ui, + _("sammoa.messageDialog.sammoa.exportFile.alreadyExists", + dataModel.getExportFile())); + } + return doExport; + } + public void close() { context.changeScreen(SammoaScreen.HOME); } @@ -229,6 +280,8 @@ filename = ""; } else { flights = flightService.getFlights(newCampaign); + // add a null value to unselect flights + flights.add(0, null); filename = String.format("campaign-%s.sammoa", newCampaign.getCode()); } if (logger.isDebugEnabled()) { Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIModel.java 2012-08-18 08:05:22 UTC (rev 429) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/sammoa/ExportApplicationUIModel.java 2012-08-18 08:08:55 UTC (rev 430) @@ -59,6 +59,8 @@ public static final String PROPERTY_CALLBACK = "callback"; + public static final String PROPERTY_VALID = "valid"; + protected List<Campaign> campaigns; protected Campaign selectedCampaign; @@ -73,6 +75,8 @@ protected ExportApplicationCallbackMode callback; + protected boolean valid; + public File getExportDirectory() { return exportDirectory; } @@ -149,18 +153,30 @@ firePropertyChange(PROPERTY_CALLBACK, oldValue, callback); } + public boolean isValid() { + return valid; + } + + public void setValid(boolean valid) { + boolean oldValue = this.valid; + this.valid = valid; + firePropertyChange(PROPERTY_VALID, oldValue, valid); + } + public ExportApplicationModel toModel() { Set<Flight> flightsToExport; - if (getSelectedFlight() != null) { + if (getSelectedFlight() == null) { + // all flights of this campaign + flightsToExport = Sets.newHashSet(getFlights()); + // remove the null value + flightsToExport.remove(null); + } else { + // only one flight to export flightsToExport = Sets.newHashSet(getSelectedFlight()); - } else { - - // all flights of this campaign - flightsToExport = Sets.newHashSet(getFlights()); } ExportApplicationModel result = ExportApplicationModel.newModel( new File(getExportDirectory(), getExportFilename()), Modified: trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties =================================================================== --- trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-18 08:05:22 UTC (rev 429) +++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-18 08:08:55 UTC (rev 430) @@ -73,6 +73,7 @@ sammoa.dialog.title.strateFile=Choose a shape file for strates sammoa.dialog.title.transect=New Transect sammoa.dialog.title.transectFile=Choose a shape file for transects +sammoa.error.export.sammoa= sammoa.flight.decorator.flight=Flight %1$d sammoa.flight.decorator.newFlight=New flight sammoa.flight.decorator.notEnded=not ended @@ -138,7 +139,11 @@ sammoa.menu.showLogs=Display logs sammoa.menu.showLogs.tip=Display logs sammoa.message.goto.site=Opening %1$s on navigator +sammoa.messageDialog.map.export.success=Map (with %s rows in dbf) was successfully exported in directory\n\n%s +sammoa.messageDialog.mapOrDbf.exportFile.alreadyExists=Export Shape file (%s)\nor dbf file (%s) already exists.\n\nConfirm to override it? sammoa.messageDialog.observers.import.success=%1$d observers are successfully imported +sammoa.messageDialog.sammoa.export.success=Sammoa was successfully exported in file\n\n%s +sammoa.messageDialog.sammoa.exportFile.alreadyExists=Export File %s already exists.\n\nConfirm to override it? sammoa.messageDialog.species.import.success=%1$d species are successfully imported sammoa.messageDialog.strates.import.success=%1$d strates are successfully imported sammoa.messageDialog.transects.import.success=%1$d transects are successfully imported