/*
* Copyright 2004-2012 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.faces.webflow;
import java.util.ArrayList;
import java.util.List;
import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.ExpressionFactory;
import javax.el.FunctionMapper;
import javax.el.VariableMapper;
import org.springframework.binding.expression.el.DefaultELResolver;
import org.springframework.binding.expression.el.ELContextFactory;
import org.springframework.binding.expression.el.ELExpressionParser;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.expression.el.ActionMethodELResolver;
import org.springframework.webflow.expression.el.FlowResourceELResolver;
import org.springframework.webflow.expression.el.ImplicitFlowVariableELResolver;
import org.springframework.webflow.expression.el.RequestContextELResolver;
import org.springframework.webflow.expression.el.ScopeSearchingELResolver;
import org.springframework.webflow.expression.el.SpringBeanWebFlowELResolver;
/**
* A JSF-specific ExpressionParser that allows beans managed by either JSF, Spring, or Web Flow to be referenced in
* expressions in the FlowDefinition.
*
* @author Jeremy Grelle
*/
public class JsfManagedBeanAwareELExpressionParser extends ELExpressionParser {
public JsfManagedBeanAwareELExpressionParser(ExpressionFactory expressionFactory) {
super(expressionFactory);
putContextFactory(RequestContext.class, new RequestContextELContextFactory());
}
private static class RequestContextELContextFactory implements ELContextFactory {
public ELContext getELContext(Object target) {
RequestContext context = (RequestContext) target;
List<ELResolver> customResolvers = new ArrayList<ELResolver>();
customResolvers.add(new RequestContextELResolver(context));
customResolvers.add(new FlowResourceELResolver(context));
customResolvers.add(new ImplicitFlowVariableELResolver(context));
customResolvers.add(new ScopeSearchingELResolver(context));
customResolvers.add(new SpringBeanWebFlowELResolver(context));
customResolvers.add(new ActionMethodELResolver());
customResolvers.add(new JsfManagedBeanResolver());
ELResolver resolver = new DefaultELResolver(customResolvers);
return new WebFlowELContext(resolver);
}
}
private static class WebFlowELContext extends ELContext {
private final ELResolver resolver;
public WebFlowELContext(ELResolver resolver) {
this.resolver = resolver;
}
public ELResolver getELResolver() {
return this.resolver;
}
public FunctionMapper getFunctionMapper() {
return null;
}
public VariableMapper getVariableMapper() {
return null;
}
}
}