package com.jidesoft.utils;
import javax.swing.*;
import java.awt.*;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
/**
* Utils methods for data type.
*/
public class TypeUtils {
// indexes referring to columns in the PRIMITIVE_ARRAY_TYPES table.
private static final int WRAPPER_TYPE_INDEX = 0;
private static final int PRIMITIVE_TYPE_INDEX = 1;
private static final int PRIMITIVE_TYPE_KEY_INDEX = 2;
private static final Object[][] PRIMITIVE_ARRAY_TYPES = {
{Boolean.class, boolean.class, "Z"},
{Character.class, char.class, "C"},
{Byte.class, byte.class, "B"},
{Short.class, short.class, "S"},
{Integer.class, int.class, "I"},
{Long.class, long.class, "J"},
{Float.class, float.class, "F"},
{Double.class, double.class, "D"}
};
public static boolean isPrimitive(Class<?> primitive) {
for (Object[] primitiveArrayType : PRIMITIVE_ARRAY_TYPES) {
if (primitiveArrayType[PRIMITIVE_TYPE_INDEX] == primitive) {
return true;
}
}
return false;
}
public static boolean isPrimitiveWrapper(Class<?> wrapperType) {
for (Object[] primitiveArrayType : PRIMITIVE_ARRAY_TYPES) {
if (primitiveArrayType[WRAPPER_TYPE_INDEX] == wrapperType) {
return true;
}
}
return false;
}
public static Class<?> convertPrimitiveToWrapperType(Class<?> primitive) {
for (Object[] primitiveArrayType : PRIMITIVE_ARRAY_TYPES) {
if (primitiveArrayType[PRIMITIVE_TYPE_INDEX] == primitive) {
return (Class<?>) primitiveArrayType[WRAPPER_TYPE_INDEX];
}
}
return primitive;
}
public static Class<?> convertWrapperToPrimitiveType(Class<?> wrapperType) {
for (Object[] primitiveArrayType : PRIMITIVE_ARRAY_TYPES) {
if (primitiveArrayType[WRAPPER_TYPE_INDEX] == wrapperType) {
return (Class<?>) primitiveArrayType[PRIMITIVE_TYPE_INDEX];
}
}
return wrapperType;
}
/**
* Checks if the type is a numeric type.
*
* @param type the data type.
* @return true if it is numeric type including all subclasses of Number, double, int, float, short and long.
*/
public static boolean isNumericType(Class<?> type) {
return type != null && (Number.class.isAssignableFrom(type)
|| type == double.class
|| type == int.class
|| type == float.class
|| type == short.class
|| type == long.class);
}
/**
* Checks if the type is an integer type.
*
* @param type the data type.
* @return true if it is numeric type including all subclasses of Integer or int.
*/
public static boolean isIntegerType(Class<?> type) {
return type != null && (Integer.class.isAssignableFrom(type)
|| type == int.class);
}
/**
* Checks if the type is a long type.
*
* @param type the data type.
* @return true if it is numeric type including all subclasses of Long or long.
*/
public static boolean isLongType(Class<?> type) {
return type != null && (Long.class.isAssignableFrom(type)
|| type == long.class);
}
/**
* Checks if the type is a BigDecimal type.
*
* @param type the data type.
* @return true if it is numeric type including all subclasses of BigDecimal.
*/
public static boolean isBigDecimalType(Class<?> type) {
return type != null && BigDecimal.class.isAssignableFrom(type);
}
/**
* Checks if the type is a string type.
*
* @param type the data type.
* @return true if it is numeric type including all subclasses of String.
*/
public static boolean isStringType(Class<?> type) {
return type != null && (String.class.isAssignableFrom(type));
}
/**
* Checks if the type is a boolean type.
*
* @param type the data type.
* @return true if it is a boolean
*/
public static boolean isBooleanType(Class<?> type) {
return type != null && (Boolean.class.isAssignableFrom(type) || type == boolean.class);
}
/**
* Checks if the type is a temporal type such as Date, Calendar, long or double that can be used to represent date
* or time.
*
* @param type the data type.
* @return true if it is temporal type including all subclasses.
*/
public static boolean isTemporalType(Class<?> type) {
return type != null && (Date.class.isAssignableFrom(type) || Calendar.class.isAssignableFrom(type)
|| type == double.class
|| type == long.class);
}
/**
* Checks if the type is a type that can be visualized such as color, image or icon.
*
* @param type the data type.
* @return true if it is visual type including all subclasses.
*/
public static boolean isVisualType(Class<?> type) {
return type != null && (Color.class.isAssignableFrom(type) || Icon.class.isAssignableFrom(type) || Image.class.isAssignableFrom(type));
}
}