From d1fff90a79555e9103a862c198750cbd98b575e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 23 May 2011 13:58:09 +0200 Subject: [PATCH] Allow to GC the page before the desktop is discarded A weak reference is introduced to allow that. FEA: ItEr74S08DeployFramework --- .../web/common/MessagesForUser.java | 86 +++++++++++-------- 1 file changed, 51 insertions(+), 35 deletions(-) diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/MessagesForUser.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/MessagesForUser.java index 113a7fa73..7aee52cae 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/common/MessagesForUser.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/common/MessagesForUser.java @@ -21,6 +21,7 @@ package org.navalplanner.web.common; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import java.util.Queue; @@ -46,9 +47,55 @@ import org.zkoss.zul.Label; public class MessagesForUser extends GenericForwardComposer implements IMessagesForUser { - private static final long DEFAULT_MINIMUM_VISUALIZATION_TIME_MILLIS = 1000 * 2; // 2 + // 2 seconds + private static final long DEFAULT_MINIMUM_VISUALIZATION_TIME_MILLIS = 1000 * 2; - // seconds + private static final class PreviousMessagesDiscarder implements + EventInterceptor { + + private final WeakReference messagesForUserRef; + + public PreviousMessagesDiscarder(MessagesForUser messagesForUser) { + this.messagesForUserRef = new WeakReference( + messagesForUser); + } + + @Override + public void afterProcessEvent(Event event) { + } + + @Override + public Event beforePostEvent(Event event) { + return event; + } + + @Override + public Event beforeProcessEvent(Event event) { + MessagesForUser messagesForUser = messagesForUserRef.get(); + if (messagesForUser == null) { + return event; + } + + if (event.getName().equals(DETACH_EVENT_NAME) + || messagesForUser.pendingToDetach.isEmpty()) { + return event; + } + long currentTime = System.currentTimeMillis(); + ComponentHolderTimestamped currrent = null; + while ((currrent = messagesForUser.pendingToDetach.peek()) != null + && currrent + .minimumVisualizationTimeSurpased(currentTime)) { + currrent.component.detach(); + messagesForUser.pendingToDetach.poll(); + } + return event; + } + + @Override + public Event beforeSendEvent(Event event) { + return event; + } + } private class ComponentHolderTimestamped { private final Component component; @@ -80,39 +127,8 @@ public class MessagesForUser extends GenericForwardComposer implements long minimumVisualizationTimeMilliseconds) { this.container = container; this.minimumVisualizationTimeMilliseconds = minimumVisualizationTimeMilliseconds; - container.getPage().getDesktop().addListener(new EventInterceptor() { - - @Override - public void afterProcessEvent(Event event) { - } - - @Override - public Event beforePostEvent(Event event) { - return event; - } - - @Override - public Event beforeProcessEvent(Event event) { - if (event.getName().equals(DETACH_EVENT_NAME) - || pendingToDetach.isEmpty()) { - return event; - } - long currentTime = System.currentTimeMillis(); - ComponentHolderTimestamped currrent = null; - while ((currrent = pendingToDetach.peek()) != null - && currrent - .minimumVisualizationTimeSurpased(currentTime)) { - currrent.component.detach(); - pendingToDetach.poll(); - } - return event; - } - - @Override - public Event beforeSendEvent(Event event) { - return event; - } - }); + container.getPage().getDesktop() + .addListener(new PreviousMessagesDiscarder(this)); } @Override