This is an automated email from the ASF dual-hosted git repository.
lkishalmi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 8c073c3 Avoid NPE in BridgingIOProvider when using null color
8c073c3 is described below
commit 8c073c3ccac1569c0c79c08b6a7179e3ceb8adee
Author: Jaroslav Tulach <[email protected]>
AuthorDate: Wed Sep 23 08:00:09 2020 +0200
Avoid NPE in BridgingIOProvider when using null color
---
.../modules/gradle/api/execute/RunUtils.java | 2 +-
.../src/org/openide/io/BridgingIOProvider.java | 6 +-
.../src/org/openide/io/BridgingIOProviderTest.java | 209 +++++++++++++++++++++
3 files changed, 213 insertions(+), 4 deletions(-)
diff --git
a/extide/gradle/src/org/netbeans/modules/gradle/api/execute/RunUtils.java
b/extide/gradle/src/org/netbeans/modules/gradle/api/execute/RunUtils.java
index c275c86..328fd16 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/api/execute/RunUtils.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/api/execute/RunUtils.java
@@ -199,7 +199,7 @@ public final class RunUtils {
new ProxyNonSelectableInputOutput(io));
if (initialOutput != null) {
try {
- if (IOColorPrint.isSupported(io)) {
+ if (IOColorPrint.isSupported(io) && IOColors.isSupported(io)) {
IOColorPrint.print(io, initialOutput,
IOColors.getColor(io, IOColors.OutputType.LOG_DEBUG));
} else {
io.getOut().println(initialOutput);
diff --git a/platform/openide.io/src/org/openide/io/BridgingIOProvider.java
b/platform/openide.io/src/org/openide/io/BridgingIOProvider.java
index 8f38395..dbd3f02 100644
--- a/platform/openide.io/src/org/openide/io/BridgingIOProvider.java
+++ b/platform/openide.io/src/org/openide/io/BridgingIOProvider.java
@@ -22,7 +22,6 @@ import java.awt.Color;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
-import java.io.StringWriter;
import java.util.EnumSet;
import java.util.Set;
import java.util.logging.Level;
@@ -236,7 +235,7 @@ public class BridgingIOProvider<IO, S extends PrintWriter,
P, F>
private final IO ioDelegate;
public BridgingOutputWriter(IO ioDelegate, S delegate) {
- super(new StringWriter());
+ super(delegate);
this.writerDelegate = delegate;
this.ioDelegate = ioDelegate;
}
@@ -294,9 +293,10 @@ public class BridgingIOProvider<IO, S extends PrintWriter,
P, F>
boolean important, Color color) throws IOException {
Hyperlink h = listenerToHyperlink(listener, important);
+ final OutputColor outColor = color == null ? null :
OutputColor.rgb(color.getRGB());
providerDelegate.print(ioDelegate,
providerDelegate.getOut(ioDelegate), text.toString(),
- h, OutputColor.rgb(color.getRGB()), false);
+ h, outColor, false);
}
}
diff --git
a/platform/openide.io/test/unit/src/org/openide/io/BridgingIOProviderTest.java
b/platform/openide.io/test/unit/src/org/openide/io/BridgingIOProviderTest.java
new file mode 100644
index 0000000..662482d
--- /dev/null
+++
b/platform/openide.io/test/unit/src/org/openide/io/BridgingIOProviderTest.java
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.openide.io;
+
+import java.awt.Color;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.Writer;
+import java.util.Set;
+import org.junit.Test;
+import static org.junit.Assert.*;
+import org.netbeans.api.io.Hyperlink;
+import org.netbeans.api.io.OutputColor;
+import org.netbeans.api.io.ShowOperation;
+import org.netbeans.spi.io.InputOutputProvider;
+import org.openide.util.Lookup;
+import org.openide.windows.IOColorPrint;
+import org.openide.windows.IOColors;
+import org.openide.windows.IOProvider;
+import org.openide.windows.InputOutput;
+import org.openide.windows.OutputWriter;
+
+public class BridgingIOProviderTest {
+
+ public BridgingIOProviderTest() {
+ }
+
+ @Test
+ public void bridgeToPrint() {
+ MockIOP mock = new MockIOP();
+ IOProvider provider = BridgingIOProvider.create(mock);
+ InputOutput io = provider.getIO("test", true);
+ StringBuilder sb = mock.assertBuilder();
+ final OutputWriter stdOut = io.getOut();
+ stdOut.println("Hello there!");
+ assertEquals("Hello there!\n", sb.toString());
+ }
+
+ @Test
+ public void bridgeToColorLessProvider() throws IOException {
+ MockIOP mock = new MockIOP();
+ IOProvider provider = BridgingIOProvider.create(mock);
+ InputOutput io = provider.getIO("test", true);
+ assertFalse("No colors", IOColors.isSupported(io));
+ assertTrue("Color print supported!?", IOColorPrint.isSupported(io));
+ IOColorPrint.print(io, "Red!", Color.RED);
+ StringBuilder sb = mock.assertBuilder();
+ assertEquals("Red!", sb.toString());
+ }
+
+ @Test
+ public void bridgeToNullColor() throws IOException {
+ MockIOP mock = new MockIOP();
+ IOProvider provider = BridgingIOProvider.create(mock);
+ InputOutput io = provider.getIO("test", true);
+ assertFalse("No colors", IOColors.isSupported(io));
+ assertTrue("Color print supported!?", IOColorPrint.isSupported(io));
+ IOColorPrint.print(io, "Null!", null);
+ StringBuilder sb = mock.assertBuilder();
+ assertEquals("Null!", sb.toString());
+ }
+
+ private static class MockBuilder {
+ final StringBuilder io = new StringBuilder();
+ final PrintWriter out = new PrintWriter(new AppendWriter(io));
+ }
+
+ private static final class MockIOP implements
InputOutputProvider<MockBuilder, PrintWriter, Void, Void> {
+ private MockBuilder last;
+
+ public StringBuilder assertBuilder() {
+ try {
+ assertNotNull(last);
+ return last.io;
+ } finally {
+ last = null;
+ }
+ }
+
+ @Override
+ public String getId() {
+ return "mock";
+ }
+
+ @Override
+ public MockBuilder getIO(String name, boolean newIO, Lookup lookup) {
+ assertNull(last);
+ last = new MockBuilder();
+ return last;
+ }
+
+ @Override
+ public Reader getIn(MockBuilder io) {
+ return new StringReader(io.toString());
+ }
+
+ @Override
+ public PrintWriter getOut(MockBuilder io) {
+ return io.out;
+ }
+
+ @Override
+ public PrintWriter getErr(MockBuilder io) {
+ return io.out;
+ }
+
+ @Override
+ public void print(MockBuilder io, PrintWriter writer, String text,
Hyperlink link, OutputColor color, boolean printLineEnd) {
+ if (printLineEnd) {
+ writer.println(text);
+ } else {
+ writer.print(text);
+ }
+ }
+
+ @Override
+ public Lookup getIOLookup(MockBuilder io) {
+ return Lookup.EMPTY;
+ }
+
+ @Override
+ public void resetIO(MockBuilder io) {
+ }
+
+ @Override
+ public void showIO(MockBuilder io, Set<ShowOperation> operations) {
+ }
+
+ @Override
+ public void closeIO(MockBuilder io) {
+ }
+
+ @Override
+ public boolean isIOClosed(MockBuilder io) {
+ return false;
+ }
+
+ @Override
+ public Void getCurrentPosition(MockBuilder io, PrintWriter writer) {
+ return null;
+ }
+
+ @Override
+ public void scrollTo(MockBuilder io, PrintWriter writer, Void
position) {
+ }
+
+ @Override
+ public Void startFold(MockBuilder io, PrintWriter writer, boolean
expanded) {
+ return null;
+ }
+
+ @Override
+ public void endFold(MockBuilder io, PrintWriter writer, Void fold) {
+ }
+
+ @Override
+ public void setFoldExpanded(MockBuilder io, PrintWriter writer, Void
fold, boolean expanded) {
+ }
+
+ @Override
+ public String getIODescription(MockBuilder io) {
+ return "mock";
+ }
+
+ @Override
+ public void setIODescription(MockBuilder io, String description) {
+ }
+ }
+
+ private static final class AppendWriter extends Writer {
+ private final StringBuilder io;
+
+ private AppendWriter(StringBuilder io) {
+ this.io = io;
+ }
+
+ @Override
+ public void write(char[] cbuf, int off, int len) throws IOException {
+ io.append(cbuf, off, len);
+ }
+
+ @Override
+ public void flush() throws IOException {
+ }
+
+ @Override
+ public void close() throws IOException {
+ }
+
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists