001 package org.apache.myfaces.tobago.servlet; 002 003 /* 004 * Licensed to the Apache Software Foundation (ASF) under one or more 005 * contributor license agreements. See the NOTICE file distributed with 006 * this work for additional information regarding copyright ownership. 007 * The ASF licenses this file to You under the Apache License, Version 2.0 008 * (the "License"); you may not use this file except in compliance with 009 * the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, software 014 * distributed under the License is distributed on an "AS IS" BASIS, 015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 016 * See the License for the specific language governing permissions and 017 * limitations under the License. 018 */ 019 020 import org.apache.commons.logging.Log; 021 import org.apache.commons.logging.LogFactory; 022 023 import javax.faces.FactoryFinder; 024 import javax.faces.application.Application; 025 import javax.faces.application.NavigationHandler; 026 import javax.faces.application.ViewHandler; 027 import javax.faces.component.UIViewRoot; 028 import javax.faces.context.FacesContext; 029 import javax.faces.context.FacesContextFactory; 030 import javax.faces.lifecycle.Lifecycle; 031 import javax.faces.lifecycle.LifecycleFactory; 032 import javax.servlet.ServletException; 033 import javax.servlet.http.HttpServlet; 034 import javax.servlet.http.HttpServletRequest; 035 import javax.servlet.http.HttpServletResponse; 036 import java.io.IOException; 037 038 public abstract class NonFacesRequestServlet extends HttpServlet { 039 040 private static final long serialVersionUID = -7448621953821447997L; 041 042 private static final Log LOG = LogFactory.getLog(NonFacesRequestServlet.class); 043 044 protected void service(HttpServletRequest request, 045 HttpServletResponse response) throws ServletException, 046 IOException { 047 048 LifecycleFactory lFactory = (LifecycleFactory) 049 FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); 050 Lifecycle lifecycle = 051 lFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE); 052 FacesContextFactory fcFactory = (FacesContextFactory) 053 FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); 054 FacesContext facesContext = 055 fcFactory.getFacesContext(getServletContext(), request, response, lifecycle); 056 try { 057 Application application = facesContext.getApplication(); 058 ViewHandler viewHandler = application.getViewHandler(); 059 String viewId = getFromViewId(); 060 UIViewRoot view = viewHandler.createView(facesContext, viewId); 061 facesContext.setViewRoot(view); 062 063 // ExternalContext externalContext = facesContext.getExternalContext(); 064 // externalContext.getRequestMap().put("com.sun.faces.INVOCATION_PATH", "/faces"); 065 066 // invoke application 067 String outcome = invokeApplication(facesContext); 068 069 if (facesContext.getResponseComplete()) { 070 return; 071 } 072 if (LOG.isDebugEnabled()) { 073 LOG.debug("outcome = '" + outcome + "'"); 074 } 075 NavigationHandler navigationHandler = application.getNavigationHandler(); 076 navigationHandler.handleNavigation(facesContext, null, outcome); 077 lifecycle.render(facesContext); 078 } finally { 079 facesContext.release(); 080 } 081 } 082 083 public abstract String invokeApplication(FacesContext facesContext); 084 085 /** 086 * will be called to initilize the first ViewRoot, 087 * may be overwritten by extended classes 088 */ 089 public String getFromViewId() { 090 return ""; 091 } 092 }