Skip to content

Commit e155f8e

Browse files
committed
Change a logic for controlling accessible member on OGNL #1258
1 parent 36b3917 commit e155f8e

File tree

4 files changed

+40
-56
lines changed

4 files changed

+40
-56
lines changed

src/main/java/org/apache/ibatis/reflection/Reflector.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private void addDefaultConstructor(Class<?> clazz) {
7777
Constructor<?>[] consts = clazz.getDeclaredConstructors();
7878
for (Constructor<?> constructor : consts) {
7979
if (constructor.getParameterTypes().length == 0) {
80-
if (canAccessPrivateMethods()) {
80+
if (canControlMemberAccessible()) {
8181
try {
8282
constructor.setAccessible(true);
8383
} catch (Exception e) {
@@ -254,7 +254,7 @@ private Class<?> typeToClass(Type src) {
254254
private void addFields(Class<?> clazz) {
255255
Field[] fields = clazz.getDeclaredFields();
256256
for (Field field : fields) {
257-
if (canAccessPrivateMethods()) {
257+
if (canControlMemberAccessible()) {
258258
try {
259259
field.setAccessible(true);
260260
} catch (Exception e) {
@@ -339,7 +339,7 @@ private void addUniqueMethods(Map<String, Method> uniqueMethods, Method[] method
339339
// if it is known, then an extended class must have
340340
// overridden a method
341341
if (!uniqueMethods.containsKey(signature)) {
342-
if (canAccessPrivateMethods()) {
342+
if (canControlMemberAccessible()) {
343343
try {
344344
currentMethod.setAccessible(true);
345345
} catch (Exception e) {
@@ -372,7 +372,13 @@ private String getSignature(Method method) {
372372
return sb.toString();
373373
}
374374

375-
private static boolean canAccessPrivateMethods() {
375+
/**
376+
* Checks whether can control member accessible.
377+
*
378+
* @return If can control member accessible, it return {@literal true}
379+
* @since 3.5.0
380+
*/
381+
public static boolean canControlMemberAccessible() {
376382
try {
377383
SecurityManager securityManager = System.getSecurityManager();
378384
if (null != securityManager) {

src/main/java/org/apache/ibatis/scripting/xmltags/OgnlMemberAccess.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
package org.apache.ibatis.scripting.xmltags;
1717

1818
import ognl.MemberAccess;
19+
import org.apache.ibatis.reflection.Reflector;
1920

2021
import java.lang.reflect.AccessibleObject;
2122
import java.lang.reflect.Member;
22-
import java.lang.reflect.Modifier;
2323
import java.util.Map;
2424

2525
/**
@@ -35,6 +35,12 @@
3535
*/
3636
class OgnlMemberAccess implements MemberAccess {
3737

38+
private final boolean canControlMemberAccessible;
39+
40+
OgnlMemberAccess() {
41+
this.canControlMemberAccessible = Reflector.canControlMemberAccessible();
42+
}
43+
3844
@Override
3945
public Object setup(Map context, Object target, Member member, String propertyName) {
4046
Object result = null;
@@ -58,7 +64,7 @@ public void restore(Map context, Object target, Member member, String propertyNa
5864

5965
@Override
6066
public boolean isAccessible(Map context, Object target, Member member, String propertyName) {
61-
return Modifier.isPublic(member.getModifiers());
67+
return canControlMemberAccessible;
6268
}
6369

6470
}

src/test/java/org/apache/ibatis/submitted/member_access/CreateDB.sql

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/test/java/org/apache/ibatis/submitted/member_access/MemberAccessTest.java

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package org.apache.ibatis.submitted.member_access;
1717

1818
import java.io.Reader;
19-
import java.sql.Connection;
2019
import java.util.HashMap;
2120
import java.util.Map;
2221

@@ -26,7 +25,6 @@
2625
import org.apache.ibatis.annotations.Results;
2726
import org.apache.ibatis.annotations.Select;
2827
import org.apache.ibatis.io.Resources;
29-
import org.apache.ibatis.jdbc.ScriptRunner;
3028
import org.apache.ibatis.session.SqlSession;
3129
import org.apache.ibatis.session.SqlSessionFactory;
3230
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
@@ -49,14 +47,6 @@ public static void setUp() throws Exception {
4947
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
5048
sqlSessionFactory.getConfiguration().addMapper(Mapper.class);
5149
}
52-
try (SqlSession session = sqlSessionFactory.openSession();
53-
Connection conn = session.getConnection();
54-
Reader reader = Resources
55-
.getResourceAsReader("org/apache/ibatis/submitted/member_access/CreateDB.sql")) {
56-
ScriptRunner runner = new ScriptRunner(conn);
57-
runner.setLogWriter(null);
58-
runner.runScript(reader);
59-
}
6050
}
6151

6252
@Test
@@ -87,15 +77,15 @@ public void parameterMappingAndResultAutoMappingUsingOgnl() {
8777
Params params = new Params();
8878
Bean bean = mapper.resultAutoMappingUsingOgnl(params);
8979

90-
assertEquals(params.privateField, bean.privateField);
91-
assertEquals(params.packagePrivateField, bean.packagePrivateField);
92-
assertEquals(params.protectedField, bean.protectedField);
93-
assertEquals(params.publicField, bean.publicField);
94-
assertEquals(params.getPrivateProperty(), bean.properties.get("privateProperty"));
95-
assertEquals(params.getPackagePrivateProperty(),
80+
assertEquals(params.privateField + "%", bean.privateField);
81+
assertEquals(params.packagePrivateField + "%", bean.packagePrivateField);
82+
assertEquals(params.protectedField + "%", bean.protectedField);
83+
assertEquals(params.publicField + "%", bean.publicField);
84+
assertEquals(params.getPrivateProperty() + "%", bean.properties.get("privateProperty"));
85+
assertEquals(params.getPackagePrivateProperty() + "%",
9686
bean.properties.get("packagePrivateProperty"));
97-
assertEquals(params.getProtectedProperty(), bean.properties.get("protectedProperty"));
98-
assertEquals(params.getPublicProperty(), bean.properties.get("publicProperty"));
87+
assertEquals(params.getProtectedProperty() + "%", bean.properties.get("protectedProperty"));
88+
assertEquals(params.getPublicProperty() + "%", bean.properties.get("publicProperty"));
9989
}
10090
}
10191

@@ -217,17 +207,23 @@ interface Mapper {
217207
// @formatter:off
218208
"<script>"
219209

220-
,"<bind name=\"publicFieldValue\" value=\"_parameter.publicField\" />"
221-
,"<bind name=\"publicPropertyValue\" value=\"_parameter.publicProperty\" />"
210+
,"<bind name=\"privateFieldValue\" value=\"_parameter.privateField + '%'\" />"
211+
,"<bind name=\"packagePrivateFieldValue\" value=\"_parameter.packagePrivateField + '%'\" />"
212+
,"<bind name=\"protectedFieldValue\" value=\"_parameter.protectedField + '%'\" />"
213+
,"<bind name=\"publicFieldValue\" value=\"_parameter.publicField + '%'\" />"
214+
,"<bind name=\"privatePropertyValue\" value=\"_parameter.privateProperty + '%'\" />"
215+
,"<bind name=\"packagePrivatePropertyValue\" value=\"_parameter.packagePrivateProperty + '%'\" />"
216+
,"<bind name=\"protectedPropertyValue\" value=\"_parameter.getProtectedProperty() + '%'\" />"
217+
,"<bind name=\"publicPropertyValue\" value=\"_parameter.publicProperty + '%'\" />"
222218

223219
,"SELECT"
224-
,"#{privateField} as privateField"
225-
,",#{packagePrivateField} as packagePrivateField"
226-
,",#{protectedField} as protectedField"
220+
,"#{privateFieldValue} as privateField"
221+
,",#{packagePrivateFieldValue} as packagePrivateField"
222+
,",#{protectedFieldValue} as protectedField"
227223
,",#{publicFieldValue} as publicField"
228-
,",#{privateProperty} as privateProperty"
229-
,",#{packagePrivateProperty} as packagePrivateProperty"
230-
,",#{protectedProperty} as protectedProperty"
224+
,",#{privatePropertyValue} as privateProperty"
225+
,",#{packagePrivatePropertyValue} as packagePrivateProperty"
226+
,",#{protectedPropertyValue} as protectedProperty"
231227
,",#{publicPropertyValue} as publicProperty"
232228

233229
,"FROM"

0 commit comments

Comments
 (0)