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


Reply via email to