CPP-3088 Kill CMake processes when exiting IDE
[idea/community.git] / platform / platform-api / src / com / intellij / execution / process / ProcessOutput.java
1 /*
2  * Copyright 2000-2014 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.process;
17
18 import com.intellij.openapi.diagnostic.Logger;
19 import com.intellij.openapi.util.text.StringUtil;
20 import org.jetbrains.annotations.NotNull;
21 import org.jetbrains.annotations.Nullable;
22
23 import java.util.List;
24
25 /**
26  * @author yole
27  */
28 public class ProcessOutput {
29   private static final int ERROR_EXIT_CODE = -1;
30   
31   private final StringBuilder myStdoutBuilder = new StringBuilder();
32   private final StringBuilder myStderrBuilder = new StringBuilder();
33   private int myExitCode;
34   private boolean myTimeout;
35   private boolean myCancelled;
36
37   public ProcessOutput() {
38     myExitCode = ERROR_EXIT_CODE; // until set explicitly, exit code denotes an error.
39   }
40
41   public ProcessOutput(final int exitCode) {
42     myExitCode = exitCode;
43   }
44
45   public void appendStdout(@Nullable String text) {
46     myStdoutBuilder.append(text);
47   }
48
49   public void appendStderr(@Nullable String text) {
50     myStderrBuilder.append(text);
51   }
52
53   @NotNull
54   public String getStdout() {
55     return myStdoutBuilder.toString();
56   }
57
58   @NotNull
59   public String getStderr() {
60     return myStderrBuilder.toString();
61   }
62
63   @NotNull
64   public List<String> getStdoutLines() {
65     return getStdoutLines(true);
66   }
67
68   @NotNull
69   public List<String> getStdoutLines(boolean excludeEmptyLines) {
70     return splitLines(getStdout(), excludeEmptyLines);
71   }
72
73   @NotNull
74   public List<String> getStderrLines() {
75     return getStderrLines(true);
76   }
77
78   @NotNull
79   public List<String> getStderrLines(boolean excludeEmptyLines) {
80     return splitLines(getStderr(), excludeEmptyLines);
81   }
82
83   @NotNull
84   private static List<String> splitLines(String s, boolean excludeEmptyLines) {
85     String converted = StringUtil.convertLineSeparators(s);
86     return StringUtil.split(converted, "\n", true, excludeEmptyLines);
87   }
88
89   /**
90    * If exit code is nonzero or the process timed out, logs stderr and exit code and returns false,
91    * else just returns true.
92    *
93    * @param logger where to put error information
94    * @return true iff exit code is zero
95    */
96   public boolean checkSuccess(@NotNull final Logger logger) {
97     if (getExitCode() != 0 || isTimeout()) {
98       logger.info(getStderr() + (isTimeout()? "\nTimed out" : "\nExit code " + getExitCode()));
99       return false;
100     }
101     return true;
102   }
103
104   public void setExitCode(int exitCode) {
105     myExitCode = exitCode;
106   }
107
108   public int getExitCode() {
109     return myExitCode;
110   }
111
112   /**
113    * @return true if exit code wasn't set and is still set to default value (this might happen, 
114    * for example, when our CapturingProcessHandler.runProcess() is interrupted)
115    */
116   public boolean hasErrorExitCode() {
117     return getExitCode() == ERROR_EXIT_CODE;
118   }
119
120   public void setTimeout() {
121     myTimeout = true;
122   }
123
124   public boolean isTimeout() {
125     return myTimeout;
126   }
127
128   public void setCancelled() {
129     myCancelled = true;
130   }
131
132   public boolean isCancelled() {
133     return myCancelled;
134   }
135 }