From aaa84d0d5c2559fe16552fafc4c92bef9fe5e293 Mon Sep 17 00:00:00 2001 From: Ivan Bodrov Date: Sun, 3 Dec 2023 12:20:51 -0500 Subject: [PATCH] concord-server: support priority annotation when binding jetty components --- .../concord/server/boot/HttpServer.java | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/server/impl/src/main/java/com/walmartlabs/concord/server/boot/HttpServer.java b/server/impl/src/main/java/com/walmartlabs/concord/server/boot/HttpServer.java index 7d024bada5..e958ba99a6 100644 --- a/server/impl/src/main/java/com/walmartlabs/concord/server/boot/HttpServer.java +++ b/server/impl/src/main/java/com/walmartlabs/concord/server/boot/HttpServer.java @@ -32,6 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Priority; import javax.inject.Inject; import javax.servlet.*; import javax.servlet.annotation.WebFilter; @@ -39,6 +40,7 @@ import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import java.lang.management.ManagementFactory; +import java.util.Comparator; import java.util.EnumSet; import java.util.Set; @@ -101,21 +103,21 @@ public HttpServer(ServerConfiguration cfg, } // init all @WebListeners - for (ServletContextListener listener : contextListeners) { + contextListeners.stream().sorted(byPriority()).forEachOrdered(listener -> { WebListener annotation = listener.getClass().getAnnotation(WebListener.class); if (annotation == null) { - continue; + return; } log.info("Event listener -> {}", listener.getClass()); contextHandler.addEventListener(listener); - } + }); // init all @WebServlets - for (HttpServlet servlet : servlets) { + servlets.stream().sorted(byPriority()).forEachOrdered(servlet -> { WebServlet annotation = servlet.getClass().getAnnotation(WebServlet.class); if (annotation == null) { - continue; + return; } ServletHolder holder = new ServletHolder(servlet); @@ -123,54 +125,54 @@ public HttpServer(ServerConfiguration cfg, log.info("Servlet -> {} @ {}", servlet.getClass(), pathSpec); contextHandler.addServlet(holder, pathSpec); } - } + }); - for (ServletHolder holder : servletHolders) { + servletHolders.stream().sorted(byPriority()).forEachOrdered(holder -> { WebServlet annotation = holder.getClass().getAnnotation(WebServlet.class); if (annotation == null) { - continue; + return; } for (String pathSpec : annotation.value()) { log.info("Servlet -> {} @ {}", holder.getClass(), pathSpec); contextHandler.addServlet(holder, pathSpec); } - } + }); // init all @WebFilters - for (Filter filter : filters) { + filters.stream().sorted(byPriority()).forEachOrdered(filter -> { WebFilter annotation = filter.getClass().getAnnotation(WebFilter.class); if (annotation == null) { - continue; + return; } FilterHolder holder = new FilterHolder(filter); for (String pathSpec : annotation.value()) { - log.info("Servlet -> {} @ {}", filter.getClass(), pathSpec); + log.info("Filter -> {} @ {}", filter.getClass(), pathSpec); contextHandler.addFilter(holder, pathSpec, EnumSet.allOf(DispatcherType.class)); } - } + }); - for (FilterHolder holder : filterHolders) { + filterHolders.stream().sorted(byPriority()).forEachOrdered(holder -> { WebFilter annotation = holder.getClass().getAnnotation(WebFilter.class); if (annotation == null) { - continue; + return; } for (String pathSpec : annotation.value()) { log.info("Filter -> {} @ {}", holder.getClass(), pathSpec); - contextHandler.addFilter(holder, pathSpec, EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.ERROR)); + contextHandler.addFilter(holder, pathSpec, EnumSet.allOf(DispatcherType.class)); } - } + }); ContextHandlerCollection contextHandlerCollection = new ContextHandlerCollection(); contextHandlerCollection.addHandler(contextHandler); // additional handlers - for (ContextHandlerConfigurator configurator : contextHandlerConfigurators) { + contextHandlerConfigurators.stream().sorted(byPriority()).forEachOrdered(configurator -> { log.info("Configuring additional context handlers {}...", configurator.getClass()); configurator.configure(contextHandlerCollection); - } + }); StatisticsHandler statisticsHandler = new StatisticsHandler(); statisticsHandler.setHandler(contextHandlerCollection); @@ -202,4 +204,11 @@ private static RequestLog createRequestLog(ServerConfiguration cfg) { return new CustomRequestLog(writer, ServerConfiguration.ACCESS_LOG_FORMAT); } + + private static Comparator byPriority() { + return Comparator.comparingInt(o -> { + var a = o.getClass().getAnnotation(Priority.class); + return a != null ? a.value() : 0; + }); + } }