001package io.konik.csv.pdf;
002
003import com.google.common.base.Function;
004import io.konik.harness.FileAppender;
005
006import javax.annotation.Nullable;
007import java.util.Comparator;
008
009/**
010 * {@link FileAppender} {@link Comparator} that uses {@code FileAppender.getPriority()} method
011 * to define correct order.
012 *
013 * Objects with higher priority come first.
014 */
015public class FileAppenderPriorityComparator implements Comparator<FileAppender> {
016
017        public enum Order {
018                DESC(new Function<Integer, Integer>() {
019                        public Integer apply(Integer input) {
020                                return input * -1;
021                        }
022                }),
023                ASC(new Function<Integer, Integer>() {
024                        public Integer apply(@Nullable Integer input) {
025                                return input;
026                        }
027                });
028
029                private Function<Integer,Integer> transform;
030
031                Order(Function<Integer,Integer> transform) {
032                        this.transform = transform;
033                }
034
035                public Integer apply(Integer value) {
036                        return this.transform.apply(value);
037                }
038        }
039
040        private final Order order;
041
042        public FileAppenderPriorityComparator(Order order) {
043                this.order = order;
044        }
045
046        @Override
047        public int compare(FileAppender fa1, FileAppender fa2) {
048                if (fa1 != null && fa2 != null) {
049                        return order.apply(fa1.getPriority() - fa2.getPriority());
050                }
051
052                if (fa1 != null) {
053                        return order.apply(1);
054                }
055
056                return 0;
057        }
058}