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