You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2020/08/04 06:01:24 UTC

[groovy] branch GROOVY_3_0_X updated: GROOVY-6843: Remove GroovyDoc JANSI dependency (closes #1336)

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

paulk pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new 0cf72b1  GROOVY-6843: Remove GroovyDoc JANSI dependency (closes #1336)
0cf72b1 is described below

commit 0cf72b1b38113e5d3510efc44a8160a54ff59582
Author: Paul King <pa...@asert.com.au>
AuthorDate: Mon Aug 3 12:35:59 2020 +1000

    GROOVY-6843: Remove GroovyDoc JANSI dependency (closes #1336)
---
 .../java/org/codehaus/groovy/tools/shell/IO.java   | 80 +++++++++++++++++-----
 .../codehaus/groovy/tools/shell/util/Logger.java   | 23 +++++--
 2 files changed, 78 insertions(+), 25 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/tools/shell/IO.java b/src/main/java/org/codehaus/groovy/tools/shell/IO.java
index 5d7459c..efe790b 100644
--- a/src/main/java/org/codehaus/groovy/tools/shell/IO.java
+++ b/src/main/java/org/codehaus/groovy/tools/shell/IO.java
@@ -18,8 +18,8 @@
  */
 package org.codehaus.groovy.tools.shell;
 
+import org.codehaus.groovy.runtime.InvokerHelper;
 import org.codehaus.groovy.tools.shell.util.Preferences;
-import org.fusesource.jansi.AnsiRenderWriter;
 
 import java.io.Closeable;
 import java.io.IOException;
@@ -32,27 +32,45 @@ import java.io.Reader;
 /**
  * Container for input/output handles.
  */
-public class IO implements Closeable
-{
-    /** Raw input stream. */
+public class IO implements Closeable {
+    private static final String ANSI_RENDER_WRITER = "org.fusesource.jansi.AnsiRenderWriter";
+
+    /**
+     * Raw input stream.
+     */
     public final InputStream inputStream;
 
-    /** Raw output stream. */
+    /**
+     * Raw output stream.
+     */
     public final OutputStream outputStream;
 
-    /** Raw error output stream. */
+    /**
+     * Raw error output stream.
+     */
     public final OutputStream errorStream;
 
-    /** Prefered input reader. */
+    /**
+     * Preferred input reader.
+     */
     public final Reader in;
 
-    /** Prefered output writer. */
+    /**
+     * Preferred output writer.
+     */
     public final PrintWriter out;
 
-    /** Prefered error output writer. */
+    /**
+     * Preferred error output writer.
+     */
     public final PrintWriter err;
 
     /**
+     * Whether ansi support is available
+     */
+    public final boolean ansiSupported;
+
+    /**
      * Construct a new IO container.
      */
     public IO(final InputStream inputStream, final OutputStream outputStream, final OutputStream errorStream) {
@@ -65,8 +83,36 @@ public class IO implements Closeable
         this.errorStream = errorStream;
 
         this.in = new InputStreamReader(inputStream);
-        this.out = new AnsiRenderWriter(outputStream, true);
-        this.err = new AnsiRenderWriter(errorStream, true);
+        boolean ansiSupported = false;
+        try {
+            Class.forName(ANSI_RENDER_WRITER, false, IO.class.getClassLoader());
+            ansiSupported = true;
+        } catch (ClassNotFoundException ignore) {
+        }
+        this.ansiSupported = ansiSupported;
+        PrintWriter out = null;
+        PrintWriter err = null;
+        if (ansiSupported) {
+            out = tryConstructRenderWriter(outputStream);
+            err = tryConstructRenderWriter(errorStream);
+        }
+        if (out == null) {
+            out = new PrintWriter(outputStream, true);
+        }
+        if (err == null) {
+            err = new PrintWriter(errorStream, true);
+        }
+        this.out = out;
+        this.err = err;
+    }
+
+    protected PrintWriter tryConstructRenderWriter(OutputStream stream) {
+        // load via reflection to avoid hard-coded dependency on jansi jar
+        try {
+            return (PrintWriter) InvokerHelper.invokeConstructorOf(ANSI_RENDER_WRITER, new Object[]{stream, true});
+        } catch (ClassNotFoundException ignore) {
+            return null;
+        }
     }
 
     /**
@@ -78,8 +124,6 @@ public class IO implements Closeable
 
     /**
      * Set the verbosity level.
-     *
-     * @param verbosity
      */
     public void setVerbosity(final Verbosity verbosity) {
         assert verbosity != null;
@@ -142,12 +186,10 @@ public class IO implements Closeable
         err.close();
     }
 
-    //
-    // Verbosity
-    //
-
-    public static final class Verbosity
-    {
+    /**
+     * Verbosity for simple logging: QUIET, INFO, VERBOSE, DEBUG
+     */
+    public static final class Verbosity {
         public static final Verbosity QUIET = new Verbosity("QUIET");
 
         public static final Verbosity INFO = new Verbosity("INFO");
diff --git a/src/main/java/org/codehaus/groovy/tools/shell/util/Logger.java b/src/main/java/org/codehaus/groovy/tools/shell/util/Logger.java
index 61fe230..4fdf9fa 100644
--- a/src/main/java/org/codehaus/groovy/tools/shell/util/Logger.java
+++ b/src/main/java/org/codehaus/groovy/tools/shell/util/Logger.java
@@ -58,20 +58,31 @@ public final class Logger {
             }
         }
 
-        Color color = GREEN;
-        if (WARN.equals(level) || ERROR.equals(level)) {
-            color = RED;
+        if (io.ansiSupported) {
+            logWithAnsi(level, msg);
+        } else {
+            logDefault(level, msg);
         }
 
-        io.out.println(ansi().a(INTENSITY_BOLD).fg(color).a(level).reset().a(" [").a(name).a("] ").a(msg));
-
         if (cause != null) {
             cause.printStackTrace(io.out);
         }
 
         io.flush();
     }
-    
+
+    private void logDefault(String level, Object msg) {
+        io.out.println(level + " [" + name + "] " + msg);
+    }
+
+    private void logWithAnsi(String level, Object msg) {
+        Color color = GREEN;
+        if (WARN.equals(level) || ERROR.equals(level)) {
+            color = RED;
+        }
+        io.out.println(ansi().a(INTENSITY_BOLD).fg(color).a(level).reset().a(" [").a(name).a("] ").a(msg));
+    }
+
     //
     // Level helpers
     //