Author: gnodet
Date: Tue Sep 21 17:05:46 2010
New Revision: 999499

URL: http://svn.apache.org/viewvc?rev=999499&view=rev
Log:
[KARAF-218] Add a more pager command

Modified:
    
karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/MoreAction.java
    
karaf/trunk/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
    
karaf/trunk/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml

Modified: 
karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/MoreAction.java
URL: 
http://svn.apache.org/viewvc/karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/MoreAction.java?rev=999499&r1=999498&r2=999499&view=diff
==============================================================================
--- 
karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/MoreAction.java
 (original)
+++ 
karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/MoreAction.java
 Tue Sep 21 17:05:46 2010
@@ -16,8 +16,138 @@
  */
 package org.apache.karaf.shell.commands;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.Reader;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import jline.Terminal;
+import org.apache.felix.gogo.commands.Argument;
 import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.karaf.shell.console.AbstractAction;
+
+...@command(scope = "shell", name = "more", description = "file pager")
+public class MoreAction extends AbstractAction {
+
+    @Option(name = "--lines", description = "stop after N lines")
+    int lines;
+
+    @Override
+    protected Object doExecute() throws Exception {
+        Terminal term = (Terminal) session.get(".jline.terminal");
+        if (term == null || !isTty(System.out)) {
+            BufferedReader reader = new BufferedReader(new 
InputStreamReader(System.in));
+            String line;
+            while ((line = reader.readLine()) != null) {
+                System.out.println(line);
+            }
+            return null;
+        } else {
+            boolean echo = term.getEcho();
+            term.disableEcho();
+            try {
+                if (lines == 0) {
+                    lines = term.getTerminalHeight();
+                }
+                LineSplitter reader = new LineSplitter(new BufferedReader(new 
InputStreamReader(System.in)), term.getTerminalWidth());
+                int count = 0;
+                int c;
+                do {
+                    do {
+                        String line;
+                        if ((line = reader.readLine()) == null) {
+                            return null;
+                        }
+                        System.out.println(line);
+                    } while (++count < lines - 2);
+                    c = -1;
+                    while (c == -1) {
+                        System.out.flush();
+                        System.out.print("--More--");
+                        System.out.flush();
+                        c = term.readVirtualKey(session.getKeyboard());
+                        switch (c) {
+                            case 'q':
+                            case -1:
+                                c = 'q';
+                                break;
+                            case '\r':
+                            case '\n':
+                            case 14: // Down arrow
+                                count--;
+                                System.out.print("\r          \r");
+                                break;
+                            case ' ':
+                                count = 0;
+                                System.out.print("\r          \r");
+                                break;
+                            case 16: // Up arrow
+                                // fall through
+                            default:
+                                c = -1;
+                                System.out.print("\r          \r");
+                                break;
+                        }
+                        if (c == 'q') {
+                            break;
+                        }
+                    }
+                } while (c != 'q');
+                return null;
+            } finally {
+                if (echo) {
+                    term.enableEcho();
+                } else {
+                    term.disableEcho();
+                }
+            }
+        }
+    }
+
+    public static class LineSplitter {
+
+        private final BufferedReader reader;
+        private final int width;
+        private final List<String> lines = new LinkedList<String>();
+
+        public LineSplitter(BufferedReader reader, int width) {
+            this.reader = reader;
+            this.width = width;
+        }
+
+        public String readLine() throws IOException {
+            if (lines.isEmpty()) {
+                String str = reader.readLine();
+                if (str == null) {
+                    return null;
+                }
+                while (str.length() > width) {
+                    lines.add(str.substring(0, width));
+                    str = str.substring(width);
+                }
+                lines.add(str);
+            }
+            return lines.remove(0);
+        }
+    }
+
+    protected boolean isTty(OutputStream out) {
+        try {
+            Method mth = out.getClass().getDeclaredMethod("getCurrent");
+            mth.setAccessible(true);
+            Object current = mth.invoke(out);
+            return current == session.getConsole();
+        } catch (Throwable t) {
+            return false;
+        }
+    }
 
-...@command(scope = "shell", name = "more", description = "")
-public class MoreAction {
 }

Modified: 
karaf/trunk/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
URL: 
http://svn.apache.org/viewvc/karaf/trunk/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands?rev=999499&r1=999498&r2=999499&view=diff
==============================================================================
--- 
karaf/trunk/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
 (original)
+++ 
karaf/trunk/shell/commands/src/main/resources/META-INF/services/org/apache/karaf/shell/commands
 Tue Sep 21 17:05:46 2010
@@ -24,6 +24,7 @@ org.apache.karaf.shell.commands.HistoryA
 org.apache.karaf.shell.commands.IfAction
 org.apache.karaf.shell.commands.JavaAction
 org.apache.karaf.shell.commands.LogoutAction
+org.apache.karaf.shell.commands.MoreAction
 org.apache.karaf.shell.commands.NewAction
 org.apache.karaf.shell.commands.PrintfAction
 org.apache.karaf.shell.commands.SleepAction

Modified: 
karaf/trunk/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
URL: 
http://svn.apache.org/viewvc/karaf/trunk/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml?rev=999499&r1=999498&r2=999499&view=diff
==============================================================================
--- 
karaf/trunk/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
 (original)
+++ 
karaf/trunk/shell/commands/src/main/resources/OSGI-INF/blueprint/shell-commands.xml
 Tue Sep 21 17:05:46 2010
@@ -50,11 +50,9 @@
         <command name="shell/java">
             <action class="org.apache.karaf.shell.commands.JavaAction"/>
         </command>
-        <!--
         <command name="shell/more">
             <action class="org.apache.karaf.shell.commands.MoreAction"/>
         </command>
-        -->
         <command name="shell/new">
             <action class="org.apache.karaf.shell.commands.NewAction">
                 <property name="blueprintConverter" ref="blueprintConverter"/>


Reply via email to