Author: tchemit Date: 2012-08-29 13:25:54 +0200 (Wed, 29 Aug 2012) New Revision: 486 Url: http://forge.codelutin.com/repositories/revision/sammoa/486 Log: fixes #1413: Backup des donn?\195?\169es avant suppression reusinage des repertoire (on laisse dans la configuration uniquement ce qui est configurable) Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaDirectories.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/BackupService.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ReferentialService.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaServiceSupport.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties trunk/sammoa-ui-swing/src/main/filters/sammoa.properties trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.css trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.jaxx trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/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/ReferentialService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ReferentialService.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/ReferentialService.java 2012-08-29 11:25:54 UTC (rev 486) @@ -51,6 +51,7 @@ import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaRuntimeException; +import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.Collections; @@ -264,9 +265,12 @@ if (createCampaign) { + File dataDirectory = config.getDataDirectory(); + // creates the campaign storage SammoaStorages.createCampaignStorage( - config.getCampaignDirectory(), result); + SammoaDirectories.getCampaignDirectory(dataDirectory), + result); } return result; @@ -474,7 +478,6 @@ } - public void deleteAllData() { Iterable<String> campaignIds; Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaConfig.java 2012-08-29 11:25:54 UTC (rev 486) @@ -29,10 +29,10 @@ import com.google.common.base.Throwables; import fr.ulr.sammoa.application.device.gps.GpsConfig; import fr.ulr.sammoa.persistence.AutoSaveListener; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.nuiton.util.ApplicationConfig; import org.nuiton.util.ArgumentsParserException; -import org.nuiton.util.FileUtil; import org.nuiton.util.Version; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -105,12 +105,33 @@ gpsConfig = new GpsConfig(applicationConfig); - // create directory if needed - getOrCreateDirectory(SammoaConfigOption.DATA_DIRECTORY); + try { + prepareDirectories(); + } catch (IOException e) { + throw Throwables.propagate(e); + } logger.debug("parsed options in config file {}", applicationConfig.getOptions()); } + protected void prepareDirectories() throws IOException { + + getOrCreateDirectory(SammoaConfigOption.DATA_DIRECTORY); + File tmpDir = getOrCreateDirectory(SammoaConfigOption.TMP_DIRECTORY); + // clean it + FileUtils.deleteDirectory(tmpDir); + + FileUtils.forceMkdir(tmpDir); + + FileUtils.forceMkdir(SammoaDirectories.getBackupDirectory(getDataDirectory())); + FileUtils.forceMkdir(SammoaDirectories.getCampaignDirectory(getDataDirectory())); + File dbDirectory = SammoaDirectories.getDbDirectory(getDataDirectory()); + FileUtils.forceMkdir(dbDirectory); + + // inject in defaults (we don't want anybody to change this + applicationConfig.setDefaultOption("db.directory", dbDirectory.getAbsolutePath()); + } + @Override public ApplicationConfig get() { return applicationConfig; @@ -133,36 +154,6 @@ return ReflectionToStringBuilder.toString(this); } -// public Properties getProperties() { -// Properties result = applicationConfig.getFlatOptions(); -// return result; -// } -// -// public File getDataDirectory() { -// File file = applicationConfig.getOptionAsFile(SammoaConfigOption.DATA_DIRECTORY.key); -// Preconditions.checkNotNull(file); -// return file; -// } -// -// public String getUIConfigFileName() { -// String filePath = applicationConfig.getOption(SammoaConfigOption.UI_CONFIG_FILE.key); -// return filePath; -// } - -// public Version getApplicationVersion() { -// String versionStr = applicationConfig.getOption(SammoaConfigOption.VERSION.key); -// String s = VersionUtil.removeSnapshot(versionStr); -// Version v = VersionUtil.valueOf(s); -// Preconditions.checkNotNull(v); -// return v; -// } -// -// public URL getApplicationSite() { -// URL url = applicationConfig.getOptionAsURL(SammoaConfigOption.SITE_URL.key); -// Preconditions.checkNotNull(url); -// return url; -// } - /** @return {@link SammoaConfigOption#LOG_FILE} value */ public File getLogFile() { return applicationConfig.getOptionAsFile(SammoaConfigOption.LOG_FILE.key); @@ -204,16 +195,22 @@ /** @return {@link SammoaConfigOption#DATA_DIRECTORY} value */ public File getDataDirectory() { - File result = getOrCreateDirectory(SammoaConfigOption.DATA_DIRECTORY); + File result = applicationConfig.getOptionAsFile(SammoaConfigOption.DATA_DIRECTORY.key); return result; } -// /** @return {@link SammoaConfigOption#AUDIO_DIRECTORY} value */ -// public File getAudioDirectory() { -// File result = getOrCreateDirectory(SammoaConfigOption.AUDIO_DIRECTORY); -// return result; -// } + public File getTmpDirectory() { + File result = applicationConfig.getOptionAsFile(SammoaConfigOption.TMP_DIRECTORY.key); + return result; + } + public char getCsvSeparator() { + char csvSeparator = applicationConfig.getOption( + char.class, SammoaConfigOption.CSV_SEPARATOR.key); + Preconditions.checkNotNull(csvSeparator); + return csvSeparator; + } + /** @return {@link SammoaConfigOption#SYSTEM_ID} value */ public String getSystemId() { String result = applicationConfig.getOption(SammoaConfigOption.SYSTEM_ID.key); @@ -229,35 +226,9 @@ /** @return {@link SammoaConfigOption#BACKGROUND_SHAPE_FILE} value */ public File getBackgroundShapeFile() { File result = applicationConfig.getOptionAsFile(SammoaConfigOption.BACKGROUND_SHAPE_FILE.key); -// Preconditions.checkArgument(result.exists(), "File " + result.getAbsolutePath() + " doesn't exist"); return result; } -// /** -// * @return {@link SammoaConfigOption#TRANSECT_SHAPE_FILE} value -// */ -// public File getTransectShapeFile() { -// File result = applicationConfig.getOptionAsFile(SammoaConfigOption.TRANSECT_SHAPE_FILE.key); -//// Preconditions.checkArgument(result.exists(), "File " + result.getAbsolutePath() + " doesn't exist"); -// return result; -// } -// -// /** -// * @return {@link SammoaConfigOption#STRATE_SHAPE_FILE} value -// */ -// public File getStrateShapeFile() { -// File result = applicationConfig.getOptionAsFile(SammoaConfigOption.STRATE_SHAPE_FILE.key); -//// Preconditions.checkArgument(result.exists(), "File " + result.getAbsolutePath() + " doesn't exist"); -// return result; -// } -// -// /** -// * @param backgroundShapeFile {@link SammoaConfigOption#BACKGROUND_SHAPE_FILE} value -// */ -// public void setBackgroundShapeFile(File backgroundShapeFile) { -// applicationConfig.setOption(SammoaConfigOption.BACKGROUND_SHAPE_FILE.key, String.valueOf(mapBaseShapeFile)); -// } - /** @return {@link SammoaConfigOption#AUTO_COMMIT_DELAY} value */ public Long getAutoCommitDelay() { long result = applicationConfig.getOptionAsLong(SammoaConfigOption.AUTO_COMMIT_DELAY.key); @@ -294,7 +265,7 @@ * the directory to create * @return the created directory */ - protected File getOrCreateDirectory(SammoaConfigOption option) { + protected File getOrCreateDirectory(SammoaConfigOption option) throws IOException { File directory = applicationConfig.getOptionAsFile(option.getKey()); @@ -307,32 +278,11 @@ logger.debug("{} = {}", option, directory); - try { - FileUtil.createDirectoryIfNecessary(directory); + FileUtils.forceMkdir(directory); - } catch (IOException e) { - throw Throwables.propagate(e); - } return directory; } - public File getCampaignDirectory() { - File result = getOrCreateDirectory(SammoaConfigOption.CAMPAIGN_DIRECTORY); - return result; - } - - public File getTmpDirectory() { - File result = getOrCreateDirectory(SammoaConfigOption.TMP_DIRECTORY); - return result; - } - - public char getCsvSeparator() { - char csvSeparator = applicationConfig.getOption( - char.class, SammoaConfigOption.CSV_SEPARATOR.key); - Preconditions.checkNotNull(csvSeparator); - return csvSeparator; - } - /** * All Sammoa configuration options. * @@ -347,11 +297,6 @@ "${user.home}/.sammoa", File.class ), - CAMPAIGN_DIRECTORY("campaign.directory", - n_("sammoa.config.campaign.directory"), - "${data.directory}/campaign", - File.class - ), TMP_DIRECTORY("tmp.directory", n_("sammoa.config.tmp.directory"), "${java.io.tmpdir}/sammoa", Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaDirectories.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaDirectories.java (rev 0) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaDirectories.java 2012-08-29 11:25:54 UTC (rev 486) @@ -0,0 +1,74 @@ +package fr.ulr.sammoa.application; + +/* + * #%L + * SAMMOA :: Application + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 UMS 3462, Code Lutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import java.io.File; + +/** + * Helper about directories used in Sammoa. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.7 + */ +public class SammoaDirectories { + + protected SammoaDirectories() { + // no constructor + } + + public static File getBackupFile(File container, String filename) { + return new File(getBackupDirectory(container), filename); + } + + public static File getBackupDirectory(File container) { + return new File(container, "backup"); + } + + public static File getCampaignDirectory(File container) { + return new File(container, "campaign"); + } + + public static File getDbDirectory(File container) { + return new File(container, "db"); + } + + public static File getCsvDirectory(File container) { + return new File(container, "csv"); + } + + public static File getAudioDirectory(File container) { + return new File(container, "audio"); + } + + public static File getFlightDirectory(File container) { + return new File(container, "flight"); + } + + public static File getMapDirectory(File container) { + return new File(container, "map"); + } + +} + Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaDirectories.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaServiceSupport.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaServiceSupport.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/SammoaServiceSupport.java 2012-08-29 11:25:54 UTC (rev 486) @@ -26,7 +26,9 @@ import fr.ulr.sammoa.application.io.CampaignStorage; import fr.ulr.sammoa.application.io.SammoaStorages; import fr.ulr.sammoa.persistence.SammoaPersistence; +import org.apache.commons.io.FileUtils; import org.nuiton.topia.TopiaContext; +import org.nuiton.util.ZipUtil; import java.io.File; import java.io.IOException; @@ -63,7 +65,8 @@ } public CampaignStorage getCampaignStorage(String campaignId) { - File directory = config.getCampaignDirectory(); + File dataDirectory = config.getDataDirectory(); + File directory = SammoaDirectories.getCampaignDirectory(dataDirectory); CampaignStorage campaignStorage = SammoaStorages.getCampaignStorage( directory, campaignId); return campaignStorage; @@ -82,4 +85,20 @@ public void close() throws IOException { // by default nothing to close } + + protected void compressZipFile(File zipFile, File directory) { + + try { + FileUtils.forceMkdir(zipFile.getParentFile()); + + try { + ZipUtil.compress(zipFile, directory); + } finally { + FileUtils.deleteDirectory(directory); + + } + } catch (IOException e) { + throw new SammoaTechnicalException("Could not compress directory", e); + } + } } Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/BackupService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/BackupService.java (rev 0) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/BackupService.java 2012-08-29 11:25:54 UTC (rev 486) @@ -0,0 +1,101 @@ +package fr.ulr.sammoa.application.io; + +/* + * #%L + * SAMMOA :: Application + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 UMS 3462, Code Lutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import com.google.common.base.Preconditions; +import fr.ulr.sammoa.application.SammoaDirectories; +import fr.ulr.sammoa.application.SammoaServiceSupport; +import fr.ulr.sammoa.application.SammoaTechnicalException; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.DirectoryFileFilter; +import org.apache.commons.io.filefilter.OrFileFilter; +import org.apache.commons.io.filefilter.SuffixFileFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; + +/** + * Service to backup (or/and later restore) sammoa. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.7 + */ +public class BackupService extends SammoaServiceSupport { + + /** Logger. */ + private static final Logger logger = + LoggerFactory.getLogger(BackupService.class); + + protected static final OrFileFilter DB_FILTER = + new OrFileFilter(DirectoryFileFilter.INSTANCE, + new SuffixFileFilter(".h2.db")); + + /** + * Export all the application data to the backup directory. + * + * @param backupFilename filename of the backup file + * @since 0.7 + */ + public void backupApplication(String backupFilename) { + Preconditions.checkNotNull(backupFilename); + + // sammoa data directory to use + File sourceDirectory = config.getDataDirectory(); + + // create export directory + File targetDirectory = new File(new File(config.getTmpDirectory(), + "backupSammoa-" + System.nanoTime()), "sammoa"); + + try { + // copy in it all the campaign directory + File campaignDirectory = SammoaDirectories.getCampaignDirectory(targetDirectory); + FileUtils.copyDirectory(SammoaDirectories.getCampaignDirectory(sourceDirectory), + campaignDirectory); + + // copy in it the db + File dbDirectory = SammoaDirectories.getDbDirectory(targetDirectory); + FileUtils.copyDirectory(SammoaDirectories.getDbDirectory(sourceDirectory), + dbDirectory, DB_FILTER); + + // final zip file + File zipFile = SammoaDirectories.getBackupFile(sourceDirectory, + backupFilename); + + if (logger.isInfoEnabled()) { + logger.info("Compress backup to {}", zipFile); + } + // zip it and clean target directory + compressZipFile(zipFile, targetDirectory); + + FileUtils.deleteDirectory(targetDirectory.getParentFile()); + + } catch (IOException e) { + throw new SammoaTechnicalException("could not backup data", e); + } + + } +} Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/BackupService.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/CampaignStorage.java 2012-08-29 11:25:54 UTC (rev 486) @@ -29,6 +29,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import fr.ulr.sammoa.application.DecoratorService; +import fr.ulr.sammoa.application.SammoaDirectories; import fr.ulr.sammoa.application.SammoaTechnicalException; import fr.ulr.sammoa.persistence.Campaign; import fr.ulr.sammoa.persistence.Region; @@ -68,7 +69,7 @@ } public File getMapDirectory() { - return new File(getDirectory(), "map"); + return SammoaDirectories.getMapDirectory(getDirectory()); } public File getMapFile(String mapFilename) { @@ -76,7 +77,7 @@ } public File getFlightDirectory() { - return new File(getDirectory(), "flight"); + return SammoaDirectories.getFlightDirectory(getDirectory()); } public Set<String> getFlightIds() { Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/FlightStorage.java 2012-08-29 11:25:54 UTC (rev 486) @@ -25,6 +25,7 @@ import com.google.common.collect.Maps; import fr.ulr.sammoa.application.DecoratorService; +import fr.ulr.sammoa.application.SammoaDirectories; import fr.ulr.sammoa.persistence.Campaign; import fr.ulr.sammoa.persistence.Flight; import fr.ulr.sammoa.persistence.Region; @@ -50,7 +51,7 @@ } public File getAudioDirectory() { - return new File(getDirectory(), "audio"); + return SammoaDirectories.getAudioDirectory(getDirectory()); } public File getAudioFile(Route route, String ext) { Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/SammoaStorage.java 2012-08-29 11:25:54 UTC (rev 486) @@ -26,6 +26,7 @@ import com.google.common.base.Charsets; import com.google.common.io.Files; import fr.ulr.sammoa.application.DecoratorService; +import fr.ulr.sammoa.application.SammoaDirectories; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -92,7 +93,7 @@ } public File getCsvDirectory() { - return new File(getDirectory(), "csv"); + return SammoaDirectories.getCsvDirectory(getDirectory()); } public File getPropertiesFile() { Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/input/application/ImportApplicationService.java 2012-08-29 11:25:54 UTC (rev 486) @@ -29,6 +29,7 @@ import fr.ulr.sammoa.application.FlightService; import fr.ulr.sammoa.application.ReferentialService; import fr.ulr.sammoa.application.SammoaContext; +import fr.ulr.sammoa.application.SammoaDirectories; import fr.ulr.sammoa.application.SammoaServiceSupport; import fr.ulr.sammoa.application.SammoaTechnicalException; import fr.ulr.sammoa.application.io.CampaignStorage; @@ -320,8 +321,10 @@ Preconditions.checkNotNull(newCampaign); // create the new empty (or not) campaign storage + File dataDirectory = config.getDataDirectory(); CampaignStorage newStorage = SammoaStorages.createCampaignStorage( - config.getCampaignDirectory(), newCampaign.getTopiaId()); + SammoaDirectories.getCampaignDirectory(dataDirectory), + newCampaign.getTopiaId()); // remove properties files from storage storageToCopy.deletePropertiesFiles(); Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/io/output/application/ExportApplicationService.java 2012-08-29 11:25:54 UTC (rev 486) @@ -84,6 +84,7 @@ private static final TimeLog TIME_LOG = new TimeLog(ExportApplicationService.class); + private final ExportModelFactory<SammoaEntityEnum> defaultExportModelFactory = new ExportModelFactory<SammoaEntityEnum>() { @Override public <E extends TopiaEntity> ExportModel<E> buildForExport(TableMeta<SammoaEntityEnum> meta) { @@ -126,6 +127,12 @@ } }; + /** + * Export some data of a campaign. + * + * @param model model of data to export + * @since 0.6 + */ public void exportApplication(ExportApplicationModel model) { Preconditions.checkNotNull(model); Preconditions.checkNotNull(model.getExportFile()); @@ -315,20 +322,4 @@ } - protected void compressZipFile(File zipFile, File directory) { - - try { - FileUtils.forceMkdir(zipFile.getParentFile()); - - try { - ZipUtil.compress(zipFile, directory); - } finally { - FileUtils.deleteDirectory(directory); - - } - } catch (IOException e) { - throw new SammoaTechnicalException("Could not compress directory", e); - } - } - } Modified: trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties =================================================================== --- trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-application/src/main/resources/i18n/sammoa-application_en_GB.properties 2012-08-29 11:25:54 UTC (rev 486) @@ -2,10 +2,12 @@ sammoa.config.application.site.url=Website URL of the application sammoa.config.application.version=Version of the application sammoa.config.background.shape.file=Location of the Background shape file +sammoa.config.backup.directory=BAckup directory where to sotre all data backup sammoa.config.campaign.directory=Directory where are stored campaign data (maps, flight audio files,...) sammoa.config.campaign.id=Id of the default campaign to use sammoa.config.csv.separator=Csv separator caracter to use sammoa.config.data.directory=Main directory where all data are stored. You can use ${data.directory} in other property values (ex\: ${data.directory}/audio). +sammoa.config.db.directory= sammoa.config.flight.number=Number of the default flight to use sammoa.config.fly.mode=Default fly mode sammoa.config.gps.check.period=Time in seconds between each GPS capture @@ -30,7 +32,6 @@ sammoa.config.ui.stop=Stop sammoa.config.ui.validObservation=Validate the selected observation sammoa.config.ui.validRoute=Validate the selected route -sammoa.datePattern=dd/MM/yyyy sammoa.dateTimePattern=dd/MM/yyyy HH\:mm\:ss sammoa.dbf.import.error.unableToReadField=impossible to read value for column %s at line %s sammoa.flight.decorator.flight=Flight %1$d Modified: trunk/sammoa-ui-swing/src/main/filters/sammoa.properties =================================================================== --- trunk/sammoa-ui-swing/src/main/filters/sammoa.properties 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-ui-swing/src/main/filters/sammoa.properties 2012-08-29 11:25:54 UTC (rev 486) @@ -27,7 +27,7 @@ hibernate.show_sql=false hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.connection.url=jdbc:h2:file:${data.directory}/db/sammoa +hibernate.connection.url=jdbc:h2:file:${db.directory}/sammoa hibernate.connection.username=sa hibernate.connection.password=sa hibernate.connection.driver_class=org.h2.Driver Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/StartApp.java 2012-08-29 11:25:54 UTC (rev 486) @@ -26,10 +26,8 @@ import fr.ulr.sammoa.application.SammoaConfig; import fr.ulr.sammoa.application.SammoaContext; -import fr.ulr.sammoa.application.SammoaTechnicalException; import fr.ulr.sammoa.ui.swing.util.LogFileInitializer; import jaxx.runtime.SwingUtil; -import org.apache.commons.io.FileUtils; import org.nuiton.i18n.I18n; import org.nuiton.i18n.init.DefaultI18nInitializer; import org.slf4j.Logger; @@ -38,7 +36,6 @@ import javax.swing.UIManager; import java.awt.Color; import java.io.File; -import java.io.IOException; import java.util.Locale; /** @@ -55,16 +52,6 @@ // Create sammoa configuration from sammoa.properties file SammoaConfig config = new SammoaConfig("sammoa.properties", args); - //clean sammoa temporary directory - File tmpDirectory = config.getTmpDirectory(); - try { - // clean tmp dir - FileUtils.cleanDirectory(tmpDirectory); - } catch (IOException e) { - throw new SammoaTechnicalException( - "Could not clean temp directory " + tmpDirectory, e); - } - // Create application context SammoaContext appContext = new SammoaContext(config); @@ -91,7 +78,7 @@ } } - UIManager.put("BlockingLayerUI.blockingColor", new Color(50,50,50)); + UIManager.put("BlockingLayerUI.blockingColor", new Color(50, 50, 50)); MainUI mainUI = new MainUI(context); mainUI.setVisible(true); Added: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java (rev 0) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java 2012-08-29 11:25:54 UTC (rev 486) @@ -0,0 +1,80 @@ +package fr.ulr.sammoa.ui.swing.io; + +/* + * #%L + * SAMMOA :: UI Swing + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2012 UMS 3462, Code Lutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/gpl-3.0.html>. + * #L% + */ + +import org.jdesktop.beans.AbstractSerializableBean; + +/** + * Abstract model which support backup configuration. + * + * @author tchemit <chemit@codelutin.com> + * @since 0.7 + */ +public abstract class AbstractApplicationModelWithBackup extends AbstractSerializableBean { + + private static final long serialVersionUID = 1L; + + public static final String PROPERTY_VALID = "valid"; + + public static final String PROPERTY_BACKUP = "backup"; + + public static final String PROPERTY_BACKUP_FILENAME = "backupFilename"; + + protected boolean backup; + + protected String backupFilename; + + protected boolean valid; + + public boolean isValid() { + return valid; + } + + public void setValid(boolean valid) { + boolean oldValue = this.valid; + this.valid = valid; + firePropertyChange(PROPERTY_VALID, oldValue, valid); + } + + public boolean isBackup() { + return backup; + } + + public void setBackup(boolean backup) { + boolean oldValue = this.backup; + this.backup = backup; + firePropertyChange(PROPERTY_BACKUP, oldValue, backup); + } + + public String getBackupFilename() { + return backupFilename; + } + + public void setBackupFilename(String backupFilename) { + String oldValue = this.backupFilename; + this.backupFilename = backupFilename; + firePropertyChange(PROPERTY_BACKUP_FILENAME, oldValue, backupFilename); + } +} Property changes on: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/AbstractApplicationModelWithBackup.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.css 2012-08-29 11:25:54 UTC (rev 486) @@ -39,6 +39,7 @@ #importButton { text: "sammoa.action.importApplication"; + enabled:{model.isValid()}; } #loadImportFileButton { @@ -54,4 +55,26 @@ useIcon:false; blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; block:{!model.isImportFileLoaded()}; -} \ No newline at end of file +} + +#backupPanel { + border:{new TitledBorder(_("sammoa.label.exportApplication.backup.panel"))}; +} + +#backupCheckBox { + text:"sammoa.label.exportApplication.backup"; + selected:{model.isBackup()}; +} + +#backupFilenameLbl { + text:"sammoa.label.exportApplication.backupFilename"; +} + +#backupFilename { + text:{model.getBackupFilename()}; +} + +#backupInfo { + actionIcon:"information"; + text:{handler.getBackupInfo(model.getBackupFilename())}; +} Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUI.jaxx 2012-08-29 11:25:54 UTC (rev 486) @@ -98,7 +98,35 @@ </JPanel> </cell> </row> - + <!-- backup panel --> + <row> + <cell columns='3' fill="horizontal"> + <JPanel id='backupPanel' layout='{new BorderLayout()}'> + <Table id='backupTable' fill='both' constraints='BorderLayout.CENTER' decorator='boxed'> + <row> + <cell fill="horizontal" columns='2'> + <JCheckBox id='backupCheckBox' + onItemStateChanged='getModel().setBackup(backupCheckBox.isSelected())'/> + </cell> + </row> + <row> + <cell anchor='west'> + <JLabel id='backupFilenameLbl'/> + </cell> + <cell weightx='1' fill="horizontal"> + <JTextField id='backupFilename' + onKeyReleased='getModel().setBackupFilename(((JTextField)event.getSource()).getText())'/> + </cell> + </row> + <row> + <cell columns='2'> + <JLabel id='backupInfo'/> + </cell> + </row> + </Table> + </JPanel> + </cell> + </row> <!--import actions--> <row> <cell columns='3' fill="both"> Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIHandler.java 2012-08-29 11:25:54 UTC (rev 486) @@ -26,6 +26,8 @@ import com.google.common.collect.Lists; import fr.ulr.sammoa.application.FlightService; import fr.ulr.sammoa.application.ReferentialService; +import fr.ulr.sammoa.application.SammoaDirectories; +import fr.ulr.sammoa.application.io.BackupService; import fr.ulr.sammoa.application.io.CampaignStorage; import fr.ulr.sammoa.application.io.FlightStorage; import fr.ulr.sammoa.application.io.input.application.ImportApplicationModel; @@ -40,6 +42,7 @@ import jaxx.runtime.SwingUtil; import jaxx.runtime.swing.ErrorDialogUI; import jaxx.runtime.swing.editor.FileEditor; +import org.apache.commons.lang.StringUtils; import org.nuiton.util.FileUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,6 +56,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; +import java.util.Date; import java.util.List; import java.util.Map; @@ -82,6 +86,8 @@ protected final UIDecoratorService decoratorService; + protected final BackupService backupService; + public ImportApplicationUIHandler(SammoaUIContext context, ImportApplicationUI ui) { this.context = context; @@ -90,6 +96,7 @@ this.flightService = context.getService(FlightService.class); this.referentialService = context.getService(ReferentialService.class); this.decoratorService = context.getService(UIDecoratorService.class); + this.backupService = context.getService(BackupService.class); } @Override @@ -114,7 +121,16 @@ } else if (ImportApplicationUIModel.PROPERTY_IMPORT_FILE_LOADED.equals(propertyName)) { boolean newValue = (Boolean) evt.getNewValue(); onImportFileLoaded(newValue); + } else if (ImportApplicationUIModel.PROPERTY_CAMPAIGN_EXIST.equals(propertyName)) { + boolean newValue = (Boolean) evt.getNewValue(); + onCampaignExistChanged(newValue); } + + if (!ImportApplicationUIModel.PROPERTY_VALID.equals(propertyName)) { + + // validate model + validateModel(); + } } }); } @@ -122,6 +138,10 @@ @Override public void afterInitUI() { + String backupFilename = String.format( + "backup-%1$td-%1$tm-%1$ty-%1$tH_%1$tM_%1$tS.zip", new Date()); + getModel().setBackupFilename(backupFilename); + // Boolean editor/renderer on table { JTable table = ui.getLoadImportFileResultFlightsTable(); @@ -162,10 +182,36 @@ public void importApplication() { + JFrame frame = ui.getParentContainer(JFrame.class); + + ImportApplicationUIModel model = getModel(); + + if (model.isBackup()) { + + String backupFilename = model.getBackupFilename(); + + try { + SammoaUtil.updateBusyState(frame.getRootPane(), true); + ui.getBusyBlockLayerUI().setBlock(true); + + // backup sammoa data + backupService.backupApplication(backupFilename); + SammoaUtil.showSuccessMessage( + frame, + _("sammoa.messageDialog.sammoa.backup.success", + getBackupFile(backupFilename))); + } catch (Exception e) { + ErrorDialogUI.showError(e); + } finally { + ui.getBusyBlockLayerUI().setBlock(false); + SammoaUtil.updateBusyState(frame.getRootPane(), false); + } + } + // get service model - ImportApplicationModel dataModel = getModel().toModel(); - JFrame frame = ui.getParentContainer(JFrame.class); + ImportApplicationModel dataModel = model.toModel(); + SammoaUtil.updateBusyState(frame, true); try { importService.importApplication(dataModel); @@ -173,7 +219,7 @@ SammoaUtil.showSuccessMessage( frame, _("sammoa.messageDialog.aplication.import.success", - getModel().getImportFile())); + model.getImportFile())); } catch (Exception e) { ErrorDialogUI.showError(e); @@ -187,6 +233,12 @@ context.changeScreen(SammoaScreen.HOME); } + public String getBackupInfo(String filename) { + File backupFile = getBackupFile(filename == null ? "" : filename); + String result = _("sammoa.label.exportApplication.backupInfo", backupFile); + return result; + } + protected ImportApplicationUIModel getModel() { return ui.getModel(); } @@ -313,4 +365,48 @@ label.setText(infoLabel); } + protected void onCampaignExistChanged(boolean newValue) { + + // always force to backup if data could be lost + if (newValue) { + getModel().setBackup(true); + } + } + + protected void validateModel() { + boolean valid = true; + + ImportApplicationUIModel model = getModel(); + + File importFile = model.getImportFile(); + + if (importFile == null) { + // no file loaded + valid = false; + } + + if (model.isBackup()) { + + // validate that backup filename not empty and does not exist + // in backup directory + String backupFilename = model.getBackupFilename(); + if (StringUtils.isBlank(backupFilename)) { + valid = false; + } else { + File backupFile = getBackupFile(backupFilename); + if (backupFile.exists()) { + valid = false; + } + } + } + + model.setValid(valid); + } + + protected File getBackupFile(String backupFilename) { + File result = SammoaDirectories.getBackupFile( + context.getConfig().getDataDirectory(), backupFilename); + return result; + } + } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/input/application/ImportApplicationUIModel.java 2012-08-29 11:25:54 UTC (rev 486) @@ -27,7 +27,7 @@ import fr.ulr.sammoa.application.io.CampaignStorage; import fr.ulr.sammoa.application.io.input.application.ImportApplicationModel; import fr.ulr.sammoa.persistence.Flight; -import org.jdesktop.beans.AbstractSerializableBean; +import fr.ulr.sammoa.ui.swing.io.AbstractApplicationModelWithBackup; import java.io.File; import java.util.List; @@ -38,7 +38,7 @@ * @author tchemit <chemit@codelutin.com> * @since 0.6 */ -public class ImportApplicationUIModel extends AbstractSerializableBean { +public class ImportApplicationUIModel extends AbstractApplicationModelWithBackup { private static final long serialVersionUID = 1L; @@ -138,7 +138,7 @@ flightIds.add(entry.getFlightStorage().getId()); Flight existingFlight = entry.getExistingFlight(); - if (existingFlight!=null) { + if (existingFlight != null) { flightToRemoveIds.add(existingFlight.getTopiaId()); } } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.css =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.css 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.css 2012-08-29 11:25:54 UTC (rev 486) @@ -38,18 +38,10 @@ text: "sammoa.label.campaign"; } -/*#campaignCombobox { - renderer: {new DecoratorProviderListCellRenderer(getHandler().getDecoratorProvider())}; -}*/ - #flightLabel { text: "sammoa.label.flight"; } -/*#flightCombobox { - renderer: {new DecoratorProviderListCellRenderer(getHandler().getDecoratorProvider())}; -}*/ - #quitButton { text:"sammoa.action.quitExportMaps"; } @@ -108,3 +100,27 @@ useIcon:false; blockingColor:{UIManager.getColor("BlockingLayerUI.blockingColor")}; } + +#backupPanel { + border:{new TitledBorder(_("sammoa.label.exportApplication.backup.panel"))}; +} + +#backupCheckBox { + text:"sammoa.label.exportApplication.backup"; + selected:{model.isBackup()}; +} + +#backupFilenameLbl { + text:"sammoa.label.exportApplication.backupFilename"; +} + +#backupFilename { + text:{model.getBackupFilename()}; +} + +#backupInfo { + actionIcon:"information"; + text:{handler.getBackupInfo(model.getBackupFilename())}; +} + + Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.jaxx =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.jaxx 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUI.jaxx 2012-08-29 11:25:54 UTC (rev 486) @@ -119,9 +119,38 @@ </JPanel> </cell> </row> + <!-- backup panel --> + <row> + <cell columns='3' fill="horizontal"> + <JPanel id='backupPanel' layout='{new BorderLayout()}'> + <Table id='backupTable' fill='both' constraints='BorderLayout.CENTER' decorator='boxed'> + <row> + <cell fill="horizontal" columns='2'> + <JCheckBox id='backupCheckBox' + onItemStateChanged='getModel().setBackup(backupCheckBox.isSelected())'/> + </cell> + </row> + <row> + <cell anchor='west'> + <JLabel id='backupFilenameLbl'/> + </cell> + <cell weightx='1' fill="horizontal"> + <JTextField id='backupFilename' + onKeyReleased='getModel().setBackupFilename(((JTextField)event.getSource()).getText())'/> + </cell> + </row> + <row> + <cell columns='2'> + <JLabel id='backupInfo'/> + </cell> + </row> + </Table> + </JPanel> + </cell> + </row> <!--export actions--> <row> - <cell columns='5' fill="both"> + <cell columns='3' fill="both"> <JPanel layout='{new GridLayout(1,2,0,0)}'> <JButton id='quitButton' onActionPerformed='getHandler().close()'/> <JButton id='exportButton' Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIHandler.java 2012-08-29 11:25:54 UTC (rev 486) @@ -25,6 +25,9 @@ import fr.ulr.sammoa.application.FlightService; import fr.ulr.sammoa.application.ReferentialService; +import fr.ulr.sammoa.application.SammoaConfig; +import fr.ulr.sammoa.application.SammoaDirectories; +import fr.ulr.sammoa.application.io.BackupService; import fr.ulr.sammoa.application.io.output.application.ExportApplicationModel; import fr.ulr.sammoa.application.io.output.application.ExportApplicationService; import fr.ulr.sammoa.persistence.Campaign; @@ -37,6 +40,7 @@ import jaxx.runtime.SwingUtil; import jaxx.runtime.swing.ErrorDialogUI; import jaxx.runtime.swing.renderer.DecoratorListCellRenderer; +import org.apache.commons.lang.StringUtils; import org.nuiton.util.FileUtil; import org.nuiton.util.decorator.Decorator; import org.slf4j.Logger; @@ -48,6 +52,7 @@ import java.io.File; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.List; import static org.nuiton.i18n.I18n._; @@ -71,10 +76,14 @@ protected final ReferentialService referentialService; + protected final BackupService backupService; + protected final FlightService flightService; protected final UIDecoratorService decoratorService; + protected final SammoaConfig config; + public ExportApplicationUIHandler(SammoaUIContext context, ExportApplicationUI ui) { this.context = context; @@ -83,6 +92,8 @@ this.referentialService = context.getService(ReferentialService.class); this.exportService = context.getService(ExportApplicationService.class); this.decoratorService = context.getService(UIDecoratorService.class); + this.backupService = context.getService(BackupService.class); + this.config = context.getConfig(); } @Override @@ -129,9 +140,10 @@ } else if (ExportApplicationUIModel.PROPERTY_FLIGHTS.equals(propertyName)) { Collection<Flight> newValue = (Collection<Flight>) evt.getNewValue(); onFlightsChanged(newValue); - } else if (ExportApplicationUIModel.PROPERTY_SELECTED_FLIGHT.equals(propertyName)) { - Flight newValue = (Flight) evt.getNewValue(); - onSelectedFlightChanged(newValue); + } else if (ExportApplicationUIModel.PROPERTY_CALLBACK.equals(propertyName)) { + ExportApplicationCallbackMode newValue = + (ExportApplicationCallbackMode) evt.getNewValue(); + onCallbackChanged(newValue); } if (!ExportApplicationUIModel.PROPERTY_VALID.equals(propertyName)) { @@ -158,21 +170,23 @@ File currentDirectory = FileUtil.getCurrentDirectory(); String absolutePath = currentDirectory.getAbsolutePath(); if (absolutePath.endsWith(File.separator + ".")) { - currentDirectory = new File(absolutePath.substring(0, absolutePath.length() - 2)); + currentDirectory = new File( + absolutePath.substring(0, absolutePath.length() - 2)); } if (logger.isInfoEnabled()) { logger.info("Current directory to use: {}", currentDirectory); } model.setExportDirectory(currentDirectory); + String backupFilename = String.format( + "backup-%1$td-%1$tm-%1$ty-%1$tH_%1$tM_%1$tS.zip", new Date()); + model.setBackupFilename(backupFilename); + SwingUtil.fillComboBox(ui.getCampaignCombobox(), model.getCampaigns(), model.getSelectedCampaign()); - Flight selectedFlight = model.getSelectedFlight(); - onSelectedCampaignChanged(model.getSelectedCampaign()); - onSelectedFlightChanged(selectedFlight); } @Override @@ -183,59 +197,84 @@ JFrame frame = ui.getParentContainer(JFrame.class); + ExportApplicationUIModel model = getModel(); - try { - ExportApplicationModel dataModel = getModel().toModel(); + ExportApplicationModel dataModel = model.toModel(); - boolean doExport = checkFileToExport(dataModel); + boolean doExport = checkFileToExport(dataModel); - if (doExport) { + if (!doExport) { - ui.getBusyBlockLayerUI().setBlock(true); + // nothing to do, quit now + return; + } + if (model.isBackup()) { + + String backupFilename = model.getBackupFilename(); + + try { SammoaUtil.updateBusyState(frame.getRootPane(), true); + ui.getBusyBlockLayerUI().setBlock(true); - exportService.exportApplication(dataModel); - + // backup sammoa data + backupService.backupApplication(backupFilename); SammoaUtil.showSuccessMessage( frame, - _("sammoa.messageDialog.sammoa.export.success", - dataModel.getExportFile())); + _("sammoa.messageDialog.sammoa.backup.success", + getBackupFile(backupFilename))); + } catch (Exception e) { + ErrorDialogUI.showError(e); + } finally { + ui.getBusyBlockLayerUI().setBlock(false); + SammoaUtil.updateBusyState(frame.getRootPane(), false); + } + } + try { - boolean removeFlightId = false; - boolean removeCampaingId = false; + ui.getBusyBlockLayerUI().setBlock(true); + SammoaUtil.updateBusyState(frame.getRootPane(), true); - switch (getModel().getCallback()) { + exportService.exportApplication(dataModel); - case NOTHING: - // nothing to do - break; - case REMOVE_FLIGHTS: - removeFlights(dataModel); - removeFlightId = true; - break; - case REMOVE_CAMPAIGN: - removeCampaign(dataModel); - removeCampaingId = true; - break; - case REMOVE_ALL: - removeAllData(); - removeCampaingId = true; - break; + SammoaUtil.showSuccessMessage( + frame, + _("sammoa.messageDialog.sammoa.export.success", + dataModel.getExportFile())); - } + boolean removeFlightId = false; + boolean removeCampaingId = false; - if (removeCampaingId) { - context.setCampaignId(null); + switch (model.getCallback()) { + + case NOTHING: + // nothing to do + break; + case REMOVE_FLIGHTS: + removeFlights(dataModel); removeFlightId = true; - } + break; + case REMOVE_CAMPAIGN: + removeCampaign(dataModel); + removeCampaingId = true; + break; + case REMOVE_ALL: + removeAllData(); + removeCampaingId = true; + break; - if (removeFlightId) { - context.setFlightId(null); - } - close(); } + if (removeCampaingId) { + context.setCampaignId(null); + removeFlightId = true; + } + + if (removeFlightId) { + context.setFlightId(null); + } + close(); + } catch (Exception e) { ErrorDialogUI.showError(e); } finally { @@ -244,6 +283,12 @@ } } + public String getBackupInfo(String filename) { + File backupFile = getBackupFile(filename == null ? "" : filename); + String result = _("sammoa.label.exportApplication.backupInfo", backupFile); + return result; + } + protected void removeFlights(ExportApplicationModel model) { String campaignId = model.getCampaignId(); Iterable<String> flightIds = model.getFlightIds(); @@ -292,9 +337,30 @@ } } + if (model.isBackup()) { + + // validate that backup filename not empty and does not exist + // in backup directory + String backupFilename = model.getBackupFilename(); + if (StringUtils.isBlank(backupFilename)) { + valid = false; + } else { + File backupFile = getBackupFile(backupFilename); + if (backupFile.exists()) { + valid = false; + } + } + } + model.setValid(valid); } + protected File getBackupFile(String backupFilename) { + File result = SammoaDirectories.getBackupFile( + config.getDataDirectory(), backupFilename); + return result; + } + protected boolean checkFileToExport(ExportApplicationModel dataModel) { boolean doExport = true; @@ -370,17 +436,10 @@ selectedFlight); } - protected void onSelectedFlightChanged(Flight newCampaign) { + protected void onCallbackChanged(ExportApplicationCallbackMode callback) { - // reset flights,... - if (logger.isInfoEnabled()) { - Decorator<Flight> decorator = - decoratorService.getDecoratorByType(Flight.class); - logger.info("New selected flight: {}", - decorator.toString(newCampaign)); - } - - ExportApplicationUIModel model = getModel(); + // always force to backup if data could be lost + getModel().setBackup(callback != ExportApplicationCallbackMode.NOTHING); } Modified: trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIModel.java =================================================================== --- trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIModel.java 2012-08-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-ui-swing/src/main/java/fr/ulr/sammoa/ui/swing/io/output/application/ExportApplicationUIModel.java 2012-08-29 11:25:54 UTC (rev 486) @@ -29,7 +29,7 @@ import fr.ulr.sammoa.application.io.output.application.ExportApplicationModel; import fr.ulr.sammoa.persistence.Campaign; import fr.ulr.sammoa.persistence.Flight; -import org.jdesktop.beans.AbstractSerializableBean; +import fr.ulr.sammoa.ui.swing.io.AbstractApplicationModelWithBackup; import org.nuiton.topia.persistence.TopiaId; import java.io.File; @@ -42,7 +42,7 @@ * @author tchemit <chemit@codelutin.com> * @since 0.6 */ -public class ExportApplicationUIModel extends AbstractSerializableBean { +public class ExportApplicationUIModel extends AbstractApplicationModelWithBackup { private static final long serialVersionUID = 1L; @@ -60,8 +60,6 @@ public static final String PROPERTY_CALLBACK = "callback"; - public static final String PROPERTY_VALID = "valid"; - protected List<Campaign> campaigns; protected Campaign selectedCampaign; @@ -76,8 +74,6 @@ protected ExportApplicationCallbackMode callback; - protected boolean valid; - public File getExportDirectory() { return exportDirectory; } @@ -154,16 +150,6 @@ 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; 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-29 11:16:30 UTC (rev 485) +++ trunk/sammoa-ui-swing/src/main/resources/i18n/sammoa-ui-swing_en_GB.properties 2012-08-29 11:25:54 UTC (rev 486) @@ -104,6 +104,10 @@ sammoa.label.campaign.region=Region\: sammoa.label.campaign.strate=Strates\: sammoa.label.campaign.transect=Transects\: +sammoa.label.exportApplication.backup=Do a backup +sammoa.label.exportApplication.backup.panel=Backup Sammoa data +sammoa.label.exportApplication.backupFilename=Backup file name +sammoa.label.exportApplication.backupInfo=Backup file will be stored at %s sammoa.label.exportApplication.callbackNothing=Do nothing sammoa.label.exportApplication.callbackRemoveAllData=Remove all data sammoa.label.exportApplication.callbackRemoveCampaignData=Remove selected campaign data @@ -145,6 +149,7 @@ 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.backup.success=Sammoa was successfully backup in file\n\n%s 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