Please open a JIRA issue and attach your changes as a unified diff patch. -Mike
On Nov 20, 2007 9:47 AM, Vorobjov, Dmitriy (DB) <[EMAIL PROTECTED]> wrote: > > > > > Guys, > > > > > > I implemented TODO "null-check for Weblogic, that tries to initialize > Servlet before ContextListener" in FacesServlet class (line 92). > > And tested it with Weblogic 10. It works fine. > > > > This is changes for MyFaces Core 1.1.5, FacesServlet class. > > > > try { > > _facesContextFactory = > (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); > > } catch (IllegalStateException e) { > > log.trace("reinit StartupServletContextListener"); > > > > //It's patch for Weblogic, that tries to initialize Servlet > before ContextListener > > ServletContext sc = servletConfig.getServletContext(); > > clearFacesInitFlag(sc); > > StartupServletContextListener.initFaces(sc); > > > > _facesContextFactory = > (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); > > } > > > > > > private void clearFacesInitFlag(ServletContext sc) { > > sc.setAttribute(StartupServletContextListener.class.getName() + > ".FACES_INIT_DONE", null); > > } > > > > Could you integrate changes in MyFaces Core 1.1.5. > > > > Here is full FacesServlet class listing (changes marked with bold): > > > > /* > > * Licensed to the Apache Software Foundation (ASF) under one > > * or more contributor license agreements. See the NOTICE file > > * distributed with this work for additional information > > * regarding copyright ownership. The ASF 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 javax.faces.webapp; > > > > import java.io.IOException; > > > > import javax.faces.FacesException; > > import javax.faces.FactoryFinder; > > import javax.faces.context.FacesContext; > > import javax.faces.context.FacesContextFactory; > > import javax.faces.lifecycle.Lifecycle; > > import javax.faces.lifecycle.LifecycleFactory; > > import javax.servlet.Servlet; > > import javax.servlet.ServletConfig; > > import javax.servlet.ServletContext; > > import javax.servlet.ServletException; > > import javax.servlet.ServletRequest; > > import javax.servlet.ServletResponse; > > import javax.servlet.http.HttpServletRequest; > > import javax.servlet.http.HttpServletResponse; > > > > import org.apache.commons.logging.Log; > > import org.apache.commons.logging.LogFactory; > > import org.apache.myfaces.webapp.StartupServletContextListener; > > > > /** > > * see Javadoc of <a > href="http://java.sun.com/j2ee/javaserverfaces/1.1_01/docs/api/index.html">JSF > Specification</a> > > * > > * @author Manfred Geiler (latest modification by $Author: vorodmi $) > > * @version $Revision: #1 $ $Date: 2007/11/16 $ > > */ > > public final class FacesServlet > > implements Servlet > > { > > private static final Log log = LogFactory.getLog(FacesServlet.class); > > public static final String CONFIG_FILES_ATTR = > "javax.faces.CONFIG_FILES"; > > public static final String LIFECYCLE_ID_ATTR = > "javax.faces.LIFECYCLE_ID"; > > > > private static final String SERVLET_INFO = "FacesServlet of the MyFaces > API implementation"; > > private ServletConfig _servletConfig; > > private FacesContextFactory _facesContextFactory; > > private Lifecycle _lifecycle; > > > > public FacesServlet() > > { > > super(); > > } > > > > public void destroy() > > { > > _servletConfig = null; > > _facesContextFactory = null; > > _lifecycle = null; > > if(log.isTraceEnabled()) log.trace("destroy"); > > } > > > > public ServletConfig getServletConfig() > > { > > return _servletConfig; > > } > > > > public String getServletInfo() > > { > > return SERVLET_INFO; > > } > > > > private String getLifecycleId() > > { > > String lifecycleId = > _servletConfig.getServletContext().getInitParameter(LIFECYCLE_ID_ATTR); > > return lifecycleId != null ? lifecycleId : > LifecycleFactory.DEFAULT_LIFECYCLE; > > } > > > > public void init(ServletConfig servletConfig) > > throws ServletException > > { > > if(log.isTraceEnabled()) log.trace("init begin"); > > _servletConfig = servletConfig; > > try { > > _facesContextFactory = > (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); > > } catch (IllegalStateException e) { > > log.trace("reinit StartupServletContextListener"); > > > > //It's patch for Weblogic, that tries to initialize Servlet > before ContextListener > > ServletContext sc = servletConfig.getServletContext(); > > clearFacesInitFlag(sc); > > StartupServletContextListener.initFaces(sc); > > > > _facesContextFactory = > (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); > > } > > > > //Javadoc says: Lifecycle instance is shared across multiple > simultaneous requests, it must be implemented in a thread-safe manner. > > //So we can acquire it here once: > > LifecycleFactory lifecycleFactory = > (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); > > _lifecycle = lifecycleFactory.getLifecycle(getLifecycleId()); > > if(log.isTraceEnabled()) log.trace("init end"); > > } > > > > private void clearFacesInitFlag(ServletContext sc) { > > sc.setAttribute(StartupServletContextListener.class.getName() + > ".FACES_INIT_DONE", null); > > } > > > > public void service(ServletRequest request, > > ServletResponse response) > > throws IOException, > > ServletException > > { > > > > HttpServletRequest httpRequest = ((HttpServletRequest) request); > > String pathInfo = httpRequest.getPathInfo(); > > > > // if it is a prefix mapping ... > > if (pathInfo != null > > && (pathInfo.startsWith("/WEB-INF") || pathInfo > > .startsWith("/META-INF"))) > > { > > StringBuffer buffer = new StringBuffer(); > > > > buffer.append(" Someone is trying to access a secure resource : > ").append(pathInfo); > > buffer.append("\n remote address is > ").append(httpRequest.getRemoteAddr()); > > buffer.append("\n remote host is > ").append(httpRequest.getRemoteHost()); > > buffer.append("\n remote user is > ").append(httpRequest.getRemoteUser()); > > buffer.append("\n request URI is > ").append(httpRequest.getRequestURI()); > > > > log.warn(buffer.toString()); > > > > // Why does RI return a 404 and not a 403, SC_FORBIDDEN ? > > > > ((HttpServletResponse) response) > > .sendError(HttpServletResponse.SC_NOT_FOUND); > > return; > > } > > > > if(log.isTraceEnabled()) log.trace("service begin"); > > FacesContext facesContext > > = > _facesContextFactory.getFacesContext(_servletConfig.getServletContext(), > > request, > > response, > > _lifecycle); > > try { > > _lifecycle.execute(facesContext); > > _lifecycle.render(facesContext); > > } > > catch (Throwable e) > > { > > if (e instanceof IOException) > > { > > throw (IOException)e; > > } > > else if (e instanceof ServletException) > > { > > throw (ServletException)e; > > } > > else if (e.getMessage() != null) > > { > > throw new ServletException(e.getMessage(), e); > > } > > else > > { > > throw new ServletException(e); > > } > > } > > finally > > { > > facesContext.release(); > > } > > if(log.isTraceEnabled()) log.trace("service end"); > > } > > } > > > > Best regards, > > Dmitry Vorobjov > > > > Senior developer > > DB ODC, LUXOFT, > > IBS Group of Companies > > http://www.luxoft.com > >