1 package org.apache.commons.ognl;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.commons.ognl.enhance.UnsupportedCompilationException;
23
24
25
26
27
28
29 class ASTEval
30 extends SimpleNode
31 {
32
33 public ASTEval( int id )
34 {
35 super( id );
36 }
37
38 public ASTEval( OgnlParser p, int id )
39 {
40 super( p, id );
41 }
42
43 protected Object getValueBody( OgnlContext context, Object source )
44 throws OgnlException
45 {
46 Object result, expr = children[0].getValue( context, source ), previousRoot = context.getRoot();
47 Node node;
48
49 source = children[1].getValue( context, source );
50 node = ( expr instanceof Node ) ? (Node) expr : (Node) Ognl.parseExpression( expr.toString() );
51 try
52 {
53 context.setRoot( source );
54 result = node.getValue( context, source );
55 }
56 finally
57 {
58 context.setRoot( previousRoot );
59 }
60 return result;
61 }
62
63 protected void setValueBody( OgnlContext context, Object target, Object value )
64 throws OgnlException
65 {
66 Object expr = children[0].getValue( context, target ), previousRoot = context.getRoot();
67 Node node;
68
69 target = children[1].getValue( context, target );
70 node = ( expr instanceof Node ) ? (Node) expr : (Node) Ognl.parseExpression( expr.toString() );
71 try
72 {
73 context.setRoot( target );
74 node.setValue( context, target, value );
75 }
76 finally
77 {
78 context.setRoot( previousRoot );
79 }
80 }
81
82 public String toGetSourceString( OgnlContext context, Object target )
83 {
84 throw new UnsupportedCompilationException( "Eval expressions not supported as native java yet." );
85 }
86
87 public String toSetSourceString( OgnlContext context, Object target )
88 {
89 throw new UnsupportedCompilationException( "Map expressions not supported as native java yet." );
90 }
91
92 public <R, P> R accept( NodeVisitor<? extends R, ? super P> visitor, P data )
93 throws OgnlException
94 {
95 return visitor.visit( this, data );
96 }
97
98 @Override
99 public boolean isEvalChain( OgnlContext context )
100 throws OgnlException
101 {
102 return true;
103 }
104 }