You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by iu...@apache.org on 2022/02/18 13:38:05 UTC

[brooklyn-server] 01/01: Revert "Support UTF sequences in stream gobbler"

This is an automated email from the ASF dual-hosted git repository.

iuliana pushed a commit to branch revert-1301-streams/stream-gobbler
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git

commit 0b0ec04460031d8f735ca1e9095113ceb3962b0c
Author: Iuliana Cosmina <iu...@gmail.com>
AuthorDate: Fri Feb 18 13:37:56 2022 +0000

    Revert "Support UTF sequences in stream gobbler"
---
 .../apache/brooklyn/util/stream/StreamGobbler.java | 83 +++++++---------------
 .../brooklyn/util/stream/StreamGobblerTest.java    | 71 +++---------------
 2 files changed, 37 insertions(+), 117 deletions(-)

diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/stream/StreamGobbler.java b/utils/common/src/main/java/org/apache/brooklyn/util/stream/StreamGobbler.java
index 87b1838..6053fa0 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/stream/StreamGobbler.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/stream/StreamGobbler.java
@@ -18,21 +18,22 @@
  */
 package org.apache.brooklyn.util.stream;
 
-import org.slf4j.Logger;
-
-import java.io.*;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-public class StreamGobbler extends Thread implements Closeable {
+import org.slf4j.Logger;
 
-    private static final char REPLACEMENT_CHARACTER = 0xfffd;
+public class StreamGobbler extends Thread implements Closeable {
+    
     protected final InputStream stream;
     protected final PrintStream out;
     protected final Logger log;
     private final AtomicBoolean running = new AtomicBoolean(true);
-
+    
     public StreamGobbler(InputStream stream, OutputStream out, Logger log) {
         this(stream, out != null ? new PrintStream(out) : null, log);
     }
@@ -42,7 +43,7 @@ public class StreamGobbler extends Thread implements Closeable {
         this.out = out;
         this.log = log;
     }
-
+    
     @Override
     public void close() {
         running.set(false);
@@ -59,56 +60,26 @@ public class StreamGobbler extends Thread implements Closeable {
 
     String logPrefix = "";
     String printPrefix = "";
-
     public StreamGobbler setPrefix(String prefix) {
         setLogPrefix(prefix);
         setPrintPrefix(prefix);
         return this;
     }
-
     public StreamGobbler setPrintPrefix(String prefix) {
         printPrefix = prefix;
         return this;
     }
-
     public StreamGobbler setLogPrefix(String prefix) {
         logPrefix = prefix;
         return this;
-    }
-
+    }    
+    
     @Override
     public void run() {
-        int c, bytes = 0;
-        char[] utfSymbol = new char[2];
+        int c = -1;
         try {
-            ByteBuffer bb = ByteBuffer.allocate(4);
-            while (running.get() && (c = stream.read()) >= 0) {
-
-                if (bytes == 0) {
-                    // Identify utf symbol size by Unicode page.
-                    if (c >= 0xF0) {
-                        bytes = 4;
-                    } else if (c >= 0xE0) {
-                        bytes = 3;
-                    } else if (c >= 0xC2) {
-                        bytes = 2;
-                    } else {
-                        bytes = 1;
-                    }
-                }
-
-                bb.put((byte) c);
-                bytes--;
-
-                if (bytes == 0) {
-                    bb.rewind();
-                    StandardCharsets.UTF_8.decode(bb).get(utfSymbol);
-                    bb.clear();
-                    onChar(utfSymbol[0]);
-                    if (utfSymbol[1] != 0) {
-                        onChar(utfSymbol[1]);
-                    }
-                }
+            while (running.get() && (c=stream.read())>=0) {
+                onChar(c);
             }
             onClose();
         } catch (IOException e) {
@@ -116,25 +87,23 @@ public class StreamGobbler extends Thread implements Closeable {
             //TODO parametrise log level, for this error, and for normal messages
             if (log!=null && log.isTraceEnabled()) log.trace(logPrefix+"exception reading from stream ("+e+")");
         } finally {
-            if (out!=null) out.flush();
+            if (out != null) out.flush();
         }
     }
-
+    
     private final StringBuilder lineSoFar = new StringBuilder(16);
-
-    public void onChar(char c) {
-        if (c == REPLACEMENT_CHARACTER) return;
-        if (c == '\n' || c == '\r') {
-            if (lineSoFar.length() > 0)
-                // suppress blank lines, so that we can treat either newline char as a line separator
-                // (e.g. to show curl updates frequently)
+    public void onChar(int c) {
+        if (c=='\n' || c=='\r') {
+            if (lineSoFar.length()>0)
+                //suppress blank lines, so that we can treat either newline char as a line separator
+                //(eg to show curl updates frequently)
                 onLine(lineSoFar.toString());
             lineSoFar.setLength(0);
         } else {
-            lineSoFar.append(c);
+            lineSoFar.append((char)c);
         }
     }
-
+    
     public void onLine(String line) {
         //right trim, in case there is \r or other funnies
         while (line.length()>0 && Character.isWhitespace(line.charAt(line.length()-1)))
@@ -147,7 +116,7 @@ public class StreamGobbler extends Thread implements Closeable {
             if (log!=null && log.isDebugEnabled()) log.debug(logPrefix+line);
         }
     }
-
+    
     public void onClose() {
         onLine(lineSoFar.toString());
         if (out!=null) out.flush();
@@ -155,7 +124,7 @@ public class StreamGobbler extends Thread implements Closeable {
         finished = true;
         synchronized (this) { notifyAll(); }
     }
-
+    
     private volatile boolean finished = false;
 
     /** convenience -- equivalent to calling join() */
diff --git a/utils/common/src/test/java/org/apache/brooklyn/util/stream/StreamGobblerTest.java b/utils/common/src/test/java/org/apache/brooklyn/util/stream/StreamGobblerTest.java
index 2438a6d..3ace7be 100644
--- a/utils/common/src/test/java/org/apache/brooklyn/util/stream/StreamGobblerTest.java
+++ b/utils/common/src/test/java/org/apache/brooklyn/util/stream/StreamGobblerTest.java
@@ -18,71 +18,22 @@
  */
 package org.apache.brooklyn.util.stream;
 
-import org.apache.brooklyn.test.Asserts;
-import org.apache.brooklyn.util.os.Os;
-import org.apache.brooklyn.util.text.Strings;
-import org.apache.commons.lang3.RandomStringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.io.*;
-
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 
-public class StreamGobblerTest {
-
-    private static final Logger LOG = LoggerFactory.getLogger(StreamGobblerTest.class);
-
-    private final String NL = Os.LINE_SEPARATOR;
-
-    private void testStreamGobbler(String text) throws Exception {
-        LOG.info("Processing text: '{}'", text);
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        ByteArrayInputStream in = new ByteArrayInputStream(text.getBytes());
-        StreamGobbler streamGobbler = new StreamGobbler(in, out, (Logger) null);
-        streamGobbler.start();
-        streamGobbler.join(5000);
-        streamGobbler.close();
-        out.close();
-
-        String expected = Strings.isBlank(text) ? "" : text.replace("\t\r","\r").replace("\r","\n") + NL;
-        Assert.assertEquals(out.toString(), expected);
-    }
-
-    @Test
-    public void testUnicodeString() throws Exception {
-
-        // empty
-        testStreamGobbler("");
-
-        // single chars
-        testStreamGobbler(" "); // 1 byte char
-        testStreamGobbler("ß"); // 2 bytes char
-        testStreamGobbler("√"); // 3 bytes char
-        testStreamGobbler("𑱣"); // 4 bytes char
-
-        // duplicate chars
-        testStreamGobbler("  "); // 2 x (1 byte char)
-        testStreamGobbler("ßß"); // 2 x (2 bytes char)
-        testStreamGobbler("√√"); // 2 x (3 bytes char)
-        testStreamGobbler("𑱣𑱣"); // 2 x (4 bytes char)
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
 
-        // mixed text
-        testStreamGobbler("옖ʧ񆑮");
-        testStreamGobbler("aßc√qq1!");
-        testStreamGobbler("옖ʧ񆑮\t롬㟦密䕎孓");
-        testStreamGobbler("їїх\rхфт шф9в 0-ф");
-        testStreamGobbler("їїх\t\rхфт шф9в 0-ф");
-        testStreamGobbler("a ßßa√√aˆa©aƒa∫a˚\na˙a¬a∆a¥a®a†a.  √");
-        testStreamGobbler("娨∫√爈ø¨¨\0iubxo𑱣qpihbpπ∫ˆ¨¨ø߆a");
-        testStreamGobbler(" oubibosu√bfhf иіашвщ, гирф𑱣ііззфххіхіїїх. цйїхз/йї звохй отв 90320к4590е- †a");
+import org.apache.brooklyn.test.Asserts;
+import org.apache.brooklyn.util.os.Os;
+import org.apache.brooklyn.util.stream.StreamGobbler;
+import org.testng.annotations.Test;
 
-        // random text
-        testStreamGobbler(RandomStringUtils.random(999));
-    }
+public class StreamGobblerTest {
+    private String NL = Os.LINE_SEPARATOR;
 
     @Test
     public void testGobbleStream() throws Exception {