Author: rmannibucau
Date: Mon Oct 28 12:57:43 2013
New Revision: 1536343

URL: http://svn.apache.org/r1536343
Log:
TOMEE-740 tomcat 7.0.47

Added:
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/websocket/
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/websocket/JavaEEDefaultServerEnpointConfigurator.java
Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
    
tomee/tomee/trunk/container/openejb-core/src/main/resources/default.exclusions
    tomee/tomee/trunk/pom.xml
    tomee/tomee/trunk/tomee/tomee-catalina/pom.xml
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1536343&r1=1536342&r2=1536343&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 Mon Oct 28 12:57:43 2013
@@ -282,9 +282,15 @@ public class AnnotationDeployer implemen
     };
 
     private static final String[] WEB_CLASSES = new String[] {
+            // Servlet 3.0
             "javax.servlet.annotation.WebServlet",
             "javax.servlet.annotation.WebFilter",
-            "javax.servlet.annotation.WebListener"
+            "javax.servlet.annotation.WebListener",
+
+            // WebSocket 1.0 (since Tomcat 7.0.47)
+            "javax.websocket.server.ServerEndpoint",
+            "javax.websocket.server.ServerApplicationConfig",
+            "javax.websocket.Endpoint"
     };
 
     private static final Collection<String> API_CLASSES = new 
ArrayList<String>(WEB_CLASSES.length + JSF_CLASSES.length);
@@ -450,7 +456,7 @@ public class AnnotationDeployer implemen
                     removeModule();
                 }
             }
-            for (WebModule webModule : appModule.getWebModules()) {
+            for (WebModule webModule : appModule.getWebModules()) { // here we 
scan by inheritance so great to keep it last
                 webModule.initAppModule(appModule);
                 setModule(webModule);
                 try {
@@ -1176,7 +1182,8 @@ public class AnnotationDeployer implemen
             }
 
             /*
-             * Servlet, Filter, Listener
+             * Servlet, Filter, Listener...
+             * here we can scan by inheritance so do it last
              */
 
             Map<String, String> urlByClasses = null;
@@ -2178,8 +2185,14 @@ public class AnnotationDeployer implemen
                         continue;
                     }
 
-                    final List<Annotated<Class<?>>> found = 
finder.findMetaAnnotatedClasses(clazz);
-                    classes.addAll(metaToClass(found));
+                    final List<Annotated<Class<?>>> found;
+                    if (clazz.isAnnotation()) {
+                        
classes.addAll(metaToClass(finder.findMetaAnnotatedClasses(clazz)));
+                    } else if (Modifier.isAbstract(clazz.getModifiers())) {
+                        classes.addAll(finder.findSubclasses(clazz));
+                    } else {
+                        classes.addAll(finder.findImplementations(clazz));
+                    }
                 }
 
             }

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java?rev=1536343&r1=1536342&r2=1536343&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java
 Mon Oct 28 12:57:43 2013
@@ -20,6 +20,7 @@ import org.apache.openejb.OpenEJBRuntime
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.xbean.finder.Annotated;
 import org.apache.xbean.finder.AnnotationFinder;
+import org.apache.xbean.finder.AsynchronousInheritanceAnnotationFinder;
 import org.apache.xbean.finder.IAnnotationFinder;
 import org.apache.xbean.finder.UrlSet;
 import org.apache.xbean.finder.archive.Archive;
@@ -43,6 +44,7 @@ public class FinderFactory {
 
     private static final FinderFactory factory = new FinderFactory();
     public static final String TOMEE_JAXRS_DEPLOY_UNDECLARED_PROP = 
"tomee.jaxrs.deploy.undeclared";
+    public static final String ASYNC_SCAN = 
"openejb.scanning.inheritance.asynchronous";
     public static final String SKIP_LINK = "openejb.finder.skip.link";
 
     private static FinderFactory get() {
@@ -55,22 +57,22 @@ public class FinderFactory {
     }
 
     public static AnnotationFinder getFinder(ClassLoader classLoader, URL url) 
{
-        return new AnnotationFinder(ClasspathArchive.archive(classLoader, 
url));
+        return newFinder(ClasspathArchive.archive(classLoader, url));
     }
 
     public IAnnotationFinder create(DeploymentModule module) throws Exception {
         IAnnotationFinder finder;
         if (module instanceof WebModule) {
             WebModule webModule = (WebModule) module;
-            final AnnotationFinder annotationFinder = new AnnotationFinder(new 
WebappAggregatedArchive(webModule, webModule.getScannableUrls()));
+            final AnnotationFinder annotationFinder = newFinder(new 
WebappAggregatedArchive(webModule, webModule.getScannableUrls()));
             enableFinderOptions(annotationFinder);
             finder = annotationFinder;
         } else if (module instanceof ConnectorModule) {
             ConnectorModule connectorModule = (ConnectorModule) module;
-            finder = new AnnotationFinder(new 
ConfigurableClasspathArchive(connectorModule, 
connectorModule.getLibraries())).link();
+            finder = newFinder(new 
ConfigurableClasspathArchive(connectorModule, 
connectorModule.getLibraries())).link();
         } else if (module instanceof AppModule) {
             final Collection<URL> urls = 
NewLoaderLogic.applyBuiltinExcludes(new 
UrlSet(AppModule.class.cast(module).getAdditionalLibraries())).getUrls();
-            finder = new AnnotationFinder(new 
WebappAggregatedArchive(module.getClassLoader(), module.getAltDDs(), urls));
+            finder = newFinder(new 
WebappAggregatedArchive(module.getClassLoader(), module.getAltDDs(), urls));
         } else if (module.getJarLocation() != null) {
             String location = module.getJarLocation();
             File file = new File(location);
@@ -88,11 +90,12 @@ public class FinderFactory {
             }
 
             if (module instanceof Module) {
-                final AnnotationFinder annotationFinder = new 
AnnotationFinder(new DebugArchive(new ConfigurableClasspathArchive((Module) 
module, url)));
+                final DebugArchive archive = new DebugArchive(new 
ConfigurableClasspathArchive((Module) module, url));
+                final AnnotationFinder annotationFinder = newFinder(archive);
                 enableFinderOptions(annotationFinder);
                 finder = annotationFinder.link();
             } else {
-                final AnnotationFinder annotationFinder = new 
AnnotationFinder(new DebugArchive(new 
ConfigurableClasspathArchive(module.getClassLoader(), url)));
+                final AnnotationFinder annotationFinder = newFinder(new 
DebugArchive(new ConfigurableClasspathArchive(module.getClassLoader(), url)));
                 enableFinderOptions(annotationFinder);
                 finder = annotationFinder.link();
             }
@@ -103,6 +106,13 @@ public class FinderFactory {
         return new ModuleLimitedFinder(finder);
     }
 
+    private static AnnotationFinder newFinder(final Archive archive) {
+        if ("true".equals(SystemInstance.get().getProperty(ASYNC_SCAN, 
"true"))) {
+            return new AsynchronousInheritanceAnnotationFinder(archive);
+        }
+        return new AnnotationFinder(archive);
+    }
+
     public static class DebugArchive implements Archive {
         private final Archive archive;
 
@@ -136,19 +146,22 @@ public class FinderFactory {
             annotationFinder.enableMetaAnnotations();
         }
         if (enableFindSubclasses()) {
-            annotationFinder.link(); // for @HandleTypes we need interface 
impl, impl of abstract classes too
+            // for @HandleTypes we need interface impl, impl of abstract 
classes too
+            annotationFinder.enableFindSubclasses();
+            annotationFinder.enableFindImplementations();
         }
 
         return annotationFinder;
     }
 
     private static boolean enableFindSubclasses() {
-        return !SystemInstance.get().getOptions().get(SKIP_LINK, false) && 
(isJaxRsInstalled() && 
SystemInstance.get().getOptions().get(TOMEE_JAXRS_DEPLOY_UNDECLARED_PROP, 
false));
+        return !SystemInstance.get().getOptions().get(SKIP_LINK, false)
+            && (isTomEE() || (isJaxRsInstalled() && 
SystemInstance.get().getOptions().get(TOMEE_JAXRS_DEPLOY_UNDECLARED_PROP, 
false)));
     }
 
-    private static boolean isTomEE() {
-        try {
-            
FinderFactory.class.getClassLoader().loadClass("org.apache.tomee.catalina.ServerListener");
+    public static boolean isTomEE() {
+        try { // since Tomcat 7.0.47
+            
FinderFactory.class.getClassLoader().loadClass("javax.websocket.Endpoint");
             return true;
         } catch (Throwable e) {
             return false;

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java?rev=1536343&r1=1536342&r2=1536343&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
 Mon Oct 28 12:57:43 2013
@@ -250,7 +250,8 @@ public class NewLoaderLogic {
             exclusions = readDefaultExclusions();
         }
 
-        final List<String> excludes = null != exclusions ? 
Arrays.asList(exclusions) : new ArrayList<String>();
+        final List<String> excludes = new ArrayList<String>(exclusions.length 
+ 5);
+        excludes.addAll(Arrays.asList(exclusions));
 
         if (ADDITIONAL_EXCLUDES != null) {
             for (final String exclude : ADDITIONAL_EXCLUDES.split(",")) {

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/resources/default.exclusions
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/resources/default.exclusions?rev=1536343&r1=1536342&r2=1536343&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/resources/default.exclusions 
(original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/resources/default.exclusions 
Mon Oct 28 12:57:43 2013
@@ -193,7 +193,13 @@ surefire-
 swizzle-
 sxc-
 testng-
-tomcat-
+tomcat-api
+tomcat-coyote
+tomcat-dbcp
+tomcat-i18n
+tomcat-jdbc
+tomcat-juli
+tomcat-util
 tomee-
 tools.jar
 twitter4j-

Modified: tomee/tomee/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/pom.xml?rev=1536343&r1=1536342&r2=1536343&view=diff
==============================================================================
--- tomee/tomee/trunk/pom.xml (original)
+++ tomee/tomee/trunk/pom.xml Mon Oct 28 12:57:43 2013
@@ -100,7 +100,7 @@
     <maven-bundle-plugin.version>2.3.7</maven-bundle-plugin.version>
 
     <!-- This is used by a manifest classpath entry -->
-    <xbeanVersion>3.14</xbeanVersion>
+    <xbeanVersion>3.15-SNAPSHOT</xbeanVersion>
 
     <!-- OSGi bundles properties -->
     <openejb.bundle.activator/>
@@ -121,7 +121,7 @@
 
     <jaxb.version>2.2.6</jaxb.version>
 
-    <tomcat.version>7.0.42</tomcat.version>
+    <tomcat.version>7.0.47</tomcat.version>
 
     <!-- used mainly by jetty modules -->
     <cxf.version>2.6.9</cxf.version>

Modified: tomee/tomee/trunk/tomee/tomee-catalina/pom.xml
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/pom.xml?rev=1536343&r1=1536342&r2=1536343&view=diff
==============================================================================
--- tomee/tomee/trunk/tomee/tomee-catalina/pom.xml (original)
+++ tomee/tomee/trunk/tomee/tomee-catalina/pom.xml Mon Oct 28 12:57:43 2013
@@ -87,6 +87,12 @@
     </dependency>
     <dependency>
       <groupId>org.apache.tomcat</groupId>
+      <artifactId>tomcat7-websocket</artifactId>
+      <version>${tomcat.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.tomcat</groupId>
       <artifactId>tomcat-coyote</artifactId>
       <version>${tomcat.version}</version>
       <scope>provided</scope>

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java?rev=1536343&r1=1536342&r2=1536343&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java
 Mon Oct 28 12:57:43 2013
@@ -44,15 +44,8 @@ public class JavaeeInstanceManager imple
     }
 
     @Override
-    public Object newInstance(String className) throws IllegalAccessException, 
InvocationTargetException, NamingException, InstantiationException, 
ClassNotFoundException {
-        final ClassLoader classLoader = webContext.getClassLoader();
-        return newInstance(className, classLoader);
-    }
-
-    @Override
-    public Object newInstance(String className, ClassLoader classLoader) 
throws IllegalAccessException, InvocationTargetException, NamingException, 
InstantiationException, ClassNotFoundException {
+    public Object newInstance(final Class<?> clazz) throws 
IllegalAccessException, InvocationTargetException, NamingException, 
InstantiationException {
         try {
-            final Class<?> clazz = classLoader.loadClass(className);
             final Object object = webContext.newInstance(clazz);
             postConstruct(object, clazz);
             return object;
@@ -66,6 +59,17 @@ public class JavaeeInstanceManager imple
     }
 
     @Override
+    public Object newInstance(String className) throws IllegalAccessException, 
InvocationTargetException, NamingException, InstantiationException, 
ClassNotFoundException {
+        final ClassLoader classLoader = webContext.getClassLoader();
+        return newInstance(className, classLoader);
+    }
+
+    @Override
+    public Object newInstance(String className, ClassLoader classLoader) 
throws IllegalAccessException, InvocationTargetException, NamingException, 
InstantiationException, ClassNotFoundException {
+        return newInstance(classLoader.loadClass(className));
+    }
+
+    @Override
     public void newInstance(Object o) throws IllegalAccessException, 
InvocationTargetException, NamingException {
         try {
             webContext.inject(o);

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java?rev=1536343&r1=1536342&r2=1536343&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 Mon Oct 28 12:57:43 2013
@@ -430,8 +430,10 @@ public class OpenEJBContextConfig extend
                                 // no-op
                             }
                         } else {
-                            try { // we need to load the class 
(entry.getKey()) with the finder classloader = tempClassLoader otherwise 
isAssignable is false in almost all cases
-                                logger.info("Using @HandlesTypes on a parent 
class (and not an annotation) is a performance killer. See " + 
annotation.getName() + " on " + sci.getClass().getName());
+                            try {
+                                // we need to load the class (entry.getKey()) 
with the finder classloader = tempClassLoader otherwise isAssignable is false 
in almost all cases
+                                // don't warn since it is in the spec + JavaEE 
7 will rely a lot on it so *we* need to improve and not the opposite!
+                                // logger.info("Using @HandlesTypes on a 
parent class (and not an annotation) is a performance killer. See " + 
annotation.getName() + " on " + sci.getClass().getName());
                                 if (AnnotationFinder.class.isInstance(finder)) 
{
                                     if (annotation.isInterface()) {
                                         if (!foundImplementations) {

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1536343&r1=1536342&r2=1536343&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 Mon Oct 28 12:57:43 2013
@@ -87,7 +87,12 @@ import org.apache.openejb.assembler.clas
 import 
org.apache.openejb.assembler.classic.event.NewEjbAvailableAfterApplicationCreated;
 import org.apache.openejb.cdi.CdiBuilder;
 import org.apache.openejb.cdi.OpenEJBLifecycle;
-import org.apache.openejb.config.*;
+import org.apache.openejb.config.AppModule;
+import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.DeploymentLoader;
+import org.apache.openejb.config.EjbModule;
+import org.apache.openejb.config.TldScanner;
+import org.apache.openejb.config.WebModule;
 import org.apache.openejb.config.sys.Resource;
 import org.apache.openejb.core.CoreContainerSystem;
 import org.apache.openejb.core.ParentClassLoaderFinder;
@@ -111,6 +116,7 @@ import org.apache.tomee.catalina.cluster
 import org.apache.tomee.catalina.cluster.TomEEClusterListener;
 import org.apache.tomee.catalina.event.AfterApplicationCreated;
 import org.apache.tomee.catalina.routing.RouterValve;
+import 
org.apache.tomee.catalina.websocket.JavaEEDefaultServerEnpointConfigurator;
 import org.apache.tomee.common.LegacyAnnotationProcessor;
 import org.apache.tomee.common.NamingUtil;
 import org.apache.tomee.common.TomcatVersion;
@@ -135,6 +141,7 @@ import javax.servlet.jsp.JspFactory;
 import javax.sql.DataSource;
 import javax.transaction.TransactionManager;
 import javax.transaction.TransactionSynchronizationRegistry;
+import javax.websocket.server.ServerEndpointConfig;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -261,6 +268,9 @@ public class TomcatWebAppBuilder impleme
         final StandardServer standardServer = TomcatHelper.getServer();
         globalListenerSupport = new GlobalListenerSupport(standardServer, 
this);
 
+        // force tomcat to use our custom WebSocket ServerEndpointConfigurator
+        forceEEServerEndpointConfigurator();
+
         // could search mbeans
 
         //Getting host config listeners
@@ -305,6 +315,24 @@ public class TomcatWebAppBuilder impleme
         deploymentLoader = new DeploymentLoader();
     }
 
+    private static void forceEEServerEndpointConfigurator() {
+        // by reflection cause
+        // 1- tomcat algorithm uses ServiceLoader.next() so no real way to 
ensure it is our META-INF/services/...
+        // 2- avoids getResources which can be slow depending the server config
+        try {
+            final Field f = 
ServerEndpointConfig.Configurator.class.getDeclaredField("defaultImpl");
+            boolean acc = f.isAccessible();
+            f.setAccessible(true);
+            try {
+                f.set(null, new JavaEEDefaultServerEnpointConfigurator());
+            } finally {
+                f.setAccessible(acc);
+            }
+        } catch (final Exception e) {
+            logger.warning("Can't set TomEE 
ServerEndpointConfig$Configurator", e);
+        }
+    }
+
     private void manageCluster(final Cluster cluster) {
         if (cluster == null || cluster instanceof SimpleTomEETcpCluster) {
             return;
@@ -1293,7 +1321,9 @@ public class TomcatWebAppBuilder impleme
                 webContext.getBindings().putAll(appContext.getBindings());
                 webContext.getBindings().putAll(getJndiBuilder(classLoader, 
webAppInfo, injections).buildBindings(JndiEncBuilder.JndiScope.comp));
 
-                standardContext.setInstanceManager(new 
JavaeeInstanceManager(webContext, standardContext));
+                final JavaeeInstanceManager instanceManager = new 
JavaeeInstanceManager(webContext, standardContext);
+                standardContext.setInstanceManager(instanceManager);
+                
JavaEEDefaultServerEnpointConfigurator.registerInstanceManager(classLoader, 
instanceManager);
                 
standardContext.getServletContext().setAttribute(InstanceManager.class.getName(),
 standardContext.getInstanceManager());
 
             } catch (Exception e) {
@@ -1802,6 +1832,7 @@ public class TomcatWebAppBuilder impleme
                 logger.error("error stopping classloader of webapp " + 
standardContext.getName(), e);
             }
             ClassLoaderUtil.cleanOpenJPACache(old);
+            
JavaEEDefaultServerEnpointConfigurator.unregisterInstanceManager(old);
         }
         if (contextInfo != null && (contextInfo.appInfo == null || 
contextInfo.appInfo.webAppAlone)) {
             removeContextInfo(standardContext);

Added: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/websocket/JavaEEDefaultServerEnpointConfigurator.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/websocket/JavaEEDefaultServerEnpointConfigurator.java?rev=1536343&view=auto
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/websocket/JavaEEDefaultServerEnpointConfigurator.java
 (added)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/websocket/JavaEEDefaultServerEnpointConfigurator.java
 Mon Oct 28 12:57:43 2013
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *     contributor license agreements.  See the NOTICE file distributed with
+ *     this work for additional information regarding copyright ownership.
+ *     The ASF licenses this file to You under the Apache License, Version 2.0
+ *     (the "License"); you may not use this file except in compliance with
+ *     the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.apache.tomee.catalina.websocket;
+
+import org.apache.tomcat.InstanceManager;
+import org.apache.tomcat.websocket.server.DefaultServerEndpointConfigurator;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class JavaEEDefaultServerEnpointConfigurator extends 
DefaultServerEndpointConfigurator {
+    private static final Map<ClassLoader, InstanceManager> INSTANCE_MANAGERS = 
new ConcurrentHashMap<ClassLoader, InstanceManager>();
+
+    @Override
+    public <T> T getEndpointInstance(final Class<T> clazz) throws 
InstantiationException {
+        final InstanceManager instanceManager = 
INSTANCE_MANAGERS.get(clazz.getClassLoader());
+        if (instanceManager == null) {
+            return super.getEndpointInstance(clazz);
+        }
+
+        try {
+            return clazz.cast(instanceManager.newInstance(clazz));
+        } catch (final Exception e) {
+            if (InstantiationException.class.isInstance(e)) {
+                throw InstantiationException.class.cast(e);
+            }
+            throw new InstantiationException(e.getMessage());
+        }
+    }
+
+    public static void registerInstanceManager(final ClassLoader loader, final 
InstanceManager manager) {
+        INSTANCE_MANAGERS.put(loader, manager);
+    }
+
+    public static void unregisterInstanceManager(final ClassLoader loader) {
+        INSTANCE_MANAGERS.remove(loader);
+    }
+}


Reply via email to