package org.springframework.roo.model;
import static org.springframework.roo.model.JavaType.DOUBLE_OBJECT;
import static org.springframework.roo.model.JavaType.DOUBLE_PRIMITIVE;
import static org.springframework.roo.model.JavaType.FLOAT_OBJECT;
import static org.springframework.roo.model.JavaType.FLOAT_PRIMITIVE;
import static org.springframework.roo.model.JavaType.INT_OBJECT;
import static org.springframework.roo.model.JavaType.INT_PRIMITIVE;
import static org.springframework.roo.model.JavaType.LONG_OBJECT;
import static org.springframework.roo.model.JavaType.LONG_PRIMITIVE;
import static org.springframework.roo.model.JavaType.SHORT_OBJECT;
import static org.springframework.roo.model.JavaType.SHORT_PRIMITIVE;
import java.beans.PropertyEditorSupport;
import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Ref;
import java.sql.Struct;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import javax.annotation.PostConstruct;
import org.apache.commons.lang3.Validate;
/**
* Constants for JDK {@link JavaType}s. Use them in preference to creating new
* instances of these types.
*
* @author Alan Stewart
* @since 1.2.0
*/
public final class JdkJavaType {
// java.sql
public static final JavaType ARRAY = new JavaType(Array.class);
// java.util
public static final JavaType ARRAY_LIST = new JavaType(ArrayList.class);
public static final JavaType ARRAYS = new JavaType(Arrays.class);
// java.math
public static final JavaType BIG_DECIMAL = new JavaType(BigDecimal.class);
public static final JavaType BIG_INTEGER = new JavaType(BigInteger.class);
public static final JavaType BLOB = new JavaType(Blob.class);
// java.io
public static final JavaType BYTE_ARRAY_INPUT_STREAM = new JavaType(ByteArrayInputStream.class);
public static final JavaType CALENDAR = new JavaType(Calendar.class);
public static final JavaType CLOB = new JavaType(Clob.class);
public static final JavaType COLLECTION = new JavaType(Collection.class);
public static final JavaType DATE = new JavaType(Date.class);
// java.text
public static final JavaType DATE_FORMAT = new JavaType(DateFormat.class);
// java.lang
public static final JavaType EXCEPTION = new JavaType(Exception.class);
public static final JavaType GREGORIAN_CALENDAR = new JavaType(GregorianCalendar.class);
public static final JavaType HASH_SET = new JavaType(HashSet.class);
public static final JavaType ITERATOR = new JavaType(Iterator.class);
public static final JavaType ILLEGAL_STATE_EXCEPTION = new JavaType(IllegalStateException.class);
private static final List<String> javaLangSimpleTypeNames = new ArrayList<String>();
private static final List<String> javaLangTypes = new ArrayList<String>();
public static final JavaType LIST = new JavaType(List.class);
public static final JavaType MAP = new JavaType(Map.class);
// javax.annotation
public static final JavaType POST_CONSTRUCT = new JavaType(PostConstruct.class);
// java.beans
public static final JavaType PROPERTY_EDITOR_SUPPORT = new JavaType(PropertyEditorSupport.class);
public static final JavaType RANDOM = new JavaType(Random.class);
public static final JavaType REF = new JavaType(Ref.class);
// java.security
public static final JavaType SECURE_RANDOM = new JavaType(SecureRandom.class);
public static final JavaType SERIALIZABLE = new JavaType(Serializable.class);
public static final JavaType SET = new JavaType(Set.class);
public static final JavaType SIMPLE_DATE_FORMAT = new JavaType(SimpleDateFormat.class);
public static final JavaType STRING_BUILDER = new JavaType(StringBuilder.class);
public static final JavaType STRUCT = new JavaType(Struct.class);
public static final JavaType SUPPRESS_WARNINGS = new JavaType(SuppressWarnings.class);
// java.sql
public static final JavaType TIMESTAMP = new JavaType(Timestamp.class);
public static final JavaType UNSUPPORTED_ENCODING_EXCEPTION = new JavaType(
UnsupportedEncodingException.class);
public static final JavaType LOCALE = new JavaType(Locale.class);
// Static methods
static {
javaLangSimpleTypeNames.add("Appendable");
javaLangSimpleTypeNames.add("CharSequence");
javaLangSimpleTypeNames.add("Cloneable");
javaLangSimpleTypeNames.add("Comparable");
javaLangSimpleTypeNames.add("Iterable");
javaLangSimpleTypeNames.add("Readable");
javaLangSimpleTypeNames.add("Runnable");
javaLangSimpleTypeNames.add("Boolean");
javaLangSimpleTypeNames.add("Byte");
javaLangSimpleTypeNames.add("Character");
javaLangSimpleTypeNames.add("Class");
javaLangSimpleTypeNames.add("ClassLoader");
javaLangSimpleTypeNames.add("Compiler");
javaLangSimpleTypeNames.add("Double");
javaLangSimpleTypeNames.add("Enum");
javaLangSimpleTypeNames.add("Float");
javaLangSimpleTypeNames.add("InheritableThreadLocal");
javaLangSimpleTypeNames.add("Integer");
javaLangSimpleTypeNames.add("Long");
javaLangSimpleTypeNames.add("Math");
javaLangSimpleTypeNames.add("Number");
javaLangSimpleTypeNames.add("Object");
javaLangSimpleTypeNames.add("Package");
javaLangSimpleTypeNames.add("Process");
javaLangSimpleTypeNames.add("ProcessBuilder");
javaLangSimpleTypeNames.add("Runtime");
javaLangSimpleTypeNames.add("RuntimePermission");
javaLangSimpleTypeNames.add("SecurityManager");
javaLangSimpleTypeNames.add("Short");
javaLangSimpleTypeNames.add("StackTraceElement");
javaLangSimpleTypeNames.add("StrictMath");
javaLangSimpleTypeNames.add("String");
javaLangSimpleTypeNames.add("StringBuilder");
javaLangSimpleTypeNames.add("StringBuilder");
javaLangSimpleTypeNames.add("System");
javaLangSimpleTypeNames.add("Thread");
javaLangSimpleTypeNames.add("ThreadGroup");
javaLangSimpleTypeNames.add("ThreadLocal");
javaLangSimpleTypeNames.add("Throwable");
javaLangSimpleTypeNames.add("Void");
javaLangSimpleTypeNames.add("ArithmeticException");
javaLangSimpleTypeNames.add("ArrayIndexOutOfBoundsException");
javaLangSimpleTypeNames.add("ArrayStoreException");
javaLangSimpleTypeNames.add("ClassCastException");
javaLangSimpleTypeNames.add("ClassNotFoundException");
javaLangSimpleTypeNames.add("CloneNotSupportedException");
javaLangSimpleTypeNames.add("EnumConstantNotPresentException");
javaLangSimpleTypeNames.add("Exception");
javaLangSimpleTypeNames.add("IllegalAccessException");
javaLangSimpleTypeNames.add("IllegalArgumentException");
javaLangSimpleTypeNames.add("IllegalMonitorStateException");
javaLangSimpleTypeNames.add("IllegalStateException");
javaLangSimpleTypeNames.add("IllegalThreadStateException");
javaLangSimpleTypeNames.add("IndexOutOfBoundsException");
javaLangSimpleTypeNames.add("InstantiationException");
javaLangSimpleTypeNames.add("InterruptedException");
javaLangSimpleTypeNames.add("NegativeArraySizeException");
javaLangSimpleTypeNames.add("NoSuchFieldException");
javaLangSimpleTypeNames.add("NoSuchMethodException");
javaLangSimpleTypeNames.add("NullPointerException");
javaLangSimpleTypeNames.add("NumberFormatException");
javaLangSimpleTypeNames.add("RuntimeException");
javaLangSimpleTypeNames.add("SecurityException");
javaLangSimpleTypeNames.add("StringIndexOutOfBoundsException");
javaLangSimpleTypeNames.add("TypeNotPresentException");
javaLangSimpleTypeNames.add("UnsupportedOperationException");
javaLangSimpleTypeNames.add("AbstractMethodError");
javaLangSimpleTypeNames.add("AssertionError");
javaLangSimpleTypeNames.add("ClassCircularityError");
javaLangSimpleTypeNames.add("ClassFormatError");
javaLangSimpleTypeNames.add("Error");
javaLangSimpleTypeNames.add("ExceptionInInitializerError");
javaLangSimpleTypeNames.add("IllegalAccessError");
javaLangSimpleTypeNames.add("IncompatibleClassChangeError");
javaLangSimpleTypeNames.add("InstantiationError");
javaLangSimpleTypeNames.add("InternalError");
javaLangSimpleTypeNames.add("LinkageError");
javaLangSimpleTypeNames.add("NoClassDefFoundError");
javaLangSimpleTypeNames.add("NoSuchFieldError");
javaLangSimpleTypeNames.add("NoSuchMethodError");
javaLangSimpleTypeNames.add("OutOfMemoryError");
javaLangSimpleTypeNames.add("StackOverflowError");
javaLangSimpleTypeNames.add("ThreadDeath");
javaLangSimpleTypeNames.add("UnknownError");
javaLangSimpleTypeNames.add("UnsatisfiedLinkError");
javaLangSimpleTypeNames.add("UnsupportedClassVersionError");
javaLangSimpleTypeNames.add("VerifyError");
javaLangSimpleTypeNames.add("VirtualMachineError");
}
public static boolean isDateField(final JavaType javaType) {
return javaType.equals(DATE) || javaType.equals(CALENDAR);
}
public static boolean isDecimalType(final JavaType javaType) {
return javaType.equals(BIG_DECIMAL) || isDoubleOrFloat(javaType);
}
public static boolean isDoubleOrFloat(final JavaType javaType) {
return javaType.equals(DOUBLE_OBJECT) || javaType.equals(DOUBLE_PRIMITIVE)
|| javaType.equals(FLOAT_OBJECT) || javaType.equals(FLOAT_PRIMITIVE);
}
public static boolean isIntegerType(final JavaType javaType) {
return javaType.equals(BIG_INTEGER) || javaType.equals(INT_PRIMITIVE)
|| javaType.equals(INT_OBJECT) || javaType.equals(LONG_PRIMITIVE)
|| javaType.equals(LONG_OBJECT) || javaType.equals(SHORT_PRIMITIVE)
|| javaType.equals(SHORT_OBJECT);
}
/**
* Determines whether the presented java type is in the java.lang package or
* not.
*
* @param javaType the Java type (required)
* @return whether the type is declared as part of java.lang
*/
public static boolean isPartOfJavaLang(final JavaType javaType) {
Validate.notNull(javaType, "Java type required");
if (javaLangTypes.isEmpty()) {
for (final String javaLangSimpleTypeName : javaLangSimpleTypeNames) {
javaLangTypes.add("java.lang." + javaLangSimpleTypeName);
}
}
return javaLangTypes.contains(javaType.getFullyQualifiedTypeName());
}
/**
* Determines whether the presented simple type name is part of java.lang or
* not.
*
* @param simpleTypeName the simple type name (required)
* @return whether the type is declared as part of java.lang
*/
public static boolean isPartOfJavaLang(final String simpleTypeName) {
Validate.notBlank(simpleTypeName, "Simple type name required");
return javaLangSimpleTypeNames.contains(simpleTypeName);
}
/**
* Constructor is private to prevent instantiation
*/
private JdkJavaType() {}
}