diff --git a/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java b/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java index c3e32608983d..b6adb108a10e 100644 --- a/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java +++ b/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java @@ -17,8 +17,10 @@ package com.intellij.execution.junit2.segments; import com.intellij.execution.junit.SegmentedInputStreamReader; import com.intellij.execution.junit2.SegmentedInputStream; +import com.intellij.execution.testframework.Printable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.rt.execution.junit.segments.PacketProcessor; import java.io.InputStream; @@ -31,6 +33,8 @@ import java.nio.charset.Charset; public class Extractor { private DeferredActionsQueue myFulfilledWorkGate = null; private final SegmentedInputStream myStream; + private OutputPacketProcessor myEventsDispatcher; + private static final Logger LOG = Logger.getInstance("#" + Extractor.class.getName()); public Extractor(final InputStream stream, final Charset charset) { myStream = new SegmentedInputStream(stream, charset); @@ -54,7 +58,7 @@ public class Extractor { queue.setDispactchListener(listener); } }; - myStream.setEventsDispatcher(new PacketProcessor() { + myEventsDispatcher = new OutputPacketProcessor() { public void processPacket(final String packet) { myFulfilledWorkGate.addLast(new Runnable() { public void run() { @@ -62,7 +66,22 @@ public class Extractor { } }); } - }); + + @Override + public void processOutput(final Printable printable) { + LOG.assertTrue(packetProcessor instanceof OutputPacketProcessor); + myFulfilledWorkGate.addLast(new Runnable() { + public void run() { + ((OutputPacketProcessor)packetProcessor).processOutput(printable); + } + }); + } + }; + myStream.setEventsDispatcher(myEventsDispatcher); + } + + public OutputPacketProcessor getEventsDispatcher() { + return myEventsDispatcher; } public Reader createReader() { diff --git a/java/execution/impl/src/com/intellij/execution/junit2/segments/OutputPacketProcessor.java b/java/execution/impl/src/com/intellij/execution/junit2/segments/OutputPacketProcessor.java new file mode 100644 index 000000000000..455ae6e60f41 --- /dev/null +++ b/java/execution/impl/src/com/intellij/execution/junit2/segments/OutputPacketProcessor.java @@ -0,0 +1,27 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.execution.junit2.segments; + +import com.intellij.execution.testframework.Printable; +import com.intellij.rt.execution.junit.segments.PacketProcessor; + +/** + * User: anna + * Date: 12/6/10 + */ +public interface OutputPacketProcessor extends PacketProcessor{ + void processOutput(Printable printable); +} diff --git a/plugins/junit/src/com/intellij/execution/junit/TestObject.java b/plugins/junit/src/com/intellij/execution/junit/TestObject.java index 6c35036f255e..84ba85436d9e 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestObject.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestObject.java @@ -23,6 +23,7 @@ import com.intellij.execution.junit2.TestProxy; import com.intellij.execution.junit2.segments.DeferredActionsQueue; import com.intellij.execution.junit2.segments.DeferredActionsQueueImpl; import com.intellij.execution.junit2.segments.DispatchListener; +import com.intellij.execution.junit2.segments.Extractor; import com.intellij.execution.junit2.ui.JUnitTreeConsoleView; import com.intellij.execution.junit2.ui.TestsPacketsReceiver; import com.intellij.execution.junit2.ui.actions.RerunFailedTestsAction; @@ -263,7 +264,7 @@ public abstract class TestObject implements JavaCommandLine { consoleView.attachToProcess(handler); unboundOutputRoot.setPrinter(consoleView.getPrinter()); Disposer.register(consoleView, unboundOutputRoot); - final TestsPacketsReceiver packetsReceiver = new TestsPacketsReceiver(consoleView) { + final TestsPacketsReceiver packetsReceiver = new TestsPacketsReceiver(consoleView, unboundOutputRoot) { @Override public void notifyStart(TestProxy root) { super.notifyStart(root); @@ -309,20 +310,23 @@ public abstract class TestObject implements JavaCommandLine { public void onTextAvailable(final ProcessEvent event, final Key outputType) { final String text = event.getText(); final ConsoleViewContentType consoleViewType = ConsoleViewContentType.getConsoleViewType(outputType); - final Set currentTests = packetsReceiver.getCurrentTests(); final Printable printable = new Printable() { public void printOn(final Printer printer) { printer.print(text, consoleViewType); } }; - - if (!currentTests.isEmpty()) { - for (TestProxy currentTest : currentTests) { - currentTest.addLast(printable); - } + if (consoleViewType == ConsoleViewContentType.SYSTEM_OUTPUT) { + unboundOutputRoot.addLast(printable); } else { - unboundOutputRoot.addLast(printable); + final Extractor extractor; + if (consoleViewType == ConsoleViewContentType.ERROR_OUTPUT) { + extractor = handler.getErr(); + } + else { + extractor = handler.getOut(); + } + extractor.getEventsDispatcher().processOutput(printable); } } }); diff --git a/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java b/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java index a19acc43863a..a3588c08df2f 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java +++ b/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java @@ -25,31 +25,36 @@ import com.intellij.execution.junit2.info.ClassBasedInfo; import com.intellij.execution.junit2.info.DisplayTestInfoExtractor; import com.intellij.execution.junit2.segments.InputObjectRegistry; import com.intellij.execution.junit2.segments.ObjectReader; +import com.intellij.execution.junit2.segments.OutputPacketProcessor; import com.intellij.execution.junit2.states.*; import com.intellij.execution.junit2.ui.model.CompletionEvent; import com.intellij.execution.junit2.ui.model.JUnitListenersNotifier; import com.intellij.execution.junit2.ui.model.JUnitRunningModel; import com.intellij.execution.junit2.ui.properties.JUnitConsoleProperties; import com.intellij.execution.testframework.AbstractTestProxy; +import com.intellij.execution.testframework.Printable; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.rt.execution.junit.segments.PacketProcessor; import com.intellij.rt.execution.junit.segments.PoolOfDelimiters; import com.intellij.rt.execution.junit.states.PoolOfTestStates; import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; -public class TestsPacketsReceiver implements PacketProcessor, Disposable { +public class TestsPacketsReceiver implements OutputPacketProcessor, Disposable { public static final Map STATE_CLASSES = new HashMap(); private Map myKnownDynamicParents; + private TestProxy myUnboundOutput; static { mapClass(PoolOfTestStates.RUNNING_INDEX, new RunningStateSetter()); @@ -74,18 +79,13 @@ public class TestsPacketsReceiver implements PacketProcessor, Disposable { private final JUnitConsoleProperties myConsoleProperties; - public TestsPacketsReceiver(final JUnitTreeConsoleView consoleView) { + public TestsPacketsReceiver(final JUnitTreeConsoleView consoleView, TestProxy unboundOutput) { + myUnboundOutput = unboundOutput; myObjectRegistry = new InputObjectRegistry(); myConsoleProperties = (JUnitConsoleProperties)consoleView.getProperties(); Disposer.register(consoleView, this); } - public Set getCurrentTests() { - synchronized (myCurrentTests) { - return new HashSet(myCurrentTests); - } - } - public void processPacket(final String packet) { ApplicationManager.getApplication().assertIsDispatchThread(); @@ -110,6 +110,18 @@ public class TestsPacketsReceiver implements PacketProcessor, Disposable { } } + @Override + public void processOutput(Printable printable) { + synchronized (myCurrentTests) { + if (myCurrentTests.isEmpty()) { + myUnboundOutput.addLast(printable); + } else { + for (TestProxy currentTest : myCurrentTests) { + currentTest.addLast(printable); + } + } + } + } public void notifyStart(TestProxy root) { myModel = new JUnitRunningModel(root, myConsoleProperties);