001package org.unix4j.unix.cat; 002 003import java.io.File; 004import java.util.List; 005 006import org.unix4j.command.AbstractCommand; 007import org.unix4j.context.ExecutionContext; 008import org.unix4j.io.FileInput; 009import org.unix4j.processor.LineProcessor; 010import org.unix4j.processor.RedirectInputLineProcessor; 011import org.unix4j.unix.Cat; 012import org.unix4j.util.FileUtil; 013 014/** 015 * Implementation of the {@link Cat cat} command. 016 */ 017class CatCommand extends AbstractCommand<CatArguments> { 018 public CatCommand(CatArguments arguments) { 019 super(Cat.NAME, arguments); 020 } 021 022 @Override 023 public LineProcessor execute(ExecutionContext context, final LineProcessor output) { 024 final CatArguments args = getArguments(context); 025 026 // input from files? 027 if (args.isFilesSet()) { 028 final List<FileInput> inputs = FileInput.multiple(args.getFiles()); 029 return getFileInputProcessor(inputs, context, output, args); 030 } else if (args.isPathsSet()) { 031 final List<File> files = FileUtil.expandFiles(context.getCurrentDirectory(), args.getPaths()); 032 final List<FileInput> inputs = FileInput.multiple(files); 033 return getFileInputProcessor(inputs, context, output, args); 034 } 035 036 // standard input 037 return getStandardInputProcessor(context, output, args); 038 } 039 040 private LineProcessor getStandardInputProcessor(ExecutionContext context, LineProcessor output, CatArguments args) { 041 final LineProcessor printer; 042 if (args.isNumberLines() || args.isNumberNonBlankLines()) { 043 printer = new NumberLinesProcessor(this, context, output); 044 } else { 045 printer = output; 046 } 047 if (args.isSqueezeEmptyLines()) { 048 return new SqueezeEmptyLinesProcessor(this, context, printer); 049 } 050 return new CatProcessor(this, context, printer); 051 } 052 053 private LineProcessor getFileInputProcessor(List<FileInput> inputs, ExecutionContext context, LineProcessor output, CatArguments args) { 054 final LineProcessor standardInputProcessor = getStandardInputProcessor(context, output, args); 055 return new RedirectInputLineProcessor(inputs, standardInputProcessor); 056 } 057}