/**
* Copyright 2007-2010 非也
* All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License v3 as published by the Free Software
* Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with this library; if not, see http://www.gnu.org/licenses/lgpl.html.
*
*/
package org.firesoa.common.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.namespace.QName;
import org.apache.commons.lang.StringUtils;
import org.firesoa.common.schema.NameSpaces;
/**
*
* @author 非也 nychen2000@163.com
* Fire Workflow 官方网站:www.firesoa.com 或者 www.fireflow.org
*
*/
public class JavaDataTypeConvertor {
// /**
// * 将string 转换成相应的java对象,例如Integer,Float等
// *
// * @param valueAsStr
// * @param dataType
// * @param pattern
// * @return
// */
// public static Object string2Object(String valueAsStr, QName qnDataType,
// String pattern) {
// String dataType = qnDataType.toString();
//
// if (dataType == null || dataType.trim().equals("")
// || dataType.trim().equals("java:java.lang.String")) {
// return valueAsStr;
// }
// try {
// if (dataType.trim().equals("java:int")
// || dataType.trim().equals("java:java.lang.Integer")) {
// return new Integer(valueAsStr);
// } else if (dataType.trim().equals("java:long")
// || dataType.trim().equals("java:java.lang.Long")) {
// return new Long(valueAsStr);
// } else if (dataType.trim().equals("java:float")
// || dataType.trim().equals("java:java.lang.Float")) {
// return new Float(valueAsStr);
// } else if (dataType.trim().equals("java:double")
// || dataType.trim().equals("java:java.lang.Double")) {
// return new Double(valueAsStr);
// } else if (dataType.trim().equals("java:short")
// || dataType.trim().equals("java:java.lang.Short")) {
// return new Short(valueAsStr);
// } else if (dataType.trim().equals("java:byte")
// || dataType.trim().equals("java:java.lang.Byte")) {
// return new Byte(valueAsStr);
// } else if (dataType.trim().equals("java:boolean")
// || dataType.trim().equals("java:java.lang.Boolean")) {
// return new Boolean(valueAsStr);
// }
// // else if
// // (dataType.trim().equals("char")||dataType.trim().equals("java.lang.Char")){
// // return new java.lang.Character(valueAsStr);
// // }
// else if (dataType.trim().equals("java:java.util.Date")) {
// SimpleDateFormat format = new SimpleDateFormat(pattern);
// Date d = format.parse(valueAsStr);
// return d;
// }
//
// else {
// return valueAsStr;
// }
// } catch (Exception e) {
// return null;
// }
// }
public static boolean isTypeValueMatch(String dataTypeStr,Object value)
throws ClassNotFoundException{
if (value==null)return true;
if (isInt(dataTypeStr)){
if (value instanceof Integer){
return true;
}else {
return false;
}
}
else if (isShort(dataTypeStr)){
if (value instanceof Short){
return true;
}else{
return false;
}
}
else if (isLong(dataTypeStr)){
if (value instanceof Long){
return true;
}else{
return false;
}
}
else if (isByte(dataTypeStr)){
if (value instanceof Byte){
return true ;
}else {
return false;
}
}
else if (isFloat(dataTypeStr)){
if (value instanceof Float){
return true;
}else {
return false;
}
}
else if (isDouble(dataTypeStr)){
if (value instanceof Double){
return true;
}else{
return false;
}
}
else if (isBoolean(dataTypeStr)){
if (value instanceof Boolean){
return true;
}else {
return false;
}
}
else if (isChar(dataTypeStr)){
if (value instanceof java.lang.Character){
return true;
}else{
return false;
}
}else if (isString(dataTypeStr)){
if (value instanceof String){
return true;
}else{
return false;
}
} else {
Class clz = Class.forName(dataTypeStr);
if (clz.isInstance(value)) {
return true;
} else {
return false;
}
}
}
/**
* 判断是否是基本数据类型或者其包装类型; 包含String类型和java.util.Date类型
*
* @param dataTypeStr 数据类型的Java类名
* @return
*/
public static boolean isPrimaryDataType(String dataTypeStr) {
if (StringUtils.isEmpty(dataTypeStr)) {
return false;
}
String s = dataTypeStr.trim();
if (isInt(s) || isFloat(s) || isDouble(s) || isLong(s) || isShort(s)
|| isChar(s) || isBoolean(s)
|| isString(s) || isDate(s)
|| isByte(s)) {
return true;
}
return false;
}
/**
* 判断该对象是否是基本数据类型。
* @param value
* @return
*/
public static boolean isPrimaryObject(Object value){
if (value==null)return true;
String dataType = value.getClass().getName();
return isPrimaryDataType(dataType);
}
public static boolean isChar(String dataTypeStr) {
if (StringUtils.isEmpty(dataTypeStr)) {
return false;
}
String s = dataTypeStr.trim();
if (s.equals("char") || s.equals("java.lang.Character")) {
return true;
}
return false;
}
public static boolean isBoolean(String dataTypeStr) {
if (StringUtils.isEmpty(dataTypeStr)) {
return false;
}
String s = dataTypeStr.trim();
if (s.equals("boolean") || s.equals("java.lang.Boolean")) {
return true;
}
return false;
}
public static boolean isDate(String dataTypeStr){
if (StringUtils.isEmpty(dataTypeStr)) {
return false;
}
String s = dataTypeStr.trim();
if (s.equals("java.util.Date")){
return true;
}
return false;
}
public static boolean isString(String dataTypeStr){
if (StringUtils.isEmpty(dataTypeStr)) {
return false;
}
String s = dataTypeStr.trim();
if (s.equals("java.lang.String")){
return true;
}
return false;
}
public static boolean isShort(String dataTypeStr) {
if (StringUtils.isEmpty(dataTypeStr)) {
return false;
}
String s = dataTypeStr.trim();
if (s.equals("short") || s.equals("java.lang.Short")) {
return true;
}
return false;
}
public static boolean isLong(String dataTypeStr) {
if (StringUtils.isEmpty(dataTypeStr)) {
return false;
}
String s = dataTypeStr.trim();
if (s.equals("long") || s.equals("java.lang.Long")) {
return true;
}
return false;
}
public static boolean isInt(String dataTypeStr) {
if (StringUtils.isEmpty(dataTypeStr)) {
return false;
}
String s = dataTypeStr.trim();
if (s.equals("int") || s.equals("java.lang.Integer")) {
return true;
}
return false;
}
public static boolean isByte(String dateTypeStr){
if (StringUtils.isEmpty(dateTypeStr)) {
return false;
}
String s = dateTypeStr.trim();
if (s.equals("byte") || s.equals("java.lang.Byte")){
return true;
}
return false;
}
public static boolean isFloat(String dataTypeStr) {
if (StringUtils.isEmpty(dataTypeStr)) {
return false;
}
String s = dataTypeStr.trim();
if (s.equals("float") || s.equals("java.lang.Float")) {
return true;
}
return false;
}
public static boolean isDouble(String dataTypeStr) {
if (StringUtils.isEmpty(dataTypeStr)) {
return false;
}
String s = dataTypeStr.trim();
if (s.equals("double") || s.equals("java.lang.Double")) {
return true;
}
return false;
}
public static Object convertToJavaObject(QName dataType, String strValue,
String dataPattern)throws ClassNotFoundException, ClassCastException {
return dataTypeConvert(dataType,strValue,dataPattern);
}
/**
* 如果targetDataType是基本数据类型,则进行类型转换。否则检查类型是否匹配。
*
* @param targetDataType
* @param source
* @param dataPattern TODO
* @return
* @throws ClassCastException
*/
public static Object dataTypeConvert(QName targetDataType, Object source, String dataPattern)
throws ClassNotFoundException, ClassCastException {
// 类型验证和类型转换
if (targetDataType.getNamespaceURI().equals(NameSpaces.JAVA.getUri())) {
String typeClassStr = targetDataType.getLocalPart();
if (isInt(typeClassStr)) {
return convertToInt(source);
} else if (isFloat(typeClassStr)) {
return convertToFloat(source);
} else if (isDouble(typeClassStr)) {
return convertToDouble(source);
} else if (isLong(typeClassStr)) {
return convertToLong(source);
} else if (isShort(typeClassStr)) {
return convertToShort(source);
} else if (isBoolean(typeClassStr)) {
return convertToBoolean(source);
} else if (isChar(typeClassStr)) {
return convertToChar(source);
}
else if (isByte(typeClassStr)){
return convertToByte(source);
}
else if (isDate(typeClassStr)) {
if (source instanceof Date) {
return (Date) source;
} else if (source instanceof String) {
String _pattern = StringUtils.isEmpty(dataPattern) ? "yyyy-MM-dd HH:mm:ss"
: dataPattern;
SimpleDateFormat df = new SimpleDateFormat(_pattern);
try {
return df.parse((String) source);
} catch (ParseException e) {
throw new ClassCastException("Can not convert from "
+ source.getClass().getName() + " to "
+ typeClassStr + ",data patter is "
+ dataPattern);
}
} else {
throw new ClassCastException("Can not convert from "
+ source.getClass().getName() + " to "
+ typeClassStr);
}
} else if (isString(typeClassStr)) {
if (source == null) {
return source;
} else {
return source.toString();
}
} else {
Class typeClass = Class.forName(typeClassStr);
if (!typeClass.isAssignableFrom(source.getClass())) {
throw new ClassCastException("Can not convert from "
+ source.getClass().getName() + " to "
+ typeClassStr);
}
return source;
}
} else {
// 其他数据类型paramValue必须是datacontainer
// TODO 类型 验证待补充
return source;
}
}
public static Byte convertToByte(Object object)throws ClassCastException {
if (object == null)
return 0;
if (object instanceof Byte) {
return (Byte) object;
}
else if (object instanceof String && isNum((String)object)){
String s = ((String)object).trim();
if (s.equals("")){
s = "0";
}
return Byte.parseByte(s);
}
throw new ClassCastException("Can NOT convert from "
+ object.getClass().toString() + " to java.lang.Integer");
}
public static Integer convertToInt(Object object) throws ClassCastException {
if (object == null)
return 0;
if (object instanceof Integer) {
return (Integer) object;
}
if (object instanceof Double) {
return ((Double) object).intValue();
}
if (object instanceof Float) {
return ((Float) object).intValue();
}
if (object instanceof Long) {
return ((Long) object).intValue();
}
if (object instanceof Short) {
return ((Short) object).intValue();
}
if (object instanceof String && isNum((String)object)){
String s = ((String)object).trim();
if (s.equals("")){
s = "0";
}
return Integer.parseInt(s);
}
throw new ClassCastException("Can NOT convert from "
+ object.getClass().toString() + " to java.lang.Integer");
}
public static Float convertToFloat(Object object) throws ClassCastException {
if (object == null)
return null;
if (object instanceof Integer) {
return new Float((Integer) object);
}
if (object instanceof Double) {
return new Float((Double) object);
}
if (object instanceof Float) {
return ((Float) object);
}
if (object instanceof Long) {
return new Float((Long) object);
}
if (object instanceof Short) {
return new Float((Short) object);
}
if (object instanceof String && isNum((String)object)){
return Float.parseFloat((String)object);
}
throw new ClassCastException("Can NOT convert from "
+ object.getClass().toString() + " to java.lang.Float");
}
public static Double convertToDouble(Object object)
throws ClassCastException {
if (object == null)
return null;
if (object instanceof Integer) {
return new Double((Integer) object);
}
if (object instanceof Double) {
return (Double) object;
}
if (object instanceof Float) {
return new Double((Float) object);
}
if (object instanceof Long) {
return new Double((Long) object);
}
if (object instanceof Short) {
return new Double((Short) object);
}
if (object instanceof String && isNum((String)object)){
return Double.parseDouble((String)object);
}
throw new ClassCastException("Can NOT convert from "
+ object.getClass().toString() + " to java.lang.Double");
}
public static Long convertToLong(Object object) throws ClassCastException {
if (object == null)
return null;
if (object instanceof Integer) {
return new Long((Integer) object);
}
if (object instanceof Double) {
return ((Double) object).longValue();
}
if (object instanceof Float) {
return ((Float) object).longValue();
}
if (object instanceof Long) {
return (Long) object;
}
if (object instanceof Short) {
return new Long((Short) object);
}
if (object instanceof String && isNum((String)object)){
return Long.parseLong((String)object);
}
throw new ClassCastException("Can NOT convert from "
+ object.getClass().toString() + " to java.lang.Long");
}
public static Short convertToShort(Object object) throws ClassCastException {
if (object == null)
return null;
if (object instanceof Integer) {
return ((Integer) object).shortValue();
}
if (object instanceof Double) {
return ((Double) object).shortValue();
}
if (object instanceof Float) {
return ((Float) object).shortValue();
}
if (object instanceof Long) {
return ((Long) object).shortValue();
}
if (object instanceof Short) {
return (Short) object;
}
if (object instanceof String && isNum((String)object)){
return Short.parseShort((String)object);
}
throw new ClassCastException("Can NOT convert from "
+ object.getClass().toString() + " to java.lang.Short");
}
public static Boolean convertToBoolean(Object object)
throws ClassCastException {
if (object == null)
return null;
if (object instanceof Boolean) {
return (Boolean) object;
}
if (object instanceof String){
return Boolean.parseBoolean((String)object);
}
throw new ClassCastException("Can NOT convert from "
+ object.getClass().toString() + " to java.lang.Boolean");
}
public static Character convertToChar(Object object)
throws ClassCastException {
if (object == null)
return null;
if (object instanceof Character) {
return (Character) object;
}
else if (object instanceof String){
String s = ((String)object);
if (s.length()>0){
return s.charAt(0);
}
else{
return null;
}
}
throw new ClassCastException("Can NOT convert from "
+ object.getClass().toString() + " to java.lang.Character");
}
private static boolean isNum(String str){
return str.matches("^[-+]?(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$");
}
}