OK I will reopen the issue. On Fri, Dec 10, 2010 at 12:36 AM, Guillaume Nodet <[email protected]> wrote:
> I haven't yet tried the tail command, from looking at it, I think it > will fail to behave correctly in a number of cases. > The first one would be with a huge file, as keeping all the lines in > memory will certainly be a problem. > Also i'd love to see the -f option being implemented ... > > On Thu, Dec 9, 2010 at 18:48, <[email protected]> wrote: > > Author: iocanel > > Date: Thu Dec 9 17:48:16 2010 > > New Revision: 1044051 > > > > URL: http://svn.apache.org/viewvc?rev=1044051&view=rev > > Log: > > [KARAF-316] Added simple implementations of head and tail commands. > > > > Added: > > > > karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/HeadAction.java > > > > karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/TailAction.java > > Modified: > > > > 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 > > > > Added: > karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/HeadAction.java > > URL: > http://svn.apache.org/viewvc/karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/HeadAction.java?rev=1044051&view=auto > > > ============================================================================== > > --- > karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/HeadAction.java > (added) > > +++ > karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/HeadAction.java > Thu Dec 9 17:48:16 2010 > > @@ -0,0 +1,101 @@ > > +/* > > + * Licensed to the Apache Software Foundation (ASF) under one or more > > + * contributor license agreements. See the NOTICE file distributed with > > + * this work for additional information regarding copyright ownership. > > + * The ASF licenses this file to You under the Apache License, Version > 2.0 > > + * (the "License"); you may not use this file except in compliance with > > + * the License. You may obtain a copy of the License at > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > + * See the License for the specific language governing permissions and > > + * limitations under the License. > > + */ > > +package org.apache.karaf.shell.commands; > > + > > +import java.io.BufferedReader; > > +import java.io.File; > > +import java.io.FileReader; > > +import java.io.IOException; > > +import java.io.InputStreamReader; > > +import java.net.MalformedURLException; > > +import java.net.URL; > > +import java.util.List; > > + > > +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 = "head", description = "Displays the > first lines of a file.") > > +public class HeadAction extends AbstractAction { > > + > > + private static final int DEFAULT_NUMBER_OF_LINES = 10; > > + > > + @Option(name = "-n", aliases = {}, description = "The number of > lines to display, starting at 1.", required = false, multiValued = false) > > + private int numberOfLines; > > + > > + @Argument(index = 0, name = "paths or urls", description = "A list > of file paths or urls to display separated by whitespaces.", required = > false, multiValued = true) > > + private List<String> paths; > > + > > + protected Object doExecute() throws Exception { > > + //If no paths provided assume standar input > > + if (paths == null || paths.size() == 0) { > > + if (log.isDebugEnabled()) { > > + log.debug("Heading STDIN"); > > + } > > + > > + head(new BufferedReader(new InputStreamReader(System.in))); > > + } else { > > + for (String filename : paths) { > > + BufferedReader reader; > > + > > + // First try a URL > > + try { > > + URL url = new URL(filename); > > + if (log.isDebugEnabled()) { > > + log.debug("Heading URL: " + url); > > + } > > + reader = new BufferedReader(new > InputStreamReader(url.openStream())); > > + } > > + catch (MalformedURLException ignore) { > > + // They try a file > > + File file = new File(filename); > > + if (log.isDebugEnabled()) { > > + log.debug("Heading file: " + file); > > + } > > + reader = new BufferedReader(new FileReader(file)); > > + } > > + > > + try { > > + head(reader); > > + } > > + finally { > > + try { > > + reader.close(); > > + } catch (IOException e) { > > + // Ignore > > + } > > + } > > + } > > + } > > + return null; > > + } > > + > > + private void head(final BufferedReader reader) throws IOException { > > + String line; > > + int lineno = 1; > > + > > + if (numberOfLines < 1) { > > + numberOfLines = DEFAULT_NUMBER_OF_LINES; > > + } > > + > > + while ((line = reader.readLine()) != null && lineno <= > numberOfLines) { > > + System.out.println(line); > > + lineno++; > > + } > > + } > > +} > > > > Added: > karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/TailAction.java > > URL: > http://svn.apache.org/viewvc/karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/TailAction.java?rev=1044051&view=auto > > > ============================================================================== > > --- > karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/TailAction.java > (added) > > +++ > karaf/trunk/shell/commands/src/main/java/org/apache/karaf/shell/commands/TailAction.java > Thu Dec 9 17:48:16 2010 > > @@ -0,0 +1,108 @@ > > +/* > > + * Licensed to the Apache Software Foundation (ASF) under one or more > > + * contributor license agreements. See the NOTICE file distributed with > > + * this work for additional information regarding copyright ownership. > > + * The ASF licenses this file to You under the Apache License, Version > 2.0 > > + * (the "License"); you may not use this file except in compliance with > > + * the License. You may obtain a copy of the License at > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > + * See the License for the specific language governing permissions and > > + * limitations under the License. > > + */ > > +package org.apache.karaf.shell.commands; > > + > > +import java.io.BufferedReader; > > +import java.io.File; > > +import java.io.FileReader; > > +import java.io.IOException; > > +import java.io.InputStreamReader; > > +import java.net.MalformedURLException; > > +import java.net.URL; > > +import java.util.LinkedList; > > +import java.util.List; > > + > > +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 = "tail", description = "Displays the > last lines of a file") > > +public class TailAction extends AbstractAction { > > + > > + private static final int DEFAULT_NUMBER_OF_LINES = 10; > > + > > + @Option(name = "-n", aliases = {}, description = "The number of > lines to display, starting at 1.", required = false, multiValued = false) > > + private int numberOfLines; > > + > > + @Argument(index = 0, name = "paths or urls", description = "A list > of file paths or urls to display separated by whitespaces.", required = > false, multiValued = true) > > + private List<String> paths; > > + > > + protected Object doExecute() throws Exception { > > + //If no paths provided assume standar input > > + if (paths == null || paths.size() == 0) { > > + if (log.isDebugEnabled()) { > > + log.debug("Tailing STDIN"); > > + } > > + tail(new BufferedReader(new InputStreamReader(System.in))); > > + } else { > > + for (String filename : paths) { > > + BufferedReader reader; > > + > > + // First try a URL > > + try { > > + URL url = new URL(filename); > > + if (log.isDebugEnabled()) { > > + log.debug("Tailing URL: " + url); > > + } > > + reader = new BufferedReader(new > InputStreamReader(url.openStream())); > > + } > > + catch (MalformedURLException ignore) { > > + // They try a file > > + File file = new File(filename); > > + if (log.isDebugEnabled()) { > > + log.debug("Tailing file: " + file); > > + } > > + reader = new BufferedReader(new FileReader(file)); > > + } > > + > > + try { > > + tail(reader); > > + } > > + finally { > > + try { > > + reader.close(); > > + } catch (IOException e) { > > + // Ignore > > + } > > + } > > + } > > + } > > + > > + return null; > > + } > > + > > + private void tail(final BufferedReader reader) throws IOException { > > + List<String> lines = new LinkedList<String>(); > > + String line; > > + int lineno = 1; > > + > > + while ((line = reader.readLine()) != null) { > > + lines.add(line); > > + } > > + > > + if (numberOfLines < 1) { > > + numberOfLines = DEFAULT_NUMBER_OF_LINES; > > + } > > + > > + int startLine = lines.size() < numberOfLines ? 0 : lines.size() > - numberOfLines; > > + > > + for (lineno = startLine; lineno < lines.size(); lineno++) { > > + System.out.println(lines.get(lineno)); > > + } > > + } > > +} > > > > 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=1044051&r1=1044050&r2=1044051&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 > Thu Dec 9 17:48:16 2010 > > @@ -21,6 +21,7 @@ org.apache.karaf.shell.commands.EchoActi > > org.apache.karaf.shell.commands.ExecuteAction > > org.apache.karaf.shell.commands.GrepAction > > org.apache.karaf.shell.commands.HistoryAction > > +org.apache.karaf.shell.commands.HeadAction > > org.apache.karaf.shell.commands.IfAction > > org.apache.karaf.shell.commands.JavaAction > > org.apache.karaf.shell.commands.LogoutAction > > @@ -30,3 +31,4 @@ org.apache.karaf.shell.commands.PrintfAc > > org.apache.karaf.shell.commands.SleepAction > > org.apache.karaf.shell.commands.SortAction > > org.apache.karaf.shell.commands.TacAction > > +org.apache.karaf.shell.commands.TailAction > > > > 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=1044051&r1=1044050&r2=1044051&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 > Thu Dec 9 17:48:16 2010 > > @@ -41,6 +41,9 @@ > > <command name="shell/history"> > > <action > class="org.apache.karaf.shell.commands.HistoryAction"/> > > </command> > > + <command name="shell/head"> > > + <action class="org.apache.karaf.shell.commands.HeadAction"/> > > + </command> > > <command name="shell/if"> > > <action class="org.apache.karaf.shell.commands.IfAction"/> > > </command> > > @@ -78,6 +81,9 @@ > > <command name="shell/tac"> > > <action class="org.apache.karaf.shell.commands.TacAction"/> > > </command> > > + <command name="shell/tail"> > > + <action class="org.apache.karaf.shell.commands.TailAction"/> > > + </command> > > </command-bundle> > > > > <bean class="org.osgi.util.tracker.BundleTracker" init-method="open" > > > > > > > > > > -- > Cheers, > Guillaume Nodet > ------------------------ > Blog: http://gnodet.blogspot.com/ > ------------------------ > Open Source SOA > http://fusesource.com > -- *Ioannis Canellos* http://iocanel.blogspot.com Integration Engineer @ Upstream S.A. <http://www.upstreamsystems.com>
