1
2
3
4
5
6
7 package org.mule.module.json;
8
9 import org.mule.api.MuleMessage;
10 import org.mule.api.MuleRuntimeException;
11 import org.mule.api.expression.ExpressionEvaluator;
12 import org.mule.config.i18n.CoreMessages;
13 import org.mule.util.NumberUtils;
14
15 import java.util.ArrayList;
16 import java.util.Iterator;
17 import java.util.List;
18
19 import org.apache.commons.logging.Log;
20 import org.apache.commons.logging.LogFactory;
21 import org.codehaus.jackson.JsonNode;
22 import org.codehaus.jackson.node.ArrayNode;
23 import org.codehaus.jackson.node.ObjectNode;
24 import org.codehaus.jackson.node.ValueNode;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 public class JsonExpressionEvaluator implements ExpressionEvaluator
63 {
64
65
66
67 protected transient final Log logger = LogFactory.getLog(JsonExpressionEvaluator.class);
68
69 public Object evaluate(String expression, MuleMessage message)
70 {
71 String compareTo = null;
72 boolean not = false;
73 int start = expression.lastIndexOf("/");
74 if (start == -1)
75 {
76 start = 0;
77 }
78 int i=0;
79 if ((i = expression.indexOf("!=", start)) > -1)
80 {
81 compareTo = expression.substring(i + 2, expression.length()).trim();
82 expression = expression.substring(0, i).trim();
83 not = true;
84 }
85 else if ((i = expression.indexOf("=", start)) > -1)
86 {
87 compareTo = expression.substring(i + 1, expression.length()).trim();
88 expression = expression.substring(0, i).trim();
89 }
90
91 try
92 {
93 String json = message.getPayloadAsString();
94 JsonData data = new JsonData(json);
95 try
96 {
97 JsonNode resultNode = data.get(expression);
98 if (compareTo != null)
99 {
100 Object resultValue = resultNode.isValueNode() ? resultNode.getValueAsText() : resultNode;
101 if (compareTo.equalsIgnoreCase("null"))
102 {
103 boolean answer = resultValue == null;
104 return (not ? !answer : answer);
105 }
106 else if (resultValue instanceof Number && NumberUtils.isDigits(compareTo))
107 {
108 boolean answer = NumberUtils.createNumber(compareTo).equals(resultValue);
109 return (not ? !answer : answer);
110 }
111 else if (resultValue instanceof Boolean
112 && (compareTo.equalsIgnoreCase("true") || compareTo.equalsIgnoreCase("false")))
113 {
114 boolean answer = resultValue.equals(Boolean.valueOf(compareTo));
115 return (not ? !answer : answer);
116 }
117 else
118 {
119 boolean answer = compareTo.equals(resultValue);
120 return (not ? !answer : answer);
121 }
122 }
123 else
124 {
125 return extractResultFromNode(resultNode);
126 }
127 }
128 catch (IllegalArgumentException e)
129 {
130 if (compareTo == null)
131 {
132 logger.debug("returning null for json expression: " + expression + ": " + e.getMessage());
133 return null;
134 }
135
136 return (compareTo.equalsIgnoreCase("null")) & !not;
137 }
138 }
139 catch (Exception e)
140 {
141 throw new MuleRuntimeException(CoreMessages.failedToProcessExtractorFunction(getName() + ":" + expression), e);
142 }
143 }
144
145 protected Object extractResultFromNode(JsonNode result)
146 {
147 if (result instanceof ValueNode)
148 {
149 return result.getValueAsText();
150 }
151 if (result instanceof ObjectNode)
152 {
153 return ((ObjectNode) result).toString();
154 }
155 else if (result instanceof ArrayNode)
156 {
157 List parts = new ArrayList();
158 for (Iterator<JsonNode> i = ((JsonNode) result).getElements(); i.hasNext();)
159 {
160 JsonNode arrayNode = i.next();
161 parts.add(extractResultFromNode(arrayNode));
162 }
163 return parts;
164 }
165 else
166 {
167 return result;
168 }
169 }
170
171 public void setName(String name)
172 {
173 throw new UnsupportedOperationException("setName");
174 }
175
176 public String getName()
177 {
178 return "json";
179 }
180 }