1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
package com.vci.ubcs.starter.web.util;
 
 
import com.vci.ubcs.starter.web.toolmodel.DateConverter;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.cglib.core.Converter;
 
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
 
public class BeanUtil {
    private static final ConcurrentMap<String, BeanCopier> beanCopierMap = new ConcurrentHashMap();
 
    public BeanUtil() {
    }
 
    public static BeanCopier getBeanCopier(Class<?> source, Class<?> target, boolean useConverter) {
        String beanCopierKey = generateBeanKey(source, target);
        if (beanCopierMap.containsKey(beanCopierKey)) {
            return (BeanCopier)beanCopierMap.get(beanCopierKey);
        } else {
            BeanCopier beanCopier = BeanCopier.create(source, target, useConverter);
            beanCopierMap.putIfAbsent(beanCopierKey, beanCopier);
            return (BeanCopier)beanCopierMap.get(beanCopierKey);
        }
    }
 
    public static String generateBeanKey(Class<?> source, Class<?> target) {
        return source.getName() + "@" + target.getName();
    }
 
    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);
        }
 
    }
 
    public static void convert(Object source, Object target) {
        convert(source, target, true);
    }
 
    public static class DeepCopyConverter implements Converter {
        private Object target;
 
        public DeepCopyConverter(Object target) {
            this.target = target;
        }
 
        public Object convert(Object value, Class targetClazz, Object methodName) {
            if (value instanceof List) {
                List values = (List)value;
                List retList = new ArrayList(values.size());
                this.copyForCollection(values, retList, methodName);
                return retList;
            } else {
                if (value instanceof Set) {
                    Set values = (Set)value;
                    Set retSet = new HashSet();
                    this.copyForCollection(values, retSet, methodName);
                } else if (value instanceof Vector) {
                    Vector values = (Vector)value;
                    Vector retVector = new Vector();
                    this.copyForCollection(values, retVector, methodName);
                } else if (value instanceof Map) {
                    Map values = (Map)value;
                    Map retMap = new HashMap();
                    Iterator var6 = values.keySet().iterator();
 
                    while(var6.hasNext()) {
                        Object key = var6.next();
                        Object mapValue = values.get(key);
                        String tempFieldName = methodName.toString().replace("set", "");
                        String fieldName = tempFieldName.substring(0, 1).toLowerCase() + tempFieldName.substring(1);
                        Class clazz = ClassUtil.getElementType(this.target.getClass(), fieldName);
                        Object targetAttr = null;
 
                        try {
                            targetAttr = clazz.newInstance();
                        } catch (Throwable var15) {
                        }
 
                        BeanUtil.convert(mapValue, targetAttr);
                        retMap.put(key, targetAttr);
                    }
                } else if (!ClassUtil.isPrimitive(targetClazz)) {
                    Object targetAttr = null;
 
                    try {
                        targetAttr = targetClazz.newInstance();
                    } catch (Throwable var14) {
                    }
 
                    BeanUtil.convert(value, targetAttr);
                    return targetAttr;
                }
 
                if (value instanceof Boolean && targetClazz.equals(String.class)) {
                    return String.valueOf(value);
                } else if (!(value instanceof String) || !targetClazz.equals(Boolean.class) && !targetClazz.equals(Boolean.TYPE)) {
                    if (value instanceof Date && targetClazz.equals(String.class)) {
                        return VciDateUtil.date2Str((Date)value, "yyyy-MM-dd HH:mm:ss.SSS");
                    } else if (value instanceof String && targetClazz.equals(Date.class)) {
                        DateConverter dateConverter = new DateConverter();
                        dateConverter.setAsText((String)value);
                        return dateConverter.getValue();
                    } else {
                        return value;
                    }
                } else {
                    return "true".equalsIgnoreCase((String)value) ? true : false;
                }
            }
        }
 
        private void copyForCollection(Collection<?> sourceCollection, Collection targetCollection, Object methodName) {
            Iterator var4 = sourceCollection.iterator();
 
            while(true) {
                while(var4.hasNext()) {
                    Object source = var4.next();
                    if (source instanceof Collection) {
                        List<Object> targetValues = new ArrayList();
                        this.copyForCollection((Collection)source, targetValues, methodName);
                        targetCollection.add(targetValues);
                    } else {
                        String tempFieldName;
                        String fieldName;
                        Class clazz;
                        Object targetAttr;
                        if (!(source instanceof Map)) {
                            tempFieldName = methodName.toString().replace("set", "");
                            fieldName = tempFieldName.substring(0, 1).toLowerCase() + tempFieldName.substring(1);
                            clazz = ClassUtil.getElementType(this.target.getClass(), fieldName);
                            targetAttr = null;
 
                            try {
                                targetAttr = clazz.newInstance();
                            } catch (Throwable var13) {
                            }
 
                            BeanUtil.convert(source, targetAttr);
                            targetCollection.add(targetAttr);
                        } else {
                            tempFieldName = methodName.toString().replace("set", "");
                            fieldName = tempFieldName.substring(0, 1).toLowerCase() + tempFieldName.substring(1);
                            clazz = ClassUtil.getElementType(this.target.getClass(), fieldName);
                            targetAttr = null;
 
                            try {
                                targetAttr = clazz.newInstance();
                            } catch (Throwable var14) {
                            }
 
                            Map map = (Map)source;
                            Iterator var11 = map.keySet().iterator();
 
                            while(var11.hasNext()) {
                                Object key = var11.next();
                                VciBaseUtil.setValueForField(key.toString(), targetAttr, VciBaseUtil.getStringValueFromObject(map.get(key)));
                            }
 
                            targetCollection.add(targetAttr);
                        }
                    }
                }
 
                return;
            }
        }
    }
}