tomee-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From rmannibu...@apache.org
Subject svn commit: r1557507 - in /tomee/tomee/trunk/server/openejb-cxf/src: main/java/org/apache/openejb/server/cxf/pojo/PojoEndpoint.java test/java/org/apache/openejb/server/cxf/CdiPojoTest.java
Date Sun, 12 Jan 2014 09:48:01 GMT
Author: rmannibucau
Date: Sun Jan 12 09:48:00 2014
New Revision: 1557507

URL: http://svn.apache.org/r1557507
Log:
TOMEE-1105 jaxws endpoints as cdi beans

Added:
    tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/CdiPojoTest.java
      - copied, changed from r1556736, tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/PojoWebServiceContextTest.java
Modified:
    tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoEndpoint.java

Modified: tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoEndpoint.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoEndpoint.java?rev=1557507&r1=1557506&r2=1557507&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoEndpoint.java
(original)
+++ tomee/tomee/trunk/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoEndpoint.java
Sun Jan 12 09:48:00 2014
@@ -29,12 +29,24 @@ import org.apache.cxf.transport.http.HTT
 import org.apache.openejb.Injection;
 import org.apache.openejb.InjectionProcessor;
 import org.apache.openejb.assembler.classic.util.ServiceConfiguration;
+import org.apache.openejb.cdi.CdiAppContextsService;
 import org.apache.openejb.core.webservices.JaxWsUtils;
 import org.apache.openejb.core.webservices.PortData;
 import org.apache.openejb.server.cxf.CxfEndpoint;
 import org.apache.openejb.server.cxf.CxfServiceConfiguration;
 import org.apache.openejb.server.cxf.JaxWsImplementorInfoImpl;
-
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+import org.apache.webbeans.component.AbstractOwbBean;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.container.BeanManagerImpl;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
+import org.apache.webbeans.util.WebBeansUtil;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionTarget;
+import javax.enterprise.inject.spi.Producer;
 import javax.naming.Context;
 import javax.xml.ws.WebServiceContext;
 import javax.xml.ws.WebServiceException;
@@ -42,10 +54,12 @@ import java.lang.reflect.Type;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import static org.apache.openejb.InjectionProcessor.unwrap;
 
 public class PojoEndpoint extends CxfEndpoint {
+    private static final Logger LOGGER = Logger.getInstance(LogCategory.CXF, PojoEndpoint.class);
     private static final WebServiceContextResourceResolver WEB_SERVICE_CONTEXT_RESOURCE_RESOLVER
= new WebServiceContextResourceResolver();
 
     private final ResourceInjector injector;
@@ -53,7 +67,7 @@ public class PojoEndpoint extends CxfEnd
     public PojoEndpoint(ClassLoader loader, Bus bus, PortData port, Context context, Class<?>
instance,
                         HTTPTransportFactory httpTransportFactory,
                         Map<String, Object> bindings, ServiceConfiguration config)
{
-    	super(bus, port, context, instance, httpTransportFactory, config);
+        super(bus, port, context, instance, httpTransportFactory, config);
 
         String bindingURI = null;
         if (port.getBindingID() != null) {
@@ -81,21 +95,67 @@ public class PojoEndpoint extends CxfEnd
             }
         }
 
+        ResourceInjector injector = null;
+
         // instantiate and inject resources into service using the app classloader to be
sure to get the right InitialContext
+        implementor = null;
+
         final ClassLoader old = Thread.currentThread().getContextClassLoader();
         Thread.currentThread().setContextClassLoader(loader);
         try {
-            final InjectionProcessor<Object> injectionProcessor = new InjectionProcessor<Object>(instance,
port.getInjections(), null, null, unwrap(context), bindings);
-            injectionProcessor.createInstance();
-            implementor = injectionProcessor.getInstance();
-            injector = injectCxfResources(implementor);
-            injector.invokePostConstruct();
+            final WebBeansContext webBeansContext = WebBeansContext.currentInstance();
+            final BeanManagerImpl bm = webBeansContext.getBeanManagerImpl();
+            if (bm.isInUse()) { // try cdi bean
+                try {
+                    final Set<Bean<?>> beans = bm.getBeans(instance);
+                    final Bean<?> bean = bm.resolve(beans);
+                    CreationalContextImpl creationalContext = bm.createCreationalContext(bean);
+                    if (bean != null) {
+                        Bean<?> oldBean = creationalContext.putBean(bean);
+                        try {
+                            if (AbstractOwbBean.class.isInstance(bean)) {
+                                final AbstractOwbBean<?> aob = AbstractOwbBean.class.cast(bean);
+
+                                final Producer producer = aob.getProducer();
+                                implementor = producer.produce(creationalContext);
+                                if (producer instanceof InjectionTarget) {
+                                    final InjectionTarget injectionTarget = (InjectionTarget)
producer;
+                                    injectionTarget.inject(implementor, creationalContext);
+                                    injector = injectCxfResources(implementor); // we need
it before postconstruct
+                                    injectionTarget.postConstruct(implementor);
+                                }
+                                if (aob.getScope().equals(Dependent.class)) {
+                                    creationalContext.addDependent(aob, instance);
+                                }
+                            }
+                        } finally {
+                            creationalContext.putBean(oldBean);
+                        }
+                    } else {
+                        implementor = bm.getReference(bean, instance, creationalContext);
+                        injector = injectCxfResources(implementor);
+                    }
+                    if (WebBeansUtil.isDependent(bean)) { // should be isPseudoScope but
should be ok for jaxws
+                        CdiAppContextsService.pushRequestReleasable(new RealeaseCreationalContextRunnable(creationalContext));
+                    }
+                } catch (final Exception ie) {
+                    LOGGER.info("Can't use cdi to create " + instance + " webservice: " +
ie.getMessage());
+                }
+            }
+            if (implementor == null) { // old pojo style
+                final InjectionProcessor<Object> injectionProcessor = new InjectionProcessor<Object>(instance,
port.getInjections(), null, null, unwrap(context), bindings);
+                injectionProcessor.createInstance();
+                implementor = injectionProcessor.getInstance();
+                injector = injectCxfResources(implementor);
+                injector.invokePostConstruct();
+            }
         } catch (final Exception e) {
             throw new WebServiceException("Service resource injection failed", e);
         } finally {
             Thread.currentThread().setContextClassLoader(old);
         }
 
+        this.injector = injector;
         service.setInvoker(new JAXWSMethodInvoker(implementor));
     }
 
@@ -141,4 +201,17 @@ public class PojoEndpoint extends CxfEnd
         // shutdown server
         super.stop();
     }
+
+    private static class RealeaseCreationalContextRunnable implements Runnable {
+        private final CreationalContextImpl<?> cc;
+
+        public RealeaseCreationalContextRunnable(final CreationalContextImpl<?> creationalContext)
{
+            this.cc = creationalContext;
+        }
+
+        @Override
+        public void run() {
+            cc.release();
+        }
+    }
 }

Copied: tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/CdiPojoTest.java
(from r1556736, tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/PojoWebServiceContextTest.java)
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/CdiPojoTest.java?p2=tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/CdiPojoTest.java&p1=tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/PojoWebServiceContextTest.java&r1=1556736&r2=1557507&rev=1557507&view=diff
==============================================================================
--- tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/PojoWebServiceContextTest.java
(original)
+++ tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/CdiPojoTest.java
Sun Jan 12 09:48:00 2014
@@ -18,6 +18,7 @@ package org.apache.openejb.server.cxf;
 
 import org.apache.openejb.jee.WebApp;
 import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.Classes;
 import org.apache.openejb.testing.EnableServices;
 import org.apache.openejb.testing.Module;
 import org.junit.Test;
@@ -25,22 +26,39 @@ import org.junit.runner.RunWith;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
+import javax.inject.Inject;
 import javax.jws.WebService;
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
 import javax.xml.ws.WebServiceContext;
 
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 @EnableServices("jax-ws")
 @RunWith(ApplicationComposer.class)
-public class PojoWebServiceContextTest {
+public class CdiPojoTest {
     @Module
+    @Classes(value = { MyWebservice.class, ACdiTaste.class }, cdi = true)
     public WebApp module() {
         return new WebApp().contextRoot("/test").addServlet("ws", MyWebservice.class.getName(),
"/ws");
     }
 
     @Test
-    public void checkInjection() {
-        assertTrue(MyWebservice.ok);
+    public void checkInjection() throws MalformedURLException {
+        final MyWsApi api = Service.create(new URL("http://localhost:4204/test/ws?wsdl"),
+                                           new QName("http://cxf.server.openejb.apache.org/",
"MyWebserviceService"))
+                .getPort(MyWsApi.class);
+        assertEquals("ok", api.test());
+    }
+
+    public static class ACdiTaste {
+        public String ok() {
+            return "ok";
+        }
     }
 
     @WebService
@@ -50,19 +68,15 @@ public class PojoWebServiceContextTest {
 
     @WebService
     public static class MyWebservice implements MyWsApi {
-        private static boolean ok = false;
-
-        @Resource
-        private WebServiceContext ctx;
-
-        @PostConstruct
-        public void check() {
-            ok = ctx != null;
-        }
+        @Inject
+        private ACdiTaste cdi;
 
         @Override
         public String test() {
-            return "ok";
+            if (cdi == null) {
+                return "cdi injection failed";
+            }
+            return cdi.ok();
         }
     }
 }



Mime
View raw message