This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit 9df61807b0435b42785eec9523b28d47b20fcd49 Author: Tony CHEMIT <chemit@codelutin.com> Date: Mon Sep 19 16:44:31 2016 +0200 Add task to auto backup local database --- .../application/swing/LocalDatabaseBackupTask.java | 76 ++++++++++++++++++++++ .../swing/ObserveSwingApplicationContext.java | 35 ++++++++++ .../i18n/application-swing_en_GB.properties | 2 + .../i18n/application-swing_es_ES.properties | 2 + .../i18n/application-swing_fr_FR.properties | 2 + 5 files changed, 117 insertions(+) diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/LocalDatabaseBackupTask.java b/application-swing/src/main/java/fr/ird/observe/application/swing/LocalDatabaseBackupTask.java new file mode 100644 index 0000000..ca24f30 --- /dev/null +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/LocalDatabaseBackupTask.java @@ -0,0 +1,76 @@ +package fr.ird.observe.application.swing; + +import fr.ird.observe.application.swing.db.ObserveSwingDataSource; +import fr.ird.observe.application.swing.ui.ObserveMainUI; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.StringUtil; + +import java.io.File; +import java.util.Date; + +import static org.nuiton.i18n.I18n.t; + +/** + * Created on 19/09/16. + * + * @author Tony Chemit - chemit@codelutin.com + */ +public class LocalDatabaseBackupTask implements Runnable { + + /** Logger. */ + private static final Log log = LogFactory.getLog(LocalDatabaseBackupTask.class); + + @Override + public void run() { + + ObserveSwingApplicationContext applicationContext = ObserveSwingApplicationContext.get(); + if (!applicationContext.getConfig().isBackupUse()) { + if (log.isInfoEnabled()) { + log.info("Skip, auto backup is not activate."); + } + } + if (!applicationContext.getConfig().isLocalStorageExist()) { + if (log.isInfoEnabled()) { + log.info("Skip, no local database found."); + } + return; + } + + ObserveSwingDataSource mainDataSource = applicationContext.getDataSourcesManager().getMainDataSource(); + if (mainDataSource == null) { + if (log.isInfoEnabled()) { + log.info("Skip, no main data source opened."); + } + return; + } + if (!mainDataSource.isLocal()) { + if (log.isInfoEnabled()) { + log.info("Skip, not using a local data source."); + } + return; + } + + File file = applicationContext.getConfig().newBackupDataFile(); + String startMessage = t("observe.backup.start", new Date()); + + ObserveMainUI mainUI = applicationContext.getMainUI(); + mainUI.getStatus().setStatus(startMessage); + if (log.isInfoEnabled()) { + log.info(startMessage + " - " + file); + } + long t0 = System.nanoTime(); + mainUI.setBusy(true); + try { + mainDataSource.newDataSourceService().backup(file); + } finally { + String endMessage = t("observe.backup.done", new Date(), StringUtil.convertTime(System.nanoTime() - t0)); + mainUI.getStatus().setStatus(endMessage); + if (log.isInfoEnabled()) { + log.info(endMessage + " - " + file); + } + mainUI.setBusy(false); + } + + } +} diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveSwingApplicationContext.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveSwingApplicationContext.java index 66ad919..8bac9e7 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveSwingApplicationContext.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveSwingApplicationContext.java @@ -69,6 +69,10 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import static fr.ird.observe.application.swing.ObserveSwingApplicationContext.Entries.ACTIONS; import static fr.ird.observe.application.swing.ObserveSwingApplicationContext.Entries.ACTION_MAP; @@ -81,6 +85,7 @@ import static fr.ird.observe.application.swing.ObserveSwingApplicationContext.En import static fr.ird.observe.application.swing.ObserveSwingApplicationContext.Entries.H2_SERVER; import static fr.ird.observe.application.swing.ObserveSwingApplicationContext.Entries.H2_SERVER_MODE; import static fr.ird.observe.application.swing.ObserveSwingApplicationContext.Entries.H2_WEBSERVER; +import static fr.ird.observe.application.swing.ObserveSwingApplicationContext.Entries.LOCAL_DATABASE_BACKUP_TIMER; import static fr.ird.observe.application.swing.ObserveSwingApplicationContext.Entries.MAIN_UI; import static fr.ird.observe.application.swing.ObserveSwingApplicationContext.Entries.NODE_TO_RESELECT; import static fr.ird.observe.application.swing.ObserveSwingApplicationContext.Entries.OPEN_DATA_MANAGER; @@ -106,6 +111,7 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im /** Logger */ private static final Log log = LogFactory.getLog(ObserveSwingApplicationContext.class); + protected final ScheduledFuture<?> scheduledFuture; enum Entries { @@ -126,6 +132,7 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im H2_SERVER("H2 Server", Server.class), H2_WEBSERVER("H2 Web server", Server.class), VALIDATORS("Validators"), + LOCAL_DATABASE_BACKUP_TIMER("Local database backup task", ScheduledThreadPoolExecutor.class), NODE_TO_RESELECT("Node to reselect"); private final String objectName; @@ -212,7 +219,11 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im VALIDATION_CONTEXT.set(new ValidationContext(config, getDataContext())); VALIDATORS.set(Lists.newArrayList(ValidateServiceUtils.getValidators())); SERVICE_MAIN_FACTORY.set(ObserveServiceMainFactory.get()); + LOCAL_DATABASE_BACKUP_TIMER.set(new ScheduledThreadPoolExecutor(1)); referenceBinderEngine = new ReferenceBinderEngineSupplier().get(); + + scheduledFuture = getLocalDatabaseBackupTimer().scheduleAtFixedRate(new LocalDatabaseBackupTask(), 0, config.getBackupDelay(), TimeUnit.MINUTES); + lock = new Object(); } @@ -304,6 +315,10 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im return SERVICE_MAIN_FACTORY.get(); } + public ScheduledThreadPoolExecutor getLocalDatabaseBackupTimer() { + return LOCAL_DATABASE_BACKUP_TIMER.get(); + } + //------------------------------------------- // - Write //------------------------------------------- @@ -391,6 +406,26 @@ public class ObserveSwingApplicationContext extends DefaultApplicationContext im log.info("Closing swing application context " + this); } + if (getConfig().isBackupUse()) { + + try { + getLocalDatabaseBackupTimer().submit(new LocalDatabaseBackupTask()).get(); + } catch (InterruptedException | ExecutionException e) { + if (log.isErrorEnabled()) { + log.error(e); + } + } + + } + + try { + getLocalDatabaseBackupTimer().awaitTermination(0, TimeUnit.NANOSECONDS); + } catch (InterruptedException e) { + if (log.isErrorEnabled()) { + log.error(e); + } + } + // fermeture de touts les context de donnée ouvert getDataSourcesManager().close(); diff --git a/application-swing/src/main/resources/i18n/application-swing_en_GB.properties b/application-swing/src/main/resources/i18n/application-swing_en_GB.properties index 788d8c1..7bd0517 100644 --- a/application-swing/src/main/resources/i18n/application-swing_en_GB.properties +++ b/application-swing/src/main/resources/i18n/application-swing_en_GB.properties @@ -316,6 +316,8 @@ observe.admin.resume.operation.failed=operation failed observe.admin.resume.operation.need.fix=operation need fix observe.admin.resume.operation.not.started=operation not started observe.admin.resume.operation.running=operation is running... +observe.backup.done=[%s] Auto backup done (in %s) +observe.backup.start=[%s] Start auto backup observe.choice.cancel=Cancel observe.choice.confirm.delete=Confirm delete observe.choice.continue=Continue diff --git a/application-swing/src/main/resources/i18n/application-swing_es_ES.properties b/application-swing/src/main/resources/i18n/application-swing_es_ES.properties index a5c3a18..5f4eb8f 100644 --- a/application-swing/src/main/resources/i18n/application-swing_es_ES.properties +++ b/application-swing/src/main/resources/i18n/application-swing_es_ES.properties @@ -316,6 +316,8 @@ observe.admin.resume.operation.failed=la operación no realizada observe.admin.resume.operation.need.fix=la operación nesista correcciones observe.admin.resume.operation.not.started=operación no empezada observe.admin.resume.operation.running=operación en curso... +observe.backup.done=[%s] Fin de la sauvegarde automatique (en %s) \#TODO +observe.backup.start=[%s] Début de la sauvegarde automatique \#TODO observe.choice.cancel=Cancelar observe.choice.confirm.delete=Eliminar observe.choice.continue=Continuar diff --git a/application-swing/src/main/resources/i18n/application-swing_fr_FR.properties b/application-swing/src/main/resources/i18n/application-swing_fr_FR.properties index 9eeb70a..c7d1bea 100644 --- a/application-swing/src/main/resources/i18n/application-swing_fr_FR.properties +++ b/application-swing/src/main/resources/i18n/application-swing_fr_FR.properties @@ -316,6 +316,8 @@ observe.admin.resume.operation.failed=opération échouée observe.admin.resume.operation.need.fix=opération nécessitant des corrections observe.admin.resume.operation.not.started=opération non démarrée observe.admin.resume.operation.running=opération en cours... +observe.backup.done=[%s] Fin de la sauvegarde automatique (en %s) +observe.backup.start=[%s] Début de la sauvegarde automatique observe.choice.cancel=Annuler observe.choice.confirm.delete=Supprimer observe.choice.continue=Continuer -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.