• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mybatis / mybatis-3 / 2686

01 Feb 2025 09:55PM UTC coverage: 87.093% (-0.1%) from 87.217%
2686

Pull #3379

github

web-flow
Merge c97c5c598 into 3d71c862a
Pull Request #3379: Resolve type handler based on `java.lang.reflect.Type` instead of `Class` and respect runtime JDBC type

3825 of 4663 branches covered (82.03%)

515 of 579 new or added lines in 36 files covered. (88.95%)

28 existing lines in 6 files now uncovered.

9912 of 11381 relevant lines covered (87.09%)

0.87 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.72
/src/main/java/org/apache/ibatis/reflection/wrapper/BeanWrapper.java
1
/*
2
 *    Copyright 2009-2025 the original author or authors.
3
 *
4
 *    Licensed under the Apache License, Version 2.0 (the "License");
5
 *    you may not use this file except in compliance with the License.
6
 *    You may obtain a copy of the License at
7
 *
8
 *       https://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 *    Unless required by applicable law or agreed to in writing, software
11
 *    distributed under the License is distributed on an "AS IS" BASIS,
12
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 *    See the License for the specific language governing permissions and
14
 *    limitations under the License.
15
 */
16
package org.apache.ibatis.reflection.wrapper;
17

18
import java.lang.reflect.Type;
19
import java.util.List;
20
import java.util.Map.Entry;
21

22
import org.apache.ibatis.reflection.ExceptionUtil;
23
import org.apache.ibatis.reflection.MetaClass;
24
import org.apache.ibatis.reflection.MetaObject;
25
import org.apache.ibatis.reflection.ReflectionException;
26
import org.apache.ibatis.reflection.SystemMetaObject;
27
import org.apache.ibatis.reflection.factory.ObjectFactory;
28
import org.apache.ibatis.reflection.invoker.Invoker;
29
import org.apache.ibatis.reflection.property.PropertyTokenizer;
30

31
/**
32
 * @author Clinton Begin
33
 */
34
public class BeanWrapper extends BaseWrapper {
35

36
  private final Object object;
37
  private final MetaClass metaClass;
38

39
  public BeanWrapper(MetaObject metaObject, Object object) {
40
    super(metaObject);
1✔
41
    this.object = object;
1✔
42
    this.metaClass = MetaClass.forClass(object.getClass(), metaObject.getReflectorFactory());
1✔
43
  }
1✔
44

45
  @Override
46
  public Object get(PropertyTokenizer prop) {
47
    if (prop.hasNext()) {
1✔
48
      return getChildValue(prop);
1✔
49
    } else if (prop.getIndex() != null) {
1✔
50
      return getCollectionValue(prop, resolveCollection(prop, object));
1✔
51
    } else {
52
      return getBeanProperty(prop, object);
1✔
53
    }
54
  }
55

56
  @Override
57
  public void set(PropertyTokenizer prop, Object value) {
58
    if (prop.hasNext()) {
1✔
59
      setChildValue(prop, value);
1✔
60
    } else if (prop.getIndex() != null) {
1✔
61
      setCollectionValue(prop, resolveCollection(prop, object), value);
1✔
62
    } else {
63
      setBeanProperty(prop, object, value);
1✔
64
    }
65
  }
1✔
66

67
  @Override
68
  public String findProperty(String name, boolean useCamelCaseMapping) {
69
    return metaClass.findProperty(name, useCamelCaseMapping);
1✔
70
  }
71

72
  @Override
73
  public String[] getGetterNames() {
74
    return metaClass.getGetterNames();
1✔
75
  }
76

77
  @Override
78
  public String[] getSetterNames() {
79
    return metaClass.getSetterNames();
1✔
80
  }
81

82
  @Override
83
  public Class<?> getSetterType(String name) {
84
    PropertyTokenizer prop = new PropertyTokenizer(name);
1✔
85
    if (!prop.hasNext()) {
1✔
86
      return metaClass.getSetterType(name);
1✔
87
    }
88
    MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName());
1✔
89
    if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
1✔
90
      return metaClass.getSetterType(name);
1✔
91
    }
92
    return metaValue.getSetterType(prop.getChildren());
1✔
93
  }
94

95
  @Override
96
  public Entry<Type, Class<?>> getGenericSetterType(String name) {
97
    PropertyTokenizer prop = new PropertyTokenizer(name);
1✔
98
    if (prop.hasNext()) {
1✔
99
      MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName());
1✔
100
      if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
1✔
101
        return metaClass.getGenericSetterType(name);
1✔
102
      } else {
103
        return metaValue.getGenericSetterType(prop.getChildren());
1✔
104
      }
105
    } else {
106
      return metaClass.getGenericSetterType(name);
1✔
107
    }
108
  }
109

110
  @Override
111
  public Class<?> getGetterType(String name) {
112
    PropertyTokenizer prop = new PropertyTokenizer(name);
1✔
113
    if (!prop.hasNext()) {
1✔
114
      return metaClass.getGetterType(name);
1✔
115
    }
116
    MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName());
1✔
117
    if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
1✔
118
      return metaClass.getGetterType(name);
1✔
119
    }
120
    return metaValue.getGetterType(prop.getChildren());
1✔
121
  }
122

123
  @Override
124
  public Entry<Type, Class<?>> getGenericGetterType(String name) {
125
    PropertyTokenizer prop = new PropertyTokenizer(name);
1✔
126
    if (prop.hasNext()) {
1✔
127
      MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName());
1✔
128
      if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
1!
NEW
129
        return metaClass.getGenericGetterType(name);
×
130
      } else {
131
        return metaValue.getGenericGetterType(prop.getChildren());
1✔
132
      }
133
    } else {
134
      return metaClass.getGenericGetterType(name);
1✔
135
    }
136
  }
137

138
  @Override
139
  public boolean hasSetter(String name) {
140
    PropertyTokenizer prop = new PropertyTokenizer(name);
1✔
141
    if (!prop.hasNext()) {
1✔
142
      return metaClass.hasSetter(name);
1✔
143
    }
144
    if (metaClass.hasSetter(prop.getIndexedName())) {
1✔
145
      MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName());
1✔
146
      if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
1✔
147
        return metaClass.hasSetter(name);
1✔
148
      }
149
      return metaValue.hasSetter(prop.getChildren());
1✔
150
    }
151
    return false;
1✔
152
  }
153

154
  @Override
155
  public boolean hasGetter(String name) {
156
    PropertyTokenizer prop = new PropertyTokenizer(name);
1✔
157
    if (!prop.hasNext()) {
1✔
158
      return metaClass.hasGetter(name);
1✔
159
    }
160
    if (metaClass.hasGetter(prop.getIndexedName())) {
1✔
161
      MetaObject metaValue = metaObject.metaObjectForProperty(prop.getIndexedName());
1✔
162
      if (metaValue == SystemMetaObject.NULL_META_OBJECT) {
1✔
163
        return metaClass.hasGetter(name);
1✔
164
      }
165
      return metaValue.hasGetter(prop.getChildren());
1✔
166
    }
167
    return false;
1✔
168
  }
169

170
  @Override
171
  public MetaObject instantiatePropertyValue(String name, PropertyTokenizer prop, ObjectFactory objectFactory) {
172
    MetaObject metaValue;
173
    Class<?> type = getSetterType(prop.getName());
1✔
174
    try {
175
      Object newObject = objectFactory.create(type);
1✔
176
      metaValue = MetaObject.forObject(newObject, metaObject.getObjectFactory(), metaObject.getObjectWrapperFactory(),
1✔
177
          metaObject.getReflectorFactory());
1✔
178
      set(prop, newObject);
1✔
179
    } catch (Exception e) {
×
180
      throw new ReflectionException("Cannot set value of property '" + name + "' because '" + name
×
181
          + "' is null and cannot be instantiated on instance of " + type.getName() + ". Cause:" + e.toString(), e);
×
182
    }
1✔
183
    return metaValue;
1✔
184
  }
185

186
  private Object getBeanProperty(PropertyTokenizer prop, Object object) {
187
    try {
188
      Invoker method = metaClass.getGetInvoker(prop.getName());
1✔
189
      try {
190
        return method.invoke(object, NO_ARGUMENTS);
1✔
191
      } catch (Throwable t) {
×
192
        throw ExceptionUtil.unwrapThrowable(t);
×
193
      }
194
    } catch (RuntimeException e) {
1✔
195
      throw e;
1✔
196
    } catch (Throwable t) {
×
197
      throw new ReflectionException(
×
198
          "Could not get property '" + prop.getName() + "' from " + object.getClass() + ".  Cause: " + t.toString(), t);
×
199
    }
200
  }
201

202
  private void setBeanProperty(PropertyTokenizer prop, Object object, Object value) {
203
    try {
204
      Invoker method = metaClass.getSetInvoker(prop.getName());
1✔
205
      Object[] params = { value };
1✔
206
      try {
207
        method.invoke(object, params);
1✔
208
      } catch (Throwable t) {
1✔
209
        throw ExceptionUtil.unwrapThrowable(t);
1✔
210
      }
1✔
211
    } catch (Throwable t) {
1✔
212
      throw new ReflectionException("Could not set property '" + prop.getName() + "' of '" + object.getClass()
1✔
213
          + "' with value '" + value + "' Cause: " + t.toString(), t);
1✔
214
    }
1✔
215
  }
1✔
216

217
  @Override
218
  public boolean isCollection() {
219
    return false;
1✔
220
  }
221

222
  @Override
223
  public void add(Object element) {
224
    throw new UnsupportedOperationException();
1✔
225
  }
226

227
  @Override
228
  public <E> void addAll(List<E> list) {
229
    throw new UnsupportedOperationException();
1✔
230
  }
231

232
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc