1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.apache.ibatis.scripting.xmltags;
17
18 import java.util.Map;
19 import java.util.concurrent.ConcurrentHashMap;
20
21 import ognl.Ognl;
22 import ognl.OgnlException;
23
24 import org.apache.ibatis.builder.BuilderException;
25
26
27
28
29
30
31
32
33 public final class OgnlCache {
34
35 private static final OgnlMemberAccess MEMBER_ACCESS = new OgnlMemberAccess();
36 private static final OgnlClassResolver CLASS_RESOLVER = new OgnlClassResolver();
37 private static final Map<String, Object> expressionCache = new ConcurrentHashMap<>();
38
39 private OgnlCache() {
40
41 }
42
43 public static Object getValue(String expression, Object root) {
44 try {
45 Map context = Ognl.createDefaultContext(root, MEMBER_ACCESS, CLASS_RESOLVER, null);
46 return Ognl.getValue(parseExpression(expression), context, root);
47 } catch (OgnlException e) {
48 throw new BuilderException("Error evaluating expression '" + expression + "'. Cause: " + e, e);
49 }
50 }
51
52 private static Object parseExpression(String expression) throws OgnlException {
53 Object node = expressionCache.get(expression);
54 if (node == null) {
55 node = Ognl.parseExpression(expression);
56 expressionCache.put(expression, node);
57 }
58 return node;
59 }
60
61 }