Author: rmannibucau Date: Mon Aug 25 18:20:42 2014 New Revision: 1620400 URL: http://svn.apache.org/r1620400 Log: XBean 4 + cdi HttpServletRequest, HttpSession, ServletContext + allowing to filter BValExtension if hibernate is used
Added: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/Proxys.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebBeansContextBeforeDeploy.java - copied, changed from r1619877, tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebBeansContextCreated.java tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/RequestInjectionTest.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/ServletContextHandler.java Removed: tomee/tomee/trunk/container/openejb-core/src/main/resources/container-cdi-classes.properties Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java tomee/tomee/trunk/examples/polling-parent/pom.xml tomee/tomee/trunk/pom.xml tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBSecurityListener.java tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEERealm.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/cdi/OpenEJBLifecycle.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java?rev=1620400&r1=1620399&r2=1620400&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java Mon Aug 25 18:20:42 2014 @@ -22,8 +22,12 @@ import org.apache.openejb.BeanContext; import org.apache.openejb.OpenEJBRuntimeException; import org.apache.openejb.assembler.classic.AppInfo; import org.apache.openejb.assembler.classic.Assembler; +import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; +import org.apache.webbeans.component.BuiltInOwbBean; +import org.apache.webbeans.component.SimpleProducerFactory; +import org.apache.webbeans.component.WebBeansType; import org.apache.webbeans.config.BeansDeployer; import org.apache.webbeans.config.OpenWebBeansConfiguration; import org.apache.webbeans.config.WebBeansContext; @@ -32,6 +36,7 @@ import org.apache.webbeans.container.Bea import org.apache.webbeans.intercept.InterceptorResolutionService; import org.apache.webbeans.portable.AbstractProducer; import org.apache.webbeans.portable.InjectionTargetImpl; +import org.apache.webbeans.portable.ProviderBasedProducer; import org.apache.webbeans.portable.events.discovery.BeforeShutdownImpl; import org.apache.webbeans.spi.ContainerLifecycle; import org.apache.webbeans.spi.ContextsService; @@ -46,10 +51,15 @@ import javax.el.ELResolver; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; +import javax.inject.Provider; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import javax.servlet.jsp.JspApplicationContext; import javax.servlet.jsp.JspFactory; +import java.io.ObjectStreamException; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Properties; @@ -67,8 +77,6 @@ public class OpenEJBLifecycle implements //Logger instance private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_CDI, OpenEJBLifecycle.class); - public static final String OPENEJB_CDI_SKIP_CLASS_NOT_FOUND = "openejb.cdi.skip-class-not-found"; - /** * Discover bean classes */ @@ -184,6 +192,9 @@ public class OpenEJBLifecycle implements // just to let us write custom CDI Extension using our internals easily CURRENT_APP_INFO.set(stuff.getAppInfo()); + addInternalBeans(); // before next event which can register custom beans (JAX-RS) + SystemInstance.get().fireEvent(new WebBeansContextBeforeDeploy(webBeansContext)); + //Deploy bean from XML. Also configures deployments, interceptors, decorators. deployer.deploy(scannerService); } catch (final Exception e1) { @@ -231,6 +242,26 @@ public class OpenEJBLifecycle implements logger.info("OpenWebBeans Container has started, it took {0} ms.", Long.toString(System.currentTimeMillis() - begin)); } + private void addInternalBeans() { + beanManager.getInjectionResolver().clearCaches(); + + if (!hasBean(beanManager, HttpServletRequest.class)) { + beanManager.addInternalBean(new InternalBean<>(webBeansContext, HttpServletRequest.class)); + } + if (!hasBean(beanManager, HttpSession.class)) { + beanManager.addInternalBean(new InternalBean<>(webBeansContext, HttpSession.class)); + } + if (!hasBean(beanManager, ServletContext.class)) { + beanManager.addInternalBean(new InternalBean<>(webBeansContext, ServletContext.class)); + } + + beanManager.getInjectionResolver().clearCaches(); // hasBean() usage can have cached several things + } + + private static boolean hasBean(final BeanManagerImpl beanManagerImpl, final Class<?> type) { + return !beanManagerImpl.getInjectionResolver().implResolveByType(false, type).isEmpty(); + } + private void starts(final BeanManager beanManager, final Class<?> clazz) { final Bean<?> bean = beanManager.resolve(beanManager.getBeans(clazz)); if (!beanManager.isNormalScope(bean.getScope())) { @@ -400,4 +431,42 @@ public class OpenEJBLifecycle implements } return object; } + + public static class InternalBean<T> extends BuiltInOwbBean<T> { + private final Class<T> type; + + protected InternalBean(final WebBeansContext webBeansContext, final Class<T> type) { + super(webBeansContext, WebBeansType.MANAGED, type, + new SimpleProducerFactory<T>( + new ProviderBasedProducer<>(webBeansContext, type, new OpenEJBComponentProvider<T>(webBeansContext, type), false))); + this.type = type; + } + + @Override + public Class<?> proxyableType() { + return null; + } + } + + private static class OpenEJBComponentProvider<T> implements Provider<T>, Serializable { + private Class<T> type; + private transient WebBeansContext webBeansContext; + + public OpenEJBComponentProvider(final WebBeansContext webBeansContext, final Class<T> type) { + this.webBeansContext = webBeansContext; + this.type = type; + } + + @Override + public T get() { + if (webBeansContext == null) { + webBeansContext = WebBeansContext.currentInstance(); + } + return SystemInstance.get().getComponent(type); + } + + Object readResolve() throws ObjectStreamException { + return get(); + } + } } Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java?rev=1620400&r1=1620399&r2=1620400&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java Mon Aug 25 18:20:42 2014 @@ -28,6 +28,7 @@ import javax.enterprise.inject.spi.Exten import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; import java.util.List; /** @@ -80,9 +81,39 @@ public class OptimizedLoaderService impl } } } + + final Collection<Extension> extensionCopy = new ArrayList<>(list); + + final Iterator<Extension> it = list.iterator(); + while (it.hasNext()) { + if (it.hasNext()) { + if (isFiltered(extensionCopy, it.next())) { + it.remove(); + } + } + } return list; } + // mainly intended to avoid conflicts between internal and overrided spec extensions + private boolean isFiltered(final Collection<Extension> extensions, final Extension next) { + final String name = next.getClass().getName(); + switch (name) { + case "org.apache.bval.cdi.BValExtension": + for (final Extension e : extensions) { + final String en = e.getClass().getName(); + + // org.hibernate.validator.internal.cdi.ValidationExtension but allowing few evolutions of packages + if (en.startsWith("org.hibernate.validator.") && en.endsWith("ValidationExtension")) { + return true; + } + } + break; + default: + } + return false; + } + private <T> List<T> loadWebBeansPlugins(final ClassLoader loader) { final String[] knownPlugins = { "org.apache.openejb.cdi.CdiPlugin", Added: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/Proxys.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/Proxys.java?rev=1620400&view=auto ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/Proxys.java (added) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/Proxys.java Mon Aug 25 18:20:42 2014 @@ -0,0 +1,98 @@ +/* + * 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.openejb.cdi; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.io.Serializable; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +// some helper reused accross several modules +public final class Proxys { + public static <T> T threadLocalProxy(final Class<T> type, final ThreadLocal<? extends T> threadLocal) { + return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), + new Class<?>[] { type, Serializable.class }, new ThreadLocalHandler<>(threadLocal)); + } + + public static HttpSession threadLocalRequestSessionProxy(final ThreadLocal<? extends HttpServletRequest> threadLocal) { + return (HttpSession) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), + new Class<?>[] { HttpSession.class, Serializable.class }, new ThreadLocalSessionFromRequestHandler(threadLocal)); + } + + public static <T> T handlerProxy(final Class<T> type, final InvocationHandler raw) { + return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), + new Class<?>[] { type, Serializable.class }, new EnsureExceptionIsUnwrapped(raw)); + } + + private Proxys() { + // no-op + } + + private static final class ThreadLocalSessionFromRequestHandler implements InvocationHandler { + private final ThreadLocal<? extends HttpServletRequest> holder; + + public ThreadLocalSessionFromRequestHandler(final ThreadLocal<? extends HttpServletRequest> threadLocal) { + holder = threadLocal; + } + + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + try { + return method.invoke(holder.get().getSession(), args); + } catch (final InvocationTargetException ite) { + throw ite.getCause(); + } + } + } + + private static final class ThreadLocalHandler<T> implements InvocationHandler { + private final ThreadLocal<T> holder; + + public ThreadLocalHandler(final ThreadLocal<T> threadLocal) { + holder = threadLocal; + } + + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + try { + return method.invoke(holder.get(), args); + } catch (final InvocationTargetException ite) { + throw ite.getCause(); + } + } + } + + private static final class EnsureExceptionIsUnwrapped implements InvocationHandler { + private final InvocationHandler delegate; + + public EnsureExceptionIsUnwrapped(final InvocationHandler raw) { + this.delegate = raw; + } + + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + try { + return delegate.invoke(proxy, method, args); + } catch (final InvocationTargetException ite) { + throw ite.getCause(); + } + } + } +} Copied: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebBeansContextBeforeDeploy.java (from r1619877, tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebBeansContextCreated.java) URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebBeansContextBeforeDeploy.java?p2=tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebBeansContextBeforeDeploy.java&p1=tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebBeansContextCreated.java&r1=1619877&r2=1620400&rev=1620400&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebBeansContextCreated.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/WebBeansContextBeforeDeploy.java Mon Aug 25 18:20:42 2014 @@ -20,10 +20,10 @@ import org.apache.openejb.observer.Event import org.apache.webbeans.config.WebBeansContext; @Event -public class WebBeansContextCreated { +public class WebBeansContextBeforeDeploy { private final WebBeansContext context; - public WebBeansContextCreated(final WebBeansContext webBeansContext) { + public WebBeansContextBeforeDeploy(final WebBeansContext webBeansContext) { this.context = webBeansContext; } @@ -33,7 +33,7 @@ public class WebBeansContextCreated { @Override public String toString() { - return "WebBeansContextCreated{" + + return "WebBeansContextBeforeDeploy{" + "context=" + context + '}'; } Added: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/RequestInjectionTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/RequestInjectionTest.java?rev=1620400&view=auto ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/RequestInjectionTest.java (added) +++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/RequestInjectionTest.java Mon Aug 25 18:20:42 2014 @@ -0,0 +1,56 @@ +/* + * 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.openejb.cdi; + +import org.apache.openejb.jee.WebApp; +import org.apache.openejb.junit.ApplicationComposer; +import org.apache.openejb.rest.ThreadLocalHttpServletRequest; +import org.apache.openejb.testing.Classes; +import org.apache.openejb.testing.Component; +import org.apache.openejb.testing.Module; +import org.junit.Test; +import org.junit.runner.RunWith; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; + +@RunWith(ApplicationComposer.class) +public class RequestInjectionTest { + @Module + @Classes(cdi = true) + public WebApp war() { + return new WebApp(); + } + + @Component + public HttpServletRequest request() { + return new ThreadLocalHttpServletRequest() {}; + } + + @Inject + private HttpServletRequest request; + + @Test + public void run() { + assertNotNull(request); + assertThat(request, instanceOf(ThreadLocalHttpServletRequest.class)); + } +} Modified: tomee/tomee/trunk/examples/polling-parent/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/examples/polling-parent/pom.xml?rev=1620400&r1=1620399&r2=1620400&view=diff ============================================================================== --- tomee/tomee/trunk/examples/polling-parent/pom.xml (original) +++ tomee/tomee/trunk/examples/polling-parent/pom.xml Mon Aug 25 18:20:42 2014 @@ -162,7 +162,7 @@ </dependencyManagement> <properties> - <xbean.version>3.19-SNAPSHOT</xbean.version> + <xbean.version>4.0</xbean.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <version.tomee>2.0.0-SNAPSHOT</version.tomee> <version.openejb>5.0.0-SNAPSHOT</version.openejb> Modified: tomee/tomee/trunk/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/pom.xml?rev=1620400&r1=1620399&r2=1620400&view=diff ============================================================================== --- tomee/tomee/trunk/pom.xml (original) +++ tomee/tomee/trunk/pom.xml Mon Aug 25 18:20:42 2014 @@ -104,7 +104,7 @@ <maven-bundle-plugin.version>2.3.7</maven-bundle-plugin.version> <!-- This is used by a manifest classpath entry --> - <xbeanVersion>3.19-SNAPSHOT</xbeanVersion> + <xbeanVersion>4.0</xbeanVersion> <!-- OSGi bundles properties --> <openejb.bundle.activator/> Modified: tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java?rev=1620400&r1=1620399&r2=1620400&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java (original) +++ tomee/tomee/trunk/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java Mon Aug 25 18:20:42 2014 @@ -21,7 +21,7 @@ import org.apache.cxf.binding.BindingFac import org.apache.cxf.jaxrs.JAXRSBindingFactory; import org.apache.cxf.transport.DestinationFactory; import org.apache.cxf.transport.http.HTTPTransportFactory; -import org.apache.openejb.cdi.WebBeansContextCreated; +import org.apache.openejb.cdi.WebBeansContextBeforeDeploy; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.observer.Observes; import org.apache.openejb.rest.AbstractRestThreadLocalProxy; @@ -43,7 +43,6 @@ import javax.enterprise.inject.spi.Injec import javax.enterprise.util.AnnotationLiteral; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; -import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.Context; @@ -91,24 +90,59 @@ public class CxfRSService extends RESTSe return NAME; } - public void integrateCDIAndJaxRsInjections(@Observes final WebBeansContextCreated event) { + public void integrateCDIAndJaxRsInjections(@Observes final WebBeansContextBeforeDeploy event) { contextCDIIntegration(event.getContext()); } private void contextCDIIntegration(final WebBeansContext wbc) { + if (!enabled) { + return; + } + final BeanManagerImpl beanManagerImpl = wbc.getBeanManagerImpl(); - beanManagerImpl.addAdditionalQualifier(Context.class); - beanManagerImpl.addInternalBean(new ContextBean<>(SecurityContext.class, ThreadLocalContextManager.SECURITY_CONTEXT)); - beanManagerImpl.addInternalBean(new ContextBean<>(UriInfo.class, ThreadLocalContextManager.URI_INFO)); - beanManagerImpl.addInternalBean(new ContextBean<>(HttpServletRequest.class, ThreadLocalContextManager.HTTP_SERVLET_REQUEST)); - beanManagerImpl.addInternalBean(new ContextBean<>(HttpServletResponse.class, ThreadLocalContextManager.HTTP_SERVLET_RESPONSE)); - beanManagerImpl.addInternalBean(new ContextBean<>(HttpHeaders.class, ThreadLocalContextManager.HTTP_HEADERS)); - beanManagerImpl.addInternalBean(new ContextBean<>(Request.class, ThreadLocalContextManager.REQUEST)); - beanManagerImpl.addInternalBean(new ContextBean<>(ServletRequest.class, ThreadLocalContextManager.SERVLET_REQUEST)); - beanManagerImpl.addInternalBean(new ContextBean<>(ServletContext.class, ThreadLocalContextManager.SERVLET_CONTEXT)); - beanManagerImpl.addInternalBean(new ContextBean<>(ServletConfig.class, ThreadLocalContextManager.SERVLET_CONFIG)); - beanManagerImpl.addInternalBean(new ContextBean<>(Providers.class, ThreadLocalContextManager.PROVIDERS)); - beanManagerImpl.addInternalBean(new ContextBean<>(ContextResolver.class, ThreadLocalContextManager.CONTEXT_RESOLVER)); + if (!beanManagerImpl.getAdditionalQualifiers().contains(Context.class)) { + beanManagerImpl.addAdditionalQualifier(Context.class); + } + if (!hasBean(beanManagerImpl, SecurityContext.class)) { + beanManagerImpl.addInternalBean(new ContextBean<>(SecurityContext.class, ThreadLocalContextManager.SECURITY_CONTEXT)); + } + if (!hasBean(beanManagerImpl, UriInfo.class)) { + beanManagerImpl.addInternalBean(new ContextBean<>(UriInfo.class, ThreadLocalContextManager.URI_INFO)); + } + if (!hasBean(beanManagerImpl, HttpServletRequest.class)) { + beanManagerImpl.addInternalBean(new ContextBean<>(HttpServletRequest.class, ThreadLocalContextManager.HTTP_SERVLET_REQUEST)); + } + if (!hasBean(beanManagerImpl, HttpServletResponse.class)) { + beanManagerImpl.addInternalBean(new ContextBean<>(HttpServletResponse.class, ThreadLocalContextManager.HTTP_SERVLET_RESPONSE)); + } + if (!hasBean(beanManagerImpl, HttpHeaders.class)) { + beanManagerImpl.addInternalBean(new ContextBean<>(HttpHeaders.class, ThreadLocalContextManager.HTTP_HEADERS)); + } + if (!hasBean(beanManagerImpl, Request.class)) { + beanManagerImpl.addInternalBean(new ContextBean<>(Request.class, ThreadLocalContextManager.REQUEST)); + } + /* HttpServletRequest impl it + if (!hasBean(beanManagerImpl, ServletRequest.class)) { + beanManagerImpl.addInternalBean(new ContextBean<>(ServletRequest.class, ThreadLocalContextManager.SERVLET_REQUEST)); + } + */ + if (!hasBean(beanManagerImpl, ServletContext.class)) { + beanManagerImpl.addInternalBean(new ContextBean<>(ServletContext.class, ThreadLocalContextManager.SERVLET_CONTEXT)); + } + if (!hasBean(beanManagerImpl, ServletConfig.class)) { + beanManagerImpl.addInternalBean(new ContextBean<>(ServletConfig.class, ThreadLocalContextManager.SERVLET_CONFIG)); + } + if (!hasBean(beanManagerImpl, Providers.class)) { + beanManagerImpl.addInternalBean(new ContextBean<>(Providers.class, ThreadLocalContextManager.PROVIDERS)); + } + if (!hasBean(beanManagerImpl, ContextResolver.class)) { + beanManagerImpl.addInternalBean(new ContextBean<>(ContextResolver.class, ThreadLocalContextManager.CONTEXT_RESOLVER)); + } + beanManagerImpl.getInjectionResolver().clearCaches(); // hasBean() usage can have cached several things + } + + private static boolean hasBean(final BeanManagerImpl beanManagerImpl, final Class<?> type) { + return beanManagerImpl.getInjectionResolver().implResolveByType(false, type).isEmpty(); } @Override @@ -211,7 +245,7 @@ public class CxfRSService extends RESTSe @Override public Set<InjectionPoint> getInjectionPoints() { - return Collections.<InjectionPoint>emptySet(); + return Collections.emptySet(); } @Override @@ -221,7 +255,7 @@ public class CxfRSService extends RESTSe @Override public Set<Class<? extends Annotation>> getStereotypes() { - return Collections.<Class<? extends Annotation>>emptySet(); + return Collections.emptySet(); } @Override Modified: tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java?rev=1620400&r1=1620399&r2=1620400&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java (original) +++ tomee/tomee/trunk/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java Mon Aug 25 18:20:42 2014 @@ -16,6 +16,11 @@ */ package org.apache.openejb.server.httpd; +import org.apache.openejb.loader.SystemInstance; + +import org.apache.openejb.cdi.Proxys; + +import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -26,12 +31,20 @@ import java.util.Map; * @version $Revision$ $Date$ */ public class HttpListenerRegistry implements HttpListener { - private final Map<String, HttpListener> registry = new LinkedHashMap<String, HttpListener>(); - private final Map<String, Collection<HttpListener>> filterRegistry = new LinkedHashMap<String, Collection<HttpListener>>(); - private final ThreadLocal<FilterListener> currentFilterListener = new ThreadLocal<FilterListener>(); + private final Map<String, HttpListener> registry = new LinkedHashMap<>(); + private final Map<String, Collection<HttpListener>> filterRegistry = new LinkedHashMap<>(); + private final ThreadLocal<FilterListener> currentFilterListener = new ThreadLocal<>(); + private final ThreadLocal<HttpRequest> request = new ThreadLocal<>(); public HttpListenerRegistry() { - // no-op + final SystemInstance systemInstance = SystemInstance.get(); + if (systemInstance.getComponent(HttpServletRequest.class) == null) { + systemInstance.setComponent(HttpServletRequest.class, Proxys.threadLocalProxy(HttpServletRequest.class, request)); + } + if (systemInstance.getComponent(HttpSession.class) == null) { + systemInstance.setComponent(javax.servlet.http.HttpSession.class, Proxys.threadLocalRequestSessionProxy(request)); + } + // servlet context is unknown in this module } @Override @@ -42,10 +55,11 @@ public class HttpListenerRegistry implem // first look filters Map<String, Collection<HttpListener>> filters; synchronized (filterRegistry) { - filters = new HashMap<String, Collection<HttpListener>>(filterRegistry); + filters = new HashMap<>(filterRegistry); } try { + this.request.set(request); boolean lastWasCurrent = false; for (Map.Entry<String, Collection<HttpListener>> entry : filters.entrySet()) { String pattern = entry.getKey(); @@ -62,7 +76,7 @@ public class HttpListenerRegistry implem // then others Map<String, HttpListener> listeners; synchronized (registry) { - listeners = new HashMap<String, HttpListener>(registry); + listeners = new HashMap<>(registry); } for (final Map.Entry<String, HttpListener> entry : listeners.entrySet()) { Modified: tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java?rev=1620400&r1=1620399&r2=1620400&view=diff ============================================================================== --- tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java (original) +++ tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java Mon Aug 25 18:20:42 2014 @@ -96,7 +96,7 @@ public abstract class RESTService implem private String virtualHost = "localhost"; private String auth = "NONE"; private String realm = "PropertiesLogin"; - private boolean enabled = true; + protected boolean enabled = true; private final String wildcard = SystemInstance.get().getProperty("openejb.rest.wildcard", ".*"); // embedded = regex, tomee = servlet public void afterApplicationCreated(final AppInfo appInfo, final WebAppInfo webApp) { Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBSecurityListener.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBSecurityListener.java?rev=1620400&r1=1620399&r2=1620400&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBSecurityListener.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBSecurityListener.java Mon Aug 25 18:20:42 2014 @@ -16,7 +16,6 @@ */ package org.apache.tomee.catalina; -import org.apache.catalina.Realm; import org.apache.catalina.connector.Request; import javax.servlet.AsyncEvent; @@ -24,6 +23,8 @@ import javax.servlet.AsyncListener; import java.io.IOException; public class OpenEJBSecurityListener implements AsyncListener { + public static final ThreadLocal<Request> requests = new ThreadLocal<>(); + private TomcatSecurityService securityService; private Object oldState; private Request request; @@ -54,25 +55,16 @@ public class OpenEJBSecurityListener imp } public void enter() { + requests.set(request); if (securityService != null && request.getWrapper() != null) { - final Realm realm = request.getContext().getRealm(); - if (realm instanceof TomEERealm) { - ((TomEERealm) realm).enter(request); - } oldState = securityService.enterWebApp(request.getWrapper().getRealm(), request.getPrincipal(), request.getWrapper().getRunAs()); } } public void exit() { + requests.remove(); if (securityService != null) { - try { - securityService.exitWebApp(oldState); - } finally { - final Realm realm = request.getContext().getRealm(); - if (realm instanceof TomEERealm) { - ((TomEERealm) realm).exit(); - } - } + securityService.exitWebApp(oldState); } } } Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEERealm.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEERealm.java?rev=1620400&r1=1620399&r2=1620400&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEERealm.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEERealm.java Mon Aug 25 18:20:42 2014 @@ -18,7 +18,6 @@ package org.apache.tomee.catalina; import org.apache.catalina.Realm; import org.apache.catalina.Wrapper; -import org.apache.catalina.connector.Request; import org.apache.catalina.realm.CombinedRealm; import org.apache.catalina.realm.GenericPrincipal; import org.apache.openejb.loader.SystemInstance; @@ -29,8 +28,6 @@ import java.security.Principal; import java.security.cert.X509Certificate; public class TomEERealm extends CombinedRealm { - private final ThreadLocal<Request> requests = new ThreadLocal<>(); - @Override public Principal authenticate(final String username, final String password) { return logInTomEE(super.authenticate(username, password)); @@ -91,18 +88,10 @@ public class TomEERealm extends Combined // normally we don't care about oldstate because the listener already contains one // which is the previous one // so no need to clean twice here - if (requests.get() != null) { - ss.enterWebApp(this, pcp, requests.get().getWrapper().getRunAs()); + if (OpenEJBSecurityListener.requests.get() != null) { + ss.enterWebApp(this, pcp, OpenEJBSecurityListener.requests.get().getWrapper().getRunAs()); } } return pcp; } - - public void enter(final Request request) { - requests.set(request); - } - - public void exit() { - requests.remove(); - } } 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=1620400&r1=1620399&r2=1620400&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 Aug 25 18:20:42 2014 @@ -78,6 +78,7 @@ 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.cdi.Proxys; import org.apache.openejb.config.AppModule; import org.apache.openejb.config.ConfigurationFactory; import org.apache.openejb.config.DeploymentLoader; @@ -96,6 +97,7 @@ import org.apache.openejb.loader.IO; import org.apache.openejb.loader.SystemInstance; import org.apache.openejb.server.httpd.BeginWebBeansListener; import org.apache.openejb.server.httpd.EndWebBeansListener; +import org.apache.openejb.server.httpd.HttpSession; import org.apache.openejb.spi.ContainerSystem; import org.apache.openejb.util.LogCategory; import org.apache.openejb.util.Logger; @@ -111,6 +113,7 @@ import org.apache.tomcat.util.descriptor import org.apache.tomcat.util.descriptor.web.FilterMap; import org.apache.tomcat.util.descriptor.web.ResourceBase; import org.apache.tomcat.util.scan.StandardJarScanFilter; +import org.apache.tomee.catalina.cdi.ServletContextHandler; import org.apache.tomee.catalina.cluster.ClusterObserver; import org.apache.tomee.catalina.cluster.TomEEClusterListener; import org.apache.tomee.catalina.environment.Hosts; @@ -133,6 +136,7 @@ import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.servlet.ServletContext; import javax.servlet.SessionTrackingMode; +import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspApplicationContext; import javax.servlet.jsp.JspFactory; import javax.sql.DataSource; @@ -310,6 +314,21 @@ public class TomcatWebAppBuilder impleme configurationFactory = new ConfigurationFactory(); deploymentLoader = new DeploymentLoader(); + + setComponentsUsedByCDI(); + } + + private void setComponentsUsedByCDI() { + final SystemInstance systemInstance = SystemInstance.get(); + if (systemInstance.getComponent(HttpServletRequest.class) == null) { + systemInstance.setComponent(HttpServletRequest.class, Proxys.threadLocalProxy(HttpServletRequest.class, OpenEJBSecurityListener.requests)); + } + if (systemInstance.getComponent(HttpSession.class) == null) { + systemInstance.setComponent(javax.servlet.http.HttpSession.class, Proxys.threadLocalRequestSessionProxy(OpenEJBSecurityListener.requests)); + } + if (systemInstance.getComponent(ServletContext.class) == null) { + systemInstance.setComponent(ServletContext.class, Proxys.handlerProxy(ServletContext.class, new ServletContextHandler())); + } } private void manageCluster(final Cluster cluster) { Added: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/ServletContextHandler.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/ServletContextHandler.java?rev=1620400&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/ServletContextHandler.java (added) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/ServletContextHandler.java Mon Aug 25 18:20:42 2014 @@ -0,0 +1,30 @@ +/* + * 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.cdi; + +import org.apache.tomee.catalina.OpenEJBSecurityListener; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +public class ServletContextHandler implements InvocationHandler { + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + // ITE are handler by Proxys + return method.invoke(OpenEJBSecurityListener.requests.get().getServletContext(), args); + } +}