Fix Container#reload Signed-off-by: jansupol <jan.supol@oracle.com>
diff --git a/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java b/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java index 3519624..5bd8b1f 100644 --- a/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java +++ b/containers/grizzly2-http/src/main/java/org/glassfish/jersey/grizzly2/httpserver/GrizzlyHttpContainer.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -370,7 +370,7 @@ @Override public void reload() { - reload(appHandler.getConfiguration()); + reload(new ResourceConfig(appHandler.getConfiguration())); } @Override
diff --git a/containers/jdk-http/src/main/java/org/glassfish/jersey/jdkhttp/JdkHttpHandlerContainer.java b/containers/jdk-http/src/main/java/org/glassfish/jersey/jdkhttp/JdkHttpHandlerContainer.java index 4f6cb30..d1ebf61 100644 --- a/containers/jdk-http/src/main/java/org/glassfish/jersey/jdkhttp/JdkHttpHandlerContainer.java +++ b/containers/jdk-http/src/main/java/org/glassfish/jersey/jdkhttp/JdkHttpHandlerContainer.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -201,7 +201,7 @@ @Override public void reload() { - reload(getConfiguration()); + reload(new ResourceConfig(getConfiguration())); } @Override
diff --git a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java index 522ba33..a454d61 100644 --- a/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java +++ b/containers/jersey-servlet-core/src/main/java/org/glassfish/jersey/servlet/ServletContainer.java
@@ -640,7 +640,7 @@ @Override public void reload() { - reload(getConfiguration()); + reload(new ResourceConfig(getConfiguration())); } @Override
diff --git a/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java index 06687ec..ccc2fe7 100644 --- a/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java +++ b/containers/jetty-http/src/main/java/org/glassfish/jersey/jetty/JettyHttpContainer.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -417,7 +417,7 @@ @Override public void reload() { - reload(getConfiguration()); + reload(new ResourceConfig(getConfiguration())); } @Override
diff --git a/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyHttpContainer.java b/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyHttpContainer.java index ac4bf4e..f21bd7e 100644 --- a/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyHttpContainer.java +++ b/containers/netty-http/src/main/java/org/glassfish/jersey/netty/httpserver/NettyHttpContainer.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -53,7 +53,7 @@ @Override public void reload() { - reload(appHandler.getConfiguration()); + reload(new ResourceConfig(appHandler.getConfiguration())); } @Override
diff --git a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainer.java b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainer.java index 3561eab..04e7f2c 100644 --- a/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainer.java +++ b/containers/simple-http/src/main/java/org/glassfish/jersey/simple/SimpleContainer.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -407,7 +407,7 @@ @Override public void reload() { - reload(getConfiguration()); + reload(new ResourceConfig(getConfiguration())); } @Override
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java index 36fc610..4d5fd1c 100644 --- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java +++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/InjectionManager.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -51,6 +51,12 @@ void shutdown(); /** + * Returns {@code true} when the {@link InjectionManager} has been shutdown, {@code false} otherwise. + * @return Whether the {@code InjectionManager} has been shutdown. + */ + boolean isShutdown(); + + /** * Registers one bean represented using fields in the provided descriptor. The final bean can be direct bean or * factory object which will create the bean at the time of injection. {@code InjectionManager} is able to register a bean * represented by a class or direct instance.
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java b/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java index 981514c..086bcda 100644 --- a/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java +++ b/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -231,43 +231,50 @@ requestScopeInstance, externalRequestScope.open(injectionManager)); context.initAsyncContext(asyncResponderHolder); - requestScope.runInScope(requestScopeInstance, new Runnable() { - @Override - public void run() { - try { - // set base URI into response builder thread-local variable - // for later resolving of relative location URIs - if (!disableLocationHeaderRelativeUriResolution) { - final URI uriToUse = - rfc7231LocationHeaderRelativeUriResolution ? request.getRequestUri() : request.getBaseUri(); - OutboundJaxrsResponse.Builder.setBaseUri(uriToUse); + try { + requestScope.runInScope(requestScopeInstance, new Runnable() { + @Override + public void run() { + try { + // set base URI into response builder thread-local variable + // for later resolving of relative location URIs + if (!disableLocationHeaderRelativeUriResolution) { + final URI uriToUse = + rfc7231LocationHeaderRelativeUriResolution ? request.getRequestUri() : request.getBaseUri(); + OutboundJaxrsResponse.Builder.setBaseUri(uriToUse); + } + + final Ref<Endpoint> endpointRef = Refs.emptyRef(); + final RequestProcessingContext data = Stages.process(context, requestProcessingRoot, endpointRef); + + final Endpoint endpoint = endpointRef.get(); + if (endpoint == null) { + // not found + throw new NotFoundException(); + } + + final ContainerResponse response = endpoint.apply(data); + + if (!asyncResponderHolder.isAsync()) { + responder.process(response); + } else { + externalRequestScope.suspend(asyncResponderHolder.externalContext, injectionManager); + } + } catch (final Throwable throwable) { + responder.process(throwable); + } finally { + asyncResponderHolder.release(); + // clear base URI from the thread + OutboundJaxrsResponse.Builder.clearBaseUri(); } - - final Ref<Endpoint> endpointRef = Refs.emptyRef(); - final RequestProcessingContext data = Stages.process(context, requestProcessingRoot, endpointRef); - - final Endpoint endpoint = endpointRef.get(); - if (endpoint == null) { - // not found - throw new NotFoundException(); - } - - final ContainerResponse response = endpoint.apply(data); - - if (!asyncResponderHolder.isAsync()) { - responder.process(response); - } else { - externalRequestScope.suspend(asyncResponderHolder.externalContext, injectionManager); - } - } catch (final Throwable throwable) { - responder.process(throwable); - } finally { - asyncResponderHolder.release(); - // clear base URI from the thread - OutboundJaxrsResponse.Builder.clearBaseUri(); } + }); + } catch (RuntimeException illegalStateException) { + if (!IllegalStateException.class.isInstance(illegalStateException.getCause()) || !injectionManager.isShutdown()) { + // consume the IllegalStateException: InjectionManager has been closed. + throw illegalStateException; } - }); + } } /**
diff --git a/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java b/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java index 6ff37b4..ff63759 100644 --- a/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java +++ b/ext/cdi/jersey-cdi1x/src/main/java/org/glassfish/jersey/ext/cdi1x/internal/CdiComponentProvider.java
@@ -671,7 +671,7 @@ @Override public void inject(final Object t, final CreationalContext cc) { InjectionManager injectingManager = getEffectiveInjectionManager(); - if (injectingManager == null) { + if (injectingManager == null || /* reload */ injectingManager.isShutdown()) { injectingManager = effectiveInjectionManager; threadInjectionManagers.set(injectingManager); } @@ -737,7 +737,7 @@ @Override public Object create(final CreationalContext creationalContext) { InjectionManager injectionManager = getEffectiveInjectionManager(); - if (injectionManager == null) { + if (injectionManager == null || /* reload */ injectionManager.isShutdown()) { injectionManager = threadInjectionManagers.get(); }
diff --git a/ext/microprofile/mp-rest-client/pom.xml b/ext/microprofile/mp-rest-client/pom.xml index 6265c07..a07cb30 100644 --- a/ext/microprofile/mp-rest-client/pom.xml +++ b/ext/microprofile/mp-rest-client/pom.xml
@@ -116,6 +116,7 @@ <Import-Package> ${cdi.osgi.version}, org.eclipse.microprofile.rest.client.*;version="[1,3)", + org.eclipse.microprofile.config;version="!", * </Import-Package> </instructions>
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java index da291df..9787cfe 100644 --- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java +++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/BinderRegisterExtension.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -598,6 +598,11 @@ } @Override + public boolean isShutdown() { + return false; + } + + @Override public void register(Binding binding) { BinderRegisterExtension.this.register(runtimeType, binding); }
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java index e3746ab..3c00646 100644 --- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java +++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/CdiInjectionManager.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -333,6 +333,11 @@ } + @Override + public boolean isShutdown() { + return false; + } + protected Binder getBindings() { return bindings; }
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/WrappingInjectionManager.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/WrappingInjectionManager.java index a3bea1a..5d40bfa 100644 --- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/WrappingInjectionManager.java +++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/managed/WrappingInjectionManager.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -51,6 +51,11 @@ } @Override + public boolean isShutdown() { + return injectionManager.isShutdown(); + } + + @Override public void register(Binding binding) { injectionManager.register(binding); }
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java index 3a8d44d..6411310 100644 --- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java +++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/CdiSeInjectionManager.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -290,6 +290,11 @@ } @Override + public boolean isShutdown() { + return !container.isRunning(); + } + + @Override public void inject(Object injectMe, String classAnalyzer) { // TODO: Used only in legacy CDI integration. throw new UnsupportedOperationException();
diff --git a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java index 5a71084..3a46d60 100644 --- a/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java +++ b/inject/hk2/src/main/java/org/glassfish/jersey/inject/hk2/AbstractHk2InjectionManager.java
@@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -51,6 +51,7 @@ private static final ServiceLocatorFactory factory = ServiceLocatorFactory.getInstance(); private ServiceLocator locator; + private Boolean isShutdown = Boolean.FALSE; // TODO replace by getServiceLocator().isShutDown() in 3.x /** * Private constructor. @@ -182,6 +183,12 @@ } else { getServiceLocator().shutdown(); } + isShutdown = Boolean.TRUE; + } + + @Override + public boolean isShutdown() { + return isShutdown; } @Override
diff --git a/pom.xml b/pom.xml index 0f08664..1fe9764 100644 --- a/pom.xml +++ b/pom.xml
@@ -448,7 +448,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> - <version>3.1.2</version> + <version>3.3.0</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId>
diff --git a/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestApp.java b/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestApp.java index 0d77c95..dc4aa36 100644 --- a/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestApp.java +++ b/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestApp.java
@@ -16,13 +16,42 @@ package org.glassfish.jersey.tests.cdi.gf; +import org.glassfish.jersey.CommonProperties; import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.server.spi.Container; +import org.glassfish.jersey.server.spi.ContainerLifecycleListener; import javax.ws.rs.ApplicationPath; @ApplicationPath("/test") public class GFTestApp extends ResourceConfig { + public static final String RELOADER = "RELOADER"; + private Reloader reloader = new Reloader(); + public GFTestApp() { super(GFTestResource.class); + register(reloader); + + property(CommonProperties.PROVIDER_DEFAULT_DISABLE, "ALL"); + property(RELOADER, reloader); + } + + static class Reloader implements ContainerLifecycleListener { + Container container; + + @Override + public void onStartup(Container container) { + this.container = container; + } + + @Override + public void onReload(Container container) { + + } + + @Override + public void onShutdown(Container container) { + + } } }
diff --git a/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestResource.java b/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestResource.java index 8e39cc8..d7a0c8f 100644 --- a/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestResource.java +++ b/tests/integration/cdi-integration/gf-cdi-inject/src/main/java/org/glassfish/jersey/tests/cdi/gf/GFTestResource.java
@@ -20,6 +20,8 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.core.Application; +import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; @@ -34,4 +36,12 @@ public String info() { return uriInfo.getBaseUri().toASCIIString(); } + + @GET + @Path("reload") + public String reload(@Context Application application) { + GFTestApp.Reloader reloader = (GFTestApp.Reloader) application.getProperties().get(GFTestApp.RELOADER); + reloader.container.reload(); + return GFTestApp.RELOADER; + } }
diff --git a/tests/integration/cdi-integration/gf-cdi-inject/src/test/java/org/glassfish/jersey/tests/cdi/gf/GFTest.java b/tests/integration/cdi-integration/gf-cdi-inject/src/test/java/org/glassfish/jersey/tests/cdi/gf/GFTest.java index da49a8b..078cf64 100644 --- a/tests/integration/cdi-integration/gf-cdi-inject/src/test/java/org/glassfish/jersey/tests/cdi/gf/GFTest.java +++ b/tests/integration/cdi-integration/gf-cdi-inject/src/test/java/org/glassfish/jersey/tests/cdi/gf/GFTest.java
@@ -47,12 +47,27 @@ @Test public void testUriInfo() { - int port = Integer.parseInt(System.getProperty("webServerPort")); - try (Response response = ClientBuilder.newClient().target("http://localhost:" + port).path("gf-test/test/info").request().get()) { + try (Response response = ClientBuilder.newClient().target("http://localhost:" + port()) + .path("gf-test/test/info").request().get()) { String entity = response.readEntity(String.class); System.out.println(entity); Assertions.assertEquals(200, response.getStatus()); Assertions.assertTrue(entity.contains("gf-test/test")); } } + + @Test + public void testReload() { + try (Response response = ClientBuilder.newClient().target("http://localhost:" + port()) + .path("gf-test/test/reload").request().get()) { + Assertions.assertEquals(200, response.getStatus()); + Assertions.assertEquals(GFTestApp.RELOADER, response.readEntity(String.class)); + } + testUriInfo(); + } + + private static int port() { + int port = Integer.parseInt(System.getProperty("webServerPort")); + return port; + } }