From e405b861b9521f5ea38c5402203a5b05988f9de2 Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期三, 04 十二月 2024 10:47:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/BeanUtilForVCI.java |  204 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 204 insertions(+), 0 deletions(-)

diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/BeanUtilForVCI.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/BeanUtilForVCI.java
index 0fc3a78..379ad98 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/BeanUtilForVCI.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/BeanUtilForVCI.java
@@ -1,12 +1,17 @@
 package com.vci.starter.web.util;
 
+import com.vci.starter.web.toolmodel.DateConverter;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.cglib.core.Converter;
 import org.springframework.util.CollectionUtils;
 
 import java.lang.reflect.Field;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 /**
  * 涓氬姟绫诲瀷涓撶敤鐨勬嫹璐濆伐鍏凤紝杩欎釜鏄祬鎷疯礉锛�
@@ -19,6 +24,11 @@
      * 鏃ュ織
      */
     private static Logger logger = LoggerFactory.getLogger(BeanUtilForVCI.class);
+
+    /**
+     * 瀛樻斁鎷疯礉瀵硅薄鐨勭紦瀛�
+     */
+    private static final ConcurrentMap<String, BeanCopier> beanCopierMap = new ConcurrentHashMap<>();
 
     /**
      * 鎷疯礉鏁版嵁
@@ -255,4 +265,198 @@
         }
     }
 
+    /**
+     * 鑾峰彇绫绘嫹璐濈殑瀵硅薄
+     * @param source 婧愬璞$被
+     * @param target 鐩爣瀵硅薄绫�
+     * @param useConverter 鏄惁浣跨敤杞崲鍣�
+     * @return 鎷疯礉瀵硅薄
+     */
+    public static BeanCopier getBeanCopier(Class<?> source, Class<?> target,boolean useConverter) {
+        String beanCopierKey = generateBeanKey(source, target);
+        if (beanCopierMap.containsKey(beanCopierKey)) {
+            return beanCopierMap.get(beanCopierKey);
+        } else {
+            BeanCopier beanCopier = BeanCopier.create(source, target, useConverter);
+            beanCopierMap.putIfAbsent(beanCopierKey, beanCopier);
+        }
+        return beanCopierMap.get(beanCopierKey);
+    }
+
+    /**
+     * 鐢熸垚涓や釜绫荤殑key,鐢ㄤ簬瀛樻斁鍒扮紦瀛樹箣涓�
+     * @param source 婧愬璞$被鍨�
+     * @param target 鐩爣瀵硅薄绫�
+     * @return 涓や釜绫荤殑鍚嶇О杩炴帴鍒颁竴璧峰悗鐨勫悕瀛�
+     */
+    public static String generateBeanKey(Class<?> source, Class<?> target) {
+        return source.getName() + "@" + target.getName();
+    }
+
+    /**
+     * 涓や釜瀵硅薄涔嬮棿杞崲
+     * @param source 婧愬璞�
+     * @param target 鐩爣瀵硅薄
+     * @param useConvert 鏄惁浣跨敤榛樿鐨勮浆鎹㈠櫒锛岃鍦ㄥ嚭鐜板睘鎬у悕绉扮浉鍚岃�岀被鍨嬩笉鍚岋紝鎴栬�呮湁瀵硅薄绫诲瀷锛岄泦鍚堝睘鎬ф椂鎵嶈浆鎹�
+     */
+    public static void convert(Object source,Object target,boolean useConvert){
+        if(source != null && target !=null){
+            BeanCopier beanCopier = getBeanCopier(source.getClass(),target.getClass(),useConvert);
+            beanCopier.copy(source,target,useConvert?new DeepCopyConverter(target):null);
+        }
+    }
+
+    /**
+     * 涓や釜瀵硅薄涔嬮棿杞崲
+     * @param source 婧愬璞�
+     * @param target 鐩爣瀵硅薄
+     * @return 鐩爣瀵硅薄
+     */
+    public static void convert(Object source,Object target){
+        convert(source,target,true);
+    }
+
+    /**
+     * 娣卞害鎷疯礉杞崲鍣�
+     */
+    public static class DeepCopyConverter implements Converter {
+
+        /**
+         * 鐩爣瀵硅薄
+         */
+        private Object target;
+
+        /**
+         * 鏋勯�犳柟娉�
+         * @param target 鐩爣瀵硅薄
+         */
+        public DeepCopyConverter(Object target) {
+            this.target = target;
+        }
+
+        /**
+         * 鎵ц鎷疯礉
+         * @param value 婧愬璞$殑灞炴�х殑鍊�
+         * @param targetClazz 鐩爣瀵硅薄鐨勫睘鎬х殑绫�
+         * @param methodName set鏂规硶鐨勫悕瀛�
+         * @return 杞崲鍚庣殑鍊�
+         */
+        @Override
+        public Object convert(Object value, Class targetClazz, Object methodName) {
+            if (value instanceof List) {
+                List values = (List) value;
+                List retList = new ArrayList<>(values.size());
+                copyForCollection(values,retList,methodName);
+                return retList;
+            } else if(value instanceof Set){
+                Set values = (Set) value;
+                Set retSet = new HashSet<>();
+                copyForCollection(values,retSet,methodName);
+            } else if(value instanceof Vector){
+                Vector values = (Vector)value;
+                Vector retVector = new Vector();
+                copyForCollection(values,retVector,methodName);
+            }else if (value instanceof Map) {
+                Map values = (Map)value;
+                Map retMap = new HashMap();
+                for (final Object key : values.keySet()) {
+                    Object mapValue = values.get(key);
+                    String tempFieldName = methodName.toString().replace("set",
+                            "");
+                    String fieldName = tempFieldName.substring(0, 1)
+                            .toLowerCase() + tempFieldName.substring(1);
+                    Class clazz = ClassUtilForVCI.getElementType(target.getClass(), fieldName);
+                    Object targetAttr = null;
+                    try{
+                        targetAttr = clazz.newInstance();
+                    }catch (Throwable e){
+                        //鏂扮殑瀵硅薄鐨勫睘鎬у垵濮嬪寲鍑洪敊
+                    }
+                    BeanUtilForVCI.convert(mapValue, targetAttr);
+                    retMap.put(key,targetAttr);
+                }
+            } else if (!ClassUtilForVCI.isPrimitive(targetClazz)) {
+                //杩欎釜鏄璞$被鍨�
+                Object targetAttr = null;
+                try{
+                    targetAttr = targetClazz.newInstance();
+                }catch (Throwable e){
+                    //鏂扮殑瀵硅薄灞炴�у垵濮嬪寲鍑洪敊
+                }
+                BeanUtilForVCI.convert(value, targetAttr);
+                return targetAttr;
+            }
+            if(value instanceof Boolean && targetClazz.equals(String.class)){
+                //浠巄oolean鎷疯礉鍒皊tring
+                return String.valueOf(value);
+            }
+            if(value instanceof String && (targetClazz.equals(Boolean.class)
+                    || targetClazz.equals(boolean.class))){
+                //浠嶴tring鎷疯礉鍒癰oolean
+                if("true".equalsIgnoreCase((String)value)){
+                    return true;
+                }else{
+                    return false;
+                }
+            }
+            if(value instanceof Date && targetClazz.equals(String.class)){
+                //鏃堕棿鏍煎紡
+                return VciDateUtil.date2Str((Date)value,VciDateUtil.DateTimeMillFormat);
+            }
+            if(value instanceof String && targetClazz.equals(Date.class)){
+                //杞崲
+                DateConverter dateConverter = new DateConverter();
+                dateConverter.setAsText((String)value);
+                return dateConverter.getValue();
+            }
+            return value;
+        }
+
+        /**
+         * 澶勭悊闆嗗悎灞炴��
+         * @param sourceCollection 婧愬璞′腑闆嗗悎灞炴�х殑鐨勫��
+         * @param targetCollection 鐩爣瀵硅薄鐨勯泦鍚堝睘鎬х殑鍊�
+         * @param methodName setter鏂规硶
+         */
+        private void copyForCollection(Collection<?> sourceCollection,Collection targetCollection,Object methodName){
+            for (final Object source : sourceCollection) {
+                if(source instanceof Collection){
+                    List<Object> targetValues = new ArrayList<>();
+                    copyForCollection((Collection<?>)source,targetValues,methodName);
+                    targetCollection.add(targetValues);
+                }else if(source instanceof Map){
+                    String tempFieldName = methodName.toString().replace("set",
+                            "");
+                    String fieldName = tempFieldName.substring(0, 1)
+                            .toLowerCase() + tempFieldName.substring(1);
+                    Class clazz = ClassUtilForVCI.getElementType(target.getClass(), fieldName);
+                    Object targetAttr = null;
+                    try {
+                        targetAttr = clazz.newInstance();
+                    } catch (Throwable e) {
+                        //鏂扮殑瀵硅薄鐨勫睘鎬у垵濮嬪寲鍑洪敊
+                    }
+                    Map map = (Map) source;
+                    for(Object key : map.keySet()){
+                        VciBaseUtil.setValueForField(key.toString(),targetAttr,VciBaseUtil.getStringValueFromObject(map.get(key)));
+                    }
+                    targetCollection.add(targetAttr);
+                }else  {
+                    String tempFieldName = methodName.toString().replace("set",
+                            "");
+                    String fieldName = tempFieldName.substring(0, 1)
+                            .toLowerCase() + tempFieldName.substring(1);
+                    Class clazz = ClassUtilForVCI.getElementType(target.getClass(), fieldName);
+                    Object targetAttr = null;
+                    try {
+                        targetAttr = clazz.newInstance();
+                    } catch (Throwable e) {
+                        //鏂扮殑瀵硅薄鐨勫睘鎬у垵濮嬪寲鍑洪敊
+                    }
+                    BeanUtilForVCI.convert(source, targetAttr);
+                    targetCollection.add(targetAttr);
+                }
+            }
+        }
+    }
 }

--
Gitblit v1.9.3