package basics.utl;

import java.lang.reflect.Field;

public class ObjectUtl
{
Object object;
@SuppressWarnings("unchecked")
Class  c;

public static String getId(Object object)
{
   return object == null ? "NULL" : object.getClass().getSimpleName() + "@"
      + Integer.toHexString(object.hashCode());
}

/**
 * Attempt to create an object by class name, returns null if that fails.
 * No exception. 
 * @param className
 * @return object or null.
 */
public static Object createInstanceOf(String className)
{
   try
   {
      Class<?> c = Class.forName(className);
      return c.newInstance();
   }
   catch(Exception e)
   {
      return null;
   }
}

public ObjectUtl(Object object)
{
   this.object = object;
   this.c = object.getClass();
}

public boolean getValue(String fieldName, boolean value)
{
   try
   {
      Field field = c.getField(fieldName);
      return field.getBoolean(object);
   }
   catch(Exception e)
   {
      return value;
   }
}

public int getValue(String fieldName, int value)
{
   try
   {
      Field field = c.getField(fieldName);
      return field.getInt(object);
   }
   catch(Exception e)
   {
      return value;
   }
}

public long getValue(String fieldName, long value)
{
   try
   {
      Field field = c.getField(fieldName);
      return field.getLong(object);
   }
   catch(Exception e)
   {
      return value;
   }
}

public float getValue(String fieldName, float value)
{
   try
   {
      Field field = c.getField(fieldName);
      return field.getFloat(object);
   }
   catch(Exception e)
   {
      return value;
   }
}

public double getValue(String fieldName, double value)
{
   try
   {
      Field field = c.getField(fieldName);
      return field.getDouble(object);
   }
   catch(Exception e)
   {
      return value;
   }
}

public byte getValue(String fieldName, byte value)
{
   try
   {
      Field field = c.getField(fieldName);
      return field.getByte(object);
   }
   catch(Exception e)
   {
      return value;
   }
}

public short getValue(String fieldName, short value)
{
   try
   {
      Field field = c.getField(fieldName);
      return field.getShort(object);
   }
   catch(Exception e)
   {
      return value;
   }
}

public Object getValue(String fieldName, Object value)
{
   try
   {
      Field field = c.getField(fieldName);
      return field.get(object);
   }
   catch(Exception e)
   {
      return value;
   }
}

public String getValue(String fieldName, String value)
{
   try
   {
      Field field = c.getField(fieldName);
      return (String)field.get(object);
   }
   catch(Exception e)
   {
      return value;
   }
}

public boolean setValue(String fieldName, int value)
{
   try
   {
      Field field = c.getField(fieldName);
      field.setInt(object, value);
      return true;
   }
   catch(Exception e)
   {
      return false;
   }
}

public boolean setValue(String fieldName, long value)
{
   try
   {
      Field field = c.getField(fieldName);
      field.setLong(object, value);
      return true;
   }
   catch(Exception e)
   {
      return false;
   }
}

public boolean setValue(String fieldName, double value)
{
   try
   {
      Field field = c.getField(fieldName);
      field.setDouble(object, value);
      return true;
   }
   catch(Exception e)
   {
      return false;
   }
}

public boolean setValue(String fieldName, boolean value)
{
   try
   {
      Field field = c.getField(fieldName);
      field.setBoolean(object, value);
      return true;
   }
   catch(Exception e)
   {
      return false;
   }
}

public boolean setValue(String fieldName, float value)
{
   try
   {
      Field field = c.getField(fieldName);
      field.setFloat(object, value);
      return true;
   }
   catch(Exception e)
   {
      return false;
   }
}

public boolean setValue(String fieldName, char value)
{
   try
   {
      Field field = c.getField(fieldName);
      field.setFloat(object, value);
      return true;
   }
   catch(Exception e)
   {
      return false;
   }
}

public boolean setValue(String fieldName, short value)
{
   try
   {
      Field field = c.getField(fieldName);
      field.setShort(object, value);
      return true;
   }
   catch(Exception e)
   {
      return false;
   }
}

public boolean setValue(String fieldName, byte value)
{
   try
   {
      Field field = c.getField(fieldName);
      field.setByte(object, value);
      return true;
   }
   catch(Exception e)
   {
      return false;
   }
}

public boolean setValue(String fieldName, Object value)
{
   try
   {
      Field field = c.getField(fieldName);
      field.set(object, value);
      return true;
   }
   catch(Exception e)
   {
      return false;
   }
}
//
// static void showMethods (Object o)
// {
// Class c = o.getClass();
// Method[] theMethods = c.getMethods();
// for (int i = 0; i < theMethods.length; i++)
// {
// String methodString = theMethods[i].getName();
// System.out.println("Name: " + methodString);
// String returnString = theMethods[i].getReturnType().getName();
// System.out.println(" Return Type: " + returnString);
// Class[] parameterTypes = theMethods[i].getParameterTypes();
// System.out.print(" Parameter Types:");
// for (int k = 0; k < parameterTypes.length; k++)
// {
// String parameterString = parameterTypes[k].getName();
// System.out.print(" " + parameterString);
// }
// System.out.println();
// }
// }
// public static void main (String[] args)
// {
// ReflectionHelper rh = new ReflectionHelper(new Polygon());
// ArrayList list = rh.getGetterMethodNames();
// for (int i = 0; i < list.size(); i++)
// {
// System.out.println((String) list.get(i) + ":"
// + rh.getReturnType((String) list.get(i)));
// }
// }
}
