1 /*
2 * Copyright 2009-2024 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.scripting.xmltags;
17
18 import java.lang.reflect.AccessibleObject;
19 import java.lang.reflect.Member;
20
21 import ognl.MemberAccess;
22 import ognl.OgnlContext;
23
24 import org.apache.ibatis.reflection.Reflector;
25
26 /**
27 * The {@link MemberAccess} class that based on <a href=
28 * 'https://github.com/jkuhnert/ognl/blob/OGNL_3_2_1/src/java/ognl/DefaultMemberAccess.java'>DefaultMemberAccess</a>.
29 *
30 * @author Kazuki Shimizu
31 *
32 * @since 3.5.0
33 *
34 * @see <a href=
35 * 'https://github.com/jkuhnert/ognl/blob/OGNL_3_2_1/src/java/ognl/DefaultMemberAccess.java'>DefaultMemberAccess</a>
36 * @see <a href='https://github.com/jkuhnert/ognl/issues/47'>#47 of ognl</a>
37 */
38 class OgnlMemberAccess implements MemberAccess {
39
40 private final boolean canControlMemberAccessible;
41
42 OgnlMemberAccess() {
43 this.canControlMemberAccessible = Reflector.canControlMemberAccessible();
44 }
45
46 @Override
47 public Object setup(OgnlContext context, Object target, Member member, String propertyName) {
48 Object result = null;
49 if (isAccessible(context, target, member, propertyName)) {
50 AccessibleObject accessible = (AccessibleObject) member;
51 if (!accessible.isAccessible()) {
52 result = Boolean.FALSE;
53 accessible.setAccessible(true);
54 }
55 }
56 return result;
57 }
58
59 @Override
60 public void restore(OgnlContext context, Object target, Member member, String propertyName, Object state) {
61 // Flipping accessible flag is not thread safe. See #1648
62 }
63
64 @Override
65 public boolean isAccessible(OgnlContext context, Object target, Member member, String propertyName) {
66 return canControlMemberAccessible;
67 }
68
69 }