From 9a1cadade4ef3b02405d0c7e4e2b9d6c200c550d Mon Sep 17 00:00:00 2001 From: gregw Date: Mon, 5 Oct 2020 18:12:46 +0200 Subject: [PATCH] Fixes #5378 Setting Holders during STARTING Holders are now started/initialized if needed by a new utility method --- .../eclipse/jetty/servlet/ServletHandler.java | 57 +++++++++---------- .../servlet/ServletContextHandlerTest.java | 24 ++++++-- 2 files changed, 47 insertions(+), 34 deletions(-) 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