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 @Override
74 public Object evaluate(String expression, MuleMessage message)
75 {
76 String compareTo = null;
77 boolean not = false;
78 int start = expression.lastIndexOf("/");
79 if (start == -1)
80 {
81 start = 0;
82 }
83 int i=0;
84 if ((i = expression.indexOf("!=", start)) > -1)
85 {
86 compareTo = expression.substring(i + 2, expression.length()).trim();
87 expression = expression.substring(0, i).trim();
88 not = true;
89 }
90 else if ((i = expression.indexOf("=", start)) > -1)
91 {
92 compareTo = expression.substring(i + 1, expression.length()).trim();
93 expression = expression.substring(0, i).trim();
94 }
95
96 try
97 {
98 String json = message.getPayloadAsString();
99 JsonData data = new JsonData(json);
100 try
101 {
102 JsonNode resultNode = data.get(expression);
103 if (compareTo != null)
104 {
105 Object resultValue = resultNode.isValueNode() ? resultNode.getValueAsText() : resultNode;
106 if (compareTo.equalsIgnoreCase("null"))
107 {
108 boolean answer = resultValue == null;
109 return (not ? !answer : answer);
110 }
111 else if (resultValue instanceof Number && NumberUtils.isDigits(compareTo))
112 {
113 boolean answer = NumberUtils.createNumber(compareTo).equals(resultValue);
114 return (not ? !answer : answer);
115 }
116 else if (resultValue instanceof Boolean
117 && (compareTo.equalsIgnoreCase("true") || compareTo.equalsIgnoreCase("false")))
118 {
119 boolean answer = resultValue.equals(Boolean.valueOf(compareTo));
120 return (not ? !answer : answer);
121 }
122 else
123 {
124 boolean answer = compareTo.equals(resultValue);
125 return (not ? !answer : answer);
126 }
127 }
128 else
129 {
130 return extractResultFromNode(resultNode);
131 }
132 }
133 catch (IllegalArgumentException e)
134 {
135 if (compareTo == null)
136 {
137 logger.debug("returning null for json expression: " + expression + ": " + e.getMessage());
138 return null;
139 }
140
141 return (compareTo.equalsIgnoreCase("null")) & !not;
142 }
143 }
144 catch (Exception e)
145 {
146 throw new MuleRuntimeException(CoreMessages.failedToProcessExtractorFunction(getName() + ":" + expression), e);
147 }
148 }
149
150 protected Object extractResultFromNode(JsonNode result)
151 {
152 if (result instanceof ValueNode)
153 {
154 return result.getValueAsText();
155 }
156 if (result instanceof ObjectNode)
157 {
158 return ((ObjectNode) result).toString();
159 }
160 else if (result instanceof ArrayNode)
161 {
162 List<Object> parts = new ArrayList<Object>();
163 for (Iterator<JsonNode> i = result.getElements(); i.hasNext();)
164 {
165 JsonNode arrayNode = i.next();
166 parts.add(extractResultFromNode(arrayNode));
167 }
168 return parts;
169 }
170 else
171 {
172 return result;
173 }
174 }
175
176 @Override
177 public void setName(String name)
178 {
179 throw new UnsupportedOperationException("setName");
180 }
181
182 @Override
183 public String getName()
184 {
185 return "json";
186 }
187 }