/*
* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.seam.mock;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.el.ELContext;
import javax.faces.FactoryFinder;
import javax.faces.application.Application;
import javax.faces.application.ApplicationFactory;
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 javax.faces.render.RenderKitFactory;
import org.jboss.seam.el.EL;
/**
* @author Gavin King
* @author <a href="mailto:theute@jboss.org">Thomas Heute</a>
*/
public class MockFacesContext extends FacesContext
{
private UIViewRoot viewRoot;// = new UIViewRoot();
private final Map<FacesMessage, String> messages = new LinkedHashMap<FacesMessage, String>();
private ExternalContext externalContext;
private ResponseWriter responseWriter;
private RenderKitFactory renderKitFactory;
private ELContext elContext;
public MockFacesContext(ExternalContext externalContext, Application application)
{
this.externalContext = externalContext;
this.application = application;
}
// Create a MockFacesContext using a ApplicationFactory to get the
// Application
public MockFacesContext(ExternalContext externalContext)
{
application = ((ApplicationFactory) FactoryFinder
.getFactory(FactoryFinder.APPLICATION_FACTORY)).getApplication();
renderKitFactory = (RenderKitFactory) FactoryFinder
.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
this.externalContext = externalContext;
}
private Application application;
@Override
public Application getApplication()
{
return application;
}
@Override
public Iterator getClientIdsWithMessages()
{
return messages.values().iterator();
}
@Override
public ExternalContext getExternalContext()
{
return externalContext;
}
@Override
public Severity getMaximumSeverity()
{
Severity max = null;
for (FacesMessage msg : messages.keySet())
{
if (max == null || msg.getSeverity().compareTo(max) > 0)
{
max = msg.getSeverity();
}
}
return max;
}
@Override
public Iterator getMessages()
{
return messages.keySet().iterator();
}
@Override
public Iterator getMessages(String clientId)
{
List list = new ArrayList();
for (Map.Entry<FacesMessage, String> entry : messages.entrySet())
{
String messageId = entry.getValue();
if ( idsAreEqual(clientId, messageId) )
{
list.add(entry.getKey());
}
}
return list.iterator();
}
private boolean idsAreEqual(String clientId, String messageId)
{
return (clientId==null && messageId==null) ||
(clientId!=null && clientId.equals(messageId));
}
@Override
public RenderKit getRenderKit()
{
if (getViewRoot() == null || getViewRoot().getRenderKitId() == null)
{
return MockRenderKit.INSTANCE;
}
else
{
return renderKitFactory.getRenderKit(this, getViewRoot().getRenderKitId());
}
}
private boolean renderResponse;
@Override
public boolean getRenderResponse()
{
return renderResponse;
}
private boolean responseComplete;
@Override
public boolean getResponseComplete()
{
return responseComplete;
}
@Override
public ResponseStream getResponseStream()
{
throw new UnsupportedOperationException();
}
@Override
public void setResponseStream(ResponseStream stream)
{
throw new UnsupportedOperationException();
}
@Override
public ResponseWriter getResponseWriter()
{
return responseWriter;
}
@Override
public void setResponseWriter(ResponseWriter writer)
{
responseWriter = writer;
}
@Override
public UIViewRoot getViewRoot()
{
return viewRoot;
}
@Override
public void setViewRoot(UIViewRoot vr)
{
viewRoot = vr;
}
@Override
public void addMessage(String clientId, FacesMessage msg)
{
messages.put(msg, clientId);
}
@Override
public void release()
{
setCurrentInstance(null);
}
@Override
public void renderResponse()
{
renderResponse = true;
}
@Override
public void responseComplete()
{
responseComplete = true;
}
public MockFacesContext setCurrent()
{
setCurrentInstance(this);
return this;
}
public MockFacesContext createViewRoot()
{
viewRoot = new UIViewRoot();
viewRoot.setRenderKitId(getApplication().getViewHandler().calculateRenderKitId(this));
return this;
}
@Override
public ELContext getELContext()
{
if (elContext == null)
{
elContext = EL.createELContext(EL.EL_CONTEXT, getApplication().getELResolver());
elContext.putContext(FacesContext.class, this);
}
return elContext;
}
}