This is an automated email from the git hooks/post-receive script. New commit to branch develop-5.x in repository observe. See https://gitlab.nuiton.org/codelutin/observe.git commit f1b69a86b0339d11ca2539b97832c924db288a4d Author: Tony CHEMIT <chemit@codelutin.com> Date: Wed Dec 14 09:39:59 2016 +0100 refs #8863 Prévenir des fuites mémoires en recréant à chaque fois les ui (c'est un shouya plus lent, mais très stable en empreinte mémoire) --- .../application/swing/ui/ObserveMainUIHandler.java | 21 ++++++++++++--------- .../application/swing/ui/content/ContentUI.jaxx | 4 ++++ .../swing/ui/content/ContentUIHandler.java | 13 +++++++++++-- .../swing/ui/content/ContentUIManager.java | 17 +++++++++++++---- .../swing/ui/content/ContentUIModel.java | 6 ++++++ .../swing/ui/content/ObserveContentUI.java | 2 ++ pom.xml | 2 +- 7 files changed, 49 insertions(+), 16 deletions(-) diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUIHandler.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUIHandler.java index c0fcea6..21d4de4 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUIHandler.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/ObserveMainUIHandler.java @@ -22,23 +22,23 @@ package fr.ird.observe.application.swing.ui; import fr.ird.observe.application.swing.ObserveSwingApplicationContext; -import fr.ird.observe.application.swing.decoration.DecoratorService; import fr.ird.observe.application.swing.configuration.ObserveSwingApplicationConfig; import fr.ird.observe.application.swing.db.DataContext; import fr.ird.observe.application.swing.db.ObserveSwingDataSource; +import fr.ird.observe.application.swing.decoration.DecoratorService; import fr.ird.observe.application.swing.decoration.ObserveI18nDecoratorHelper; -import fr.ird.observe.services.dto.AbstractObserveDto; -import fr.ird.observe.services.dto.constants.ReferentialLocale; import fr.ird.observe.application.swing.ui.content.ContentMode; import fr.ird.observe.application.swing.ui.content.ContentUI; import fr.ird.observe.application.swing.ui.content.ContentUIManager; import fr.ird.observe.application.swing.ui.content.ContentUIModel; import fr.ird.observe.application.swing.ui.content.ObserveContentUI; import fr.ird.observe.application.swing.ui.tree.ObserveNavigationTreeShowPopupAction; -import fr.ird.observe.application.swing.ui.tree.node.ObserveNode; import fr.ird.observe.application.swing.ui.tree.ObserveTreeHelper; +import fr.ird.observe.application.swing.ui.tree.node.ObserveNode; import fr.ird.observe.application.swing.ui.util.ObserveSwingValidatorMessageTableModel; import fr.ird.observe.application.swing.ui.util.ObserveValidatorMessageTableRenderer; +import fr.ird.observe.services.dto.AbstractObserveDto; +import fr.ird.observe.services.dto.constants.ReferentialLocale; import jaxx.runtime.JAXXContext; import jaxx.runtime.context.DefaultApplicationContext; import jaxx.runtime.context.JAXXInitialContext; @@ -159,16 +159,19 @@ public class ObserveMainUIHandler { DataContext context = ui.getDataContext(); context.populateSelectedIds(selectedIds); - // on recherche l'ui (voir si elle existe déjà) - ObserveContentUI<?> content = manager.getContent(uiClass); - - if (content == null) { + ContentUI<?> previousSelectedContent = manager.getSelectedContentUI(); - content = manager.createContent(uiClass); + if (previousSelectedContent != null) { + manager.removeSelectedContentUI(); } + ObserveContentUI<?> content = manager.createContent(uiClass); + // on ouvre l'écran manager.openContent(content); + + System.runFinalization(); + System.gc(); } /** diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUI.jaxx b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUI.jaxx index 8e391c8..beaa72c 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUI.jaxx +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUI.jaxx @@ -99,6 +99,10 @@ public boolean close() { return getHandler().closeUI(); } +public void destroy() { + getHandler().destroyUI(); +} + public void startEdit(E o) { getHandler().startEditUI(); } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIHandler.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIHandler.java index 624f997..dc29e4c 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIHandler.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIHandler.java @@ -37,9 +37,9 @@ import fr.ird.observe.application.swing.decoration.decorators.ReferentialReferen import fr.ird.observe.application.swing.ui.UIHelper; import fr.ird.observe.application.swing.ui.actions.shared.AbstractUIAction; import fr.ird.observe.application.swing.ui.content.ref.ContentReferenceUIHandler; -import fr.ird.observe.application.swing.ui.tree.renderer.AbstractObserveTreeCellRenderer; -import fr.ird.observe.application.swing.ui.tree.node.ObserveNode; import fr.ird.observe.application.swing.ui.tree.ObserveTreeHelper; +import fr.ird.observe.application.swing.ui.tree.node.ObserveNode; +import fr.ird.observe.application.swing.ui.tree.renderer.AbstractObserveTreeCellRenderer; import fr.ird.observe.application.swing.ui.util.SpringUtilities; import fr.ird.observe.application.swing.validation.ValidationContext; import fr.ird.observe.services.dto.AbstractObserveDto; @@ -55,6 +55,7 @@ import fr.ird.observe.services.dto.referential.ReferentialReference; import fr.ird.observe.services.dto.referential.ReferentialReferenceSet; import fr.ird.observe.services.dto.referential.ReferentialReferences; import jaxx.runtime.JAXXContext; +import jaxx.runtime.context.DefaultJAXXContext; import jaxx.runtime.swing.editor.bean.BeanComboBox; import jaxx.runtime.swing.editor.bean.BeanListHeader; import jaxx.runtime.validator.swing.SwingValidatorMessageTableModel; @@ -307,6 +308,14 @@ public abstract class ContentUIHandler<E extends IdDto> { } + public void destroyUI() { + UIHelper.removeAllDataBindings(getUi()); + getModel().destroy(); + UIHelper.destroy((Component) getUi()); + DefaultJAXXContext delegateContext = (DefaultJAXXContext) getUi().getDelegateContext(); + delegateContext.clear(); + } + public void openUI() { boolean canWrite = computeCanWrite(getDataSource()); diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIManager.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIManager.java index 959f06f..4f96d55 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIManager.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIManager.java @@ -253,9 +253,9 @@ public class ContentUIManager { String constraints = uiClass.getName(); - if (getLayout().contains(constraints)) { - throw new IllegalStateException("Already existing constrainst [" + constraints + "]"); - } +// if (getLayout().contains(constraints)) { +// throw new IllegalStateException("Already existing constrainst [" + constraints + "]"); +// } U result; try { Constructor<U> constructor = uiClass.getConstructor(JAXXContext.class); @@ -346,6 +346,15 @@ public class ContentUIManager { return closed; } + public void removeSelectedContentUI() { + + ContentUI<?> selectedContentUI = getSelectedContentUI(); + if (selectedContentUI != null) { + getLayout().removeLayoutComponent(selectedContentUI, selectedContentUI.getClass().getName()); + selectedContentUI.destroy(); + } + } + @Override protected void finalize() throws Throwable { super.finalize(); @@ -402,7 +411,7 @@ public class ContentUIManager { String contextValue = context instanceof Class ? ((Class) context).getName() : (context == null ? null : context.toString()); String key = getMappingKey(prefix, klass, contextValue); if (log.isDebugEnabled()) { - log.debug("Add key: "+key+" → "+contentClass.getName()); + log.debug("Add key: " + key + " → " + contentClass.getName()); } mapping.put(key, (Class<? extends ContentUI<?>>) contentClass); } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIModel.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIModel.java index d3af38f..d63841f 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIModel.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ContentUIModel.java @@ -328,4 +328,10 @@ public abstract class ContentUIModel<E extends IdDto> extends AbstractSerializab return (DataReferenceSet<R>) referenceSet; } + public void destroy() { + dataReferenceSetsByPropertyName = null; + referentialReferenceSetsByPropertyName = null; + form = null; + bean = null; + } } diff --git a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ObserveContentUI.java b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ObserveContentUI.java index 1b4ce00..3a67979 100644 --- a/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ObserveContentUI.java +++ b/application-swing/src/main/java/fr/ird/observe/application/swing/ui/content/ObserveContentUI.java @@ -62,6 +62,8 @@ public interface ObserveContentUI<E extends IdDto> extends JAXXObject { boolean close(); + void destroy(); + void stopEdit(); void startEdit(E bean); diff --git a/pom.xml b/pom.xml index 381c97a..aa1c56b 100644 --- a/pom.xml +++ b/pom.xml @@ -162,7 +162,7 @@ <processorPluginVersion>1.3</processorPluginVersion> <topiaVersion>3.1.4</topiaVersion> - <jaxxVersion>2.35</jaxxVersion> + <jaxxVersion>2.36-SNAPSHOT</jaxxVersion> <nuitonI18nVersion>3.6.2</nuitonI18nVersion> <nuitonValidatorVersion>3.0.1</nuitonValidatorVersion> <nuitonUtilsVersion>3.0-rc-15</nuitonUtilsVersion> -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.