001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.camel.builder;
018
019 import java.util.Map;
020
021 import org.apache.camel.Expression;
022 import org.apache.camel.builder.xml.Namespaces;
023 import org.apache.camel.model.ExpressionNode;
024 import org.apache.camel.model.language.ExpressionType;
025 import org.apache.camel.model.language.MethodCallExpression;
026 import org.apache.camel.model.language.XPathExpression;
027 import org.apache.camel.model.language.XQueryExpression;
028
029 /**
030 * Represents an expression clause within the DSL which when the expression is complete
031 * the clause continues to another part of the DSL
032 *
033 * @version $Revision: 700514 $
034 */
035 public class ExpressionClause<T> extends ExpressionType {
036 private T result;
037 private String language;
038
039 public ExpressionClause(T result) {
040 this.result = result;
041 }
042
043 public static <T extends ExpressionNode> ExpressionClause<T> createAndSetExpression(T result) {
044 ExpressionClause<T> clause = new ExpressionClause<T>(result);
045 result.setExpression(clause);
046 return clause;
047 }
048
049
050 // Helper expressions
051 //-------------------------------------------------------------------------
052
053 /**
054 * Specify an {@link Expression} instance
055 */
056 public T expression(Expression expression) {
057 setExpressionValue(expression);
058 return result;
059 }
060
061 /**
062 * Specify the constant expression value
063 */
064 public T constant(Object value) {
065 return expression(ExpressionBuilder.constantExpression(value));
066 }
067
068 /**
069 * An expression of the exchange
070 */
071 public T exchange() {
072 return expression(ExpressionBuilder.exchangeExpression());
073 }
074
075 /**
076 * An expression of an inbound message
077 */
078 public T inMessage() {
079 return expression(ExpressionBuilder.inMessageExpression());
080 }
081
082 /**
083 * An expression of an inbound message
084 */
085 public T outMessage() {
086 return expression(ExpressionBuilder.outMessageExpression());
087 }
088
089 /**
090 * An expression of an inbound message body
091 */
092 public T body() {
093 return expression(ExpressionBuilder.bodyExpression());
094 }
095
096 /**
097 * An expression of an inbound message body converted to the expected type
098 */
099 public T body(Class expectedType) {
100 return expression(ExpressionBuilder.bodyExpression(expectedType));
101 }
102
103 /**
104 * An expression of an outbound message body
105 */
106 public T outBody() {
107 return expression(ExpressionBuilder.outBodyExpression());
108 }
109
110 /**
111 * An expression of an outbound message body converted to the expected type
112 */
113 public T outBody(Class expectedType) {
114 return expression(ExpressionBuilder.outBodyExpression(expectedType));
115 }
116
117 /**
118 * An expression of an inbound message header of the given name
119 */
120 public T header(String name) {
121 return expression(ExpressionBuilder.headerExpression(name));
122 }
123
124 /**
125 * An expression of the inbound headers
126 */
127 public T headers() {
128 return expression(ExpressionBuilder.headersExpression());
129 }
130
131 /**
132 * An expression of an outbound message header of the given name
133 */
134 public T outHeader(String name) {
135 return expression(ExpressionBuilder.outHeaderExpression(name));
136 }
137
138 /**
139 * An expression of the outbound headers
140 */
141 public T outHeaders() {
142 return expression(ExpressionBuilder.outHeadersExpression());
143 }
144
145 /**
146 * An expression of an exchange property of the given name
147 */
148 public T property(String name) {
149 return expression(ExpressionBuilder.propertyExpression(name));
150 }
151
152 /**
153 * An expression of the exchange properties
154 */
155 public T properties() {
156 return expression(ExpressionBuilder.propertiesExpression());
157 }
158
159 // Languages
160 //-------------------------------------------------------------------------
161
162 /**
163 * Evaluates an expression using the
164 * <a href="http://activemq.apache.org/camel/bean-language.html>bean language</a>
165 * which basically means the bean is invoked to determine the expression value.
166 *
167 * @param bean the name of the bean looked up the registry
168 * @return the builder to continue processing the DSL
169 */
170 public T method(String bean) {
171 MethodCallExpression expression = new MethodCallExpression(bean);
172 setExpressionType(expression);
173 return result;
174 }
175
176 /**
177 * Evaluates an expression using the
178 * <a href="http://activemq.apache.org/camel/bean-language.html>bean language</a>
179 * which basically means the bean is invoked to determine the expression value.
180 *
181 * @param bean the name of the bean looked up the registry
182 * @param method the name of the method to invoke on the bean
183 * @return the builder to continue processing the DSL
184 */
185 public T method(String bean, String method) {
186 MethodCallExpression expression = new MethodCallExpression(bean, method);
187 setExpressionType(expression);
188 return result;
189 }
190
191 /**
192 * Evaluates a <a href="http://activemq.apache.org/camel/beanshell.html">BeanShell expression</a>
193 *
194 * @param text the expression to be evaluated
195 * @return the builder to continue processing the DSL
196 * @deprecated use language(<tt>"beanshell"</tt>, text). Will be removed in Camel 2.0.
197 */
198 public T beanShell(String text) {
199 return language("beanshell", text);
200 }
201
202 /**
203 * Evaluates the <a href="http://activemq.apache.org/camel/el.html">EL Language from JSP and JSF</a>
204 * using the <a href="http://activemq.apache.org/camel/juel.html">JUEL library</a>
205 *
206 * @param text the expression to be evaluated
207 * @return the builder to continue processing the DSL
208 */
209 public T el(String text) {
210 return language("el", text);
211 }
212
213 /**
214 * Evaluates a <a href="http://activemq.apache.org/camel/groovy.html">Groovy expression</a>
215 *
216 * @param text the expression to be evaluated
217 * @return the builder to continue processing the DSL
218 */
219 public T groovy(String text) {
220 return language("groovy", text);
221 }
222
223 /**
224 * Evaluates a <a href="http://activemq.apache.org/camel/java-script.html">JavaScript expression</a>
225 *
226 * @param text the expression to be evaluated
227 * @return the builder to continue processing the DSL
228 */
229 public T javaScript(String text) {
230 return language("js", text);
231 }
232
233 /**
234 * Evaluates a <a href="http://commons.apache.org/jxpath/">JXPath expression</a>
235 *
236 * @param text the expression to be evaluated
237 * @return the builder to continue processing the DSL
238 */
239 public T jxpath(String text) {
240 return language("jxpath", text);
241 }
242
243 /**
244 * Evaluates an <a href="http://activemq.apache.org/camel/ognl.html">OGNL expression</a>
245 *
246 * @param text the expression to be evaluated
247 * @return the builder to continue processing the DSL
248 */
249 public T ognl(String text) {
250 return language("ognl", text);
251 }
252
253 /**
254 * Evaluates a <a href="http://activemq.apache.org/camel/php.html">PHP expression</a>
255 *
256 * @param text the expression to be evaluated
257 * @return the builder to continue processing the DSL
258 */
259 public T php(String text) {
260 return language("php", text);
261 }
262
263 /**
264 * Evaluates a <a href="http://activemq.apache.org/camel/python.html">Python expression</a>
265 *
266 * @param text the expression to be evaluated
267 * @return the builder to continue processing the DSL
268 */
269 public T python(String text) {
270 return language("python", text);
271 }
272
273 /**
274 * Evaluates a <a href="http://activemq.apache.org/camel/ruby.html">Ruby expression</a>
275 *
276 * @param text the expression to be evaluated
277 * @return the builder to continue processing the DSL
278 */
279 public T ruby(String text) {
280 return language("ruby", text);
281 }
282
283 /**
284 * Evaluates an <a href="http://activemq.apache.org/camel/sql.html">SQL expression</a>
285 *
286 * @param text the expression to be evaluated
287 * @return the builder to continue processing the DSL
288 */
289 public T sql(String text) {
290 return language("sql", text);
291 }
292
293 /**
294 * Evaluates a <a href="http://activemq.apache.org/camel/simple.html">Simple expression</a>
295 *
296 * @param text the expression to be evaluated
297 * @return the builder to continue processing the DSL
298 */
299 public T simple(String text) {
300 return language("simple", text);
301 }
302
303 /**
304 * Evaluates an <a href="http://activemq.apache.org/camel/xpath.html">XPath expression</a>
305 *
306 * @param text the expression to be evaluated
307 * @return the builder to continue processing the DSL
308 */
309 public T xpath(String text) {
310 return language("xpath", text);
311 }
312
313 /**
314 * Evaluates an <a href="http://activemq.apache.org/camel/xpath.html">XPath expression</a>
315 * with the specified result type
316 *
317 * @param text the expression to be evaluated
318 * @param resultType the return type expected by the expressiopn
319 * @return the builder to continue processing the DSL
320 */
321 public T xpath(String text, Class resultType) {
322 XPathExpression expression = new XPathExpression(text);
323 expression.setResultType(resultType);
324 setExpressionType(expression);
325 return result;
326 }
327
328 /**
329 * Evaluates an <a href="http://activemq.apache.org/camel/xpath.html">XPath expression</a>
330 * with the specified result type and set of namespace prefixes and URIs
331 *
332 * @param text the expression to be evaluated
333 * @param resultType the return type expected by the expression
334 * @param namespaces the namespace prefix and URIs to use
335 * @return the builder to continue processing the DSL
336 */
337 public T xpath(String text, Class resultType, Namespaces namespaces) {
338 return xpath(text, resultType, namespaces.getNamespaces());
339 }
340
341 /**
342 * Evaluates an <a href="http://activemq.apache.org/camel/xpath.html">XPath expression</a>
343 * with the specified result type and set of namespace prefixes and URIs
344 *
345 * @param text the expression to be evaluated
346 * @param resultType the return type expected by the expression
347 * @param namespaces the namespace prefix and URIs to use
348 * @return the builder to continue processing the DSL
349 */
350 public T xpath(String text, Class resultType, Map<String, String> namespaces) {
351 XPathExpression expression = new XPathExpression(text);
352 expression.setResultType(resultType);
353 expression.setNamespaces(namespaces);
354 setExpressionType(expression);
355 return result;
356 }
357
358 /**
359 * Evaluates an <a href="http://activemq.apache.org/camel/xpath.html">XPath expression</a>
360 * with the specified set of namespace prefixes and URIs
361 *
362 * @param text the expression to be evaluated
363 * @param namespaces the namespace prefix and URIs to use
364 * @return the builder to continue processing the DSL
365 */
366 public T xpath(String text, Namespaces namespaces) {
367 return xpath(text, namespaces.getNamespaces());
368 }
369
370 /**
371 * Evaluates an <a href="http://activemq.apache.org/camel/xpath.html">XPath expression</a>
372 * with the specified set of namespace prefixes and URIs
373 *
374 * @param text the expression to be evaluated
375 * @param namespaces the namespace prefix and URIs to use
376 * @return the builder to continue processing the DSL
377 */
378 public T xpath(String text, Map<String, String> namespaces) {
379 XPathExpression expression = new XPathExpression(text);
380 expression.setNamespaces(namespaces);
381 setExpressionType(expression);
382 return result;
383 }
384
385 /**
386 * Evaluates an <a href="http://activemq.apache.org/camel/xquery.html">XQuery expression</a>
387 *
388 * @param text the expression to be evaluated
389 * @return the builder to continue processing the DSL
390 */
391 public T xquery(String text) {
392 return language("xquery", text);
393 }
394
395 /**
396 * Evaluates an <a href="http://activemq.apache.org/camel/xquery.html">XQuery expression</a>
397 * with the specified result type
398 *
399 * @param text the expression to be evaluated
400 * @param resultType the return type expected by the expressiopn
401 * @return the builder to continue processing the DSL
402 */
403 public T xquery(String text, Class resultType) {
404 XQueryExpression expression = new XQueryExpression(text);
405 expression.setResultType(resultType);
406 setExpressionType(expression);
407 return result;
408 }
409
410 /**
411 * Evaluates an <a href="http://activemq.apache.org/camel/xquery.html">XQuery expression</a>
412 * with the specified result type and set of namespace prefixes and URIs
413 *
414 * @param text the expression to be evaluated
415 * @param resultType the return type expected by the expression
416 * @param namespaces the namespace prefix and URIs to use
417 * @return the builder to continue processing the DSL
418 */
419 public T xquery(String text, Class resultType, Namespaces namespaces) {
420 return xquery(text, resultType, namespaces.getNamespaces());
421 }
422
423 /**
424 * Evaluates an <a href="http://activemq.apache.org/camel/xquery.html">XQuery expression</a>
425 * with the specified result type and set of namespace prefixes and URIs
426 *
427 * @param text the expression to be evaluated
428 * @param resultType the return type expected by the expression
429 * @param namespaces the namespace prefix and URIs to use
430 * @return the builder to continue processing the DSL
431 */
432 public T xquery(String text, Class resultType, Map<String, String> namespaces) {
433 XQueryExpression expression = new XQueryExpression(text);
434 expression.setResultType(resultType);
435 expression.setNamespaces(namespaces);
436 setExpressionType(expression);
437 return result;
438 }
439
440 /**
441 * Evaluates an <a href="http://activemq.apache.org/camel/xquery.html">XQuery expression</a>
442 * with the specified set of namespace prefixes and URIs
443 *
444 * @param text the expression to be evaluated
445 * @param namespaces the namespace prefix and URIs to use
446 * @return the builder to continue processing the DSL
447 */
448 public T xquery(String text, Namespaces namespaces) {
449 return xquery(text, namespaces.getNamespaces());
450 }
451
452 /**
453 * Evaluates an <a href="http://activemq.apache.org/camel/xquery.html">XQuery expression</a>
454 * with the specified set of namespace prefixes and URIs
455 *
456 * @param text the expression to be evaluated
457 * @param namespaces the namespace prefix and URIs to use
458 * @return the builder to continue processing the DSL
459 */
460 public T xquery(String text, Map<String, String> namespaces) {
461 XQueryExpression expression = new XQueryExpression(text);
462 expression.setNamespaces(namespaces);
463 setExpressionType(expression);
464 return result;
465 }
466
467 /**
468 * Evaluates a given language name with the expression text
469 *
470 * @param language the name of the language
471 * @param expression the expression in the given language
472 * @return the builder to continue processing the DSL
473 */
474 public T language(String language, String expression) {
475 setLanguage(language);
476 setExpression(expression);
477 return result;
478 }
479
480 // Properties
481 //-------------------------------------------------------------------------
482 public String getLanguage() {
483 return language;
484 }
485
486 public void setLanguage(String language) {
487 this.language = language;
488 }
489 }