-// if (pidPrefix == null)
-// throw new IllegalArgumentException("PID prefix must be set.");
-
-// headerPid = pidPrefix + "header";
-// footerPid = pidPrefix + "footer";
-// leadPanePid = pidPrefix + "leadPane";
-// adminLeadPanePid = pidPrefix + "adminLeadPane";
-// loginScreenPid = pidPrefix + "loginScreen";
+
+ long janitorPeriod = 60 * 60 * 1000;// 1h
+ // long janitorPeriod = 60 * 1000;// min
+ janitorTimer.schedule(new TimerTask() {
+
+ @Override
+ public void run() {
+ try {
+ // copy Map in order to avoid concurrent modification exception
+ Iterator<Map.Entry<String, WeakReference<SwtAppUi>>> uiRefs = new HashMap<>(managedUis).entrySet()
+ .iterator();
+ refs: while (uiRefs.hasNext()) {
+ Map.Entry<String, WeakReference<SwtAppUi>> entry = uiRefs.next();
+ String uiUuid = entry.getKey();
+ WeakReference<SwtAppUi> uiRef = entry.getValue();
+ SwtAppUi ui = uiRef.get();
+ if (ui == null) {
+ if (log.isTraceEnabled())
+ log.warn("Unreferenced UI " + uiUuid + " in " + appPid + ", removing it");
+ managedUis.remove(uiUuid);
+ continue refs;
+ }
+ if (!ui.isDisposed() && !ui.getDisplay().isDisposed()) {
+ if (ui.isTimedOut()) {
+ if (log.isTraceEnabled())
+ log.trace("Killing timed-out UI " + uiUuid + " in " + appPid);
+ UiContext.killDisplay(ui.getDisplay());
+ }
+ } else {
+ if (log.isTraceEnabled())
+ log.warn("Disposed UI " + uiUuid + " still referenced in " + appPid + ", removing it");
+ managedUis.remove(uiUuid);
+ }
+ }
+ if (log.isTraceEnabled())
+ log.trace(managedUis.size() + " UIs being managed by app " + appPid);
+ } catch (Exception e) {
+ log.error("Could not clean up timed-out UIs", e);
+ }
+ }
+ }, janitorPeriod, janitorPeriod);
+
+ if (log.isDebugEnabled())
+ log.info("Argeo Suite App " + appPid + " started");