You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2010/11/29 12:51:09 UTC

svn commit: r1040079 - /karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java

Author: gnodet
Date: Mon Nov 29 11:51:09 2010
New Revision: 1040079

URL: http://svn.apache.org/viewvc?rev=1040079&view=rev
Log:
[KARAF-288] Shell history doesn't work anymore on windows

Modified:
    karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java

Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java?rev=1040079&r1=1040078&r2=1040079&view=diff
==============================================================================
--- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java (original)
+++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/TerminalFactory.java Mon Nov 29 11:51:09 2010
@@ -22,6 +22,14 @@ import jline.Terminal;
 import jline.UnsupportedTerminal;
 import jline.AnsiWindowsTerminal;
 import jline.NoInterruptUnixTerminal;
+import org.fusesource.jansi.internal.WindowsSupport;
+
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
 
 public class TerminalFactory {
 
@@ -43,7 +51,7 @@ public class TerminalFactory {
         boolean windows = System.getProperty("os.name").toLowerCase().contains("windows");
         try {
             if (windows) {
-                AnsiWindowsTerminal t = new AnsiWindowsTerminal();
+                AnsiWindowsTerminal t = new KarafWindowsTerminal();
                 t.setDirectConsole(true);
                 t.init();
                 term = t;
@@ -65,4 +73,47 @@ public class TerminalFactory {
         }
     }
 
+    public static class KarafWindowsTerminal extends AnsiWindowsTerminal {
+
+        public KarafWindowsTerminal() throws Exception {
+            super();
+        }
+
+        @Override
+        public int readCharacter(InputStream in) throws IOException {
+            if (isSystemIn(in)) {
+                return WindowsSupport.readByte();
+            }
+            else {
+                return super.readCharacter(in);
+            }
+        }
+
+        private boolean isSystemIn(InputStream in) throws IOException {
+            assert in != null;
+
+            if (in == System.in) {
+                return true;
+            }
+            while (in instanceof FilterInputStream) {
+                try {
+                    Field f = FilterInputStream.class.getDeclaredField("in");
+                    f.setAccessible(true);
+                    in = (InputStream) f.get(in);
+                } catch (Throwable t) {
+                    break;
+                }
+                if (in == System.in) {
+                    return true;
+                }
+            }
+            if (in instanceof FileInputStream && ((FileInputStream) in).getFD() == FileDescriptor.in) {
+                return true;
+            }
+
+            return false;
+        }
+
+    }
+
 }