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;
+ }
+
+ }
+
}