| /* |
| * 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.felix.gogo.shell; |
| |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.io.OutputStream; |
| import java.net.URI; |
| import java.util.List; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| import org.apache.felix.gogo.options.Option; |
| import org.apache.felix.gogo.options.Options; |
| import org.osgi.service.command.CommandSession; |
| |
| /** |
| * Posix-like utilities. |
| * |
| * @see http://www.opengroup.org/onlinepubs/009695399/utilities/contents.html |
| */ |
| public class Posix |
| { |
| static final String[] functions = { "cat", "echo", "grep" }; |
| |
| public void cat(CommandSession session, String[] args) throws Exception |
| { |
| if (args.length == 0) |
| { |
| copy(System.in, System.out); |
| return; |
| } |
| |
| URI cwd = Shell.cwd(session); |
| |
| for (String arg : args) |
| { |
| copy(cwd.resolve(arg), System.out); |
| } |
| } |
| |
| public void echo(Object[] args) |
| { |
| StringBuilder buf = new StringBuilder(); |
| |
| if (args == null) |
| { |
| System.out.println("Null"); |
| return; |
| } |
| |
| for (Object arg : args) |
| { |
| if (buf.length() > 0) |
| buf.append(' '); |
| buf.append(String.valueOf(arg)); |
| } |
| |
| System.out.println(buf); |
| } |
| |
| public boolean grep(CommandSession session, String[] argv) throws IOException |
| { |
| final String[] usage = { |
| "grep - search for PATTERN in each FILE or standard input.", |
| "Usage: grep [OPTIONS] PATTERN [FILES]", |
| " -? --help show help", |
| " -i --ignore-case ignore case distinctions", |
| " -n --line-number prefix each line with line number within its input file", |
| " -q --quiet, --silent suppress all normal output", |
| " -v --invert-match select non-matching lines" }; |
| |
| Option opt = Options.compile(usage).parse(argv); |
| |
| if (opt.isSet("help")) |
| { |
| opt.usage(); |
| return true; |
| } |
| |
| List<String> args = opt.args(); |
| |
| if (args.size() == 0) |
| { |
| throw opt.usageError("no pattern supplied."); |
| } |
| |
| String regex = args.remove(0); |
| if (opt.isSet("ignore-case")) |
| { |
| regex = "(?i)" + regex; |
| } |
| |
| if (args.isEmpty()) |
| { |
| args.add(null); |
| } |
| |
| StringBuilder buf = new StringBuilder(); |
| |
| if (args.size() > 1) |
| { |
| buf.append("%1$s:"); |
| } |
| |
| if (opt.isSet("line-number")) |
| { |
| buf.append("%2$s:"); |
| } |
| |
| buf.append("%3$s"); |
| String format = buf.toString(); |
| |
| Pattern pattern = Pattern.compile(regex); |
| boolean status = true; |
| boolean match = false; |
| |
| for (String arg : args) |
| { |
| InputStream in = null; |
| |
| try |
| { |
| URI cwd = Shell.cwd(session); |
| in = (arg == null) ? System.in : cwd.resolve(arg).toURL().openStream(); |
| |
| BufferedReader rdr = new BufferedReader(new InputStreamReader(in)); |
| int line = 0; |
| String s; |
| while ((s = rdr.readLine()) != null) |
| { |
| line++; |
| Matcher matcher = pattern.matcher(s); |
| if (!(matcher.find() ^ !opt.isSet("invert-match"))) |
| { |
| match = true; |
| if (opt.isSet("quiet")) |
| break; |
| |
| System.out.println(String.format(format, arg, line, s)); |
| } |
| } |
| |
| if (match && opt.isSet("quiet")) |
| { |
| break; |
| } |
| } |
| catch (IOException e) |
| { |
| System.err.println("grep: " + e.getMessage()); |
| status = false; |
| } |
| finally |
| { |
| if (arg != null && in != null) |
| { |
| in.close(); |
| } |
| } |
| } |
| |
| return match && status; |
| } |
| |
| public static void copy(URI source, OutputStream out) throws IOException { |
| InputStream in = source.toURL().openStream(); |
| try { |
| copy(in, out); |
| } finally { |
| in.close(); |
| } |
| } |
| |
| |
| public static void copy(InputStream in, OutputStream out) throws IOException { |
| byte buf[] = new byte[10240]; |
| int len; |
| while ((len = in.read(buf)) > 0) { |
| out.write(buf, 0, len); |
| } |
| out.flush(); |
| } |
| |
| } |