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