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";
+ }
+ }
+}