19
19
20
20
import com .google .gson .JsonArray ;
21
21
import com .google .gson .JsonPrimitive ;
22
+ import org .apache .axiom .om .OMNode ;
22
23
import org .apache .synapse .SynapseConstants ;
23
24
import org .apache .synapse .util .synapse .expression .context .EvaluationContext ;
24
25
import org .apache .synapse .util .synapse .expression .exception .EvaluationException ;
@@ -54,15 +55,15 @@ public PredefinedFunctionNode(ArgumentListNode arguments, String functionName) {
54
55
}
55
56
56
57
@ Override
57
- public ExpressionResult evaluate (EvaluationContext context ) {
58
+ public ExpressionResult evaluate (EvaluationContext context , boolean isObjectValue ) {
58
59
if (arguments .isEmpty ()) {
59
60
return handleNoArgumentFunctions ();
60
61
} else if (arguments .size () == 1 ) {
61
- return handleSingleArgumentFunctions (context );
62
+ return handleSingleArgumentFunctions (context , isObjectValue );
62
63
} else if (arguments .size () == 2 ) {
63
- return handleDoubleArgumentFunctions (context );
64
+ return handleDoubleArgumentFunctions (context , isObjectValue );
64
65
} else if (arguments .size () == 3 ) {
65
- return handleTripleArgumentFunctions (context );
66
+ return handleTripleArgumentFunctions (context , isObjectValue );
66
67
}
67
68
throw new EvaluationException ("Invalid number of arguments: " + arguments .size ()
68
69
+ " provided for the function: " + functionName );
@@ -75,11 +76,11 @@ private ExpressionResult handleNoArgumentFunctions() {
75
76
throw new EvaluationException ("Invalid function: " + functionName + " with no arguments" );
76
77
}
77
78
78
- private ExpressionResult handleSingleArgumentFunctions (EvaluationContext context ) {
79
+ private ExpressionResult handleSingleArgumentFunctions (EvaluationContext context , boolean isObjectValue ) {
79
80
ExpressionResult result = null ;
80
81
// do not evaluate the source for exists function - since we need to catch the exception
81
82
if (!functionName .equals (SynapseConstants .EXISTS )) {
82
- result = arguments .get (0 ).evaluate (context );
83
+ result = arguments .get (0 ).evaluate (context , isObjectValue );
83
84
checkArguments (result , "source" );
84
85
}
85
86
switch (functionName ) {
@@ -128,13 +129,13 @@ private ExpressionResult handleSingleArgumentFunctions(EvaluationContext context
128
129
case SynapseConstants .REGISTRY :
129
130
return handleRegistryAccess (context , result , null );
130
131
case SynapseConstants .EXISTS :
131
- return handleExistsCheck (context , arguments .get (0 ));
132
+ return handleExistsCheck (context , arguments .get (0 ), isObjectValue );
132
133
case SynapseConstants .OBJECT :
133
134
return convertToObject (result );
134
135
case SynapseConstants .ARRAY :
135
136
return convertToArray (result );
136
137
case SynapseConstants .XPATH :
137
- return evaluateXPATHExpression (context , result );
138
+ return evaluateXPATHExpression (context , result , isObjectValue );
138
139
case SynapseConstants .SECRET :
139
140
return fetchSecretValue (context , result .asString ());
140
141
case SynapseConstants .NOT :
@@ -144,9 +145,9 @@ private ExpressionResult handleSingleArgumentFunctions(EvaluationContext context
144
145
}
145
146
}
146
147
147
- private ExpressionResult handleDoubleArgumentFunctions (EvaluationContext context ) {
148
- ExpressionResult source = arguments .get (0 ).evaluate (context );
149
- ExpressionResult argument1 = arguments .get (1 ).evaluate (context );
148
+ private ExpressionResult handleDoubleArgumentFunctions (EvaluationContext context , boolean isObjectValue ) {
149
+ ExpressionResult source = arguments .get (0 ).evaluate (context , isObjectValue );
150
+ ExpressionResult argument1 = arguments .get (1 ).evaluate (context , isObjectValue );
150
151
checkArguments (source , "source" );
151
152
checkArguments (argument1 , "argument1" );
152
153
switch (functionName ) {
@@ -179,10 +180,10 @@ private ExpressionResult handleDoubleArgumentFunctions(EvaluationContext context
179
180
}
180
181
}
181
182
182
- private ExpressionResult handleTripleArgumentFunctions (EvaluationContext context ) {
183
- ExpressionResult source = arguments .get (0 ).evaluate (context );
184
- ExpressionResult argument1 = arguments .get (1 ).evaluate (context );
185
- ExpressionResult argument2 = arguments .get (2 ).evaluate (context );
183
+ private ExpressionResult handleTripleArgumentFunctions (EvaluationContext context , boolean isObjectValue ) {
184
+ ExpressionResult source = arguments .get (0 ).evaluate (context , isObjectValue );
185
+ ExpressionResult argument1 = arguments .get (1 ).evaluate (context , isObjectValue );
186
+ ExpressionResult argument2 = arguments .get (2 ).evaluate (context , isObjectValue );
186
187
checkArguments (source , "source" );
187
188
checkArguments (argument1 , "argument1" );
188
189
checkArguments (argument2 , "argument2" );
@@ -573,9 +574,10 @@ private ExpressionResult handleRegistryAccess(EvaluationContext ctx, ExpressionR
573
574
+ ", propKey: " + propKey .asString ());
574
575
}
575
576
576
- private ExpressionResult handleExistsCheck (EvaluationContext context , ExpressionNode expression ) {
577
+ private ExpressionResult handleExistsCheck (EvaluationContext context , ExpressionNode expression ,
578
+ boolean isObjectValue ) {
577
579
try {
578
- ExpressionResult result = expression .evaluate (context );
580
+ ExpressionResult result = expression .evaluate (context , isObjectValue );
579
581
return result != null ? new ExpressionResult (true ) : new ExpressionResult (false );
580
582
} catch (EvaluationException e ) {
581
583
// this is the only method we are handling the exceptions
@@ -597,9 +599,15 @@ private ExpressionResult convertToArray(ExpressionResult result) {
597
599
throw new EvaluationException ("Argument cannot be converted to a JSON array" );
598
600
}
599
601
600
- private ExpressionResult evaluateXPATHExpression (EvaluationContext context , ExpressionResult expression ) {
602
+ private ExpressionResult evaluateXPATHExpression (EvaluationContext context , ExpressionResult expression ,
603
+ boolean isObjectValue ) {
601
604
try {
602
- return new ExpressionResult (context .evaluateXpathExpression (expression .asString ()));
605
+ Object result = context .evaluateXpathExpression (expression .asString (), isObjectValue );
606
+ if (isObjectValue ) {
607
+ return new ExpressionResult ((List <?>) result );
608
+ } else {
609
+ return new ExpressionResult (result .toString ());
610
+ }
603
611
} catch (JaxenException e ) {
604
612
throw new EvaluationException ("Invalid XPATH expression : " + expression .asString ());
605
613
}
0 commit comments