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