001/* 002 * (C) Copyright 2017 Nuxeo SA (http://nuxeo.com/) and others. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 * 016 * Contributors: 017 * bdelbosc 018 */ 019package org.nuxeo.lib.stream.tools.command; 020 021import java.time.Duration; 022 023import org.apache.commons.cli.CommandLine; 024import org.apache.commons.cli.Option; 025import org.apache.commons.cli.Options; 026import org.nuxeo.lib.stream.computation.Record; 027import org.nuxeo.lib.stream.log.LogManager; 028import org.nuxeo.lib.stream.log.LogRecord; 029import org.nuxeo.lib.stream.log.LogTailer; 030import org.nuxeo.lib.stream.tools.renderer.Renderer; 031 032/** 033 * Output records to stdout. 034 * 035 * @since 9.3 036 */ 037public class CatCommand extends Command { 038 039 protected static final String NAME = "cat"; 040 041 @Override 042 public String name() { 043 return NAME; 044 } 045 046 @Override 047 public void updateOptions(Options options) { 048 options.addOption( 049 Option.builder("n").longOpt("lines").desc("Render the first N records").hasArg().argName("N").build()); 050 options.addOption(Option.builder("l") 051 .longOpt("log-name") 052 .desc("Log name") 053 .required() 054 .hasArg() 055 .argName("LOG_NAME") 056 .build()); 057 options.addOption( 058 Option.builder("g").longOpt("group").desc("Consumer group").hasArg().argName("GROUP").build()); 059 options.addOption(Option.builder() 060 .longOpt("codec") 061 .desc("Codec used to read record, can be: java, avro, avroBinary, avroJson") 062 .hasArg() 063 .argName("CODEC") 064 .build()); 065 options.addOption( 066 Option.builder().longOpt("render").desc("Output rendering").hasArg().argName("FORMAT").build()); 067 068 } 069 070 @Override 071 public boolean run(LogManager manager, CommandLine cmd) throws InterruptedException { 072 int limit = Integer.parseInt(cmd.getOptionValue("lines", "-1")); 073 String name = cmd.getOptionValue("log-name"); 074 String render = cmd.getOptionValue("render", "default"); 075 String group = cmd.getOptionValue("group", "tools"); 076 String codec = cmd.getOptionValue("codec"); 077 cat(manager, name, group, limit, getRecordRenderer(render), codec); 078 return true; 079 } 080 081 protected void cat(LogManager manager, String name, String group, int limit, Renderer render, String codec) 082 throws InterruptedException { 083 render.header(); 084 try (LogTailer<Record> tailer = manager.createTailer(group, name, getRecordCodec(codec))) { 085 int count = 0; 086 do { 087 LogRecord<Record> record = tailer.read(Duration.ofMillis(1000)); 088 if (record == null) { 089 break; 090 } 091 count++; 092 render.accept(record); 093 } while (limit < 0 || (count < limit)); 094 } 095 render.footer(); 096 } 097}