package org.wikiwebserver.util.comparator;

import java.util.Comparator;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;

public class DescendingEntryValueComparator<K, L> implements Comparator<Map.Entry<K, L>> {
    
    @SuppressWarnings("unchecked")
    public int compare(Map.Entry<K, L> obj1, Map.Entry<K, L> obj2) {
        Object value1 = ((Map.Entry<K, L>) obj1).getValue();
        Object value2 = ((Map.Entry<K, L>) obj2).getValue();

        if (value1 instanceof AtomicLong) {
            value1 = new Long(((AtomicLong)value1).longValue());
        }   
        if (value2 instanceof AtomicLong) {
            value2 = new Long(((AtomicLong)value2).longValue());
        }
        if (value1.getClass() != value2.getClass()) {
            value1 = value1.toString();
            value2 = value2.toString();
        }        
        @SuppressWarnings("rawtypes")
		int diff = ((Comparable) value2).compareTo(value1);
        if (diff == 0) diff = 1; // Do not remove duplicates
        return diff;
    }
}

