001package com.hammurapi.extract;
002
003import java.util.Comparator;
004
005import com.hammurapi.common.Util;
006
007/**
008 * Comparator which uses extraction.
009 * @author Pavel Vlasov
010 *
011 * @param <V>
012 */
013public class ExtractorComparator<T,V extends Comparable<V>, C> implements Comparator<T> {
014        
015        private Extractor<T, V, C> extractor;
016        private C context;
017
018        public ExtractorComparator(Extractor<T, V, C> extractor, C context) {
019                this.extractor = extractor;
020                this.context = context;
021        }
022
023        @Override
024        public int compare(T o1, T o2) {
025                return extractor.extract(context, null, Util.wrap(o1)).compareTo(extractor.extract(context, null, Util.wrap(o2)));
026        }
027
028        @Override
029        public int hashCode() {
030                final int prime = 31;
031                int result = 1;
032                result = prime * result + ((context == null) ? 0 : context.hashCode());
033                result = prime * result + ((extractor == null) ? 0 : extractor.hashCode());
034                return result;
035        }
036
037        @Override
038        public boolean equals(Object obj) {
039                if (this == obj)
040                        return true;
041                if (obj == null)
042                        return false;
043                if (getClass() != obj.getClass())
044                        return false;
045                ExtractorComparator other = (ExtractorComparator) obj;
046                if (context == null) {
047                        if (other.context != null)
048                                return false;
049                } else if (!context.equals(other.context))
050                        return false;
051                if (extractor == null) {
052                        if (other.extractor != null)
053                                return false;
054                } else if (!extractor.equals(other.extractor))
055                        return false;
056                return true;
057        }               
058
059}