/* */ package com.bbn.openmap.event; import java.util.Comparator; import java.util.logging.Level; import java.util.logging.Logger; import com.bbn.openmap.util.HashCodeUtil; /** */ public class OMEventComparator implements Comparator<OMEvent> { public static Logger logger = Logger.getLogger("com.bbn.openmap.event.OMEventComparator"); /** * */ public OMEventComparator() { super(); } public int compare(OMEvent obj1, OMEvent obj2) { int ret = 0; long ts1 = obj1.getTimeStamp(); short tsc1 = obj1.getTimeStampComparator(); long ts2 = obj2.getTimeStamp(); short tsc2 = obj2.getTimeStampComparator(); // ts1 is the one being tested/added to the TreeSet, so we // want later items with the same time being added after // previous items in the file with the same time. if (ts1 < ts2) { ret = -1; obj1.setSorted(true); } else if (ts1 > ts2) { ret = 1; } else { boolean logging = false; String id1 = null, id2 = null; if (logger.isLoggable(Level.FINE)) { id1 = obj1.getDescription(); id2 = obj2.getDescription(); logging = true; } if (tsc1 == 0) { tsc1 = tsc2; if (logging) { logger.info("new event..." + id1); } } else { obj1.setSorted(true); } if (logging) { logger.info("comparing [" + id1 + "] at " + tsc1 + " to [" + id2 + "] at " + tsc2); } // Since time stamps are equal, go to the time stamp comparator // settings. if (tsc1 < tsc2 && obj1.isSorted()) { ret = -1; if (logging) { logger.info("-----"); } } else if (tsc1 > tsc2) { ret = 1; if (logging) { logger.info("+++++"); } } else { // If they have the same setting, the second time stamp // comparator will get bumped up. If there has already been more // than one record with the same time, then this should keep // happening until the last one in has the highest tsc value; tsc1 = (short) (tsc2 + 1); obj2.setTimeStampComparator(tsc1); ret = 1; if (logging) { logger.info("^^^^^ " + ts1 + ", upping [" + id1 + "] to " + tsc1 + " over [" + id2 + "]"); } } } return ret; } public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } return obj.hashCode() == this.hashCode(); } public int hashCode() { int result = HashCodeUtil.SEED; result = HashCodeUtil.hash(result, getClass().getName()); return result; } }