From 721a05eb9d71d6ba6ee4ff57555a8a4efcef50ed Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Wed, 7 Oct 2020 23:22:55 +0200 Subject: [PATCH] Fixes #5378 Setting Holders during STARTING (#5397) * Fixes #5378 Setting Holders during STARTING Holders are now started/initialized if needed by a new utility method * Fixes #5378 Setting Holders during STARTING Holders are now started/initialized if needed by a new utility method --- .../eclipse/jetty/servlet/ListenerHolder.java | 42 ++--- .../eclipse/jetty/servlet/ServletHandler.java | 57 +++--- .../servlet/ServletContextHandlerTest.java | 171 ++++++++++++++++-- 3 files changed, 203 insertions(+), 67 deletions(-) diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ListenerHolder.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ListenerHolder.java index ef10588e5d3c..42d4c0549a82 100644 --- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ListenerHolder.java +++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ListenerHolder.java @@ -19,7 +19,6 @@ package org.eclipse.jetty.servlet; import java.util.EventListener; -import javax.servlet.ServletContext; import javax.servlet.ServletException; import org.eclipse.jetty.server.handler.ContextHandler; @@ -78,33 +77,30 @@ public void doStart() throws Exception throw new IllegalStateException(msg); } - ContextHandler contextHandler = ContextHandler.getCurrentContext().getContextHandler(); - if (contextHandler != null) + ContextHandler contextHandler = null; + if (getServletHandler() != null) + contextHandler = getServletHandler().getServletContextHandler(); + if (contextHandler == null && ContextHandler.getCurrentContext() != null) + contextHandler = ContextHandler.getCurrentContext().getContextHandler(); + if (contextHandler == null) + throw new IllegalStateException("No Context"); + + _listener = getInstance(); + if (_listener == null) { - _listener = getInstance(); - if (_listener == null) + //create an instance of the listener and decorate it + try { - //create an instance of the listener and decorate it - try - { - ServletContext context = contextHandler.getServletContext(); - _listener = (context != null) - ? context.createListener(getHeldClass()) - : getHeldClass().getDeclaredConstructor().newInstance(); - } - catch (ServletException ex) - { - Throwable cause = ex.getRootCause(); - if (cause instanceof InstantiationException) - throw (InstantiationException)cause; - if (cause instanceof IllegalAccessException) - throw (IllegalAccessException)cause; - throw ex; - } + _listener = contextHandler.getServletContext().createListener(getHeldClass()); } + catch (ServletException ex) + { + throw ex; + } + _listener = wrap(_listener, WrapFunction.class, WrapFunction::wrapEventListener); - contextHandler.addEventListener(_listener); } + contextHandler.addEventListener(_listener); } @Override diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java index 32d80bb99084..ba41caf32858 100644 --- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java +++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/ServletHandler.java @@ -773,6 +773,29 @@ public boolean isInitialized() return _initialized; } + protected void initializeHolders(BaseHolder[] holders) + { + for (BaseHolder holder : holders) + { + holder.setServletHandler(this); + if (isInitialized()) + { + try + { + if (!holder.isStarted()) + { + holder.start(); + holder.initialize(); + } + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + } + } + /** * @return whether the filter chains are cached. */ @@ -800,10 +823,7 @@ public ListenerHolder[] getListeners() public void setListeners(ListenerHolder[] listeners) { if (listeners != null) - for (ListenerHolder holder : listeners) - { - holder.setServletHandler(this); - } + initializeHolders(listeners); updateBeans(_listeners,listeners); _listeners = listeners; } @@ -865,9 +885,6 @@ public void addServletWithMapping(ServletHolder servlet, String pathSpec) { Objects.requireNonNull(servlet); ServletHolder[] holders = getServlets(); - if (holders != null) - holders = holders.clone(); - try { synchronized (this) @@ -979,8 +996,6 @@ public void addFilterWithMapping(FilterHolder holder, String pathSpec, EnumSet