PY-21488 Stopping docker debug process unexpectedly in the very beginning of Python...
[idea/community.git] / python / pydevSrc / com / jetbrains / python / debugger / pydev / transport / BaseDebuggerReader.java
1 package com.jetbrains.python.debugger.pydev.transport;
2
3 import com.intellij.openapi.application.ApplicationManager;
4 import com.intellij.openapi.diagnostic.Logger;
5 import com.intellij.util.TimeoutUtil;
6 import com.intellij.util.io.BaseOutputReader;
7 import com.jetbrains.python.debugger.pydev.RemoteDebugger;
8 import org.jetbrains.annotations.NotNull;
9
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.nio.charset.Charset;
13 import java.util.Arrays;
14 import java.util.concurrent.Future;
15
16 /**
17  * @author Alexander Koshevoy
18  */
19 public abstract class BaseDebuggerReader extends BaseOutputReader {
20   private static final Logger LOG = Logger.getInstance(BaseDebuggerReader.class);
21
22   @NotNull private final RemoteDebugger myDebugger;
23   @NotNull private StringBuilder myTextBuilder = new StringBuilder();
24
25   public BaseDebuggerReader(@NotNull InputStream inputStream, @NotNull Charset charset, @NotNull RemoteDebugger debugger) {
26     super(inputStream, charset);
27     myDebugger = debugger;
28   }
29
30   @NotNull
31   protected RemoteDebugger getDebugger() {
32     return myDebugger;
33   }
34
35   protected void doRun() {
36     try {
37       while (true) {
38         boolean read = readAvailableBlocking();
39
40         if (!read) {
41           break;
42         }
43         else {
44           if (isStopped) {
45             break;
46           }
47
48           TimeoutUtil.sleep(mySleepingPolicy.getTimeToSleep(true));
49         }
50       }
51     }
52     catch (Exception e) {
53       onCommunicationError();
54     }
55     finally {
56       close();
57       onExit();
58     }
59   }
60
61   protected abstract void onExit();
62
63   protected abstract void onCommunicationError();
64
65   @NotNull
66   @Override
67   protected Future<?> executeOnPooledThread(@NotNull Runnable runnable) {
68     return ApplicationManager.getApplication().executeOnPooledThread(runnable);
69   }
70
71   @Override
72   protected void close() {
73     try {
74       super.close();
75     }
76     catch (IOException e) {
77       LOG.error(e);
78     }
79   }
80
81   @Override
82   public void stop() {
83     super.stop();
84     close();
85   }
86
87   @Override
88   protected void onTextAvailable(@NotNull String text) {
89     myTextBuilder.append(text);
90     if (text.contains("\n")) {
91       String[] lines = myTextBuilder.toString().split("\n");
92       myTextBuilder = new StringBuilder();
93
94       if (!text.endsWith("\n")) {
95         myTextBuilder.append(lines[lines.length - 1]);
96         lines = Arrays.copyOfRange(lines, 0, lines.length - 1);
97       }
98
99       for (String line : lines) {
100         myDebugger.processResponse(line + "\n");
101       }
102     }
103   }
104 }