You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2011/12/09 16:25:46 UTC

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

Author: cschneider
Date: Fri Dec  9 15:25:46 2011
New Revision: 1212477

URL: http://svn.apache.org/viewvc?rev=1212477&view=rev
Log:
KARAF-1071 unwrap BufferedInputStream so the terminal recognizes the stream as system.in 

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

Modified: karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java
URL: http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java?rev=1212477&r1=1212476&r2=1212477&view=diff
==============================================================================
--- karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java (original)
+++ karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/jline/ConsoleFactory.java Fri Dec  9 15:25:46 2011
@@ -77,10 +77,32 @@ public class ConsoleFactory {
             });
         }
     }
+    
+    public static Object invokePrivateMethod(Object o, String methodName, Object[] params) throws Exception {
+        final Method methods[] = o.getClass().getDeclaredMethods();
+        for (int i = 0; i < methods.length; ++i) {
+            if (methodName.equals(methods[i].getName())) {
+                methods[i].setAccessible(true);
+                return methods[i].invoke(o, params);
+            }
+        }
+        return null;
+    }
+    
+    private static <T> T unwrapBIS(T stream) {
+        try {
+            return (T) invokePrivateMethod(stream, "getInIfOpen", null);
+        } catch (Throwable t) {
+            return stream;
+        }
+    }
 
     protected void doStart(String user) throws Exception {
         final Terminal terminal = terminalFactory.getTerminal();
-        InputStream in = unwrap(terminal.wrapInIfNeeded(System.in));
+        // unwrap stream so it can be recognized by the terminal and wrapped to get 
+        // special keys in windows
+        InputStream unwrappedIn = unwrapBIS(unwrap(System.in));
+        InputStream in = terminal.wrapInIfNeeded(unwrappedIn);
         PrintStream out = unwrap(System.out);
         PrintStream err = unwrap(System.err);
         Runnable callback = new Runnable() {