001package org.unix4j.unix.wc;
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.InputLineProcessor;
010import org.unix4j.processor.LineProcessor;
011import org.unix4j.unix.Wc;
012import org.unix4j.util.FileUtil;
013
014/**
015 * Implementation of the {@link Wc wc} command.
016 */
017class WcCommand extends AbstractCommand<WcArguments> {
018        public WcCommand(WcArguments arguments) {
019                super(Wc.NAME, arguments);
020        }
021
022        @Override
023        public LineProcessor execute(ExecutionContext context, final LineProcessor output) {
024                final WcArguments args = getArguments(context);
025                
026                //input from files?
027                final List<FileInput> inputs;
028                if (args.isFilesSet()) {
029                        inputs = FileInput.multiple(args.getFiles());
030                } else if (args.isPathsSet()) {
031                        final List<File> files = FileUtil.expandFiles(context.getCurrentDirectory(), args.getPaths());
032                        inputs = FileInput.multiple(files);
033                } else {
034                        //standard input
035                        return getStandardInputProcessor(context, output);
036                }
037                
038        if(inputs.size() == 1){
039                        return new InputLineProcessor(inputs.get(0), new WcFileProcessor(context, args), output);
040
041        } else if(inputs.size() > 1){
042            return new WcMultipleFilesProcessor(context, inputs, output, args);
043
044                } else {
045                        throw new IllegalStateException("No inputs specified");
046                }
047        }
048        
049        private WcProcessor getStandardInputProcessor(ExecutionContext context, final LineProcessor output) {
050                return new WcProcessor(this, context, output);
051        }
052}