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.language.juel;
018
019 import javax.el.ELContext;
020 import javax.el.ExpressionFactory;
021 import javax.el.ValueExpression;
022
023 import de.odysseus.el.util.SimpleContext;
024
025 import org.apache.camel.Exchange;
026 import org.apache.camel.Message;
027 import org.apache.camel.impl.ExpressionSupport;
028
029 /**
030 * @version $Revision: $
031 */
032 public class JuelExpression extends ExpressionSupport<Exchange> {
033
034 private final String expression;
035 private final Class<?> type;
036 private ExpressionFactory expressionFactory;
037
038 public JuelExpression(String expression, Class<?> type) {
039 this.expression = expression;
040 this.type = type;
041 }
042
043 public static JuelExpression el(String expression) {
044 return new JuelExpression(expression, Object.class);
045 }
046
047 public Object evaluate(Exchange exchange) {
048 // TODO we could use caching here but then we'd have possible concurrency issues
049 // so lets assume that the provider caches
050 ELContext context = populateContext(createContext(), exchange);
051 ValueExpression valueExpression = getExpressionFactory().createValueExpression(context, expression, type);
052 return valueExpression.getValue(context);
053 }
054
055 public ExpressionFactory getExpressionFactory() {
056 if (expressionFactory == null) {
057 expressionFactory = ExpressionFactory.newInstance();
058 }
059 return expressionFactory;
060 }
061
062 public void setExpressionFactory(ExpressionFactory expressionFactory) {
063 this.expressionFactory = expressionFactory;
064 }
065
066 protected ELContext populateContext(ELContext context, Exchange exchange) {
067 setVariable(context, "exchange", exchange, Exchange.class);
068 setVariable(context, "in", exchange.getIn(), Message.class);
069 setVariable(context, "out", exchange.getOut(), Message.class);
070 return context;
071 }
072
073 protected void setVariable(ELContext context, String name, Object value, Class<?> type) {
074 ValueExpression valueExpression = getExpressionFactory().createValueExpression(value, type);
075 SimpleContext simpleContext = (SimpleContext) context;
076 simpleContext.setVariable(name, valueExpression);
077 }
078
079 /**
080 * Factory method to create the EL context
081 */
082 protected ELContext createContext() {
083 return new SimpleContext();
084 }
085
086 protected String assertionFailureMessage(Exchange exchange) {
087 return expression;
088 }
089 }