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

Reply via email to