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 c976414f157dc47c289e9d7b71a6773107894525 Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Dec 14 09:56:16 2016 +0100 refs #8863 Prévenir des fuites mémoires quand on change de source + réusinage des dernières modifications --- .../observe/application/swing/ObserveRunner.java | 5 + .../swing/db/ObserveSwingDataSource.java | 9 +- .../swing/ui/admin/AdminUILauncher.java | 4 +- .../swing/ui/content/list/ContentListUIModel.java | 7 ++ .../ui/content/table/ContentTableUIModel.java | 9 +- .../swing/ui/storage/StorageUIHandler.java | 2 + .../swing/ui/storage/StorageUILauncher.java | 108 ++++++++++++++++++++- 7 files changed, 137 insertions(+), 7 deletions(-) diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveRunner.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveRunner.java index 3579795..b56adbc 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveRunner.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ObserveRunner.java @@ -98,6 +98,11 @@ public abstract class ObserveRunner extends ApplicationRunner { return actionExecutor; } + public static void cleanMemory() { + System.runFinalization(); + System.gc(); + } + public abstract String getRunnerName(); private final boolean init; diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/db/ObserveSwingDataSource.java b/application-swing/src/main/java/fr/ird/observe/application/swing/db/ObserveSwingDataSource.java index 21e2326..4bb8f63 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/db/ObserveSwingDataSource.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/db/ObserveSwingDataSource.java @@ -4,7 +4,7 @@ package fr.ird.observe.application.swing.db; * #%L * ObServe :: Application Swing * %% - * Copyright (C) 2008 - 2016 IRD, Code Lutin, Tony Chemit + * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -26,6 +26,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.SetMultimap; +import fr.ird.observe.application.swing.ObserveRunner; import fr.ird.observe.application.swing.ObserveSwingApplicationContext; import fr.ird.observe.application.swing.configuration.ObserveSwingApplicationConfig; import fr.ird.observe.application.swing.db.event.ObserveSwingDataSourceEvent; @@ -59,7 +60,10 @@ import fr.ird.observe.services.service.DatabaseConnexionNotAuthorizedException; import fr.ird.observe.services.service.DatabaseDestroyNotAuthorizedException; import fr.ird.observe.services.service.DatabaseNotFoundException; import fr.ird.observe.services.service.LastUpdateDateService; +import fr.ird.observe.services.service.ObserveReferentialCache; import fr.ird.observe.services.service.PingService; +import fr.ird.observe.services.service.ReferentialService; +import fr.ird.observe.services.service.SqlScriptProducerService; import fr.ird.observe.services.service.actions.consolidate.ConsolidateDataService; import fr.ird.observe.services.service.actions.report.ReportService; import fr.ird.observe.services.service.actions.synchro.referential.diff.ReferentialSynchronizeDiffService; @@ -241,6 +245,9 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements dataSourceService.close(); } } finally { + + ObserveRunner.cleanMemory(); + connection = null; expired = false; diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/admin/AdminUILauncher.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/admin/AdminUILauncher.java index 1d56234..e681d11 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/admin/AdminUILauncher.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/admin/AdminUILauncher.java @@ -21,6 +21,7 @@ */ package fr.ird.observe.application.swing.ui.admin; +import fr.ird.observe.application.swing.ObserveRunner; import fr.ird.observe.application.swing.ObserveSwingApplicationContext; import fr.ird.observe.application.swing.db.ObserveSwingDataSource; import fr.ird.observe.application.swing.ui.ObserveMainUI; @@ -243,8 +244,7 @@ public class AdminUILauncher extends WizardUILancher<AdminStep, AdminUIModel, Ad mainUI.getSynchroWizard().remove(ui); mainUI.removeContextValue(model.getClass()); - System.runFinalization(); - System.gc(); + ObserveRunner.cleanMemory(); ObserveSwingDataSource source = model.getConfigModel().getPreviousSource(); diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/list/ContentListUIModel.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/list/ContentListUIModel.java index d9d2a5a..6961482 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/list/ContentListUIModel.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/list/ContentListUIModel.java @@ -82,6 +82,13 @@ public abstract class ContentListUIModel<E extends IdDto, C extends DataDto> ext this.childType = childType; } + @Override + public void destroy() { + super.destroy(); + dataReferenceSetsByPropertyName = null; + selectedDatas = null; + } + public Class<C> getChildType() { return childType; } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIModel.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIModel.java index 3209c07..a4d27ce 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIModel.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/table/ContentTableUIModel.java @@ -2,7 +2,7 @@ * #%L * ObServe :: Application Swing * %% - * Copyright (C) 2008 - 2016 IRD, Code Lutin, Tony Chemit + * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -205,6 +205,13 @@ public abstract class ContentTableUIModel<E extends IdDto, D extends IdDto> exte firePropertyChange(PROPERTY_SHOW_DATA, oldValue, showData); } + @Override + public void destroy() { + super.destroy(); + tableEditBean = null; + tableModel = null; + } + protected BinderModelBuilder<D, D> prepareChildLoador(String binderName) { String[] properties = getChildProperties(); diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/storage/StorageUIHandler.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/storage/StorageUIHandler.java index daf3777..f636b87 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/storage/StorageUIHandler.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/storage/StorageUIHandler.java @@ -542,6 +542,8 @@ public class StorageUIHandler implements UIHandler<StorageUI> { } catch (Exception ex) { UIHelper.handlingError(ex); throw new RuntimeException(ex); + } finally { + ObserveRunner.cleanMemory(); } } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/storage/StorageUILauncher.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/storage/StorageUILauncher.java index 50e6cf0..64174cf 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/storage/StorageUILauncher.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/storage/StorageUILauncher.java @@ -2,7 +2,7 @@ * #%L * ObServe :: Application Swing * %% - * Copyright (C) 2008 - 2016 IRD, Code Lutin, Tony Chemit + * Copyright (C) 2008 - 2016 IRD, Codelutin, Tony Chemit * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -21,9 +21,11 @@ */ package fr.ird.observe.application.swing.ui.storage; +import fr.ird.observe.application.swing.ObserveRunner; import fr.ird.observe.application.swing.ObserveSwingApplicationContext; import fr.ird.observe.application.swing.configuration.ObserveSwingApplicationConfig; import fr.ird.observe.application.swing.configuration.constants.DbMode; +import fr.ird.observe.application.swing.ui.ObserveMainUIHandler; import fr.ird.observe.application.swing.ui.UIHelper; import jaxx.runtime.JAXXContext; import jaxx.runtime.JAXXObject; @@ -110,6 +112,9 @@ public class StorageUILauncher extends WizardUILancher<StorageStep, StorageUIMod super.doClose(ui, wasCanceled); ui.getModel().setBusy(false); ui.dispose(); + + ObserveRunner.cleanMemory(); + } /** @@ -149,7 +154,7 @@ public class StorageUILauncher extends WizardUILancher<StorageStep, StorageUIMod model.setCanUseServerService(modes.contains(DbMode.USE_SERVER)); model.updateUniverse(); - model.setDbMode(modes.stream().findFirst().orElse(DbMode.USE_LOCAL)); + model.setDbMode(modes.stream().findFirst().orElse(null)); } else { ObserveSwingApplicationConfig config = ObserveSwingApplicationContext.get().getConfig(); @@ -222,7 +227,7 @@ public class StorageUILauncher extends WizardUILancher<StorageStep, StorageUIMod * @param mainUI la fenetre principale parent (peut etre null) * @param model le modèle de source de données à utiliser * @param title le titre de la fenêtre - * @param dbMode le type deconnexion (base distante ou serveur distant) + * @param model le type deconnexion (base distante ou serveur distant) * @see StorageUI */ public static void obtainConnexion(JAXXContext context, Window mainUI, StorageUIModel model, String title, DbMode dbMode) { @@ -284,6 +289,103 @@ public class StorageUILauncher extends WizardUILancher<StorageStep, StorageUIMod } /** + * Méthode pour lancer l'action de connexion à une base locale. + * + * @param context le context applicatif + * @param mainUI la fenetre principale parent (peut etre null) + * @param model le modèle de source de données à utiliser + * @see StorageUI + */ + public static void obtainLocalConnexion(final JAXXContext context, + Window mainUI, + final StorageUIModel model) { + + if (mainUI == null) { + mainUI = ObserveSwingApplicationContext.get().getMainUI(); + } + + addStorageUIHandler(context); + + StorageUILauncher launcher = new StorageUILauncher( + context, + mainUI, + model, + t("observe.title.connect.localDB")) { + + @Override + protected StorageUI createUI(JAXXContext context, + Window mainUI, + Class<StorageUI> storageUIClass, + Class<StorageUIModel> modelClass, + StorageUIModel model) throws Exception { + if (!(mainUI instanceof JAXXObject)) { + // sinon on a pas de context propagé... + mainUI = null; + } + return super.createUI(context, mainUI, storageUIClass, modelClass, model); + } + + @Override + protected void init(StorageUI ui) { + StorageUIModel model = ui.getModel(); + + int nbModes = 0; + + DbMode mode = null; + if (model.isCanCreateLocalService()) { + nbModes++; + mode = DbMode.CREATE_LOCAL; + } + if (model.isCanUseLocalService()) { + nbModes++; + mode = DbMode.USE_LOCAL; + } + if (model.isCanUseRemoteService()) { + nbModes++; + mode = DbMode.USE_REMOTE; + } + if (model.isCanUseServerService()) { + nbModes++; + mode = DbMode.USE_SERVER; + } + + if (nbModes == 1) { + + if (log.isDebugEnabled()) { + log.debug("Only one mode available [" + mode + + "], set it in model"); + } + + // un seul mode possible, on le sélectionne + model.setDbMode(mode); + } + + // on supprime des étapes + model.setExcludeSteps(Arrays.asList( + StorageStep.BACKUP, + StorageStep.CONFIG_REFERENTIEL, + StorageStep.CONFIG_DATA, + StorageStep.SELECT_DATA, + StorageStep.CONFIRM)); + + model.updateUniverse(); + } + + @Override + protected void doAction(StorageUI ui) { + super.doAction(ui); + if (log.isDebugEnabled()) { + log.debug("Apply new local connexion to " + model); + } + ui.getModel().copyTo(model); + model.validate(); + } + }; + + launcher.start(); + } + + /** * Méthode pour lancer l'action de connexion à une base locale ou distante. * * @param context le context applicatif -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.