diff --git a/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/Manager.java b/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/Manager.java
--- a/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/Manager.java
+++ b/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/Manager.java
@@ -66,6 +66,7 @@
import org.openide.awt.Notification;
import org.openide.awt.NotificationDisplayer;
import org.openide.util.*;
+import org.openide.windows.InputOutput;
import org.openide.windows.Mode;
import org.openide.windows.WindowManager;
@@ -435,21 +436,27 @@
}
/** singleton of the ResultDisplayHandler
*/
- private Map displayHandlers;
+ // the ResultDisplayHandler holds TestSession and is referenced from other
+ // places so we use WeakReference, otherwise there would be memory leak
+ private Map> displayHandlers;
private Semaphore lock;
/**
*/
private synchronized ResultDisplayHandler getDisplayHandler(final TestSession session) {
- ResultDisplayHandler displayHandler = (displayHandlers != null)
- ? displayHandlers.get(session)
- : null;
+ ResultDisplayHandler displayHandler = null;
+ if (displayHandlers != null) {
+ WeakReference reference = displayHandlers.get(session);
+ if (reference != null) {
+ displayHandler = reference.get();
+ }
+ } else {
+ displayHandlers = new WeakHashMap>(7);
+ }
+
if (displayHandler == null) {
- if (displayHandlers == null) {
- displayHandlers = new WeakHashMap(7);
- }
displayHandler = new ResultDisplayHandler(session);
createIO(displayHandler);
- displayHandlers.put(session, displayHandler);
+ displayHandlers.put(session, new WeakReference(displayHandler));
final ResultDisplayHandler dispHandler = displayHandler;
lock = new Semaphore(1);
try {
@@ -483,11 +490,12 @@
private void createIO(final ResultDisplayHandler displayHandler) {
try {
Runnable r = new Runnable() {
+ @Override
public void run() {
final ResultWindow window = ResultWindow.getInstance();
- window.addDisplayComponent(displayHandler.getDisplayComponent(), displayHandler.getLookup());
window.setOutputComp(displayHandler.getOutputComponent());
- displayHandler.createIO(window.getIOContainer());
+ InputOutput io = displayHandler.createIO(window.getIOContainer());
+ window.addDisplayComponent(displayHandler.getDisplayComponent(), io);
}
};
if (SwingUtilities.isEventDispatchThread()){
diff --git a/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/ResultDisplayHandler.java b/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/ResultDisplayHandler.java
--- a/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/ResultDisplayHandler.java
+++ b/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/ResultDisplayHandler.java
@@ -108,8 +108,9 @@
return outputComponent;
}
- void createIO(IOContainer ioContainer) {
+ InputOutput createIO(IOContainer ioContainer) {
inOut = IOProvider.getDefault().getIO("test-results", null, ioContainer); //NOI18N
+ return inOut;
}
diff --git a/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/ResultWindow.java b/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/ResultWindow.java
--- a/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/ResultWindow.java
+++ b/gsf.testrunner/src/org/netbeans/modules/gsf/testrunner/api/ResultWindow.java
@@ -70,12 +70,12 @@
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.ImageUtilities;
-import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.windows.TopComponent;
import org.openide.windows.WindowManager;
import org.openide.windows.IOContainer;
import org.openide.windows.IOContainer.CallBacks;
+import org.openide.windows.InputOutput;
/**
*
@@ -93,6 +93,7 @@
private static WeakReference instance = null;
private Map viewMap = new HashMap();
+ private Map ioMap = new HashMap();
private final JTabbedPane tabPane;
private JPopupMenu pop;
@@ -199,15 +200,19 @@
/**
*/
- public void addDisplayComponent(JSplitPane displayComp, Lookup l) {
+ public void addDisplayComponent(JSplitPane displayComp, InputOutput io) {
assert EventQueue.isDispatchThread();
String key = displayComp.getToolTipText();
JSplitPane prevComp = viewMap.put(key, displayComp);
+ InputOutput prevIo = ioMap.put(key, io);
if (prevComp == null){
addView(displayComp);
}else{
replaceView(prevComp, displayComp);
+ if (prevIo != null) {
+ prevIo.closeInputOutput();
+ }
}
revalidate();
}
@@ -384,6 +389,10 @@
}
tabPane.remove(view);
viewMap.remove(view.getToolTipText());
+ InputOutput io = ioMap.remove(view.getToolTipText());
+ if (io != null) {
+ io.closeInputOutput();
+ }
validate();
}
@@ -393,7 +402,6 @@
public void remove(JComponent comp) {
outputTab = null;
outputComp.remove(comp);
- ResultWindow.getInstance().close();
}
public void select(JComponent comp) {