Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Pazderski2019-12-19 21:57:13 +0000
committerPaul Pazderski2019-12-21 13:46:39 +0000
commite5d5a40e85cdf4c3788f7ecd2139b9d7ca784702 (patch)
treed7a562c65d33821b89f61b6ff9d9652cde466a03 /org.eclipse.debug.core
parent2e12c38e53c73f7c4d65301d955a36caa57ed73b (diff)
downloadeclipse.platform.debug-e5d5a40e85cdf4c3788f7ecd2139b9d7ca784702.tar.gz
eclipse.platform.debug-e5d5a40e85cdf4c3788f7ecd2139b9d7ca784702.tar.xz
eclipse.platform.debug-e5d5a40e85cdf4c3788f7ecd2139b9d7ca784702.zip
output handling Apart from removing an unnecessary string -> bytes -> string round trip it fix a potential content corruption since the source (TextConsole) encoding and target (IOConsoleOutputStream) encoding can differ. Also the stream listener implementation in ProcessConsole is simplified a lot and lost some dead code. Last but not least it replaced some usages of encoding names as strings with using the Charset class to reduce overall number of charset lookups. Change-Id: Ie94aa433e571a2f9898c950d2997f598618aca18 Signed-off-by: Paul Pazderski <paul-eclipse@ppazderski.de>
Diffstat (limited to 'org.eclipse.debug.core')
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/core/model/RuntimeProcess.java13
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java22
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java15
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java16
4 files changed, 41 insertions, 25 deletions
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/RuntimeProcess.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/RuntimeProcess.java
index e731732cb..8ee0a099d 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/model/RuntimeProcess.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/model/RuntimeProcess.java
@@ -14,6 +14,9 @@
package org.eclipse.debug.core.model;
+import java.nio.charset.Charset;
+import java.nio.charset.IllegalCharsetNameException;
+import java.nio.charset.UnsupportedCharsetException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
@@ -281,7 +284,15 @@ public class RuntimeProcess extends PlatformObject implements IProcess {
return new NullStreamsProxy(getSystemProcess());
}
String encoding = getLaunch().getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING);
- return new StreamsProxy(getSystemProcess(), encoding);
+ Charset charset = null;
+ if (encoding != null) {
+ try {
+ charset = Charset.forName(encoding);
+ } catch (UnsupportedCharsetException | IllegalCharsetNameException e) {
+ DebugPlugin.log(e);
+ }
+ }
+ return new StreamsProxy(getSystemProcess(), charset);
}
/**
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java
index 199b183d8..94e2fb733 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/InputStreamMonitor.java
@@ -16,6 +16,7 @@ package org.eclipse.debug.internal.core;
import java.io.IOException;
import java.io.OutputStream;
+import java.nio.charset.Charset;
import java.util.Vector;
import org.eclipse.debug.core.DebugPlugin;
@@ -52,9 +53,9 @@ public class InputStreamMonitor {
private boolean fClosed = false;
/**
- * The encoding of the input stream.
+ * The charset of the input stream.
*/
- private String fEncoding;
+ private Charset fCharset;
/**
* Creates an input stream monitor which writes to system in via the given output stream.
@@ -66,16 +67,17 @@ public class InputStreamMonitor {
}
/**
- * Creates an input stream monitor which writes to system in via the given output stream.
+ * Creates an input stream monitor which writes to system in via the given
+ * output stream.
*
* @param stream output stream
- * @param encoding stream encoding or <code>null</code> for system default
+ * @param charset stream charset or <code>null</code> for system default
*/
- public InputStreamMonitor(OutputStream stream, String encoding) {
- fStream= stream;
+ public InputStreamMonitor(OutputStream stream, Charset charset) {
+ fStream = stream;
fQueue = new Vector<>();
- fLock= new Object();
- fEncoding= encoding;
+ fLock = new Object();
+ fCharset = charset;
}
/**
@@ -139,8 +141,8 @@ public class InputStreamMonitor {
String text = fQueue.firstElement();
fQueue.removeElementAt(0);
try {
- if (fEncoding != null) {
- fStream.write(text.getBytes(fEncoding));
+ if (fCharset != null) {
+ fStream.write(text.getBytes(fCharset));
} else {
fStream.write(text.getBytes());
}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java
index 34aa133a8..00daec44d 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/OutputStreamMonitor.java
@@ -18,6 +18,7 @@ import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.nio.charset.Charset;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.core.runtime.ISafeRunnable;
@@ -74,20 +75,20 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor {
private long lastSleep;
- private String fEncoding;
+ private Charset fCharset;
private final AtomicBoolean fDone;
/**
- * Creates an output stream monitor on the
- * given stream (connected to system out or err).
+ * Creates an output stream monitor on the given stream (connected to system
+ * out or err).
*
* @param stream input stream to read from
- * @param encoding stream encoding or <code>null</code> for system default
+ * @param charset stream charset or <code>null</code> for system default
*/
- public OutputStreamMonitor(InputStream stream, String encoding) {
+ public OutputStreamMonitor(InputStream stream, Charset charset) {
fStream = new BufferedInputStream(stream, 8192);
- fEncoding = encoding;
+ fCharset = charset;
fContents= new StringBuilder();
fDone = new AtomicBoolean(false);
}
@@ -149,7 +150,7 @@ public class OutputStreamMonitor implements IFlushableStreamMonitor {
long currentTime = lastSleep;
char[] chars = new char[BUFFER_SIZE];
int read = 0;
- try (InputStreamReader reader = (fEncoding == null ? new InputStreamReader(fStream) : new InputStreamReader(fStream, fEncoding))) {
+ try (InputStreamReader reader = (fCharset == null ? new InputStreamReader(fStream) : new InputStreamReader(fStream, fCharset))) {
while (read >= 0) {
try {
if (fKilled) {
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java
index 616e79674..19df55e28 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/StreamsProxy.java
@@ -15,6 +15,7 @@ package org.eclipse.debug.internal.core;
import java.io.IOException;
+import java.nio.charset.Charset;
import org.eclipse.debug.core.model.IStreamMonitor;
import org.eclipse.debug.core.model.IStreamsProxy;
@@ -43,20 +44,21 @@ public class StreamsProxy implements IStreamsProxy, IStreamsProxy2 {
* <code>false</code> by default.
*/
private boolean fClosed;
+
/**
- * Creates a <code>StreamsProxy</code> on the streams
- * of the given system process.
+ * Creates a <code>StreamsProxy</code> on the streams of the given system
+ * process.
*
* @param process system process to create a streams proxy on
- * @param encoding the process's encoding or <code>null</code> if default
+ * @param charset the process's charset or <code>null</code> if default
*/
- public StreamsProxy(Process process, String encoding) {
+ public StreamsProxy(Process process, Charset charset) {
if (process == null) {
return;
}
- fOutputMonitor= new OutputStreamMonitor(process.getInputStream(), encoding);
- fErrorMonitor= new OutputStreamMonitor(process.getErrorStream(), encoding);
- fInputMonitor= new InputStreamMonitor(process.getOutputStream(), encoding);
+ fOutputMonitor = new OutputStreamMonitor(process.getInputStream(), charset);
+ fErrorMonitor = new OutputStreamMonitor(process.getErrorStream(), charset);
+ fInputMonitor = new InputStreamMonitor(process.getOutputStream(), charset);
fOutputMonitor.startMonitoring();
fErrorMonitor.startMonitoring();
fInputMonitor.startMonitoring();

Back to the top