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}