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 2013/11/20 12:05:51 UTC

svn commit: r1543771 - 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/PojoWebServiceContextTest.java

Author: rmannibucau
Date: Wed Nov 20 11:05:51 2013
New Revision: 1543771

URL: http://svn.apache.org/r1543771
Log:
TOMEE-1081 @WebServiceContext in pojo endpoints

Added:
    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=1543771&r1=1543770&r2=1543771&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 Wed Nov 20 11:05:51 2013
@@ -25,8 +25,8 @@ import org.apache.cxf.jaxws.support.JaxW
 import org.apache.cxf.resource.DefaultResourceManager;
 import org.apache.cxf.resource.ResourceManager;
 import org.apache.cxf.resource.ResourceResolver;
-import org.apache.cxf.service.Service;
 import org.apache.cxf.transport.http.HTTPTransportFactory;
+import org.apache.openejb.Injection;
 import org.apache.openejb.InjectionProcessor;
 import org.apache.openejb.assembler.classic.util.ServiceConfiguration;
 import org.apache.openejb.core.webservices.JaxWsUtils;
@@ -36,14 +36,19 @@ import org.apache.openejb.server.cxf.Cxf
 import org.apache.openejb.server.cxf.JaxWsImplementorInfoImpl;
 
 import javax.naming.Context;
+import javax.xml.ws.WebServiceContext;
 import javax.xml.ws.WebServiceException;
+import java.lang.reflect.Type;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
 import static org.apache.openejb.InjectionProcessor.unwrap;
 
 public class PojoEndpoint extends CxfEndpoint {
-    private InjectionProcessor<Object> injectionProcessor;
+    private static final WebServiceContextResourceResolver WEB_SERVICE_CONTEXT_RESOURCE_RESOLVER = new WebServiceContextResourceResolver();
+
+    private final ResourceInjector injector;
 
     public PojoEndpoint(ClassLoader loader, Bus bus, PortData port, Context context, Class<?> instance,
                         HTTPTransportFactory httpTransportFactory,
@@ -66,16 +71,26 @@ public class PojoEndpoint extends CxfEnd
 
         service = doServiceCreate();
 
+        { // cleanup jax-ws injections
+            final Iterator<Injection> injections = port.getInjections().iterator();
+            while (injections.hasNext()) {
+                final Injection next = injections.next();
+                if (WebServiceContext.class.equals(type(loader, next))) {
+                    injections.remove();
+                }
+            }
+        }
+
         // instantiate and inject resources into service using the app classloader to be sure to get the right InitialContext
         final ClassLoader old = Thread.currentThread().getContextClassLoader();
         Thread.currentThread().setContextClassLoader(loader);
         try {
-            injectionProcessor = new InjectionProcessor<Object>(instance, port.getInjections(), null, null, unwrap(context), bindings);
+            final InjectionProcessor<Object> injectionProcessor = new InjectionProcessor<Object>(instance, port.getInjections(), null, null, unwrap(context), bindings);
             injectionProcessor.createInstance();
-            injectionProcessor.postConstruct();
             implementor = injectionProcessor.getInstance();
-            injectCxfResources(implementor);
-        } catch (Exception e) {
+            injector = injectCxfResources(implementor);
+            injector.invokePostConstruct();
+        } catch (final Exception e) {
             throw new WebServiceException("Service resource injection failed", e);
         } finally {
             Thread.currentThread().setContextClassLoader(old);
@@ -84,13 +99,26 @@ public class PojoEndpoint extends CxfEnd
         service.setInvoker(new JAXWSMethodInvoker(implementor));
     }
 
-    private void injectCxfResources(final Object implementor) {
+    private Type type(final ClassLoader loader, final Injection next) {
+        try {
+            return loader.loadClass(next.getClassname()).getDeclaredField(next.getName()).getGenericType();
+        } catch (final Throwable th) {
+            return null; // ignore
+        }
+    }
+
+    private ResourceInjector injectCxfResources(final Object implementor) {
         ResourceManager resourceManager = bus.getExtension(ResourceManager.class);
-        List<ResourceResolver> resolvers = resourceManager.getResourceResolvers();
+
+        final List<ResourceResolver> resolvers = resourceManager.getResourceResolvers();
         resourceManager = new DefaultResourceManager(resolvers);
-        resourceManager.addResourceResolver(new WebServiceContextResourceResolver());
-        ResourceInjector injector = new ResourceInjector(resourceManager);
+        if (!resourceManager.getResourceResolvers().contains(WEB_SERVICE_CONTEXT_RESOURCE_RESOLVER)) {
+            resourceManager.addResourceResolver(WEB_SERVICE_CONTEXT_RESOURCE_RESOLVER);
+        }
+
+        final ResourceInjector injector = new ResourceInjector(resourceManager);
         injector.inject(implementor);
+        return injector;
     }
 
     protected void init() {
@@ -106,9 +134,8 @@ public class PojoEndpoint extends CxfEnd
         // call handler preDestroy
         destroyHandlers();
 
-        // call service preDestroy
-        if (injectionProcessor != null) {
-            injectionProcessor.preDestroy();
+        if (injector != null) {
+            injector.invokePreDestroy();
         }
 
         // shutdown server

Added: 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/PojoWebServiceContextTest.java?rev=1543771&view=auto
==============================================================================
--- tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/PojoWebServiceContextTest.java (added)
+++ tomee/tomee/trunk/server/openejb-cxf/src/test/java/org/apache/openejb/server/cxf/PojoWebServiceContextTest.java Wed Nov 20 11:05:51 2013
@@ -0,0 +1,68 @@
+/**
+ * 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.server.cxf;
+
+import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.EnableServices;
+import org.apache.openejb.testing.Module;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import javax.jws.WebService;
+import javax.xml.ws.WebServiceContext;
+
+import static org.junit.Assert.assertTrue;
+
+@EnableServices("jax-ws")
+@RunWith(ApplicationComposer.class)
+public class PojoWebServiceContextTest {
+    @Module
+    public WebApp module() {
+        return new WebApp().contextRoot("/test").addServlet("ws", MyWebservice.class.getName(), "/ws");
+    }
+
+    @Test
+    public void checkInjection() {
+        assertTrue(MyWebservice.ok);
+    }
+
+    @WebService
+    public static interface MyWsApi {
+        String test();
+    }
+
+    @WebService
+    public static class MyWebservice implements MyWsApi {
+        private static boolean ok = false;
+
+        @Resource
+        private WebServiceContext ctx;
+
+        @PostConstruct
+        public void check() {
+            ok = ctx != null;
+        }
+
+        @Override
+        public String test() {
+            return "ok";
+        }
+    }
+}