/*
* Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software;Designed and Developed mainly by many Chinese
* opensource volunteers. you can redistribute it and/or modify it under the
* terms of the GNU General Public License version 2 only, as published by the
* Free Software Foundation.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Any questions about this component can be directed to it's project Web address
* https://code.google.com/p/opencloudb/.
*
*/
package org.hx.rainbow.common.util;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sf.cglib.beans.BeanCopier;
import net.sf.cglib.beans.BeanMap;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.hx.rainbow.common.exception.AppException;
/**
* 操作javaBean工具类
*
* @author hx
*
*/
public class JavaBeanUtil {
/**
* 高性能map to bean
* @param bean 转换的bean对象
* @param map
* @param allowEmptyString string类型中是否允许""赋值
* @author huangxin
*/
public static void map2bean(Object bean, Map<String,Object> map,boolean allowEmptyString){
map2bean(bean,map,allowEmptyString,DateUtil.DEFAULT_DATE_PATTERN);
}
/**
* 高性能map to bean
* @param bean 转换的bean对象
* @param map
* @param allowEmptyString string类型中是否允许""赋值
* @param dataFormat 如果map中有日期转换为bean中String,需要转为相应格式 如:yyyy-MM-dd HH:mm:ss
* @author huangxin
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void map2bean(Object bean, Map<String,Object> map,boolean allowEmptyString,String dataFormat){
if(bean == null || map == null){
return ;
}
Class beanClass = bean.getClass();
if(CglibUitl.getInstance().isCglib(beanClass)){
BeanMap beanMap = BeanMap.create(bean);
beanClass = beanClass.getSuperclass();
Map<String,Class> filedMap = getFileds(beanClass);
for(Map.Entry<String,Object> entry : map.entrySet()){
try {
Object value = entry.getValue();
String key = entry.getKey();
if(value == null){
continue;
}
if(value.toString().trim().length() == 0 && allowEmptyString){
continue;
}
if(filedMap.containsKey(key)){
Class clazz = filedMap.get(key);
changeObject(beanMap,key,value,clazz,dataFormat);
}
} catch (Exception e) {
e.printStackTrace();
}
}
bean = beanMap.getBean();
return;
}
Method[] methods = beanClass.getMethods();
for (Method method : methods){
try
{
if (method.getName().startsWith("set"))
{
String field = method.getName();
field = field.substring(field.indexOf("set") + 3);
field = field.toLowerCase().charAt(0) + field.substring(1);
Object o = map.get(field);
if(o == null){
continue;
}
if(o instanceof String){
if(o.toString().trim().length() == 0 && allowEmptyString){
continue;
}
method.invoke(bean, new Object[]{o});
}else{
method.invoke(bean, new Object[]{o});
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private static void changeObject(Map<String,Object> map,String key,Object value,Class clazz,String dataFormat)throws ParseException{
if(value instanceof String){
String valueStr = (String)value;
if(clazz.isEnum()){
map.put(key, Enum.valueOf(clazz, valueStr));
}else if(clazz == Date.class){
SimpleDateFormat sdf = new SimpleDateFormat(DateUtil.DEFAULT_DATE_PATTERN);
Date date = sdf.parse(valueStr);
map.put(key,date);
}else if(clazz == Integer.class){
map.put(key,Integer.valueOf(valueStr));
}else if(clazz == BigDecimal.class){
map.put(key,new BigDecimal(valueStr));
}else if(clazz == Boolean.class){
map.put(key,new Boolean(valueStr));
}else if(clazz == Number.class){
map.put(key,new Integer(valueStr));
}else if (clazz == int.class){
map.put(key, Integer.parseInt(valueStr));
}else{
map.put(key, valueStr);
}
}else if(value instanceof Integer){
Integer valueInt = (Integer)value;
if(clazz == String.class){
map.put(key,valueInt.toString());
}else if(clazz == Date.class){
map.put(key,new Date(valueInt));
}else{
map.put(key,valueInt);
}
}else if(value instanceof Boolean){
Boolean valueBoolean = (Boolean)value;
if(clazz == String.class){
map.put(key,valueBoolean.toString());
}else {
map.put(key,valueBoolean);
}
}else if(value instanceof Date){
Date valueDate = (Date)value;
if(clazz == String.class){
SimpleDateFormat sdf = new SimpleDateFormat(dataFormat);
map.put(key,sdf.format(valueDate));
}else{
map.put(key,valueDate);
}
}else if(value instanceof BigDecimal){
BigDecimal valueBigDecimal = (BigDecimal)value;
if(clazz == String.class){
map.put(key,valueBigDecimal.toPlainString());
}else if(clazz == Integer.class){
map.put(key,valueBigDecimal.toBigInteger());
}else{
map.put(key,valueBigDecimal);
}
}else{
map.put(key,value);
}
}
@SuppressWarnings("rawtypes")
private static Map<String,Class> getFileds(Class clazz) {
BeanInfo beanInfo = null;
try {
beanInfo = Introspector.getBeanInfo(clazz);
} catch (IntrospectionException e) {
e.printStackTrace();
}
Map<String,Class> map = new HashMap<String,Class>();
PropertyDescriptor[] pr = beanInfo.getPropertyDescriptors();
for (int i = 1; i < pr.length; i++) {
map.put(pr[i].getName(), pr[i].getPropertyType());
}
Field[] field = clazz.getDeclaredFields();
for (int i = 1; i < field.length; i++) {
map.put(field[i].getName(), field[i].getType());
}
return map;
}
/**
* bean to map
* @param bean 转换的bean对象
* @param map
* @return map 如果bean为null 返回null
* @author huangxin
*/
@SuppressWarnings("unchecked")
public static Map<String,Object> bean2Map(Map<String,Object> map, Object bean){
if(bean == null){
return null;
}
if(map == null){
map = new HashMap<String,Object>();
}
//判断是否是cglib代理对象
if(CglibUitl.getInstance().isCglib(bean.getClass())){
Map<String,Object> maps = BeanMap.create(bean);
for(Entry<String,Object> entry : maps.entrySet()){
if(entry.getValue() == null){
continue;
}
if(entry.getKey().contains("callbacks")){
continue;
}
if(entry.getKey().contains("bstate")){
continue;
}
map.put(entry.getKey(), entry.getValue());
}
return map;
}
Method[] methods = bean.getClass().getMethods();
for (Method method : methods){
try
{
if (method.getName().startsWith("get"))
{
String field = method.getName();
field = field.substring(field.indexOf("get") + 3);
field = field.toLowerCase().charAt(0) + field.substring(1);
Object o = method.invoke(bean, (Object[])null);
if(o == null){
continue;
}
if(o instanceof Date){
SimpleDateFormat sdf = new SimpleDateFormat(DateUtil.DEFAULT_DATETIME_PATTERN);
map.put(field,sdf.format(o));
}else if(o instanceof String){
String str = (String)o;
// if(Pattern.compile("[<>]+").matcher(str).find()){
// str = str.replaceAll("<", "<").replaceAll(">", ">");
// }
map.put(field,str);
}else{
map.put(field,o);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
return map;
}
/**
* 将一个对象的属性值取出来放置到Map中。Map的Key为对象属性名称
*
* @param bean
* @return
* @throws Exception
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@Deprecated
public static Map getProperties(Object bean) {
if (bean == null) {
return null;
}
Map dataMap = new HashMap();
try {
PropertyDescriptor origDescriptors[] = PropertyUtils
.getPropertyDescriptors(bean);
for (int i = 0; i < origDescriptors.length; i++) {
String name = origDescriptors[i].getName();
if (name.equals("class")) {
continue;
}
if (PropertyUtils.isReadable(bean, name)) {
Object obj = PropertyUtils.getProperty(bean, name);
if (obj == null) {
continue;
}
obj = convertValue(origDescriptors[i], obj);
dataMap.put(name, obj);
}
}// for end
} catch (Exception e) {
e.printStackTrace();
throw new AppException(e.getMessage());
}
return dataMap;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List getMapList(List beanList) {
if (beanList == null) {
return null;
}
ArrayList lstMap = new ArrayList();
Iterator iter;
try {
iter=beanList.iterator();
while(iter.hasNext()){
Object obj=iter.next();
Map map=getProperties(obj);
lstMap.add(map);
}
} catch (AppException e) {
e.printStackTrace();
throw e;
}
return lstMap;
}
private static Object convertValue(PropertyDescriptor origDescriptor,
Object obj) {
if (obj == null) {
return null;
}
if (obj.toString().trim().length() == 0) {
return null;
}
if (origDescriptor.getPropertyType() == java.util.Date.class) {
//同一个时间,第一次从界面层传过来时,obj为String类型;转化后为Date类型
if (obj instanceof Date) {
return obj;
}else{
try {
//修改 时间转换时会把带时分秒的截掉的问题 2012-5-10 张慧峰
if(obj.toString().length()>10)
obj = DateUtil.toDateTime(obj.toString());
else
obj = DateUtil.toDate(obj.toString());
} catch (Exception e) {
e.printStackTrace();
throw new AppException(e.getMessage());
}
}
}
return obj;
}
/**
* 高性能的Bean copy
* @param fromBean
* @param toBean
* @author huangxin
*/
public static void beanCopy(Object fromBean ,Object toBean){
if (fromBean == null || toBean==null) {
return;
}
BeanCopier b = BeanCopier.create(fromBean.getClass(), toBean.getClass(), false);
b.copy(fromBean, toBean, null);
}
/**
* 高性能的Bean copy
* @param fromBean
* @param toBean
* @param isNotNull 为true是fromBean的null不复制给toBean
* @author huangxin
*/
public static void beanCopy(Object fromBean ,Object toBean,boolean isNotNull){
if (fromBean == null || toBean==null) {
return;
}
if(!isNotNull){
beanCopy(fromBean,toBean);
return;
}
Map<String,Object> map = new HashMap<String,Object>();
bean2Map(map, fromBean);
map2bean(toBean, map, false);
}
/**
* 将一个bean的属性复制到另一个bean的同名属性中
* zhf 2012-5-14 [修改] 用BeanUtils.copyProperties方法copy属性出错问题
* @param fromBean
* @param toBean
*/
public static void copyProperties(Object fromBean ,Object toBean){
if (fromBean == null||toBean==null) {
return;
}
try {
// BeanUtils.copyProperties(toBean, fromBean);
PropertyDescriptor origDescriptors[] = PropertyUtils
.getPropertyDescriptors(toBean);
for (int i = 0; i < origDescriptors.length; i++) {
String name = origDescriptors[i].getName();
if (name.equals("class")) {
continue;
}
//if (PropertyUtils.isReadable(fromBean, name)||PropertyUtils.isWriteable(toBean, name)) {
if (PropertyUtils.isReadable(fromBean, name)&&PropertyUtils.isWriteable(toBean, name)) {
Object obj = PropertyUtils.getProperty(fromBean, name);
if (obj == null) {
continue;
}
obj = convertValue(origDescriptors[i], obj);
BeanUtils.copyProperty(toBean, name, obj);
}
}// for end
} catch (Exception e) {
e.printStackTrace();
throw new AppException(e.getMessage());
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List getEntityList(List mapList,Class clazz) {
if (mapList == null) {
return null;
}
ArrayList ListEntity = new ArrayList();
Iterator iter;
try {
iter = mapList.iterator();
while (iter.hasNext()) {
Map map = (Map) iter.next();
Object obj = clazz.newInstance();
map2bean(obj, map, false);
ListEntity.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
throw new AppException(e.getMessage());
}
return ListEntity;
}
public static void main(String[] args) {
String a = "123123123";
Pattern p=Pattern.compile("[<>\"]+");
Matcher m=p.matcher(a);
System.out.println(m.find());
}
}