Author: rmannibucau
Date: Wed May 30 15:06:54 2012
New Revision: 1344297

URL: http://svn.apache.org/viewvc?rev=1344297&view=rev
Log:
TOMEE-207 postconstruct called after injections for pojo rest services

Modified:
    
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java
    
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java

Modified: 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java?rev=1344297&r1=1344296&r2=1344297&view=diff
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java
 (original)
+++ 
openejb/trunk/openejb/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestPojoResourceProvider.java
 Wed May 30 15:06:54 2012
@@ -16,7 +16,9 @@
  */
 package org.apache.openejb.server.cxf.rs;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.ArrayList;
@@ -24,33 +26,46 @@ import java.util.Collection;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Response;
 import org.apache.cxf.jaxrs.lifecycle.PerRequestResourceProvider;
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
+import org.apache.cxf.jaxrs.utils.ResourceUtils;
 import org.apache.cxf.message.Message;
 import org.apache.openejb.Injection;
 import org.apache.openejb.InjectionProcessor;
+import org.apache.openejb.OpenEJBException;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.inject.OWBInjector;
 
+// the constructor part is mainly copied from the parent since all is private
+// and we want to invoke postconstrut ourself
 public class OpenEJBPerRequestPojoResourceProvider extends 
PerRequestResourceProvider {
     protected Collection<Injection> injections;
     protected Context context;
     protected WebBeansContext webbeansContext;
     protected InjectionProcessor<Object> injector;
     protected OWBInjector beanInjector;
+    protected Constructor<?> constructor;
 
     public OpenEJBPerRequestPojoResourceProvider(final Class<?> clazz, final 
Collection<Injection> injectionCollection, final Context initialContext, final 
WebBeansContext owbCtx) {
         super(clazz);
         injections = injectionCollection;
         webbeansContext = owbCtx;
         context = (Context) Proxy.newProxyInstance(clazz.getClassLoader(), new 
Class<?>[]{Context.class}, new InitialContextWrapper(initialContext));
+
+        constructor = ResourceUtils.findResourceConstructor(clazz, true);
+        if (constructor == null) {
+            throw new RuntimeException("Resource class " + clazz
+                    + " has no valid constructor");
+        }
     }
 
     @Override
     protected Object createInstance(Message m) {
-        Object o = super.createInstance(m);
+        Object[] values = 
ResourceUtils.createConstructorArguments(constructor, m);
         try {
-            injector = new InjectionProcessor<Object>(o, new 
ArrayList<Injection>(injections), InjectionProcessor.unwrap(context));
+            final Object instance = values.length > 0 ? 
constructor.newInstance(values) : constructor.newInstance(new Object[]{});
+            injector = new InjectionProcessor<Object>(instance, new 
ArrayList<Injection>(injections), InjectionProcessor.unwrap(context));
             injector.createInstance();
             try {
                 beanInjector = new OWBInjector(webbeansContext);
@@ -60,8 +75,21 @@ public class OpenEJBPerRequestPojoResour
             }
             injector.postConstruct();
             return injector.getInstance();
-        } catch (Exception e) {
-            throw new WebApplicationException(e);
+        } catch (InstantiationException ex) {
+            final String msg = "Resource class " + 
constructor.getDeclaringClass().getName() + " can not be instantiated";
+            throw new 
WebApplicationException(Response.serverError().entity(msg).build());
+        } catch (IllegalAccessException ex) {
+            final String msg = "Resource class " + 
constructor.getDeclaringClass().getName() + " can not be instantiated"
+                    + " due to IllegalAccessException";
+            throw new 
WebApplicationException(Response.serverError().entity(msg).build());
+        } catch (InvocationTargetException ex) {
+            final String msg = "Resource class "
+                    + constructor.getDeclaringClass().getName() + " can not be 
instantiated"
+                    + " due to InvocationTargetException";
+            throw new 
WebApplicationException(Response.serverError().entity(msg).build());
+        } catch (OpenEJBException e) {
+            final String msg = "An error occured injecting in class " + 
constructor.getDeclaringClass().getName();
+            throw new 
WebApplicationException(Response.serverError().entity(msg).build());
         }
     }
 

Modified: 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java?rev=1344297&r1=1344296&r2=1344297&view=diff
==============================================================================
--- 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java
 (original)
+++ 
openejb/trunk/openejb/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/EjbDeploymentTest.java
 Wed May 30 15:06:54 2012
@@ -17,6 +17,7 @@
 
 package org.apache.openejb.server.cxf.rs;
 
+import javax.annotation.PostConstruct;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.openejb.OpenEjbContainer;
 import org.apache.openejb.server.cxf.rs.beans.SimpleEJB;


Reply via email to