Introduce killing a zombie RWT UI session
[lgpl/argeo-commons.git] / swt / org.argeo.cms.swt / src / org / argeo / cms / swt / CmsSwtUi.java
index 7aac07b155fdbeefba571bab54d03c8917b09a2c..d02ad3aec371202cb8f4c42364b15a45277b5605 100644 (file)
@@ -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,15 +12,14 @@ 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;
 
        public CmsSwtUi(Composite parent, int style) {
                super(parent, style);
                cmsView = CmsSwtUtils.getCmsView(parent);
-               // TODO make timeout configurable
-               setUiTimeout(12 * 60 * 60 * 1000);// 12 hours
                setLayout(new GridLayout());
        }
 
@@ -31,23 +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) {
-               if (timeoutTask != null)
-                       timeoutTask.cancel();
-               timeoutTask = cmsView.schedule(() -> {
-                       if (System.currentTimeMillis() - getLastAccess() >= uiTimeout)
-                               dispose();
-               }, 0, 1000);
+//             clearTimeoutTask();
+               this.uiTimeout = uiTimeout;
+               if (this.uiTimeout <= 0)
+                       return;
+               // 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() {
+//             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;
+//             }
+//     }
+
+       @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