All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.jagg.msd.Discriminators Maven / Gradle / Ivy

Go to download

jAgg is a Java 5.0 API that supports “group by” operations on Lists of Java objects: aggregate operations such as count, sum, max, min, avg, and many more. It also allows custom aggregate operations.

The newest version!
package net.sf.jagg.msd;

import java.math.BigInteger;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.RandomAccess;

/**
 * The Discriminators utility class supplies utility functionality
 * for Discriminators.
 *
 * @author Randy Gettman
 * @since 0.5.0
 */
public class Discriminators
{
   /**
    * Do not instantiate the Discriminators class.
    */
   private Discriminators() {}

   /**
    * Gets the proper Discriminator for a particular object.
    * @param object The object representing the type to be discriminated.
    * @param  The type of the object to be discriminated.
    * @return A Discriminator capable of discriminating objects of
    *    type T, or null if one couldn't be found.
    */
   @SuppressWarnings("unchecked")
   public static  Discriminator getDiscriminator(T object)
   {
      Discriminator discriminator;
      // Try for decreasing order of popularity.
      if (object instanceof Integer)
         discriminator = (Discriminator) new IntegerDiscriminator();
      else if (object instanceof Double)
         discriminator = (Discriminator) new DoubleDiscriminator();
      else if (object instanceof CharSequence)
         discriminator = (Discriminator) new CharSequenceDiscriminator();
      else if (object instanceof Enum)
         discriminator = (Discriminator) new EnumDiscriminator();
      else if (object instanceof Long)
         discriminator = (Discriminator) new LongDiscriminator();
      else if (object instanceof Date)
         discriminator = (Discriminator) new DateDiscriminator();
      else if (object instanceof Calendar)
         discriminator = (Discriminator) new CalendarDiscriminator();
      else if (object instanceof Float)
         discriminator = (Discriminator) new FloatDiscriminator();
      else if (object instanceof Short)
         discriminator = (Discriminator) new ShortDiscriminator();
      else if (object instanceof Byte)
         discriminator = (Discriminator) new ByteDiscriminator();
      else if (object instanceof Boolean)
         discriminator = (Discriminator) new BooleanDiscriminator();
      else if (object instanceof Character)
         discriminator = (Discriminator) new CharacterDiscriminator();
      else if (object instanceof BigInteger)
         discriminator = (Discriminator) new BigIntegerDiscriminator();
      else if (object instanceof BigDecimal)
         discriminator = (Discriminator) new BigDecimalDiscriminator();
      else if (object instanceof RandomAccess && object instanceof List)
         discriminator = (Discriminator) new RandomAccessListDiscriminator();
      else if (object instanceof Collection)
         discriminator = (Discriminator) new CollectionDiscriminator();
      else if (object instanceof Class)
         discriminator = new ClassDiscriminator();
      else if (object instanceof Object[])
         discriminator = (Discriminator) new ArrayDiscriminator();
      else if (object instanceof Discriminable)
         discriminator = new DiscriminableDiscriminator();
      else
         return null;

      return new NullDiscriminator(discriminator);
   }

   /**
    * Gets the proper Discriminator for a particular object's
    * class.
    * @param c The Class object representing the type to be
    *    discriminated.
    * @param  The type of the object to be discriminated.
    * @return A Discriminator capable of discriminating objects of
    *    type T, or null if one couldn't be found.
    */
   @SuppressWarnings("unchecked")
   public static  Discriminator getDiscriminator(Class c)
   {
      Discriminator discriminator;
      // Try for decreasing order of popularity.
      if (Integer.class == c || Integer.TYPE == c)
         discriminator = (Discriminator) new IntegerDiscriminator();
      else if (Double.class == c || Double.TYPE == c)
         discriminator = (Discriminator) new DoubleDiscriminator();
      else if (CharSequence.class.isAssignableFrom(c))
         discriminator = (Discriminator) new CharSequenceDiscriminator();
      else if (Enum.class.isAssignableFrom(c))
         discriminator = (Discriminator) new EnumDiscriminator();
      else if (Long.class == c || Long.TYPE == c)
         discriminator = (Discriminator) new LongDiscriminator();
      else if (Date.class.isAssignableFrom(c))
         discriminator = (Discriminator) new DateDiscriminator();
      else if (Calendar.class.isAssignableFrom(c))
         discriminator = (Discriminator) new CalendarDiscriminator();
      else if (Float.class == c || Float.TYPE == c)
         discriminator = (Discriminator) new FloatDiscriminator();
      else if (Short.class == c || Short.TYPE == c)
         discriminator = (Discriminator) new ShortDiscriminator();
      else if (Byte.class == c || Byte.TYPE == c)
         discriminator = (Discriminator) new ByteDiscriminator();
      else if (Boolean.class == c || Boolean.TYPE == c)
         discriminator = (Discriminator) new BooleanDiscriminator();
      else if (Character.class == c || Character.TYPE == c)
         discriminator = (Discriminator) new CharacterDiscriminator();
      else if (BigInteger.class == c)
         discriminator = (Discriminator) new BigIntegerDiscriminator();
      else if (BigDecimal.class == c)
         discriminator = (Discriminator) new BigDecimalDiscriminator();
      else if (RandomAccess.class.isAssignableFrom(c) && List.class.isAssignableFrom(c))
         discriminator = (Discriminator) new RandomAccessListDiscriminator();
      else if (Collection.class.isAssignableFrom(c))
         discriminator = (Discriminator) new CollectionDiscriminator();
      else if (Class.class.isAssignableFrom(c))
         discriminator = new ClassDiscriminator();
      else if (Object[].class.isAssignableFrom(c))
         discriminator = (Discriminator) new ArrayDiscriminator();
      else if (Discriminable.class.isAssignableFrom(c))
         discriminator = new DiscriminableDiscriminator();
      else
         return null;

      return new NullDiscriminator(discriminator);
   }

   /**
    * "Flattens" a List of Lists into a new
    * List of T objects.
    * @param listOfLists A List of Lists.
    * @param  The type of object.
    * @return A flattened List that contains only the elements
    *    of each of the internal lists, in the order found.
    */
   @SuppressWarnings("ForLoopReplaceableByForEach")
   public static  List getFlattenedList(List> listOfLists)
   {
      // Get size first to avoid ArrayList re-allocation of the internal array.
      int size = 0;
      int numLists = listOfLists.size();
      for (int i = 0; i < numLists; i++)
         size += listOfLists.get(i).size();
      List flatList = new ArrayList(size);
      // Avoid Iterator creation overhead. 
      for (int i = 0; i < numLists; i++)
      {
         List internalList = listOfLists.get(i);
         for (int j = 0; j < internalList.size(); j++)
            flatList.add(internalList.get(j));
      }
      return flatList;
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy