Allow to GC the page before the desktop is discarded
A weak reference is introduced to allow that. FEA: ItEr74S08DeployFramework
This commit is contained in:
parent
a4db574b11
commit
d1fff90a79
1 changed files with 51 additions and 35 deletions
|
|
@ -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<MessagesForUser> messagesForUserRef;
|
||||
|
||||
public PreviousMessagesDiscarder(MessagesForUser messagesForUser) {
|
||||
this.messagesForUserRef = new WeakReference<MessagesForUser>(
|
||||
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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue