From 2232bf93319f92e6374a0b7e5ced6b0d14d672bd Mon Sep 17 00:00:00 2001 From: Bauke Scholtz Date: Sun, 24 Mar 2024 08:37:40 -0400 Subject: [PATCH] Fix FacesServletFactory --- .../MojarraRuntimePopulator.java | 9 +++++++-- .../processor/FactoryConfigProcessor.java | 20 +++++++++++++------ .../faces/webapp/FacesServletFactoryImpl.java | 12 +++++++++-- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/impl/src/main/java/com/sun/faces/config/configpopulator/MojarraRuntimePopulator.java b/impl/src/main/java/com/sun/faces/config/configpopulator/MojarraRuntimePopulator.java index ab5a176790..16da5b2e94 100644 --- a/impl/src/main/java/com/sun/faces/config/configpopulator/MojarraRuntimePopulator.java +++ b/impl/src/main/java/com/sun/faces/config/configpopulator/MojarraRuntimePopulator.java @@ -1,10 +1,10 @@ package com.sun.faces.config.configpopulator; +import jakarta.faces.application.ApplicationConfigurationPopulator; + import org.w3c.dom.Document; import org.w3c.dom.Element; -import jakarta.faces.application.ApplicationConfigurationPopulator; - public final class MojarraRuntimePopulator extends ApplicationConfigurationPopulator { @Override public void populateApplicationConfiguration(Document toPopulate) { @@ -12,6 +12,11 @@ public void populateApplicationConfiguration(Document toPopulate) { Element faces_configElement = toPopulate.getDocumentElement(); { Element factoryElement = toPopulate.createElementNS(ns, "factory"); + { + Element faces_servlet_factoryElement = toPopulate.createElementNS(ns, "faces-servlet-factory"); + faces_servlet_factoryElement.appendChild(toPopulate.createTextNode("com.sun.faces.webapp.FacesServletFactoryImpl")); + factoryElement.appendChild(faces_servlet_factoryElement); + } { Element application_factoryElement = toPopulate.createElementNS(ns, "application-factory"); application_factoryElement.appendChild(toPopulate.createTextNode("com.sun.faces.application.ApplicationFactoryImpl")); diff --git a/impl/src/main/java/com/sun/faces/config/processor/FactoryConfigProcessor.java b/impl/src/main/java/com/sun/faces/config/processor/FactoryConfigProcessor.java index ab39eb9e68..e2f420465d 100644 --- a/impl/src/main/java/com/sun/faces/config/processor/FactoryConfigProcessor.java +++ b/impl/src/main/java/com/sun/faces/config/processor/FactoryConfigProcessor.java @@ -28,6 +28,10 @@ import java.util.logging.Level; import java.util.logging.Logger; +import jakarta.faces.FactoryFinder; +import jakarta.faces.context.FacesContext; +import jakarta.servlet.ServletContext; + import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -39,10 +43,6 @@ import com.sun.faces.context.InjectionFacesContextFactory; import com.sun.faces.util.FacesLogger; -import jakarta.faces.FactoryFinder; -import jakarta.faces.context.FacesContext; -import jakarta.servlet.ServletContext; - /** *

* This ConfigProcessor handles all elements defined under /faces-config/factory. @@ -57,6 +57,11 @@ public class FactoryConfigProcessor extends AbstractConfigProcessor { */ private static final String FACTORY = "factory"; + /** + * faces-config/factory/faces-servlet-factory + */ + private static final String FACES_SERVLET_FACTORY = "faces-servlet-factory"; + /** * /faces-config/factory/application-factory */ @@ -135,7 +140,7 @@ public class FactoryConfigProcessor extends AbstractConfigProcessor { /** * Array of Factory names for post-configuration validation. */ - private final List factoryNames = asList(FactoryFinder.APPLICATION_FACTORY, FactoryFinder.CLIENT_WINDOW_FACTORY, + private final List factoryNames = asList(FactoryFinder.FACES_SERVLET_FACTORY, FactoryFinder.APPLICATION_FACTORY, FactoryFinder.CLIENT_WINDOW_FACTORY, FactoryFinder.EXCEPTION_HANDLER_FACTORY, FactoryFinder.EXTERNAL_CONTEXT_FACTORY, FactoryFinder.FACES_CONTEXT_FACTORY, FactoryFinder.FLASH_FACTORY, FactoryFinder.LIFECYCLE_FACTORY, FactoryFinder.VIEW_DECLARATION_LANGUAGE_FACTORY, FactoryFinder.PARTIAL_VIEW_CONTEXT_FACTORY, FactoryFinder.RENDER_KIT_FACTORY, FactoryFinder.VISIT_CONTEXT_FACTORY, FactoryFinder.FACELET_CACHE_FACTORY, @@ -204,8 +209,11 @@ private void processFactories(NodeList factories, String namespace, AtomicIntege for (int c = 0, csize = children.getLength(); c < csize; c++) { Node childNode = children.item(c); switch (childNode.getLocalName()) { + case FACES_SERVLET_FACTORY: + setFactory(FactoryFinder.FACES_SERVLET_FACTORY, getNodeText(childNode)); + break; case APPLICATION_FACTORY: - int cnt = appCount.incrementAndGet(); + appCount.incrementAndGet(); setFactory(FactoryFinder.APPLICATION_FACTORY, getNodeText(childNode)); break; case EXCEPTION_HANDLER_FACTORY: diff --git a/impl/src/main/java/com/sun/faces/webapp/FacesServletFactoryImpl.java b/impl/src/main/java/com/sun/faces/webapp/FacesServletFactoryImpl.java index cc6f323cbb..e6707d019a 100644 --- a/impl/src/main/java/com/sun/faces/webapp/FacesServletFactoryImpl.java +++ b/impl/src/main/java/com/sun/faces/webapp/FacesServletFactoryImpl.java @@ -16,10 +16,13 @@ */ package com.sun.faces.webapp; +import java.util.HashMap; + +import jakarta.faces.FacesException; import jakarta.faces.webapp.FacesServletFactory; import jakarta.servlet.Servlet; import jakarta.servlet.ServletConfig; -import java.util.HashMap; +import jakarta.servlet.ServletException; /** * The implementation of the FacesServletFactory. @@ -37,8 +40,13 @@ public class FacesServletFactoryImpl extends FacesServletFactory { public Servlet getFacesServlet(ServletConfig config) { Servlet servlet = servlets.get(config); if (servlet == null) { - servlets.put(config, servlet); servlet = new FacesServletImpl(); + try { + servlet.init(config); + } catch (ServletException e) { + throw new FacesException(e); + } + servlets.put(config, servlet); } return servlet; }