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;
+ }
}