e385f2b6ac711b3f011246a945101e58d64aebbd
[idea/community.git] / platform / smRunner / src / com / intellij / execution / testframework / sm / runner / TestProxyPrinterProvider.java
1 /*
2  * Copyright 2000-2013 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.execution.testframework.sm.runner;
17
18 import com.intellij.execution.filters.Filter;
19 import com.intellij.execution.testframework.Printer;
20 import com.intellij.execution.testframework.ui.BaseTestsOutputConsoleView;
21 import com.intellij.execution.testframework.ui.TestsOutputConsolePrinter;
22 import com.intellij.execution.ui.ConsoleViewContentType;
23 import com.intellij.openapi.util.Condition;
24 import com.intellij.openapi.util.text.StringUtil;
25 import org.jetbrains.annotations.NotNull;
26 import org.jetbrains.annotations.Nullable;
27
28 import java.util.StringTokenizer;
29
30 public final class TestProxyPrinterProvider {
31
32   private final TestProxyFilterProvider myFilterProvider;
33   private BaseTestsOutputConsoleView myTestOutputConsoleView;
34
35   public TestProxyPrinterProvider(@NotNull BaseTestsOutputConsoleView testsOutputConsoleView,
36                                   @NotNull TestProxyFilterProvider filterProvider) {
37     myTestOutputConsoleView = testsOutputConsoleView;
38     myFilterProvider = filterProvider;
39   }
40
41   @Nullable
42   public Printer getPrinterByType(@NotNull String nodeType, @NotNull String nodeName, @Nullable String nodeArguments) {
43     Filter filter = myFilterProvider.getFilter(nodeType, nodeName, nodeArguments);
44     if (filter != null) {
45       return new HyperlinkPrinter(myTestOutputConsoleView, HyperlinkPrinter.ERROR_CONTENT_TYPE, filter);
46     }
47     return null;
48   }
49
50   private static class HyperlinkPrinter extends TestsOutputConsolePrinter {
51
52     public static final Condition<ConsoleViewContentType> ERROR_CONTENT_TYPE =
53       contentType -> ConsoleViewContentType.ERROR_OUTPUT == contentType;
54     private static final String NL = "\n";
55
56     private final Condition<ConsoleViewContentType> myContentTypeCondition;
57     private final Filter myFilter;
58
59     public HyperlinkPrinter(@NotNull BaseTestsOutputConsoleView testsOutputConsoleView,
60                             @NotNull Condition<ConsoleViewContentType> contentTypeCondition,
61                             @NotNull Filter filter) {
62       super(testsOutputConsoleView, testsOutputConsoleView.getProperties(), null);
63       myContentTypeCondition = contentTypeCondition;
64       myFilter = filter;
65     }
66
67     @Override
68     public void print(String text, ConsoleViewContentType contentType) {
69       if (contentType == null || !myContentTypeCondition.value(contentType)) {
70         defaultPrint(text, contentType);
71         return;
72       }
73       text = StringUtil.replace(text, "\r\n", NL, false);
74       StringTokenizer tokenizer = new StringTokenizer(text, NL, true);
75       while (tokenizer.hasMoreTokens()) {
76         String line = tokenizer.nextToken();
77         if (NL.equals(line)) {
78           defaultPrint(line, contentType);
79         }
80         else {
81           printLine(line, contentType);
82         }
83       }
84     }
85
86     private void defaultPrint(String text, ConsoleViewContentType contentType) {
87       super.print(text, contentType);
88     }
89
90     private void printLine(@NotNull String line, @NotNull ConsoleViewContentType contentType) {
91       Filter.Result result = null;
92       try {
93         result = myFilter.applyFilter(line, line.length());
94       }
95       catch (Throwable t) {
96         throw new RuntimeException("Error while applying " + myFilter + " to '"+line+"'", t);
97       }
98       if (result != null) {
99         defaultPrint(line.substring(0, result.getHighlightStartOffset()), contentType);
100         String linkText = line.substring(result.getHighlightStartOffset(), result.getHighlightEndOffset());
101         printHyperlink(linkText, result.getHyperlinkInfo());
102         defaultPrint(line.substring(result.getHighlightEndOffset()), contentType);
103       }
104       else {
105         defaultPrint(line, contentType);
106       }
107     }
108
109   }
110
111 }