Author: dblevins
Date: Sun Dec 30 04:29:18 2012
New Revision: 1426887

URL: http://svn.apache.org/viewvc?rev=1426887&view=rev
Log:
TOMEE-686 - JAX-RS @Context injection for EJB interceptors
TOMEE-687 - Refer to internal EJB BeanContext via WeakReference in JAX-RS layer

Added:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/BeanContextInvocationHandler.java
   (with props)
    
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/ContextReferenceTypes.java
   (with props)
    
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInterceptorInjectionTest.java
      - copied, changed from r1426800, 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInjectionTest.java
Modified:
    
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/context/EjbInterceptorContextInjectionTest.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/ProxyEJB.java
    
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/Contexts.java
    
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
    
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java

Modified: 
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/context/EjbInterceptorContextInjectionTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/context/EjbInterceptorContextInjectionTest.java?rev=1426887&r1=1426886&r2=1426887&view=diff
==============================================================================
--- 
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/context/EjbInterceptorContextInjectionTest.java
 (original)
+++ 
openejb/trunk/openejb/arquillian/arquillian-tomee-tests/arquillian-tomee-jaxrs-tests/src/test/java/org/apache/openejb/arquillian/tests/jaxrs/context/EjbInterceptorContextInjectionTest.java
 Sun Dec 30 04:29:18 2012
@@ -53,7 +53,6 @@ import static org.junit.Assert.assertEqu
  * @version $Rev$ $Date$
  */
 @RunWith(Arquillian.class)
-@Ignore
 public class EjbInterceptorContextInjectionTest {
 
     @ArquillianResource
@@ -86,9 +85,6 @@ public class EjbInterceptorContextInject
         }
     }
 
-    public static class FooException extends RuntimeException {
-    }
-
     public static class RsEjbInterceptor {
         @Context
         private HttpHeaders httpHeaders;
@@ -151,4 +147,8 @@ public class EjbInterceptorContextInject
             return true;
         }
     }
+
+    public static class FooException extends RuntimeException {
+    }
+
 }

Added: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/BeanContextInvocationHandler.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/BeanContextInvocationHandler.java?rev=1426887&view=auto
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/BeanContextInvocationHandler.java
 (added)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/BeanContextInvocationHandler.java
 Sun Dec 30 04:29:18 2012
@@ -0,0 +1,28 @@
+/*
+ * 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.util.proxy;
+
+import org.apache.openejb.BeanContext;
+
+import java.lang.reflect.InvocationHandler;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public interface BeanContextInvocationHandler extends InvocationHandler {
+    public BeanContext getBeanContext();
+}

Propchange: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/BeanContextInvocationHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/ProxyEJB.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/ProxyEJB.java?rev=1426887&r1=1426886&r2=1426887&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/ProxyEJB.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/ProxyEJB.java
 Sun Dec 30 04:29:18 2012
@@ -21,6 +21,7 @@ import org.apache.openejb.RpcContainer;
 import org.apache.openejb.core.ivm.IntraVmProxy;
 
 import java.io.Serializable;
+import java.lang.ref.WeakReference;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 
@@ -54,19 +55,35 @@ public class ProxyEJB {
         return Proxy.newProxyInstance(itfs[0].getClassLoader(), itfs, new 
Handler(beanContext));
     }
 
-    private static class Handler implements 
java.lang.reflect.InvocationHandler {
-        private BeanContext beanContext;
+    private static class Handler implements BeanContextInvocationHandler {
+
+        private transient WeakReference<BeanContext> beanContextRef;
+        private final Object deploymentID;
 
         public Handler(BeanContext bc) {
-            beanContext = bc;
+            beanContextRef = new WeakReference<BeanContext>(bc);
+            deploymentID = bc.getDeploymentID();
         }
 
         @Override
         public Object invoke(Object proxy, Method method, Object[] args) 
throws Throwable {
+            final BeanContext beanContext = getBeanContext();
             final RpcContainer container = 
RpcContainer.class.cast(beanContext.getContainer());
+
             return container.invoke(beanContext.getDeploymentID(),
                     beanContext.getInterfaceType(method.getDeclaringClass()),
                     method.getDeclaringClass(), method, args, null);
         }
+
+
+        public BeanContext getBeanContext() {
+            BeanContext beanContext = beanContextRef.get();
+            if (beanContext == null|| beanContext.isDestroyed()){
+                beanContextRef.clear();
+                throw new IllegalStateException("Bean '" + deploymentID + "' 
has been undeployed.");
+            }
+            return beanContext;
+        }
+
     }
 }

Added: 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/ContextReferenceTypes.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/ContextReferenceTypes.java?rev=1426887&view=auto
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/ContextReferenceTypes.java
 (added)
+++ 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/ContextReferenceTypes.java
 Sun Dec 30 04:29:18 2012
@@ -0,0 +1,36 @@
+/*
+ * 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.server.cxf.rs;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @version $Rev$ $Date$
+ */
+class ContextReferenceTypes {
+
+    private final Set<Class<?>> types = new HashSet<Class<?>>();
+
+    ContextReferenceTypes(Set<Class<?>> types) {
+        this.types.addAll(types);
+    }
+
+    public Set<Class<?>> get() {
+        return types;
+    }
+}

Propchange: 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/ContextReferenceTypes.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/Contexts.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/Contexts.java?rev=1426887&r1=1426886&r2=1426887&view=diff
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/Contexts.java
 (original)
+++ 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/Contexts.java
 Sun Dec 30 04:29:18 2012
@@ -36,8 +36,11 @@ import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.ext.ContextResolver;
 import javax.ws.rs.ext.Providers;
 import java.lang.reflect.Field;
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 public final class Contexts {
     private Contexts() {
@@ -52,8 +55,25 @@ public final class Contexts {
         final ClassResourceInfo cri = 
exchange.get(OperationResourceInfo.class).getClassResourceInfo();
 
         // binding context fields
+        final Set<Class<?>> types = new HashSet<Class<?>>();
         for (Field field : cri.getContextFields()) {
-            Class<?> type = field.getType();
+            types.add(field.getType());
+        }
+
+        bind(exchange, types);
+    }
+
+    /**
+     * Using a set ensures we don't set the thread local twice or more,
+     * there may be super classes with injection points of identical types
+     *
+     * Also allows us to get context references from other sources such as 
interceptors
+     *
+     * @param exchange
+     * @param types
+     */
+    public static void bind(Exchange exchange, Set<Class<?>> types) {
+        for (Class<?> type : types) {
             if (Request.class.equals(type)) {
                 Request binding = 
JAXRSUtils.createContextValue(exchange.getInMessage(), null, Request.class);
                 ThreadLocalContextManager.REQUEST.set(binding);

Modified: 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1426887&r1=1426886&r2=1426887&view=diff
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
 (original)
+++ 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
 Sun Dec 30 04:29:18 2012
@@ -30,26 +30,33 @@ import org.apache.openejb.Injection;
 import org.apache.openejb.assembler.classic.ServiceInfo;
 import org.apache.openejb.assembler.classic.util.ServiceConfiguration;
 import org.apache.openejb.assembler.classic.util.ServiceInfos;
+import org.apache.openejb.core.interceptor.InterceptorData;
 import org.apache.openejb.server.cxf.transport.util.CxfUtil;
 import org.apache.openejb.server.httpd.HttpRequest;
 import org.apache.openejb.server.httpd.HttpRequestImpl;
 import org.apache.openejb.server.httpd.HttpResponse;
 import org.apache.openejb.server.rest.RsHttpListener;
+import org.apache.openejb.util.Classes;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.proxy.ProxyEJB;
 import org.apache.webbeans.config.WebBeansContext;
+import org.apache.xbean.finder.AnnotationFinder;
+import org.apache.xbean.finder.archive.ClassesArchive;
 
 import javax.naming.Context;
 import javax.servlet.http.HttpServletRequestWrapper;
 import javax.ws.rs.core.Application;
 import javax.xml.bind.Marshaller;
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public class CxfRsHttpListener implements RsHttpListener {
     private static final Logger LOGGER = 
Logger.getInstance(LogCategory.OPENEJB_RS, CxfRsHttpListener.class);
@@ -98,10 +105,31 @@ public class CxfRsHttpListener implement
     @Override
     public void deployEJB(String fullContext, BeanContext beanContext, 
Collection<Object> additionalProviders, ServiceConfiguration configuration) {
         final Object proxy = ProxyEJB.subclassProxy(beanContext);
+
+        addContextTypes(beanContext);
+
         deploy(beanContext.getBeanClass(), fullContext, new 
NoopResourceProvider(beanContext.getBeanClass(), proxy),
                 proxy, null, new OpenEJBEJBInvoker(), additionalProviders, 
configuration);
     }
 
+    private void addContextTypes(BeanContext beanContext) {
+        final Set<Class<?>> classes = new HashSet<Class<?>>();
+        classes.addAll(Classes.ancestors(beanContext.getBeanClass()));
+        for (InterceptorData interceptorData : 
beanContext.getInstanceScopedInterceptors()) {
+            
classes.addAll(Classes.ancestors(interceptorData.getInterceptorClass()));
+        }
+
+        // We really shouldn't do this here -- should be done in the 
AnnotationDeployer where we already payed for the AnnotationFinder
+        final AnnotationFinder finder = new AnnotationFinder(new 
ClassesArchive(classes));
+        final List<Field> fields = 
finder.findAnnotatedFields(javax.ws.rs.core.Context.class);
+        final Set<Class<?>> contextTypes = new HashSet<Class<?>>();
+        for (Field field : fields) {
+            contextTypes.add(field.getType());
+        }
+
+        beanContext.set(ContextReferenceTypes.class, new 
ContextReferenceTypes(contextTypes));
+    }
+
     private void deploy(Class<?> clazz, String address, ResourceProvider rp, 
Object serviceBean, Application app, Invoker invoker,
                         Collection<Object> additionalProviders, 
ServiceConfiguration configuration) {
         final String impl;

Modified: 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java?rev=1426887&r1=1426886&r2=1426887&view=diff
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
 (original)
+++ 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
 Sun Dec 30 04:29:18 2012
@@ -18,17 +18,30 @@ package org.apache.openejb.server.cxf.rs
 
 import org.apache.cxf.jaxrs.JAXRSInvoker;
 import org.apache.cxf.message.Exchange;
+import org.apache.openejb.BeanContext;
 import org.apache.openejb.InvalidateReferenceException;
 import org.apache.openejb.rest.ThreadLocalContextManager;
+import org.apache.openejb.util.proxy.BeanContextInvocationHandler;
+import org.apache.openejb.util.proxy.ProxyManager;
 
+import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.rmi.RemoteException;
+import java.util.Set;
 
 public class OpenEJBEJBInvoker extends JAXRSInvoker {
     @Override
     public Object invoke(final Exchange exchange, final Object request, final 
Object resourceObject) {
-        Contexts.bind(exchange);
+
+        final Set<Class<?>> types = getContextTypes(resourceObject);
+
+        if (types != null) {
+            Contexts.bind(exchange, types);
+        } else {
+            Contexts.bind(exchange);
+        }
+
         try {
             return super.invoke(exchange, request, resourceObject);
         } finally {
@@ -36,6 +49,18 @@ public class OpenEJBEJBInvoker extends J
         }
     }
 
+    private Set<Class<?>> getContextTypes(Object resourceObject) {
+        final InvocationHandler handler = 
ProxyManager.getInvocationHandler(resourceObject);
+        if (!(handler instanceof BeanContextInvocationHandler)) return null;
+
+        final BeanContext beanContext = ((BeanContextInvocationHandler) 
handler).getBeanContext();
+        final ContextReferenceTypes contextReferenceTypes = 
beanContext.get(ContextReferenceTypes.class);
+
+        if (contextReferenceTypes == null) return null;
+
+        return contextReferenceTypes.get();
+    }
+
     @Override
     protected Object performInvocation(final Exchange exchange, final Object 
serviceObject,
                                        final Method m, final Object[] 
paramArray) throws Exception {

Copied: 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInterceptorInjectionTest.java
 (from r1426800, 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInjectionTest.java)
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInterceptorInjectionTest.java?p2=openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInterceptorInjectionTest.java&p1=openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInjectionTest.java&r1=1426800&r2=1426887&rev=1426887&view=diff
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInjectionTest.java
 (original)
+++ 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RsInterceptorInjectionTest.java
 Sun Dec 30 04:29:18 2012
@@ -17,20 +17,35 @@
 package org.apache.openejb.server.cxf.rs;
 
 import org.apache.openejb.OpenEjbContainer;
+import org.apache.openejb.core.ivm.naming.MapObjectReference;
+import org.apache.openejb.core.ivm.naming.ObjectReference;
 import org.apache.openejb.jee.Empty;
 import org.apache.openejb.jee.SingletonBean;
 import org.apache.openejb.junit.ApplicationComposer;
 import org.apache.openejb.junit.Configuration;
 import org.apache.openejb.junit.Module;
 import org.apache.openejb.loader.IO;
+import org.apache.openejb.rest.ThreadLocalContextManager;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import javax.ejb.Singleton;
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.Interceptors;
+import javax.interceptor.InvocationContext;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.SecurityContext;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.ext.ContextResolver;
 import javax.ws.rs.ext.Providers;
 import java.io.IOException;
 import java.net.URL;
@@ -39,7 +54,8 @@ import java.util.Properties;
 import static org.junit.Assert.assertEquals;
 
 @RunWith(ApplicationComposer.class)
-public class RsInjectionTest {
+public class RsInterceptorInjectionTest {
+
     @Module
     public static SingletonBean service() throws Exception {
         final SingletonBean bean = new SingletonBean(RsInjection.class);
@@ -56,23 +72,98 @@ public class RsInjectionTest {
 
     @Test
     public void rest() throws IOException {
-        final String response = IO.slurp(new 
URL("http://127.0.0.1:4204/RsInjectionTest/injections/check";));
+        final String response = IO.slurp(new 
URL("http://127.0.0.1:4204/RsInterceptorInjectionTest/injections/check";));
         assertEquals("true", response);
     }
 
     @Singleton
+    @Interceptors(RsEjbInterceptor.class)
     @Path("/injections")
     public static class RsInjection {
+
+        @GET
+        @Path("/check")
+        public boolean check() {
+            return false;
+        }
+    }
+
+    public static class RsEjbInterceptor {
+
+        @Context
+        private HttpHeaders httpHeaders;
+
         @Context
         private Providers providers;
 
         @Context
         private HttpServletResponse response;
 
-        @GET
-        @Path("/check")
-        public boolean check() {
-            return providers != null && response != null;
+        @Context
+        private Request request;
+
+        @Context
+        private HttpServletRequest httpServletRequest;
+
+// TODO TOMEE-684
+//        @Context
+//        private ServletRequest servletRequest;
+//
+        @Context
+        private UriInfo uriInfo;
+
+        @Context
+        private SecurityContext securityContext;
+
+        @Context
+        private ContextResolver contextResolver;
+
+// TODO TOMEE-685
+//        @Context
+//        private ServletConfig servletConfig;
+
+
+        @AroundInvoke
+        private Object invoke(InvocationContext context) throws Exception {
+            // Are they injected?
+            Assert.assertNotNull("httpHeaders", httpHeaders);
+            Assert.assertNotNull("providers", providers);
+            Assert.assertNotNull("response", response);
+            Assert.assertNotNull("request", request);
+            Assert.assertNotNull("httpServletRequest", httpServletRequest);
+            Assert.assertNotNull("uriInfo", uriInfo);
+            Assert.assertNotNull("securityContext", securityContext);
+            Assert.assertNotNull("contextResolver", contextResolver);
+
+            // Do the thread locals actually point anywhere?
+            Assert.assertTrue(httpHeaders.getRequestHeaders().size() > 0);
+            Assert.assertTrue(providers.getExceptionMapper(FooException.class) 
== null);
+            Assert.assertTrue(response.getHeaderNames() != null);
+            Assert.assertTrue(request.getMethod() != null);
+            Assert.assertTrue(httpServletRequest.getMethod() != null);
+            Assert.assertTrue(uriInfo.getPath() != null);
+// TODO OPENEJB-1979 - JAX-RS SecurityContext.isCallerInRole always returns 
true in Embedded EJBContainer
+//            
Assert.assertTrue(!securityContext.isUserInRole("ThereIsNoWayThisShouldEverPass"));
+            Assert.assertTrue(contextResolver.getContext(null) == null);
+
+            context.proceed();
+
+            // Test again to ensure thread locals are still valid
+            Assert.assertTrue(httpHeaders.getRequestHeaders().size() > 0);
+            Assert.assertTrue(providers.getExceptionMapper(FooException.class) 
== null);
+            Assert.assertTrue(response.getHeaderNames() != null);
+            Assert.assertTrue(request.getMethod() != null);
+            Assert.assertTrue(httpServletRequest.getMethod() != null);
+            Assert.assertTrue(uriInfo.getPath() != null);
+// TODO OPENEJB-1979 - JAX-RS SecurityContext.isCallerInRole always returns 
true in Embedded EJBContainer
+//            
Assert.assertTrue(!securityContext.isUserInRole("ThereIsNoWayThisShouldEverPass"));
+            Assert.assertTrue(contextResolver.getContext(null) == null);
+
+            return true;
         }
     }
+
+    public static class FooException extends RuntimeException {
+    }
+
 }


Reply via email to