sm runner: code cleanup
[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 = new Condition<ConsoleViewContentType>() {
53       @Override
54       public boolean value(ConsoleViewContentType contentType) {
55         return ConsoleViewContentType.ERROR_OUTPUT == contentType;
56       }
57     };
58     private static final String NL = "\n";
59
60     private final Condition<ConsoleViewContentType> myContentTypeCondition;
61     private final Filter myFilter;
62
63     public HyperlinkPrinter(@NotNull BaseTestsOutputConsoleView testsOutputConsoleView,
64                             @NotNull Condition<ConsoleViewContentType> contentTypeCondition,
65                             @NotNull Filter filter) {
66       super(testsOutputConsoleView, testsOutputConsoleView.getProperties(), null);
67       myContentTypeCondition = contentTypeCondition;
68       myFilter = filter;
69     }
70
71     @Override
72     public void print(String text, ConsoleViewContentType contentType) {
73       if (contentType == null || !myContentTypeCondition.value(contentType)) {
74         defaultPrint(text, contentType);
75         return;
76       }
77       text = StringUtil.replace(text, "\r\n", NL, false);
78       StringTokenizer tokenizer = new StringTokenizer(text, NL, true);
79       while (tokenizer.hasMoreTokens()) {
80         String line = tokenizer.nextToken();
81         if (NL.equals(line)) {
82           defaultPrint(line, contentType);
83         }
84         else {
85           printLine(line, contentType);
86         }
87       }
88     }
89
90     private void defaultPrint(String text, ConsoleViewContentType contentType) {
91       super.print(text, contentType);
92     }
93
94     private void printLine(@NotNull String line, @NotNull ConsoleViewContentType contentType) {
95       Filter.Result result = null;
96       try {
97         result = myFilter.applyFilter(line, line.length());
98       }
99       catch (Throwable t) {
100         throw new RuntimeException("Error while applying " + myFilter + " to '"+line+"'", t);
101       }
102       if (result != null) {
103         defaultPrint(line.substring(0, result.getHighlightStartOffset()), contentType);
104         String linkText = line.substring(result.getHighlightStartOffset(), result.getHighlightEndOffset());
105         printHyperlink(linkText, result.getHyperlinkInfo());
106         defaultPrint(line.substring(result.getHighlightEndOffset()), contentType);
107       }
108       else {
109         defaultPrint(line, contentType);
110       }
111     }
112
113   }
114
115 }