From: Mathieu Baudier Date: Mon, 18 Dec 2023 07:47:12 +0000 (+0100) Subject: Introduce killing a zombie RWT UI session X-Git-Tag: v2.3.27~1 X-Git-Url: https://git.argeo.org/?p=lgpl%2Fargeo-commons.git;a=commitdiff_plain;h=bb682b8c9bceb730d827096c6d6fa715adf6c5f1 Introduce killing a zombie RWT UI session --- diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsUi.java b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsUi.java index ff6f5f081..fc8c9e0bc 100644 --- a/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsUi.java +++ b/org.argeo.api.cms/src/org/argeo/api/cms/ux/CmsUi.java @@ -8,8 +8,10 @@ public interface CmsUi { CmsView getCmsView(); - long getLastAccess(); - void updateLastAccess(); + default boolean isTimedOut() { + return false; + }; + } diff --git a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java index b16eb0f9e..d02ad3aec 100644 --- a/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java +++ b/swt/org.argeo.cms.swt/src/org/argeo/cms/swt/CmsSwtUi.java @@ -1,7 +1,5 @@ package org.argeo.cms.swt; -import java.util.TimerTask; - import org.argeo.api.cms.ux.CmsUi; import org.argeo.api.cms.ux.CmsView; import org.eclipse.swt.layout.GridLayout; @@ -14,7 +12,7 @@ public class CmsSwtUi extends Composite implements CmsUi { /** Last time the UI was accessed. */ private long lastAccess = System.currentTimeMillis(); - private TimerTask timeoutTask; +// private TimerTask timeoutTask; private long uiTimeout = 0; private CmsView cmsView; @@ -30,44 +28,59 @@ public class CmsSwtUi extends Composite implements CmsUi { return cmsView; } - @Override - public long getLastAccess() { - return lastAccess; - } - @Override public void updateLastAccess() { this.lastAccess = System.currentTimeMillis(); } public void setUiTimeout(long uiTimeout) { - clearTimeoutTask(); +// clearTimeoutTask(); this.uiTimeout = uiTimeout; if (this.uiTimeout <= 0) return; - final long timeoutTaskPeriod = 60 * 60 * 1000;// 1h - timeoutTask = cmsView.schedule(() -> { - disposeIfTimedout(); - }, timeoutTaskPeriod, timeoutTaskPeriod); + // TODO introduce mechanism to check whether the UI is "zombie" + // (that is the UI thread still exists, but cannot execute anything) +// final long timeoutTaskPeriod = 60 * 60 * 1000;// 1h +// timeoutTask = cmsView.schedule(() -> { +// disposeIfTimedout(); +// }, timeoutTaskPeriod, timeoutTaskPeriod); +// addDisposeListener((e) -> { +// clearTimeoutTask(); +// }); } - /** Must be run in UI thread. */ - public void disposeIfTimedout() { - if (isDisposed()) { - clearTimeoutTask(); - return; - } - if (System.currentTimeMillis() - getLastAccess() >= uiTimeout) { - dispose(); - clearTimeoutTask(); - } - } +// /** Must be run in UI thread. */ +// public void disposeIfTimedout() { +// System.out.println("Enter disposeIfTimedout"); +// if (isDisposed()) { +// clearTimeoutTask(); +// return; +// } +// if (isTimedOut()) { +// dispose(); +// clearTimeoutTask(); +// System.out.println("Disposed after timeout"); +// } +// } + +// private void clearTimeoutTask() { +// if (timeoutTask != null) { +// timeoutTask.cancel(); +// timeoutTask = null; +// } +// } - private void clearTimeoutTask() { - if (timeoutTask != null) { - timeoutTask.cancel(); - timeoutTask = null; - } + @Override + public boolean isTimedOut() { + return uiTimeout > 0 && (System.currentTimeMillis() - lastAccess >= uiTimeout); } +// class DisposeIfTimedOutTask implements Runnable { +// public void run() { +// disposeIfTimedout(); +// getDisplay().timerExec(1000, new DisposeIfTimedOutTask()); +// } +// +// } + } \ No newline at end of file diff --git a/swt/rap/org.argeo.swt.specific.rap/src/org/argeo/eclipse/ui/specific/UiContext.java b/swt/rap/org.argeo.swt.specific.rap/src/org/argeo/eclipse/ui/specific/UiContext.java index a81d94d11..698fe2080 100644 --- a/swt/rap/org.argeo.swt.specific.rap/src/org/argeo/eclipse/ui/specific/UiContext.java +++ b/swt/rap/org.argeo.swt.specific.rap/src/org/argeo/eclipse/ui/specific/UiContext.java @@ -4,8 +4,10 @@ import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSessionBindingListener; import org.eclipse.rap.rwt.RWT; +import org.eclipse.rap.rwt.service.UISession; import org.eclipse.swt.widgets.Display; /** Singleton class providing single sources infos about the UI context. */ @@ -51,6 +53,11 @@ public class UiContext { display.setData(key, value); } + public static void killDisplay(Display display) { + UISession uiSession = RWT.getUISession(display); + ((HttpSessionBindingListener) uiSession).valueUnbound(null); + } + private static Display getDisplay() { return Display.getCurrent(); } diff --git a/swt/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/UiContext.java b/swt/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/UiContext.java index 67b0e755c..a85d8914d 100644 --- a/swt/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/UiContext.java +++ b/swt/rcp/org.argeo.swt.specific.rcp/src/org/argeo/eclipse/ui/specific/UiContext.java @@ -44,6 +44,10 @@ public class UiContext { display.setData(key, value); } + public static void killDisplay(Display display) { + display.dispose(); + } + private static Display getDisplay() { return Display.getCurrent(); }