@SuppressWarnings("unchecked")
  @Override
  public int compare(Object o1, Object o2) {
    logger.debug("Comparing [{}] and [{}]", o1, o2);
    int result = 0;
    Comparable comparable1 = asNullIfNotComparable(o1);
    Comparable comparable2 = asNullIfNotComparable(o2);

    if (comparable1 == null && comparable2 == null) {
      logger.debug("Both items are null, result is 0");
      result=0;
    } else if (comparable1 == null && comparable2 != null) {
      logger.debug("comparable1 is null & comparable2 [{}] is not null, result is -1", comparable2);
      result = -1;
    } else if (comparable1 != null && comparable2 == null) {
      logger.debug("comparable1 [{}] is not null & comparable2 is null, result is 1", comparable1);
      result = 1;
    } else {
      try {
        result = comparable1.compareTo(comparable2);
        logger.debug("comparable1 [{}] compareTo comparable2 [{}] result is [{}]", comparable1, comparable2, result);
      } catch (Exception ex) {
        logger.debug("Get exception [{}] when comparable1 [{}] compareTo comparable2 [{}], set result as 0",
            ex.toString(), comparable1, comparable2);
        result = 0;
      }
    }
    logger.debug("Compared result is [{}]", result);
    return result;
  }
@ SuppressWarnings ( "unchecked" ) @ Override public int compare ( Object o1 , Object o2 ) { logger . debug ( "Comparing [{}] and [{}]" , o1 , o2 ) ; int result = 0 ; Comparable comparable1 = asNullIfNotComparable ( o1 ) ; Comparable comparable2 = asNullIfNotComparable ( o2 ) ; if ( comparable1 == null && comparable2 == null ) { logger . debug ( "Both items are null, result is 0" ) ; result = 0 ; } else if ( comparable1 == null && comparable2 != null ) { logger . debug ( "comparable1 is null & comparable2 [{}] is not null, result is -1" , comparable2 ) ; result = - 1 ; } else if ( comparable1 != null && comparable2 == null ) { logger . debug ( "comparable1 [{}] is not null & comparable2 is null, result is 1" , comparable1 ) ; result = 1 ; } else { try { result = comparable1 . compareTo ( comparable2 ) ; logger . debug ( "comparable1 [{}] compareTo comparable2 [{}] result is [{}]" , comparable1 , comparable2 , result ) ; } catch ( Exception ex ) { logger . debug ( "Get exception [{}] when comparable1 [{}] compareTo comparable2 [{}], set result as 0" , ex . toString ( ) , comparable1 , comparable2 ) ; result = 0 ; } } logger . debug ( "Compared result is [{}]" , result ) ; return result ; }
<ol>
<li>First convert the input objects to comparable instances(comparable1,
comparable2). If they are null or not instance of comparable, the converted
result is null.
<ul>
<li>If both converted result are null, return 0.</li>
<li>If comparable1 is null and comparable2 is not null, return -1</li>
<li>If comparable1 is not null and comparable2 is null, return 1</li>
</ul>
</li>
<li>Then <code>return comparable1.compareTo(comparable2)</code></li>
<li>If there is an exception in the above step, return 0 as the result</li>
</ol>