/* JFox, the OpenSource J2EE Application Server
 *
 * Copyright (C) 2002 huihoo.com
 * Distributable under GNU LGPL license
 * See the GNU Lesser General Public License for more details.
 */

package org.jfox.mx.util;

/**
 * 
 * @author <a href="mailto:young_yy@hotmail.com">Young Yang</a>
 */

public class PrimitiveHelper {

  public static Class getPrimitiveClass(String primitiveName){
    if(primitiveName.equals(boolean.class.getName()))
      return boolean.class;
    if(primitiveName.equals(char.class.getName()))
      return char.class;
    if(primitiveName.equals(byte.class.getName()))
      return byte.class;
    if(primitiveName.equals(short.class.getName()))
      return short.class;
    if(primitiveName.equals(int.class.getName()))
      return int.class;
    if(primitiveName.equals(long.class.getName()))
      return long.class;
    if(primitiveName.equals(float.class.getName()))
      return float.class;
    if(primitiveName.equals(double.class.getName()))
      return double.class;

    return null;
  }

  /**
   * 得到一个对象的原始类
   * @param obj
   * @return
   */
  public static Class object2PrimitiveClass(Object obj){
    if(obj instanceof Boolean)
      return boolean.class;
    if(obj instanceof Character)
      return char.class;
    if(obj instanceof Byte)
      return byte.class;
    if(obj instanceof Short)
      return short.class;
    if(obj instanceof Integer)
      return int.class;
    if(obj instanceof Long)
      return long.class;
    if(obj instanceof Float)
      return float.class;
    if(obj instanceof Double)
      return double.class;
    return null;
  }

  /**
   * create a Object by it's value and className , only check primitive class
   * @param value
   * @param className
   * @return primitive Object or itself
   */
  public static Object createObject(String value,String className){
    Object obj = value;

    if(className.equals(boolean.class.getName()) || className.equals(Boolean.class.getName())){
      obj = Boolean.valueOf(value);
    }
    else if(className.equals(char.class.getName()) || className.equals(Character.class.getName())) {
      obj = new Character(value.charAt(0));
    }
    else if(className.equals(byte.class.getName()) || className.equals(Byte.class.getName())) {
      obj = Byte.valueOf(value);
    }
    else if(className.equals(short.class.getName()) || className.equals(Short.class.getName())) {
      obj = Short.valueOf(value);
    }
    else if(className.equals(int.class.getName()) || className.equals(Integer.class.getName())) {
      obj = Integer.valueOf(value);
    }
    else if(className.equals(long.class.getName()) || className.equals(Long.class.getName())) {
      obj = Long.valueOf(value);
    }
    else if(className.equals(float.class.getName()) || className.equals(Float.class.getName())) {
      obj =  Float.valueOf(value);
    }
    else if(className.equals(double.class.getName()) || className.equals(Double.class.getName())) {
      obj = Double.valueOf(value);
    }

    return obj;

  }

  /**
   * 测试一个原始类型类是否可以附给一个对象类
   * @param primitiveClass
   * @param objClass
   * @return
   */
  public static boolean isAssignable(Class primitiveClass, Class objClass) {
    boolean assignable = false;
    if (objClass == null || primitiveClass == null) {
      assignable = false;
    }
    else if (objClass == boolean.class && primitiveClass == Boolean.class) {
      assignable = true;
    }
    else if (objClass == byte.class && primitiveClass == Byte.class) {
      assignable = true;
    }
    else if (objClass == char.class && primitiveClass == Character.class) {
      assignable = true;
    }
    else if (objClass == short.class && primitiveClass == Short.class) {
      assignable = true;
    }
    else if (objClass == int.class && primitiveClass == Integer.class) {
      assignable = true;
    }
    else if (objClass == long.class && primitiveClass == Long.class) {
      assignable = true;
    }
    else if (objClass == float.class && primitiveClass == Float.class) {
      assignable = true;
    }
    else if (objClass == double.class && primitiveClass == Double.class) {
      assignable = true;
    }
    return assignable;
  }

  /**
   * 测试一个字符参数是否是一个原始类
   * @param type
   * @return
   */
  public static boolean isPrimitiveType(String type){
    if(type.equals(boolean.class.getName())
        || type.equals(char.class.getName())
        || type.equals(byte.class.getName())
        || type.equals(short.class.getName())
        || type.equals(int.class.getName())
        || type.equals(int.class.getName())
        || type.equals(float.class.getName())
        || type.equals(double.class.getName())
    ){
      return true;
    }
    return false;
  }

  public static void main(String[] args) throws Exception {
    System.out.println(PrimitiveHelper.getPrimitiveClass("int"));
    System.out.println(int.class.getName());
    System.out.println(int.class.equals(Integer.TYPE));
  }

}