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/22 17:59:31 UTC

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

Author: rmannibucau
Date: Fri Jul 22 15:59:28 2011
New Revision: 1149644

URL: http://svn.apache.org/viewvc?rev=1149644&view=rev
Log:
OPENEJB-1237 refactoring to prepare REST EJB management

Added:
    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/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java
      - copied, changed from r1149471, openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java
Removed:
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java
Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.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/AppInfoBuilder.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
    openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
    openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
    openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java?rev=1149644&r1=1149643&r2=1149644&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanInfo.java Fri Jul 22 15:59:28 2011
@@ -88,4 +88,6 @@ public abstract class EnterpriseBeanInfo
     public TimeoutInfo statefulTimeout;    
     public List<MethodScheduleInfo> methodScheduleInfos = new ArrayList<MethodScheduleInfo>();
 
+    public boolean restService;
+
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java?rev=1149644&r1=1149643&r2=1149644&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java Fri Jul 22 15:59:28 2011
@@ -35,6 +35,7 @@ public class WebAppInfo extends Validati
     public final Set<String> restClass = new TreeSet<String>();
     public final Set<String> restApplications = new TreeSet<String>();
     public final Set<String> ejbWebServices = new TreeSet<String>();
+    public final Set<String> ejbRestServices = new TreeSet<String>();
     public final List<PortInfo> portInfos = new ArrayList<PortInfo>();
     public final JndiEncInfo jndiEnc = new JndiEncInfo();
     public final List<ServletInfo> servlets = new ArrayList<ServletInfo>();

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=1149644&r1=1149643&r2=1149644&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 Fri Jul 22 15:59:28 2011
@@ -987,7 +987,7 @@ public class AnnotationDeployer implemen
              *REST
              */
             // get by annotations
-            webModule.getRestClasses().addAll(findRestClasses(finder));
+            webModule.getRestClasses().addAll(findRestClasses(webModule, finder));
             // Applications
             List<Class<? extends Application>> applications = finder.findSubclasses(Application.class);
             for (Class<? extends Application> app : applications) {
@@ -2066,6 +2066,16 @@ public class AnnotationDeployer implemen
                             }
                         }
 
+                        /**
+                         * Annotations for singletons and stateless
+                         */
+                        if (sessionBean.getSessionType() != SessionType.STATEFUL) {
+                            // REST can be fun
+                            if (annotationFinder.isAnnotationPresent(Path.class) || !annotationFinder.findAnnotatedMethods(Path.class).isEmpty()) {
+                                sessionBean.setRestService(true);
+                            }
+                        }
+
                         /*
                          * Annotations specific to @Singleton beans
                          */
@@ -4578,7 +4588,7 @@ public class AnnotationDeployer implemen
         return 0;
     }
 
-    private static Collection<String> findRestClasses(IAnnotationFinder finder) {
+    private static Collection<String> findRestClasses(WebModule webModule, IAnnotationFinder finder) {
         Collection<String> classes = new HashSet<String>();
 
         // annotations on classes
@@ -4586,7 +4596,11 @@ public class AnnotationDeployer implemen
         for (Class<?> clazz : annotatedClasses) {
             int modifiers = clazz.getModifiers();
             if (!Modifier.isAbstract(modifiers)) {
-                classes.add(clazz.getName());
+                if (isEJB(clazz)) {
+                    classes.add(clazz.getName());
+                } else {
+                    webModule.getEjbRestServices().add(clazz.getName());
+                }
             }
         }
 
@@ -4597,10 +4611,20 @@ public class AnnotationDeployer implemen
             Class<?> clazz = method.getDeclaringClass();
             int modifiers = clazz.getModifiers();
             if (!Modifier.isAbstract(modifiers)) {
-                classes.add(clazz.getName());
+                if (isEJB(clazz)) {
+                    classes.add(clazz.getName());
+                } else {
+                    webModule.getEjbRestServices().add(clazz.getName());
+                }
             }
         }
 
         return classes;
     }
+
+    private static boolean isEJB(Class<?> clazz) {
+        return clazz.isAnnotationPresent(Stateless.class)
+            || clazz.isAnnotationPresent(Singleton.class)
+            || clazz.isAnnotationPresent(Stateful.class); // what a weird idea!
+    }
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java?rev=1149644&r1=1149643&r2=1149644&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java Fri Jul 22 15:59:28 2011
@@ -304,6 +304,7 @@ class AppInfoBuilder {
             webAppInfo.restApplications.addAll(webModule.getRestApplications());
             webAppInfo.restClass.addAll(webModule.getRestClasses());
             webAppInfo.ejbWebServices.addAll(webModule.getEjbWebServices());
+            webAppInfo.ejbRestServices.addAll(webModule.getEjbRestServices());
 
             webAppInfo.host = webModule.getHost();
             webAppInfo.contextRoot = webModule.getContextRoot();

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java?rev=1149644&r1=1149643&r2=1149644&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java Fri Jul 22 15:59:28 2011
@@ -92,6 +92,7 @@ import org.apache.openejb.jee.SecurityRo
 import org.apache.openejb.jee.SecurityRoleRef;
 import org.apache.openejb.jee.SessionBean;
 import org.apache.openejb.jee.SessionType;
+import org.apache.openejb.jee.StatefulBean;
 import org.apache.openejb.jee.Timeout;
 import org.apache.openejb.jee.Timer;
 import org.apache.openejb.jee.TimerSchedule;
@@ -638,6 +639,8 @@ public class EjbJarInfoBuilder {
 
         bean.statefulTimeout = toInfo(s.getStatefulTimeout());
 
+        bean.restService = s.isRestService() && !(s instanceof StatefulBean);
+
         return bean;
     }
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java?rev=1149644&r1=1149643&r2=1149644&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java Fri Jul 22 15:59:28 2011
@@ -50,6 +50,7 @@ public class WebModule extends Module im
     private IAnnotationFinder finder;
     private final Set<String> restClasses = new TreeSet<String>();
     private final Set<String> ejbWebServices = new TreeSet<String>();
+    private final Set<String> ejbRestServices = new TreeSet<String>();
     private final Set<String> restApplications = new TreeSet<String>();
 
     private ID id;
@@ -190,4 +191,8 @@ public class WebModule extends Module im
     public Set<String> getEjbWebServices() {
         return ejbWebServices;
     }
+
+    public Set<String> getEjbRestServices() {
+        return ejbRestServices;
+    }
 }

Modified: openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java?rev=1149644&r1=1149643&r2=1149644&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java (original)
+++ openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/SessionBean.java Fri Jul 22 15:59:28 2011
@@ -253,6 +253,9 @@ public class SessionBean implements Remo
     @XmlTransient
     private List<LifecycleCallback> afterCompletion;
 
+    @XmlTransient
+    private boolean restService = false;
+
     public SessionBean() {
     }
 
@@ -884,4 +887,12 @@ public class SessionBean implements Remo
     public String getTimerConsumerName() {
         return ejbName;
     }
+
+    public boolean isRestService() {
+        return restService;
+    }
+
+    public void setRestService(boolean restService) {
+        this.restService = restService;
+    }
 }

Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java?rev=1149644&r1=1149643&r2=1149644&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java Fri Jul 22 15:59:28 2011
@@ -57,7 +57,7 @@ public class CxfRSService extends RESTSe
         httpTransportFactory = new HttpTransportFactory(CxfUtil.getBus());
     }
 
-    @Override protected RsHttpListener createHttpListener(Object o, RsHttpListener.Scope scope) {
-        return new CxfRsHttpListener(scope, httpTransportFactory);
+    @Override protected RsHttpListener createHttpListener() {
+        return new CxfRsHttpListener(httpTransportFactory);
     }
 }

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=1149644&r1=1149643&r2=1149644&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 Fri Jul 22 15:59:28 2011
@@ -16,27 +16,32 @@
  */
 package org.apache.openejb.server.cxf.rs;
 
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.naming.Context;
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.ws.rs.core.Application;
+import javax.xml.bind.Marshaller;
 import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
 import org.apache.cxf.jaxrs.provider.JSONProvider;
+import org.apache.cxf.service.invoker.Invoker;
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
 import org.apache.cxf.transport.http.HTTPTransportFactory;
+import org.apache.openejb.BeanContext;
 import org.apache.openejb.Injection;
 import org.apache.openejb.server.httpd.HttpRequest;
 import org.apache.openejb.server.httpd.HttpResponse;
 import org.apache.openejb.server.rest.RsHttpListener;
 
-import javax.naming.Context;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.ws.rs.core.Application;
-import javax.xml.bind.Marshaller;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.*;
-
 /**
  * @author Romain Manni-Bucau
  */
@@ -46,11 +51,9 @@ public class CxfRsHttpListener implement
     private HTTPTransportFactory transportFactory;
     private AbstractHTTPDestination destination;
     private Server server;
-    private Scope scope;
 
-    public CxfRsHttpListener(Scope scp, HTTPTransportFactory httpTransportFactory) {
+    public CxfRsHttpListener(HTTPTransportFactory httpTransportFactory) {
         transportFactory = httpTransportFactory;
-        scope = scp;
     }
 
     @Override public void onMessage(final HttpRequest httpRequest, final HttpResponse httpResponse) throws Exception {
@@ -70,39 +73,39 @@ public class CxfRsHttpListener implement
 
     }
 
-    public ResourceProvider getResourceProvider(Object o, Collection<Injection> injections, Context context) {
-        switch (scope) {
-            case SINGLETON:
-                return new SingletonResourceProvider(o);
-            case PROTOTYPE:
-            default:
-                return new OpenEJBPerRequestResourceProvider(getRESTClass(o), injections, context);
-        }
+    @Override public void deploySingleton(String fullContext, Object o, Application appInstance) {
+        deploy(o.getClass(), fullContext, new SingletonResourceProvider(o), o, appInstance, null);
     }
 
-    private Class<?> getRESTClass(Object o) {
-        if (scope == Scope.PROTOTYPE) {
-            return Class.class.cast(o);
-        }
-        return o.getClass();
+    @Override public void deployPojo(String fullContext, Class<?> loadedClazz, Application app, Collection<Injection> injections, Context context) {
+        deploy(loadedClazz, fullContext, new OpenEJBPerRequestPojoResourceProvider(loadedClazz, injections, context), null, app, null);
+    }
+
+    @Override public void deployEJB(String fullContext, BeanContext beanContext) {
+        deploy(beanContext.getBeanClass(), fullContext, null, null, null, new OpenEJBEJBInvoker(beanContext));
     }
 
-    public void deploy(String address, Object o, Application app, Collection<Injection> injections, Context context) {
+    private void deploy(Class<?> clazz, String address, ResourceProvider rp, Object serviceBean, Application app, Invoker invoker) {
         JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
-        factory.setResourceClasses(getRESTClass(o));
+        factory.setResourceClasses(clazz);
         factory.setDestinationFactory(transportFactory);
         factory.setBus(transportFactory.getBus());
         factory.setAddress(address);
-        factory.setResourceProvider(getResourceProvider(o, injections, context));
         factory.setProviders(PROVIDERS);
-        if (scope == Scope.PROTOTYPE) {
-            factory.setServiceClass(Class.class.cast(o));
-        } else {
-            factory.setServiceBean(o);
+        if (rp != null) {
+            factory.setResourceProvider(rp);
         }
         if (app != null) {
             factory.setApplication(app);
         }
+        if (invoker != null) {
+            factory.setInvoker(invoker);
+        }
+        if (serviceBean != null) {
+            factory.setServiceBean(serviceBean);
+        } else {
+            factory.setServiceClass(clazz);
+        }
 
         server = factory.create();
         destination = (AbstractHTTPDestination) server.getDestination();

Added: 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=1149644&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBEJBInvoker.java Fri Jul 22 15:59:28 2011
@@ -0,0 +1,24 @@
+package org.apache.openejb.server.cxf.rs;
+
+import org.apache.cxf.jaxrs.JAXRSInvoker;
+import org.apache.cxf.message.Exchange;
+import org.apache.openejb.BeanContext;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class OpenEJBEJBInvoker extends JAXRSInvoker {
+    private BeanContext context;
+
+    public OpenEJBEJBInvoker(BeanContext beanContext) {
+        context = beanContext;
+    }
+
+    @Override public Object invoke(Exchange exchange, Object request, Object resourceObject) {
+        throw new UnsupportedOperationException("to implement...");
+    }
+
+    @Override public Object getServiceObject(Exchange exchange) {
+        return null;
+    }
+}

Copied: openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java (from r1149471, openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java?p2=openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java&p1=openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java&r1=1149471&r2=1149644&rev=1149644&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java Fri Jul 22 15:59:28 2011
@@ -16,29 +16,28 @@
  */
 package org.apache.openejb.server.cxf.rs;
 
-import org.apache.cxf.jaxrs.lifecycle.PerRequestResourceProvider;
-import org.apache.cxf.message.Message;
-import org.apache.openejb.Injection;
-import org.apache.openejb.InjectionProcessor;
-
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import javax.ws.rs.WebApplicationException;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.ArrayList;
 import java.util.Collection;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.ws.rs.WebApplicationException;
+import org.apache.cxf.jaxrs.lifecycle.PerRequestResourceProvider;
+import org.apache.cxf.message.Message;
+import org.apache.openejb.Injection;
+import org.apache.openejb.InjectionProcessor;
 
 /**
  * @author Romain Manni-Bucau
  */
-public class OpenEJBPerRequestResourceProvider extends PerRequestResourceProvider {
-    private Collection<Injection> injections;
-    private Context context;
+public class OpenEJBPerRequestPojoResourceProvider extends PerRequestResourceProvider {
+    protected Collection<Injection> injections;
+    protected Context context;
 
-    public OpenEJBPerRequestResourceProvider(Class<?> clazz, Collection<Injection> injectionCollection, Context ctx) {
+    public OpenEJBPerRequestPojoResourceProvider(Class<?> clazz, Collection<Injection> injectionCollection, Context ctx) {
         super(clazz);
         injections = injectionCollection;
         context = ctx;

Added: 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=1149644&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java Fri Jul 22 15:59:28 2011
@@ -0,0 +1,68 @@
+package org.apache.openejb.server.cxf.rs;
+
+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 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.Test;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class EjbDeploymentTest {
+    private static Context context;
+    private static RESTIsCool service;
+
+    @BeforeClass public static void start() throws Exception {
+        Properties properties = new Properties();
+        properties.setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, "true");
+        context = EJBContainer.createEJBContainer(properties).getContext();
+        service = (RESTIsCool) context.lookup("java:/global/openejb-cxf-rs/RESTIsCool");
+    }
+
+    @AfterClass public static void close() throws Exception {
+        if (context != null) {
+            context.close();
+        }
+    }
+
+    @Test public void deploy() {
+        // service works
+        assertNotNull(service);
+        assertEquals("ok", service.ok(true));
+
+        // rest invocation works
+        String response = WebClient.create("http://localhost:4204").path("/ejb/rest").get(String.class);
+        assertEquals("ok", response);
+    }
+
+    @Path("/ejb")
+    @Stateless
+    public static class RESTIsCool {
+        @javax.ws.rs.core.Context private UriInfo uriInfo;
+        @EJB private SimpleEJB simpleEJB;
+
+        @Path("/rest") @GET public String ok(@QueryParam("force") @DefaultValue("false") boolean force) {
+            /*if (!(uriInfo != null || force)) {
+                return "ko";
+            }*/
+            return simpleEJB.ok();
+        }
+    }
+}

Modified: openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java?rev=1149644&r1=1149643&r2=1149644&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java (original)
+++ openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java Fri Jul 22 15:59:28 2011
@@ -17,10 +17,31 @@
 
 package org.apache.openejb.server.rest;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.Socket;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import javax.naming.Context;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.UriBuilder;
+import org.apache.openejb.BeanContext;
 import org.apache.openejb.Injection;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
 import org.apache.openejb.assembler.classic.DeploymentListener;
+import org.apache.openejb.assembler.classic.EjbJarInfo;
+import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
 import org.apache.openejb.assembler.classic.WebAppInfo;
 import org.apache.openejb.core.CoreContainerSystem;
 import org.apache.openejb.core.WebContext;
@@ -34,23 +55,6 @@ import org.apache.openejb.spi.ContainerS
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 
-import javax.naming.Context;
-import javax.ws.rs.core.Application;
-import javax.ws.rs.core.UriBuilder;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.net.Socket;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-
 /**
  * @author Romain Manni-Bucau
  */
@@ -80,8 +84,8 @@ public abstract class RESTService implem
         }
 
         final ClassLoader classLoader = getClassLoader(webContext.getClassLoader());
-        Collection<Injection> injections = webContext.getInjections();
-        Context context = webContext.getJndiEnc();
+        final Collection<Injection> injections = webContext.getInjections();
+        final Context context = webContext.getJndiEnc();
 
         // The spec says:
         //
@@ -98,7 +102,8 @@ public abstract class RESTService implem
         if (webApp.restApplications.isEmpty()) {
             for (String clazz : webApp.restClass) {
                 try {
-                    deploy(webApp.contextRoot, classLoader.loadClass(clazz), null, classLoader, RsHttpListener.Scope.PROTOTYPE, injections, context);
+                    Class<?> loadedClazz = classLoader.loadClass(clazz);
+                    deployPojo(webApp.contextRoot, loadedClazz, null, classLoader, injections, context);
                 } catch (ClassNotFoundException e) {
                     throw new OpenEJBRestRuntimeException("can't find class " + clazz, e);
                 }
@@ -114,11 +119,11 @@ public abstract class RESTService implem
                 }
 
                 for (Object o : appInstance.getSingletons()) {
-                    deploy(webApp.contextRoot, o, appInstance, classLoader, RsHttpListener.Scope.SINGLETON, injections, context);
+                    deploySingleton(webApp.contextRoot, o, appInstance, classLoader);
                     LOGGER.info("deployed REST singleton: " + o);
                 }
                 for (Class<?> clazz : appInstance.getClasses()) {
-                    deploy(webApp.contextRoot, clazz, appInstance, classLoader, RsHttpListener.Scope.PROTOTYPE, injections, context);
+                    deployPojo(webApp.contextRoot, clazz, appInstance, classLoader, injections, context);
                     LOGGER.info("deployed REST class: " + clazz);
                 }
 
@@ -132,32 +137,71 @@ public abstract class RESTService implem
             for (final WebAppInfo webApp : appInfo.webApps) {
                 afterApplicationCreated(webApp);
             }
+
+            Map<String, String> webContextByEjb = new HashMap<String, String>();
+            for (WebAppInfo webApp : appInfo.webApps) {
+                for (String ejb : webApp.ejbRestServices) {
+                    webContextByEjb.put(ejb, webApp.contextRoot);
+                }
+            }
+
+            for (EjbJarInfo ejbJar : appInfo.ejbJars) {
+                for (EnterpriseBeanInfo bean : ejbJar.enterpriseBeans) {
+                    if (bean.restService) {
+                        BeanContext beanContext = containerSystem.getBeanContext(bean.ejbDeploymentId);
+                        if (beanContext == null) {
+                            continue;
+                        }
+
+                        deployEJB(webContextByEjb.get(bean.ejbClass), beanContext);
+                    }
+                }
+            }
         }
     }
 
-    /**
-     * @param context     the webapp context
-     * @param o           the class if scope == prototype or the instance if scope == singleton
-     * @param app         the Application if exists
-     * @param classLoader the webapp classloader
-     * @param scope       the scope
-     * @param injections  webapp injections
-     * @param ctx         webapp context
-     */
-    private void deploy(String context, Object o, Application app, ClassLoader classLoader, RsHttpListener.Scope scope, Collection<Injection> injections, Context ctx) {
-        final String nopath = getAddress(NOPATH_PREFIX + context, o, scope) + "/.*";
-        final RsHttpListener listener = createHttpListener(o, scope);
+    private void deploySingleton(String contextRoot, Object o, Application appInstance, ClassLoader classLoader) {
+        final String nopath = getAddress(contextRoot, o.getClass()) + "/.*";
+        final RsHttpListener listener = createHttpListener();
         final List<String> addresses = rsRegistry.createRsHttpListener(listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost);
         final String address = HttpUtil.selectSingleAddress(addresses);
 
         services.add(address);
-        listener.deploy(getFullContext(address, context), o, app, injections, ctx);
+        listener.deploySingleton(getFullContext(address, contextRoot), o, appInstance);
     }
 
-    protected abstract RsHttpListener createHttpListener(Object o, RsHttpListener.Scope scope);
+    private void deployPojo(String contextRoot, Class<?> loadedClazz, Application app, ClassLoader classLoader, Collection<Injection> injections, Context context) {
+        final String nopath = getAddress(contextRoot, loadedClazz) + "/.*";
+        final RsHttpListener listener = createHttpListener();
+        final List<String> addresses = rsRegistry.createRsHttpListener(listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost);
+        final String address = HttpUtil.selectSingleAddress(addresses);
+
+        services.add(address);
+        listener.deployPojo(getFullContext(address, contextRoot), loadedClazz, app, injections, context);
+    }
+
+    private void deployEJB(String context, BeanContext beanContext) {
+        final String nopath = getAddress(context, beanContext.getBeanClass()) + "/.*";
+        final RsHttpListener listener = createHttpListener();
+        final List<String> addresses = rsRegistry.createRsHttpListener(listener, beanContext.getClassLoader(), nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost);
+        final String address = HttpUtil.selectSingleAddress(addresses);
+
+        services.add(address);
+        listener.deployEJB(getFullContext(address, context), beanContext);
+    }
 
+    /**
+     * It creates the service container (http listener).
+     *
+     * @return the service container
+     */
+    protected abstract RsHttpListener createHttpListener();
 
     private static String getFullContext(String address, String context) {
+        if (context == null) {
+            return address;
+        }
+
         int idx = address.indexOf(context);
         String base = address.substring(0, idx);
         if (!base.endsWith("/") && !context.startsWith("/")) {
@@ -166,14 +210,13 @@ public abstract class RESTService implem
         return base + context;
     }
 
-    private String getAddress(String context, Object o, RsHttpListener.Scope scope) {
-        Class<?> clazz = o.getClass();
-        if (scope == RsHttpListener.Scope.PROTOTYPE) {
-            clazz = Class.class.cast(o);
+    private String getAddress(String context, Class<?> clazz) {
+        String root = NOPATH_PREFIX;
+        if (context != null) {
+            root += context;
         }
-
         try {
-            return UriBuilder.fromUri(new URI(context)).path(clazz).build().toURL().toString();
+            return UriBuilder.fromUri(new URI(root)).path(clazz).build().toURL().toString();
         } catch (MalformedURLException e) {
             throw new OpenEJBRestRuntimeException("url is malformed", e);
         } catch (URISyntaxException e) {

Modified: openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java?rev=1149644&r1=1149643&r2=1149644&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java (original)
+++ openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java Fri Jul 22 15:59:28 2011
@@ -17,21 +17,22 @@
 
 package org.apache.openejb.server.rest;
 
-import org.apache.openejb.Injection;
-import org.apache.openejb.server.httpd.HttpListener;
-
+import java.util.Collection;
 import javax.naming.Context;
 import javax.ws.rs.core.Application;
-import java.util.Collection;
+import org.apache.openejb.BeanContext;
+import org.apache.openejb.Injection;
+import org.apache.openejb.server.httpd.HttpListener;
 
 /**
  * @author Romain Manni-Bucau
  */
 public interface RsHttpListener extends HttpListener {
-    public static enum Scope {
-        SINGLETON, PROTOTYPE
-    }
+    void deploySingleton(String fullContext, Object o, Application appInstance);
+
+    void deployPojo(String fullContext, Class<?> loadedClazz, Application app, Collection<Injection> injections, Context context);
+
+    void deployEJB(String fullContext, BeanContext beanContext);
 
-    void deploy(String address, Object o, Application app, Collection<Injection> injections, Context ctx);
     void undeploy();
 }