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