/* See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * Esri Inc. licenses this file to You 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 com.esri.gpt.framework.jsf; import javax.faces.FactoryFinder; import javax.faces.component.UIViewRoot; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.context.FacesContextFactory; import javax.faces.el.VariableResolver; import javax.faces.lifecycle.Lifecycle; import javax.faces.lifecycle.LifecycleFactory; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.esri.gpt.framework.context.RequestContext; import com.esri.gpt.framework.util.Val; /** * Broker for a JSF FacesContext. */ public class FacesContextBroker { // class variables ============================================================= /** Managed bean name for the faces message broker. */ private static final String NAME_MESSAGEBROKER = "MessageBroker"; /** Managed bean name for the faces page context. */ private static final String NAME_PAGECONTEXT = "PageContext"; // instance variables ========================================================== // constructors ================================================================ /** Default constructor. */ public FacesContextBroker() {} /** * Constructs a Faces context broker from the current HTTP request. * @param request the HTTP request * @param response the HTTP response */ public FacesContextBroker(HttpServletRequest request, HttpServletResponse response) { FacesContextFactory contextFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE); ServletContext servletContext = ((HttpServletRequest)request).getSession().getServletContext(); FacesContext fc = contextFactory.getFacesContext(servletContext, request, response, lifecycle); InnerFacesContext.setFacesContextAsCurrentInstance(fc); UIViewRoot view = fc.getApplication().getViewHandler().createView(fc,"/gptInnerFacesContext"); fc.setViewRoot(view); } // properties ================================================================== /** * Gets the external context associated with the current FacesContext instance. * @return the external context */ public ExternalContext getExternalContext() { FacesContext fc = getFacesContext(); if (fc != null) { return fc.getExternalContext(); } else { return null; } } /** * Gets the current FacesContext instance. * @return the FacesContext */ public FacesContext getFacesContext() { return FacesContext.getCurrentInstance(); } // methods ===================================================================== /** * Extracts the HttpServletRequest from the Faces context instance. * @return the HttpServletRequest (null if none); */ public HttpServletRequest extractHttpServletRequest() { Object o = null; ExternalContext ec = getExternalContext(); if (ec != null) o = ec.getRequest(); if ((o != null) && (o instanceof HttpServletRequest)) { return (HttpServletRequest)o; } else { return null; } } /** * Extracts the HttpServletResponse from the Faces context instance. * @return the HttpServletResponse (null if none); */ public HttpServletResponse extractHttpServletResponse() { Object o = null; ExternalContext ec = getExternalContext(); if (ec != null) o = ec.getResponse(); if ((o != null) && (o instanceof HttpServletResponse)) { return (HttpServletResponse)o; } else { return null; } } /** * Extracts the HttpSession from the Faces context instance. * @return the HttpSession (null if none); */ public HttpSession extractHttpSession() { Object o = null; ExternalContext ec = getExternalContext(); if (ec != null) o = ec.getSession(true); if ((o != null) && (o instanceof HttpSession)) { return (HttpSession)o; } else { return null; } } /** * Extract the MessageBroker from the Faces context instance. * @return the MessageBroker */ public MessageBroker extractMessageBroker() { MessageBroker broker = (MessageBroker)resolveManagedBean(NAME_MESSAGEBROKER); if (broker == null) { return new MessageBroker(); } return broker; } /** * Extract the PageContext from the Faces context instance. * @return the PageContext */ public PageContext extractPageContext() { PageContext fpc = (PageContext)resolveManagedBean(NAME_PAGECONTEXT); if (fpc == null) { return new PageContext(); } return fpc; } /** * Extract the request context from the Faces context instance. * @return the request context */ public RequestContext extractRequestContext() { return RequestContext.extract(extractHttpServletRequest()); } /** * Extracts the ServletContext from the Faces context instance. * @return the ServletContext (null if none); */ public ServletContext extractServletContext() { Object o = null; ExternalContext ec = getExternalContext(); if (ec != null) o = ec.getContext(); if ((o != null) && (o instanceof ServletContext)) { return (ServletContext)o; } else { return null; } } /** * Extracts the ServletContext from the Faces context instance. * @return the ServletContext (null if none); */ public UIViewRoot extractViewRoot() { FacesContext fc = getFacesContext(); if (fc != null) { return fc.getViewRoot(); } else { return null; } } /** * Resolves a managed bean variable. * @param managedBeanName the configured name of the managed bean * @return the located object (can be null) */ public Object resolveManagedBean(String managedBeanName) { Object oBean = null; String sn = Val.chkStr(managedBeanName); FacesContext fc = getFacesContext(); if ((sn.length() > 0) && (fc != null) && (fc.getApplication() != null)) { VariableResolver resolver = fc.getApplication().getVariableResolver(); if (resolver != null) { oBean = resolver.resolveVariable(fc,sn); } } return oBean; } private abstract static class InnerFacesContext extends FacesContext { protected static void setFacesContextAsCurrentInstance(FacesContext facesContext) { FacesContext.setCurrentInstance(facesContext); } } }