/* * (C) Copyright 2010 Nuxeo SA (http://nuxeo.com/) and contributors. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License * (LGPL) version 2.1 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * Contributors: * Anahide Tchertchian */ package org.nuxeo.ecm.platform.ui.web.jsf; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.el.ELContext; import javax.el.ELException; import javax.el.ExpressionFactory; import javax.faces.application.Application; import javax.faces.application.FacesMessage; import javax.faces.application.FacesMessage.Severity; import javax.faces.component.UIViewRoot; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.context.ResponseStream; import javax.faces.context.ResponseWriter; import javax.faces.render.RenderKit; import org.nuxeo.ecm.platform.el.ExpressionContext; /** * Mock faces context that can be used to resolve expressions in tests. * <p> * Usage: * * <pre> * MockFacesContext facesContext = new MockFacesContext() { * public Object evaluateExpressionGet(FacesContext context, * String expression, Class expectedType) throws ELException { * if ("#{myTestExpression}".equals(expression)) { * return myTestResult; * } * return null; * } * }; * facesContext.setCurrent(); * assertNotNull(FacesContext.getCurrentInstance()); * </pre> * * @author Anahide Tchertchian */ public class MockFacesContext extends FacesContext { protected Application app = new MockApplication(); protected Map<String, Object> variables = new HashMap<String, Object>(); protected Map<String, Object> expressions = new HashMap<String, Object>(); public void mapVariable(String key, Object value) { variables.put(key, value); } public void resetVariables() { variables.clear(); } public void mapExpression(String expr, Object res) { expressions.put(expr, res); } public void resetExpressions() { expressions.clear(); } public void setCurrent() { setCurrentInstance(this); } public void relieveCurrent() { setCurrentInstance(null); } @Override public Application getApplication() { return app; } @Override public ELContext getELContext() { ELContext ctx = new ExpressionContext(); ExpressionFactory ef = getApplication().getExpressionFactory(); for (Map.Entry<String, Object> var : variables.entrySet()) { ctx.getVariableMapper().setVariable(var.getKey(), ef.createValueExpression(var.getValue(), Object.class)); } return ctx; } protected Object evaluateExpression(FacesContext context, String expression) { if (expressions.containsKey(expression)) { return expressions.get(expression); } else { ExpressionFactory ef = context.getApplication().getExpressionFactory(); ELContext elCtx = getELContext(); return ef.createValueExpression(elCtx, expression, Object.class).getValue( elCtx); } } @Deprecated @SuppressWarnings("rawtypes") public Object evaluateExpressionGet(FacesContext context, String expression, Class expectedType) throws ELException { return evaluateExpression(context, expression); } @Override public void addMessage(String clientId, FacesMessage message) { } @Override public Iterator<String> getClientIdsWithMessages() { return null; } @Override public ExternalContext getExternalContext() { return null; } @Override public Severity getMaximumSeverity() { return null; } @Override public Iterator<FacesMessage> getMessages() { return null; } @Override public Iterator<FacesMessage> getMessages(String clientId) { return null; } @Override public RenderKit getRenderKit() { return null; } @Override public boolean getRenderResponse() { return false; } @Override public boolean getResponseComplete() { return false; } @Override public ResponseStream getResponseStream() { return null; } @Override public ResponseWriter getResponseWriter() { return null; } @Override public UIViewRoot getViewRoot() { return null; } @Override public void release() { } @Override public void renderResponse() { } @Override public void responseComplete() { } @Override public void setResponseStream(ResponseStream responseStream) { } @Override public void setResponseWriter(ResponseWriter responseWriter) { } @Override public void setViewRoot(UIViewRoot root) { } }