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) {