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}