You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jg...@apache.org on 2018/04/18 15:50:30 UTC
[2/4] tomee git commit: TOMEE-1694 use tomcat destroy hook
TOMEE-1694 use tomcat destroy hook
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/532ee1be
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/532ee1be
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/532ee1be
Branch: refs/heads/tomee-1.7.x
Commit: 532ee1be14c1c5ecad1ba8052a154dc9876ccafa
Parents: dbb8479
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Mon Jan 18 19:50:16 2016 +0100
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Thu Mar 29 16:56:12 2018 +0100
----------------------------------------------------------------------
.../tomee/catalina/JavaeeInstanceManager.java | 45 +++++++++++++++++++-
1 file changed, 43 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/532ee1be/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java
index 3a8d6a7..9efedec 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java
@@ -18,6 +18,7 @@ package org.apache.tomee.catalina;
import org.apache.openejb.OpenEJBException;
import org.apache.openejb.core.WebContext;
+import org.apache.openejb.loader.SystemInstance;
import org.apache.tomcat.InstanceManager;
import org.apache.webbeans.exception.WebBeansConfigurationException;
import org.apache.webbeans.exception.WebBeansCreationException;
@@ -85,8 +86,17 @@ public class JavaeeInstanceManager implements InstanceManager {
if (o == null) {
return;
}
- preDestroy(o, o.getClass());
- webContext.destroy(o);
+ final Object unwrapped = unwrap(o);
+ preDestroy(unwrapped, unwrapped.getClass());
+ webContext.destroy(unwrapped);
+ if (unwrapped != o) { // PojoEndpointServer, they create and track a cc so release it
+ webContext.destroy(o);
+ }
+ }
+
+ private Object unwrap(final Object o) {
+ return "org.apache.tomcat.websocket.pojo.PojoEndpointServer".equals(o.getClass().getName()) ?
+ WebSocketTypes.unwrapWebSocketPojo(o) : o;
}
public void inject(final Object o) {
@@ -187,4 +197,35 @@ public class JavaeeInstanceManager implements InstanceManager {
}
}
+ private static class WebSocketTypes { // extracted for lazy loading
+ private static final WebSocketTypes WEB_SOCKET_TYPES = new WebSocketTypes();
+ private final Method getPojo;
+
+ private WebSocketTypes() {
+ Method tmp;
+ try {
+ tmp = WebSocketTypes.class.getClassLoader()
+ .loadClass("org.apache.tomcat.websocket.pojo.PojoEndpointBase")
+ .getDeclaredMethod("getPojo");
+ tmp.setAccessible(true);
+ } catch (final NoSuchMethodException e) {
+ if ("true".equals(SystemInstance.get().getProperty("tomee.websocket.skip", "false"))) {
+ tmp = null;
+ } else {
+ throw new IllegalStateException(e);
+ }
+ } catch (final ClassNotFoundException e) {
+ tmp = null; // no websocket support
+ }
+ getPojo = tmp;
+ }
+
+ private static Object unwrapWebSocketPojo(final Object o) {
+ try {
+ return WEB_SOCKET_TYPES.getPojo == null ? o : WEB_SOCKET_TYPES.getPojo.invoke(o);
+ } catch (final IllegalAccessException | InvocationTargetException | NullPointerException e) {
+ return o;
+ }
+ }
+ }
}