

package com.jamonapi.utils;  // FormattedDataSet API



import java.util.*;



/** 
 * <p>This class allows you to compare Object[] arrays by multiple columns.  It can also compare any Object that implements the ToArray interface.  
 * Each column will use the underlying
 * Compareable interface in natural or reverse order depending on how it is added, or will use the passed in Comparator.
 * </p>
 * 
 */

/** Note I took this code from fdsapi.com, and would like to eventually merge these 2 projects, so
 * this class will eventually be replaced by the one in FDS.
 */


public class JAMonArrayComparator extends java.lang.Object implements Comparator

{
    private List sortCols=new ArrayList();
    private static final Comparator defaultComparator=new JAMonComparator();

    public JAMonArrayComparator() {
    }



    /** Sort/compare the passed in col number starting at 0 in natural (true) or reverse (false)
     * order based on the columns Compareable interface being called.
     * @param sortCol
     * @param naturalOrder
     */
    public JAMonArrayComparator(int sortCol, boolean naturalOrder) {
        addCompareCol(sortCol, naturalOrder);
    }

 
    
    /** Compare the passed in col in natural order */
 public void addCompareCol(int sortCol) {
   	   sortCols.add(new ArrayElementComparator(sortCol, true));
 }

 /** Compare the passed in col in natural or reverse order */

 public void addCompareCol(int sortCol, boolean naturalOrder) {
   sortCols.add(new ArrayElementComparator(sortCol, naturalOrder));
 }
 
 /** Compare the passed in col based on the passed in Comparator */

 public void addCompareCol(int sortCol, Comparator comparator) {
   sortCols.add(new ArrayElementComparator(sortCol, comparator));
 }
 
 

/**
 * Method used by the comparator interface. <br><br>
 *   o1 &lt; o2 - returns a negative integer<br>
 *   o1==o2 - returns zero<br>
 *   o1>o2 - returns a postitive integer<br><br>
 *  Iterate through all columns that should be compared (in the proper order) 
 *  and call the Comparator for each of the column elements.
 */

 public int compare(Object o1, Object o2) {
	   Object[] array1=null;
	   Object[] array2=null;
       int compareVal=0;

       // Put data into array format or call the underlying defaultComparator if
       // the data isn't tabular
	   if (o1 instanceof ToArray  &&  o2 instanceof ToArray) {
		   array1=((ToArray)o1).toArray();
		   array2=((ToArray)o2).toArray();
	   } else if (o1 instanceof Object[] && o2 instanceof Object[]) {
		   array1=(Object[])o1;
		   array2=(Object[])o2;
	   } else {
	  	  return defaultComparator.compare(o1, o2);
	   }


	 /** Iterate through the Arrays comparators to compare columns */
     Iterator iter=sortCols.iterator();
     while (iter.hasNext()) {
    	  ArrayElementComparator elementComp=(ArrayElementComparator) iter.next();
          Object element1=array1[elementComp.getSortCol()];
          Object element2=array2[elementComp.getSortCol()];
  
          compareVal=elementComp.compare(element1,element2);

          if (compareVal!=0) // if one of the elments is not equal we know all we need to know and can return
            break;
      }


     return compareVal;

}
 
 
 

}



