Bug 513367 - IllegalStateException while decoding output to Console
Stream

Change-Id: Ia205ed73daab72454193a33c7e3abf053186caa5
Signed-off-by:  Andreas Loth <andy_2639@justmail.de>
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ConsoleTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ConsoleTests.java
index b683fe2..fb05f3e 100644
--- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ConsoleTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/console/ConsoleTests.java
@@ -65,7 +65,7 @@
 		String testString = "a\r"; //$NON-NLS-1$
 		byte[] testStringBuffer = testString.getBytes(StandardCharsets.UTF_8);
 		TestCase.assertEquals("Test string \"" + testString + "\" should consist of 2 UTF-8 bytes", 2, testStringBuffer.length); //$NON-NLS-1$ //$NON-NLS-2$
-		MessageConsole console = new MessageConsole("Test Console", //$NON-NLS-1$
+		MessageConsole console = new MessageConsole("Test Console 2", //$NON-NLS-1$
 				IConsoleConstants.MESSAGE_CONSOLE_TYPE, null, StandardCharsets.UTF_8.name(), true);
 		IDocument document = console.getDocument();
 		TestHelper.waitForJobs();
@@ -82,4 +82,57 @@
 		TestCase.assertEquals("closing the stream should write the pending \\r", testString, document.get()); //$NON-NLS-1$
 	}
 
+	public void testConsoleOutputStreamDocumentClosed() throws IOException {
+		MessageConsole console = new MessageConsole("Test Console 3", //$NON-NLS-1$
+				IConsoleConstants.MESSAGE_CONSOLE_TYPE, null, StandardCharsets.UTF_8.name(), true);
+		IDocument document = console.getDocument();
+		try (IOConsoleOutputStream outStream = console.newOutputStream()) {
+			outStream.write("write1"); //$NON-NLS-1$
+			document.getDocumentPartitioner().disconnect();
+			try {
+				outStream.write("write2"); //$NON-NLS-1$
+				TestCase.fail("IOException with message \"Document is closed\" expected"); //$NON-NLS-1$
+			} catch (IOException ioe) {
+				TestCase.assertEquals("Document is closed", ioe.getMessage()); //$NON-NLS-1$
+			}
+		}
+	}
+
+	public void testConsoleOutputStreamClosed() throws IOException {
+		MessageConsole console = new MessageConsole("Test Console 4", //$NON-NLS-1$
+				IConsoleConstants.MESSAGE_CONSOLE_TYPE, null, StandardCharsets.UTF_8.name(), true);
+		try (IOConsoleOutputStream outStream = console.newOutputStream()) {
+			outStream.write("test1".getBytes(StandardCharsets.UTF_8)); //$NON-NLS-1$
+			outStream.close();
+			try {
+				outStream.write("test2".getBytes(StandardCharsets.UTF_8)); //$NON-NLS-1$
+				TestCase.fail("IOException with message \"Output Stream is closed\" expected"); //$NON-NLS-1$
+			} catch (IOException ioe) {
+				TestCase.assertEquals("Output Stream is closed", ioe.getMessage()); //$NON-NLS-1$
+			}
+		}
+	}
+
+	public void testConsoleOutputStreamDocumentStreamClosed() throws IOException {
+		MessageConsole console = new MessageConsole("Test Console 5", //$NON-NLS-1$
+				IConsoleConstants.MESSAGE_CONSOLE_TYPE, null, StandardCharsets.UTF_8.name(), true);
+		IDocument document = console.getDocument();
+		try (IOConsoleOutputStream outStream = console.newOutputStream()) {
+			outStream.write("write1"); //$NON-NLS-1$
+			document.getDocumentPartitioner().disconnect();
+			try {
+				outStream.write("write2"); //$NON-NLS-1$
+				TestCase.fail("IOException with message \"Document is closed\" expected"); //$NON-NLS-1$
+			} catch (IOException ioe) {
+				TestCase.assertEquals("Document is closed", ioe.getMessage()); //$NON-NLS-1$
+			}
+			try {
+				outStream.write("write3"); //$NON-NLS-1$
+				TestCase.fail("IOException with message \"Output Stream is closed\" expected"); //$NON-NLS-1$
+			} catch (IOException ioe) {
+				TestCase.assertEquals("Output Stream is closed", ioe.getMessage()); //$NON-NLS-1$
+			}
+		}
+	}
+
 }
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java
index 8ee4707..0cba219 100644
--- a/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java
+++ b/org.eclipse.ui.console/src/org/eclipse/ui/console/IOConsoleOutputStream.java
@@ -199,6 +199,9 @@
      */
     @Override
 	public synchronized void write(byte[] b, int off, int len) throws IOException {
+		if (closed) {
+			throw new IOException("Output Stream is closed"); //$NON-NLS-1$
+		}
 		StringBuilder builder = new StringBuilder();
 		this.decoder.decode(builder, b, off, len);
 		encodedWrite(builder.toString());
@@ -323,6 +326,9 @@
 	 * @since 3.7
 	 */
 	public synchronized void setCharset(Charset charset) throws IOException {
+		if (closed) {
+			throw new IOException("Output Stream is closed"); //$NON-NLS-1$
+		}
 		StringBuilder builder = new StringBuilder();
 		this.decoder.finish(builder);
 		if (builder.length() > 0) {