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 <[email protected]>
Authored: Mon Jan 18 19:50:16 2016 +0100
Committer: Jonathan Gallimore <[email protected]>
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;
+            }
+        }
+    }
 }

Reply via email to