001package org.unix4j.unix.sort;
002
003import java.util.Comparator;
004
005import org.unix4j.context.ExecutionContext;
006import org.unix4j.line.Line;
007import org.unix4j.processor.AbstractLineProcessor;
008import org.unix4j.processor.LineProcessor;
009import org.unix4j.util.sort.DecimalNumberStringComparator;
010import org.unix4j.util.sort.LineComparator;
011import org.unix4j.util.sort.ReverseOrderComparator;
012import org.unix4j.util.sort.ScientificNumberStringComparator;
013
014abstract class AbstractSortProcessor extends AbstractLineProcessor<SortArguments> {
015        
016        private final Comparator<? super Line> comparator;
017
018        public AbstractSortProcessor(SortCommand command, ExecutionContext context, LineProcessor output) {
019                super(command, context, output);
020                this.comparator = initComparator();
021        }
022        
023        protected Comparator<? super Line> getComparator() {
024                return comparator;
025        }
026        
027        private Comparator<? super Line> initComparator() {
028                final SortArguments args = getArguments();
029                final Comparator<? super Line> comparator;
030                if (args.isComparatorSet()) {
031                        comparator = args.getComparator();
032                } else {
033                        if (args.isNumericSort()) {
034                                comparator = DecimalNumberStringComparator.getInstance(getContext().getLocale());
035                        } else if (args.isGeneralNumericSort()) {
036                                comparator = ScientificNumberStringComparator.INSTANCE;
037                        } else if (args.isHumanNumericSort()) {
038                                throw new RuntimeException("option " + SortOption.humanNumericSort + " is not implemented");
039                        } else if (args.isDictionaryOrder()) {
040                                throw new RuntimeException("option " + SortOption.dictionaryOrder + " is not implemented");
041                        } else if (args.isMonthSort()) {
042                                throw new RuntimeException("option " + SortOption.monthSort + " is not implemented");
043                        } else if (args.isVersionSort()) {
044                                throw new RuntimeException("option " + SortOption.versionSort + " is not implemented");
045                        } else { 
046                                if (args.isIgnoreLeadingBlanks()) {
047                                        comparator = args.isIgnoreCase() ? LineComparator.COLLATOR_IGNORE_CASE_AND_LEADING_BLANKS : LineComparator.COLLATOR_IGNORE_LEADING_BLANKS;
048                                } else {
049                                        comparator = args.isIgnoreCase() ? LineComparator.COLLATOR_IGNORE_CASE : LineComparator.COLLATOR;
050                                }
051                        }
052                }
053                if (args.isReverse()) {
054                        return ReverseOrderComparator.reverse(comparator);
055                }
056                return comparator;
057        }
058
059}