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