You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/07/25 19:51:23 UTC

svn commit: r1150809 - in /openejb/trunk/openejb3: container/openejb-core/src/main/java/org/apache/openejb/ container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ container/openejb-core/src/main/java/org/apache/openejb/config/ conta...

Author: rmannibucau
Date: Mon Jul 25 17:51:16 2011
New Revision: 1150809

URL: http://svn.apache.org/viewvc?rev=1150809&view=rev
Log:
OPENEJB-1237 starting work on REST EJBs, all injections doesn't work yet but it starts to be useable

Added:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/AbstractThreadLocalProxy.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalApplication.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextResolver.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalHttpHeaders.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalRequest.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalSecurityContext.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalUriInfo.java
Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java Mon Jul 25 17:51:16 2011
@@ -1221,7 +1221,7 @@ public class BeanContext extends Deploym
 
             // Create bean instance
 
-            final InjectionProcessor injectionProcessor = new InjectionProcessor(beanConstructor.create(creationalContext), this.getInjections(), InjectionProcessor.unwrap(ctx));
+             final InjectionProcessor injectionProcessor = new InjectionProcessor(beanConstructor.create(creationalContext), this.getInjections(), InjectionProcessor.unwrap(ctx));
 
             final Object beanInstance = injectionProcessor.createInstance();
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Mon Jul 25 17:51:16 2011
@@ -16,29 +16,6 @@
  */
 package org.apache.openejb.assembler.classic;
 
-import javax.management.InstanceNotFoundException;
-import javax.management.MBeanRegistrationException;
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-import javax.naming.Binding;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NameAlreadyBoundException;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.persistence.EntityManagerFactory;
-import javax.resource.spi.BootstrapContext;
-import javax.resource.spi.ConnectionManager;
-import javax.resource.spi.ManagedConnectionFactory;
-import javax.resource.spi.ResourceAdapter;
-import javax.resource.spi.ResourceAdapterInternalException;
-import javax.resource.spi.XATerminator;
-import javax.resource.spi.work.WorkManager;
-import javax.transaction.TransactionManager;
-import javax.transaction.TransactionSynchronizationRegistry;
-import javax.validation.ValidationException;
-import javax.validation.ValidatorFactory;
 import org.apache.geronimo.connector.work.GeronimoWorkManager;
 import org.apache.geronimo.connector.work.TransactionContextHandler;
 import org.apache.geronimo.connector.work.WorkContextHandler;
@@ -80,6 +57,7 @@ import org.apache.openejb.loader.SystemI
 import org.apache.openejb.persistence.JtaEntityManagerRegistry;
 import org.apache.openejb.persistence.PersistenceClassLoaderHandler;
 import org.apache.openejb.resource.GeronimoConnectionManagerFactory;
+import org.apache.openejb.rest.ThreadLocalContextManager;
 import org.apache.openejb.spi.ApplicationServer;
 import org.apache.openejb.spi.ContainerSystem;
 import org.apache.openejb.spi.SecurityService;
@@ -98,6 +76,29 @@ import org.apache.xbean.recipe.ObjectRec
 import org.apache.xbean.recipe.Option;
 import org.apache.xbean.recipe.UnsetPropertiesRecipe;
 
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.naming.Binding;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NameAlreadyBoundException;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.persistence.EntityManagerFactory;
+import javax.resource.spi.BootstrapContext;
+import javax.resource.spi.ConnectionManager;
+import javax.resource.spi.ManagedConnectionFactory;
+import javax.resource.spi.ResourceAdapter;
+import javax.resource.spi.ResourceAdapterInternalException;
+import javax.resource.spi.XATerminator;
+import javax.resource.spi.work.WorkManager;
+import javax.transaction.TransactionManager;
+import javax.transaction.TransactionSynchronizationRegistry;
+import javax.validation.ValidationException;
+import javax.validation.ValidatorFactory;
 import java.io.File;
 import java.io.IOException;
 import java.lang.instrument.ClassFileTransformer;
@@ -753,7 +754,7 @@ public class Assembler extends Assembler
 
 //                Debug.printContext(context);
 
-                containerSystem.getJNDIContext().bind("openejb/client/" + clientInfo.moduleId, context);
+                containerSystemContext.bind("openejb/client/" + clientInfo.moduleId, context);
 
                 if (clientInfo.path != null) {
                     context.bind("info/path", clientInfo.path);
@@ -767,15 +768,24 @@ public class Assembler extends Assembler
                 context.bind("info/injections", injections);
 
                 for (String clientClassName : clientInfo.remoteClients) {
-                    containerSystem.getJNDIContext().bind("openejb/client/" + clientClassName, clientInfo.moduleId);
+                    containerSystemContext.bind("openejb/client/" + clientClassName, clientInfo.moduleId);
                 }
 
                 for (String clientClassName : clientInfo.localClients) {
-                    containerSystem.getJNDIContext().bind("openejb/client/" + clientClassName, clientInfo.moduleId);
+                    containerSystemContext.bind("openejb/client/" + clientClassName, clientInfo.moduleId);
                     logger.getChildLogger("client").info("createApplication.createLocalClient", clientClassName, clientInfo.moduleId);
                 }
             }
 
+            // REST context resources
+            containerSystemContext.bind("openejb/Resource/rest/context/Request", ThreadLocalContextManager.REQUEST);
+            containerSystemContext.bind("openejb/Resource/rest/context/UriInfo", ThreadLocalContextManager.URI_INFO);
+            containerSystemContext.bind("openejb/Resource/rest/context/HttpHeaders", ThreadLocalContextManager.HTTP_HEADERS);
+            containerSystemContext.bind("openejb/Resource/rest/context/SecurityContext", ThreadLocalContextManager.SECURITY_CONTEXT);
+            // TODO:
+            // containerSystemContext.bind("openejb/Resource/rest/context/ContextResolver", ThreadLocalContextManager.CONTEXT_RESOLVER);
+            // containerSystemContext.bind("openejb/Resource/rest/context/Application", ThreadLocalContextManager.APPLICATION);
+
             SystemInstance systemInstance = SystemInstance.get();
 
             // WebApp

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Mon Jul 25 17:51:16 2011
@@ -119,6 +119,7 @@ import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.core.Application;
+import javax.ws.rs.core.Context;
 import javax.xml.ws.Service;
 import javax.xml.ws.WebServiceProvider;
 import javax.xml.ws.WebServiceRef;
@@ -3140,6 +3141,14 @@ public class AnnotationDeployer implemen
             }
 
             //
+            // @Context (REST)
+            //
+            for (Annotated<Field> field : annotationFinder.findMetaAnnotatedFields(Context.class)) {
+                Member member = new FieldMember(field.get());
+                buildContext(consumer, member);
+            }
+
+            //
             // @WebServiceRef
             //
 
@@ -3235,6 +3244,19 @@ public class AnnotationDeployer implemen
 
         }
 
+        private void buildContext(JndiConsumer consumer, Member member) {
+            ResourceRef ref = new ResourceRef();
+            ref.setName(member.getDeclaringClass().getName() + "/" + member.getName());
+            ref.setLookupName("java:openejb/Resource/rest/context/" + member.getType().getSimpleName());
+
+            InjectionTarget target = new InjectionTarget();
+            target.setInjectionTargetClass(member.getDeclaringClass().getName());
+            target.setInjectionTargetName(member.getName());
+            ref.getInjectionTarget().add(target);
+
+            consumer.getResourceRef().add(ref);
+        }
+
         /**
          * Process @EJB into <ejb-ref> or <ejb-local-ref> for the specified member (field or method)
          *
@@ -4592,8 +4614,9 @@ public class AnnotationDeployer implemen
         Collection<String> classes = new HashSet<String>();
 
         // annotations on classes
-        List<Class<?>> annotatedClasses = finder.findAnnotatedClasses(Path.class);
-        for (Class<?> clazz : annotatedClasses) {
+        List<Annotated<Class<?>>> annotatedClasses = finder.findMetaAnnotatedClasses(Path.class);
+        for (Annotated<Class<?>> aClazz : annotatedClasses) {
+            Class<?> clazz = aClazz.get();
             int modifiers = clazz.getModifiers();
             if (!Modifier.isAbstract(modifiers)) {
                 if (!isEJB(clazz)) {
@@ -4605,9 +4628,9 @@ public class AnnotationDeployer implemen
         }
 
         // methods annotations: inheritance is managed like it to be more efficient
-        List<Method> methods = new ArrayList<Method>();
-        methods.addAll(finder.findAnnotatedMethods(Path.class));
-        for (Method method : methods) {
+        List<Annotated<Method>> methods = finder.findMetaAnnotatedMethods(Path.class);
+        for (Annotated<Method> aMethod : methods) {
+            Method method = aMethod.get();
             Class<?> clazz = method.getDeclaringClass();
             int modifiers = clazz.getModifiers();
             if (!Modifier.isAbstract(modifiers)) {

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Mon Jul 25 17:51:16 2011
@@ -17,6 +17,12 @@
  */
 package org.apache.openejb.config;
 
+import javax.ws.rs.core.Application;
+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 org.apache.openejb.OpenEJBException;
 import org.apache.openejb.assembler.classic.ContainerInfo;
 import org.apache.openejb.assembler.classic.ResourceInfo;
@@ -101,6 +107,13 @@ public class AutoConfig implements Dynam
         // Bean Validation is automatically handled
         ignoredReferenceTypes.add(Validator.class.getName());
         ignoredReferenceTypes.add(ValidatorFactory.class.getName());
+        // REST injections done via @Context and bound into a resource env...
+        ignoredReferenceTypes.add(Request.class.getName());
+        ignoredReferenceTypes.add(UriInfo.class.getName());
+        ignoredReferenceTypes.add(HttpHeaders.class.getName());
+        ignoredReferenceTypes.add(SecurityContext.class.getName());
+        ignoredReferenceTypes.add(ContextResolver.class.getName());
+        ignoredReferenceTypes.add(Application.class.getName());
     }
 
     private final ConfigurationFactory configFactory;

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/AbstractThreadLocalProxy.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/AbstractThreadLocalProxy.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/AbstractThreadLocalProxy.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/naming/AbstractThreadLocalProxy.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,44 @@
+/**
+ * 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.core.ivm.naming;
+
+/**
+ * taken from CXF to be able to bind it into JNDI managing the value in lazy mode (request time).
+ */
+public class AbstractThreadLocalProxy<T> {
+
+    private ThreadLocal<T> infos = new ThreadLocal<T>();
+    
+    protected AbstractThreadLocalProxy() {
+        // no-op
+    }
+    
+    public T get() {
+        return infos.get();
+    }
+
+    public void remove() {
+        infos.remove();
+    }
+
+    public void set(T value) {
+        infos.set(value);
+    }
+}

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalApplication.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalApplication.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalApplication.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalApplication.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,26 @@
+/**
+ * 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.rest;
+
+import javax.ws.rs.core.Application;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalApplication extends AbstractThreadLocalProxy<Application> {
+}

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextManager.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,24 @@
+package org.apache.openejb.rest;
+
+import javax.ws.rs.core.Application;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class ThreadLocalContextManager {
+    public static final ThreadLocalRequest REQUEST = new ThreadLocalRequest();
+    public static final ThreadLocalUriInfo URI_INFO = new ThreadLocalUriInfo();
+    public static final ThreadLocalHttpHeaders HTTP_HEADERS = new ThreadLocalHttpHeaders();
+    public static final ThreadLocalSecurityContext SECURITY_CONTEXT = new ThreadLocalSecurityContext();
+    public static final ThreadLocalContextResolver CONTEXT_RESOLVER = new ThreadLocalContextResolver();
+    public static final ThreadLocalApplication APPLICATION = new ThreadLocalApplication();
+
+    public static void reset() {
+        REQUEST.remove();
+        URI_INFO.remove();
+        HTTP_HEADERS.remove();
+        SECURITY_CONTEXT.remove();
+        CONTEXT_RESOLVER.remove();
+        APPLICATION.remove();
+    }
+}

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextResolver.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextResolver.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextResolver.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalContextResolver.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,33 @@
+/**
+ * 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.rest;
+
+import javax.ws.rs.ext.ContextResolver;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalContextResolver extends AbstractThreadLocalProxy<ContextResolver>
+    implements ContextResolver {
+
+    @SuppressWarnings("unchecked")
+    public Object getContext(Class type) {
+        return get() != null ? get().getContext(type) : null;
+    }
+
+}

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalHttpHeaders.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalHttpHeaders.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalHttpHeaders.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalHttpHeaders.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,63 @@
+/**
+ * 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.rest;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import javax.ws.rs.core.Cookie;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalHttpHeaders extends AbstractThreadLocalProxy<HttpHeaders>
+    implements HttpHeaders {
+
+    public List<MediaType> getAcceptableMediaTypes() {
+        return get().getAcceptableMediaTypes();
+    }
+
+    public Map<String, Cookie> getCookies() {
+        return get().getCookies();
+    }
+
+    public Locale getLanguage() {
+        return get().getLanguage();
+    }
+
+    public MediaType getMediaType() {
+        return get().getMediaType();
+    }
+
+    public MultivaluedMap<String, String> getRequestHeaders() {
+        return get().getRequestHeaders();
+    }
+
+    public List<Locale> getAcceptableLanguages() {
+        return get().getAcceptableLanguages();
+    }
+
+    public List<String> getRequestHeader(String name) {
+        return get().getRequestHeader(name);
+    }
+
+}

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalRequest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalRequest.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalRequest.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalRequest.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,57 @@
+/**
+ * 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.rest;
+
+import java.util.Date;
+import java.util.List;
+import javax.ws.rs.core.EntityTag;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Variant;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalRequest extends AbstractThreadLocalProxy<Request>
+    implements Request {
+
+    public ResponseBuilder evaluatePreconditions(EntityTag eTag) {
+        return get().evaluatePreconditions(eTag);
+    }
+
+    public ResponseBuilder evaluatePreconditions(Date lastModified) {
+        return get().evaluatePreconditions(lastModified);
+    }
+
+    public ResponseBuilder evaluatePreconditions(Date lastModified, EntityTag eTag) {
+        return get().evaluatePreconditions(lastModified, eTag);
+    }
+
+    public Variant selectVariant(List<Variant> vars) throws IllegalArgumentException {
+        return get().selectVariant(vars);
+    }
+
+    public String getMethod() {
+        return get().getMethod();
+    }
+
+    public ResponseBuilder evaluatePreconditions() {
+        return get().evaluatePreconditions();
+    }
+
+}

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalSecurityContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalSecurityContext.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalSecurityContext.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalSecurityContext.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,45 @@
+/**
+ * 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.rest;
+
+import java.security.Principal;
+import javax.ws.rs.core.SecurityContext;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalSecurityContext extends AbstractThreadLocalProxy<SecurityContext>
+    implements SecurityContext {
+
+    public String getAuthenticationScheme() {
+        return get().getAuthenticationScheme();
+    }
+
+    public Principal getUserPrincipal() {
+        return get().getUserPrincipal();
+    }
+
+    public boolean isSecure() {
+        return get().isSecure();
+    }
+
+    public boolean isUserInRole(String role) {
+        return get().isUserInRole(role);
+    }
+
+}

Added: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalUriInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalUriInfo.java?rev=1150809&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalUriInfo.java (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/rest/ThreadLocalUriInfo.java Mon Jul 25 17:51:16 2011
@@ -0,0 +1,103 @@
+/**
+ * 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.rest;
+
+import java.net.URI;
+import java.util.List;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.PathSegment;
+import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.UriInfo;
+import org.apache.openejb.core.ivm.naming.AbstractThreadLocalProxy;
+
+public class ThreadLocalUriInfo extends AbstractThreadLocalProxy<UriInfo>
+                                    implements UriInfo {
+
+    
+    public URI getAbsolutePath() {
+        return get().getAbsolutePath();
+    }
+
+    public UriBuilder getAbsolutePathBuilder() {
+        return get().getAbsolutePathBuilder();
+    }
+
+    
+    public URI getBaseUri() {
+        return get().getBaseUri();
+    }
+
+    public UriBuilder getBaseUriBuilder() {
+        return get().getBaseUriBuilder();
+    }
+
+    public String getPath() {
+        return get().getPath();
+    }
+
+    public String getPath(boolean decode) {
+        return get().getPath(decode);
+    }
+
+    public List<PathSegment> getPathSegments() {
+        return get().getPathSegments();
+    }
+
+    public List<PathSegment> getPathSegments(boolean decode) {
+        return get().getPathSegments(decode);
+    }
+
+    public MultivaluedMap<String, String> getQueryParameters() {
+        return get().getQueryParameters();
+    }
+
+    public MultivaluedMap<String, String> getQueryParameters(boolean decode) {
+        return get().getQueryParameters(decode);
+    }
+
+    public URI getRequestUri() {
+        return get().getRequestUri();
+    }
+
+    public UriBuilder getRequestUriBuilder() {
+        return get().getRequestUriBuilder();
+    }
+
+    public MultivaluedMap<String, String> getPathParameters() {
+        return get().getPathParameters();
+    }
+
+    public MultivaluedMap<String, String> getPathParameters(boolean decode) {
+        return get().getPathParameters(decode);
+    }
+
+    public List<Object> getMatchedResources() {
+        return get().getMatchedResources();
+    }
+
+    public List<String> getMatchedURIs() {
+        return get().getMatchedURIs();
+    }
+
+    public List<String> getMatchedURIs(boolean decode) {
+        return get().getMatchedURIs(decode);
+    }
+
+}

Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java Mon Jul 25 17:51:16 2011
@@ -70,7 +70,6 @@ public class CxfRsHttpListener implement
                 }
             }
         }, httpResponse);
-
     }
 
     @Override public void deploySingleton(String fullContext, Object o, Application appInstance) {

Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java Mon Jul 25 17:51:16 2011
@@ -1,8 +1,28 @@
 package org.apache.openejb.server.cxf.rs;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.SecurityContext;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.ext.ContextResolver;
+import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.jaxrs.JAXRSInvoker;
+import org.apache.cxf.jaxrs.model.ClassResourceInfo;
+import org.apache.cxf.jaxrs.model.OperationResourceInfo;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.MessageContentsList;
 import org.apache.openejb.BeanContext;
+import org.apache.openejb.Injection;
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.RpcContainer;
+import org.apache.openejb.rest.ThreadLocalContextManager;
 
 /**
  * @author Romain Manni-Bucau
@@ -15,7 +35,59 @@ public class OpenEJBEJBInvoker extends J
     }
 
     @Override public Object invoke(Exchange exchange, Object request, Object resourceObject) {
-        throw new UnsupportedOperationException("to implement...");
+        final OperationResourceInfo ori = exchange.get(OperationResourceInfo.class);
+        final ClassResourceInfo cri = ori.getClassResourceInfo();
+        final Method method = cri.getMethodDispatcher().getMethod(ori);
+        final RpcContainer container = RpcContainer.class.cast(context.getContainer());
+
+        List<?> params;
+        if (request instanceof List) {
+            params = CastUtils.cast((List<?>) request);
+        } else if (request != null) {
+            params = new MessageContentsList(request);
+        } else {
+            params = new ArrayList<Object>();
+        }
+        Object[] parameters = params.toArray(new Object[params.size()]);
+
+        // injecting context parameters
+        super.insertExchange(method, parameters, exchange);
+
+        // binding context fields
+        for (Field field : cri.getContextFields()) {
+            Class<?> type = field.getType();
+            if (Request.class.equals(type)) {
+                Request binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, Request.class);
+                ThreadLocalContextManager.REQUEST.set(binding);
+            } else if (UriInfo.class.equals(type)) {
+                UriInfo binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, UriInfo.class);
+                ThreadLocalContextManager.URI_INFO.set(binding);
+            } else if (HttpHeaders.class.equals(type)) {
+                HttpHeaders binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, HttpHeaders.class);
+                ThreadLocalContextManager.HTTP_HEADERS.set(binding);
+            } else if (SecurityContext.class.equals(type)) {
+                SecurityContext binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, SecurityContext.class);
+                ThreadLocalContextManager.SECURITY_CONTEXT.set(binding);
+            } else if (Application.class.equals(type)) {
+                Application binding = JAXRSUtils.createContextValue(exchange.getInMessage(), null, Application.class);
+                ThreadLocalContextManager.APPLICATION.set(binding);
+            } else if (ContextResolver.class.equals(type)) {
+                // TODO
+            }
+        }
+
+        // invoking the EJB
+        try {
+            Object result = container.invoke(context.getDeploymentID(),
+                context.getInterfaceType(method.getDeclaringClass()),
+                method.getDeclaringClass(), method, parameters, null);
+            return new MessageContentsList(result);
+        } catch (OpenEJBException e) {
+            Response excResponse = JAXRSUtils.convertFaultToResponse(e, exchange.getInMessage());
+            return new MessageContentsList(excResponse);
+        } finally {
+            ThreadLocalContextManager.reset();
+        }
     }
 
     @Override public Object getServiceObject(Exchange exchange) {

Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java Mon Jul 25 17:51:16 2011
@@ -21,20 +21,17 @@ import java.util.Properties;
 import javax.ejb.EJB;
 import javax.ejb.Stateless;
 import javax.ejb.embeddable.EJBContainer;
-import javax.enterprise.inject.Default;
 import javax.naming.Context;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.SecurityContext;
-import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.core.Request;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.openejb.OpenEjbContainer;
 import org.apache.openejb.server.cxf.rs.beans.SimpleEJB;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import static junit.framework.Assert.assertEquals;
@@ -60,28 +57,49 @@ public class EjbDeploymentTest {
         }
     }
 
-    @Ignore("to be implemented")
-    @Test public void deploy() {
-        // service works
+    @Test public void normal() {
         assertNotNull(service);
-        assertEquals("ok", service.ok(true));
+        assertEquals("ok", service.normal());
+    }
 
-        // rest invocation works
+    @Test public void rest() {
         String response = WebClient.create("http://localhost:4204").path("/ejb/rest").get(String.class);
         assertEquals("ok", response);
     }
 
-    @Path("/ejb")
+    @Test public void restParameterInjected() {
+        String response = WebClient.create("http://localhost:4204").path("/ejb/param").get(String.class);
+        assertEquals("true", response);
+
+        response = WebClient.create("http://localhost:4204").path("/ejb/param").query("arg", "foo").get(String.class);
+        assertEquals("foo", response);
+    }
+
+    @Test public void restFieldInjected() {
+        Boolean response = WebClient.create("http://localhost:4204").path("/ejb/field").get(Boolean.class);
+        assertEquals(true, response.booleanValue());
+    }
+
     @Stateless
+    @Path("/ejb")
     public static class RESTIsCool {
-        @javax.ws.rs.core.Context private UriInfo uriInfo;
         @EJB private SimpleEJB simpleEJB;
+        @javax.ws.rs.core.Context Request request;
 
-        @Path("/rest") @GET public String ok(@QueryParam("force") @DefaultValue("false") boolean force) {
-            /*if (!(uriInfo != null || force)) {
-                return "ko";
-            }*/
+        @Path("/normal") @GET public String normal() {
             return simpleEJB.ok();
         }
+
+        @Path("/rest") @GET public String rest() {
+            return simpleEJB.ok();
+        }
+
+        @Path("/param") @GET public String param(@QueryParam("arg") @DefaultValue("true") String p) {
+            return p;
+        }
+
+        @Path("/field") @GET public boolean field() {
+            return "GET".equals(request.getMethod());
+        }
     }
 }

Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java?rev=1150809&r1=1150808&r2=1150809&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java Mon Jul 25 17:51:16 2011
@@ -19,6 +19,8 @@ package org.apache.openejb.server.cxf.rs
 import javax.ejb.EJB;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.UriInfo;
 
 /**
  * @author Romain Manni-Bucau
@@ -26,8 +28,9 @@ import javax.ws.rs.Path;
 @Path("/inject")
 public class RestWithInjections {
     @EJB private SimpleEJB simple;
+    @Context UriInfo uriInfo;
 
     @Path("/ejb") @GET public boolean ejb() {
-        return simple != null && "ok".equals(simple.ok());
+        return simple != null && "ok".equals(simple.ok()) && uriInfo != null;
     }
 }