X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=swt%2Forg.argeo.app.swt%2Fsrc%2Forg%2Fargeo%2Fapp%2Fswt%2Fux%2FSwtArgeoApp.java;h=b5ff82d7571f7250fb4610b3467021f7a4b382ba;hb=0652a702f6c9109ccb858f658b5cf14e6f73b815;hp=ef3bb8c330e1018de0b63c29cafa10124e9662d0;hpb=57af3e86327a40232216d20256eee155de1145aa;p=gpl%2Fargeo-suite.git diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java index ef3bb8c..b5ff82d 100644 --- a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java +++ b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java @@ -6,6 +6,7 @@ import java.lang.ref.WeakReference; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; @@ -94,7 +95,7 @@ public class SwtArgeoApp extends AbstractArgeoApp implements CmsEventSubscriber // private CmsUserManager cmsUserManager; // TODO make more optimal or via CmsSession/CmsView - private static Timer janitorTimer = new Timer(true); + private Timer janitorTimer = new Timer(true); private Map> managedUis = new HashMap<>(); // ACR @@ -127,28 +128,42 @@ public class SwtArgeoApp extends AbstractArgeoApp implements CmsEventSubscriber // TODO does it make sense to accept that? appPid = ""; } - if (log.isDebugEnabled()) - log.info("Argeo Suite App " + appPid + " started"); - Objects.requireNonNull(contentRepository, "Content repository must be provided"); Objects.requireNonNull(appUserState, "App user state must be provided"); - - long janitorPeriod = 12 * 60 * 60 * 1000;// 12h + + long janitorPeriod = 60 * 60 * 1000;// 1h janitorTimer.schedule(new TimerTask() { @Override public void run() { - refs: for (WeakReference uiRef : managedUis.values()) { - SwtAppUi ui = uiRef.get(); - if (ui == null) - continue refs; - ui.disposeIfTimedout(); + try { + Iterator> uiRefs = managedUis.values().iterator(); + refs: while (uiRefs.hasNext()) { + WeakReference uiRef = uiRefs.next(); + SwtAppUi ui = uiRef.get(); + if (ui == null) { + if (log.isTraceEnabled()) + log.warn("Unreferenced UI in " + appPid + ", removing it"); + uiRefs.remove(); + continue refs; + } + if (!ui.isDisposed() && !ui.getDisplay().isDisposed()) { + ui.getDisplay().asyncExec(() -> { + ui.disposeIfTimedout(); + }); + ui.getDisplay().wake(); + } + } + if (log.isTraceEnabled()) + log.trace(managedUis.size() + " UIs being managed by app " + appPid); + } catch (Exception e) { + e.printStackTrace(); } - if (log.isDebugEnabled()) - log.debug(managedUis.size() + " UIs being managed by app " + appPid); } }, janitorPeriod, janitorPeriod); + if (log.isDebugEnabled()) + log.info("Argeo Suite App " + appPid + " started"); } public void stop(Map properties) {